ext/digest/siphash/init.c in digest-siphash-0.0.1 vs ext/digest/siphash/init.c in digest-siphash-1.0.0

- old
+ new

@@ -1,34 +1,15 @@ #include "siphash24.h" #include "siphash.h" #define siphash crypto_auth -#define DEFAULT_SEED "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" VALUE cDigest_SipHash; ID id_DEFAULT_SEED; -ID id_seed; +ID iv_seed; +ID iv_buffer; -static VALUE -siphash_seed_get(VALUE self) -{ - if (!rb_ivar_defined(self, id_seed)) { - rb_ivar_set(self, id_seed, rb_usascii_str_new(DEFAULT_SEED, 16)); - } - return rb_ivar_get(self, id_seed); -} - -static VALUE -siphash_seed_set(VALUE self, VALUE obj) -{ - StringValue(obj); - if (RSTRING_LEN(obj) != 16) { - rb_raise(rb_eArgError, "seed string should 128 bit chars"); - } - return rb_ivar_set(self, id_seed, obj); -} - static void _siphash_s_digest(uint8_t* digest, int argc, VALUE *argv) { VALUE str; const unsigned char *seed; @@ -55,15 +36,15 @@ static inline void _siphash_finish(uint8_t *digest, VALUE self) { const unsigned char *seed; - buffer_t *ptr; + VALUE buffer; - Data_Get_Struct(self, buffer_t, ptr); - seed = (const unsigned char *) RSTRING_PTR(siphash_seed_get(self)); - siphash(digest, (const unsigned char *) ptr->buffer, ptr->p - ptr->buffer, seed); + buffer = rb_ivar_get(self, iv_buffer); + seed = (const unsigned char *) RSTRING_PTR(rb_ivar_get(self, iv_seed)); + siphash(digest, (const unsigned char *) RSTRING_PTR(buffer), RSTRING_LEN(buffer), seed); } static VALUE siphash_finish(VALUE self) { @@ -81,18 +62,10 @@ #endif return rb_str_new((const char*) digest, 8); } static VALUE -siphash_to_i(VALUE self) -{ - uint8_t digest[8]; - _siphash_finish(digest, self); - return ULL2NUM(*(uint64_t *) digest); -} - -static VALUE siphash_s_digest(int argc, VALUE *argv, VALUE klass) { uint8_t digest[8]; #if LITTLE_ENDIAN uint8_t roll[8]; @@ -107,41 +80,34 @@ #endif return rb_str_new((const char*) digest, 8); } static VALUE -siphash_s_hexdigest(int argc, VALUE *argv, VALUE klass) -{ - return hexencode_str_new(siphash_s_digest(argc, argv, klass)); -} - -static VALUE siphash_s_rawdigest(int argc, VALUE *argv, VALUE klass) { uint8_t digest[8]; +#if LITTLE_ENDIAN + uint8_t roll[8]; + int i; +#endif _siphash_s_digest(digest, argc, argv); +#if LITTLE_ENDIAN + for (i = 0; i < 8; i++) { + roll[i] = digest[7 - i]; + } + memcpy(digest, roll, 8); +#endif return ULL2NUM(*(uint64_t *) digest); } void Init_siphash(void) { - VALUE mDigest, cDigest_StringBuffer; - id_DEFAULT_SEED = rb_intern("DEFAULT_SEED"); - id_seed = rb_intern("seed"); + iv_buffer = rb_intern("@buffer"); + iv_seed = rb_intern("@seed"); - /* Digest::SipHash is require that Digest::StringBuffer */ - mDigest = rb_path2class("Digest"); - cDigest_StringBuffer = rb_path2class("Digest::StringBuffer"); - - /* class Digest::SipHash < Digest::StringBuffer */ - cDigest_SipHash = rb_define_class_under(mDigest, "SipHash", cDigest_StringBuffer); + cDigest_SipHash = rb_path2class("Digest::SipHash"); rb_define_private_method(cDigest_SipHash, "finish", siphash_finish, 0); - rb_define_method(cDigest_SipHash, "to_i", siphash_to_i, 0); - rb_define_method(cDigest_SipHash, "seed", siphash_seed_get, 0); - rb_define_method(cDigest_SipHash, "seed=", siphash_seed_set, 1); - rb_define_const(cDigest_SipHash, "DEFAULT_SEED", rb_usascii_str_new(DEFAULT_SEED, 16)); rb_define_singleton_method(cDigest_SipHash, "digest", siphash_s_digest, -1); - rb_define_singleton_method(cDigest_SipHash, "hexdigest", siphash_s_hexdigest, -1); rb_define_singleton_method(cDigest_SipHash, "rawdigest", siphash_s_rawdigest, -1); }