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 #<<.