Class: Digest::Base
| Relationships & Source Files | |
| Extension / Inclusion / Inheritance Descendants | |
|
Subclasses:
|
|
| Super Chains via Extension / Inclusion / Inheritance | |
|
Class Chain:
self,
Class
|
|
|
Instance Chain:
|
|
| Inherits: |
Digest::Class
|
| Defined in: | ext/digest/digest.c, ext/digest/digest.c |
Overview
This abstract class provides a common interface to message digest implementation classes written in C.
Write a Digest subclass in C
Base provides a common interface to message digest classes written in C. These classes must provide a struct of type rb_digest_metadata_t:
typedef int (*rb_digest_hash_init_func_t)(void *);
typedef void (*rb_digest_hash_update_func_t)(void *, unsigned char *, size_t);
typedef int (*rb_digest_hash_finish_func_t)(void *, unsigned char *);
typedef struct {
int api_version;
size_t digest_len;
size_t block_len;
size_t ctx_size;
rb_digest_hash_init_func_t init_func;
rb_digest_hash_update_func_t update_func;
rb_digest_hash_finish_func_t finish_func;
} rb_digest_metadata_t;
This structure must be set as an instance variable named metadata (without the @ in front of the name). By example:
static const rb_digest_metadata_t sha1 = {
RUBY_DIGEST_API_VERSION,
SHA1_DIGEST_LENGTH,
SHA1_BLOCK_LENGTH,
sizeof(SHA1_CTX),
(rb_digest_hash_init_func_t)SHA1_Init,
(rb_digest_hash_update_func_t)SHA1_Update,
(rb_digest_hash_finish_func_t)SHA1_Finish,
};
rb_ivar_set(cDigest_SHA1, rb_intern("metadata"),
Data_Wrap_Struct(0, 0, 0, (void *)&sha1));
Class Method Summary
Class - Inherited
| .base64digest | Returns the base64 encoded hash value of a given string. |
| .digest | Returns the hash value of a given string. |
| .file | Creates a digest object and reads a given file, name. |
| .hexdigest | Returns the hex-encoded hash value of a given string. |
| .new | |
Instance Method Summary
-
#<<(string) ⇒ Base
(also: #update)
Update the digest using given string and return
self. -
#block_length ⇒ Integer
Return the block length of the digest in bytes.
-
#digest_length ⇒ Integer
Return the length of the hash value in bytes.
-
#reset ⇒ Base
Reset the digest to its initial state and return
self. -
#update(string) ⇒ Base
Alias for #<<.
- #initialize_copy(obj) Internal use only
- #finish private Internal use only
Instance - Included
| #<< | Updates the digest using a given string and returns self. |
| #== | If a string is given, checks whether it is equal to the hex-encoded hash value of the digest object. |
| #base64digest | If none is given, returns the resulting hash value of the digest in a base64 encoded form, keeping the digest’s state. |
| #base64digest! | Returns the resulting hash value and resets the digest to the initial state. |
| #block_length | Returns the block length of the digest. |
| #bubblebabble | Returns the resulting hash value in a Bubblebabble encoded form. |
| #digest | If none is given, returns the resulting hash value of the digest, keeping the digest’s state. |
| #digest! | Returns the resulting hash value and resets the digest to the initial state. |
| #digest_length | Returns the length of the hash value of the digest. |
| #file | Updates the digest with the contents of a given file name and returns self. |
| #hexdigest | If none is given, returns the resulting hash value of the digest in a hex-encoded form, keeping the digest’s state. |
| #hexdigest! | Returns the resulting hash value in a hex-encoded form and resets the digest to the initial state. |
| #inspect | Creates a printable version of the digest object. |
| #length | Returns digest_obj.digest_length(). |
| #new | Returns a new, initialized copy of the digest object. |
| #reset | Resets the digest to the initial state and returns self. |
| #size | Alias for Instance#length. |
| #to_s | Returns digest_obj.hexdigest(). |
| #update | Alias for Instance#<<. |
| #finish | Finishes the digest and returns the resulting hash value. |
Constructor Details
This class inherits a constructor from Digest::Class
Instance Method Details
#update(string) ⇒ Base
#<<(string) ⇒ Base
Also known as: #update
Base
#<<(string) ⇒ Base
Update the digest using given string and return self.
# File 'ext/digest/digest.c', line 660
static VALUE
rb_digest_base_update(VALUE self, VALUE str)
{
rb_digest_metadata_t *algo;
void *pctx;
algo = get_digest_base_metadata(rb_obj_class(self));
TypedData_Get_Struct(self, void, &digest_type, pctx);
StringValue(str);
algo->update_func(pctx, (unsigned char *)RSTRING_PTR(str), RSTRING_LEN(str));
RB_GC_GUARD(str);
return self;
}
#block_length ⇒ Integer
Return the block length of the digest in bytes.
# File 'ext/digest/digest.c', line 718
static VALUE
rb_digest_base_block_length(VALUE self)
{
rb_digest_metadata_t *algo;
algo = get_digest_base_metadata(rb_obj_class(self));
return INT2NUM(algo->block_len);
}
#digest_length ⇒ Integer
Return the length of the hash value in bytes.
# File 'ext/digest/digest.c', line 703
static VALUE
rb_digest_base_digest_length(VALUE self)
{
rb_digest_metadata_t *algo;
algo = get_digest_base_metadata(rb_obj_class(self));
return INT2NUM(algo->digest_len);
}
#finish (private)
# File 'ext/digest/digest.c', line 678
static VALUE
rb_digest_base_finish(VALUE self)
{
rb_digest_metadata_t *algo;
void *pctx;
VALUE str;
algo = get_digest_base_metadata(rb_obj_class(self));
TypedData_Get_Struct(self, void, &digest_type, pctx);
str = rb_str_new(0, algo->digest_len);
algo->finish_func(pctx, (unsigned char *)RSTRING_PTR(str));
/* avoid potential coredump caused by use of a finished context */
algo_init(algo, pctx);
return str;
}
#initialize_copy(obj)
# File 'ext/digest/digest.c', line 612
static VALUE
rb_digest_base_copy(VALUE copy, VALUE obj)
{
rb_digest_metadata_t *algo;
void *pctx1, *pctx2;
if (copy == obj) return copy;
rb_check_frozen(copy);
algo = get_digest_base_metadata(rb_obj_class(copy));
if (algo != get_digest_base_metadata(rb_obj_class(obj)))
rb_raise(rb_eTypeError, "different algorithms");
TypedData_Get_Struct(obj, void, &digest_type, pctx1);
TypedData_Get_Struct(copy, void, &digest_type, pctx2);
memcpy(pctx2, pctx1, algo->ctx_size);
return copy;
}
#reset ⇒ Base
Reset the digest to its initial state and return self.
# File 'ext/digest/digest.c', line 638
static VALUE
rb_digest_base_reset(VALUE self)
{
rb_digest_metadata_t *algo;
void *pctx;
algo = get_digest_base_metadata(rb_obj_class(self));
TypedData_Get_Struct(self, void, &digest_type, pctx);
algo_init(algo, pctx);
return self;
}
#update(string) ⇒ Base
#<<(string) ⇒ Base
Base
#<<(string) ⇒ Base
Alias for #<<.