# class Digest::Base

This abstract class provides a common interface to message digest implementation classes written in C.

## Write a `Digest` subclass in C¶ ↑

`Digest::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"),
                rb_digest_make_metadata(&sha1));

### Public Instance Methods

digest_base << string → digest_base

Update the digest using given string and return `self`.

Alias for: update
block_length → Integer
Source

    static VALUE
    rb_digest_base_block_length(VALUE self)
    {
        rb_digest_metadata_t *algo;

        algo = get_digest_obj_metadata(self);

        return SIZET2NUM(algo->block_len);
    }

Return the block length of the digest in bytes.

digest_length → Integer
Source

    static VALUE
    rb_digest_base_digest_length(VALUE self)
    {
        rb_digest_metadata_t *algo;

        algo = get_digest_obj_metadata(self);

        return SIZET2NUM(algo->digest_len);
    }

Return the length of the hash value in bytes.

reset → digest_base
Source

    static VALUE
    rb_digest_base_reset(VALUE self)
    {
        rb_digest_metadata_t *algo;
        void *pctx;

        algo = get_digest_obj_metadata(self);

        TypedData_Get_Struct(self, void, &digest_type, pctx);

        algo_init(algo, pctx);

        return self;
    }

Reset the digest to its initial state and return `self`.

update(string) → digest_base
Source

    static VALUE
    rb_digest_base_update(VALUE self, VALUE str)
    {
        rb_digest_metadata_t *algo;
        void *pctx;

        algo = get_digest_obj_metadata(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;
    }

Update the digest using given string and return `self`.

Also aliased as: <<