diff options
Diffstat (limited to 'debian/vendor-h2o/deps/mruby-digest/src')
-rw-r--r-- | debian/vendor-h2o/deps/mruby-digest/src/digest.c | 1007 | ||||
-rw-r--r-- | debian/vendor-h2o/deps/mruby-digest/src/picohash.h | 751 |
2 files changed, 0 insertions, 1758 deletions
diff --git a/debian/vendor-h2o/deps/mruby-digest/src/digest.c b/debian/vendor-h2o/deps/mruby-digest/src/digest.c deleted file mode 100644 index 634376d..0000000 --- a/debian/vendor-h2o/deps/mruby-digest/src/digest.c +++ /dev/null @@ -1,1007 +0,0 @@ -/* -** digest.c - Digest and subclasses -** -** See Copyright Notice in mruby.h -*/ - -#include "mruby.h" - -#define USE_DIGEST_PICOHASH - -#if !defined(USE_DIGEST_PICOHASH) -#elif defined(__APPLE__) -#define USE_DIGEST_OSX_COMMONCRYPTO -#else -#define USE_DIGEST_OPENSSL -#endif - -#if defined(USE_DIGEST_PICOHASH) -#include "picohash.h" -#elif defined(USE_DIGEST_OPENSSL) -#include <openssl/evp.h> -#include <openssl/hmac.h> -#include <openssl/sha.h> -#elif defined(USE_DIGEST_OSX_COMMONCRYPTO) -#include <CommonCrypto/CommonDigest.h> -#include <CommonCrypto/CommonHMAC.h> -#else -#error "define USE_DIGEST_PICOHASH or USE_DIGEST_OPENSSL or USE_DIGEST_OSX_COMMONCRYPTO" -#endif -#include <limits.h> -#include <stdio.h> -#include <string.h> -#include "mruby/array.h" -#include "mruby/class.h" -#include "mruby/data.h" -#include "mruby/string.h" -#include "mruby/variable.h" - -#define TYPESYM "__type__" - - -/* - * library-independent layer API - */ -enum { - MD_TYPE_MD5, - MD_TYPE_RMD160, - MD_TYPE_SHA1, - MD_TYPE_SHA256, - MD_TYPE_SHA384, - MD_TYPE_SHA512, -}; - -struct mrb_md; -struct mrb_hmac; - -static void lib_init(void); -static int lib_md_block_length(const struct mrb_md *); -static mrb_value lib_md_digest(mrb_state *, const struct mrb_md *); -static mrb_value lib_md_digest_bang(mrb_state *, struct mrb_md *); -static int lib_md_digest_length(const struct mrb_md *); -static void lib_md_free(mrb_state *, void *); -static void lib_md_init(mrb_state *, struct mrb_md *, int); -static void lib_md_init_copy(mrb_state *, struct mrb_md *, struct mrb_md *); -static void lib_md_reset(mrb_state *, struct mrb_md *); -static void lib_md_update(mrb_state *, struct mrb_md *, unsigned char *, mrb_int); - -static mrb_value lib_hmac_digest(mrb_state *, const struct mrb_hmac *); -static int lib_hmac_block_length(const struct mrb_hmac *); -static int lib_hmac_digest_length(const struct mrb_hmac *); -static void lib_hmac_free(mrb_state *, void *); -static void lib_hmac_init(mrb_state *, struct mrb_hmac *, int, const unsigned char *, mrb_int); -static void lib_hmac_update(mrb_state *, struct mrb_hmac *, unsigned char *, mrb_int); - - -#if defined(USE_DIGEST_PICOHASH) - -#define HAVE_MD5 -#define HAVE_SHA1 - -struct mrb_md { - picohash_ctx_t ctx; -}; - -struct mrb_hmac { - picohash_ctx_t ctx; -}; - -static void -lib_md_free(mrb_state *mrb, void *ptr) -{ - struct mrb_md *md = ptr; - if (md != NULL) - mrb_free(mrb, md); -} - -static void -lib_hmac_free(mrb_state *mrb, void *ptr) -{ - struct mrb_hmac *hmac = ptr; - if (hmac != NULL) - mrb_free(mrb, hmac); -} - -static struct mrb_data_type mrb_md_type = { "MD", lib_md_free }; -static struct mrb_data_type mrb_hmac_type = { "HMAC", lib_hmac_free }; - -static void -lib_init(void) -{ -} - -static int -lib_md_block_length(const struct mrb_md *md) -{ - return (int)md->ctx.block_length; -} - -static mrb_value -lib_md_digest(mrb_state *mrb, const struct mrb_md *md) -{ - picohash_ctx_t ctx; - unsigned char mdstr[PICOHASH_MAX_DIGEST_LENGTH]; - - ctx = md->ctx; - picohash_final(&ctx, mdstr); - return mrb_str_new(mrb, (char *)mdstr, ctx.digest_length); -} - -static mrb_value -lib_md_digest_bang(mrb_state *mrb, struct mrb_md *md) -{ - unsigned char mdstr[PICOHASH_MAX_DIGEST_LENGTH]; - - picohash_final(&md->ctx, mdstr); - picohash_reset(&md->ctx); - return mrb_str_new(mrb, (char *)mdstr, md->ctx.digest_length); -} - -static int -lib_md_digest_length(const struct mrb_md *md) -{ - return md->ctx.digest_length; -} - -static void (*md_type_md(int type))(picohash_ctx_t *) -{ - switch (type) { - case MD_TYPE_MD5: return picohash_init_md5; - case MD_TYPE_SHA1: return picohash_init_sha1; - default: return NULL; - } -} - -static void -lib_md_init(mrb_state *mrb, struct mrb_md *md, int type) -{ - void (*ctor)(picohash_ctx_t *) = md_type_md(type); - if (ctor == NULL) - mrb_raise(mrb, E_NOTIMP_ERROR, "not supported"); - ctor(&md->ctx); -} - -static void -lib_md_init_copy(mrb_state *mrb, struct mrb_md *mdnew, struct mrb_md *mdold) -{ - mdnew->ctx = mdold->ctx; - picohash_reset(&mdnew->ctx); -} - -static void -lib_md_reset(mrb_state *mrb, struct mrb_md *md) -{ - picohash_reset(&md->ctx); -} - -static void -lib_md_update(mrb_state *mrb, struct mrb_md *md, unsigned char *str, mrb_int len) -{ -#if MRB_INT_MAX > SIZE_MAX - if (len > SIZE_MAX) - mrb_raise(mrb, E_ARGUMENT_ERROR, "too long string (not supported yet)"); -#endif - picohash_update(&md->ctx, str, len); -} - -static mrb_value -lib_hmac_digest(mrb_state *mrb, const struct mrb_hmac *hmac) -{ - picohash_ctx_t ctx; - unsigned char mdstr[PICOHASH_MAX_DIGEST_LENGTH]; - - ctx = hmac->ctx; - picohash_final(&ctx, mdstr); - return mrb_str_new(mrb, (char *)mdstr, ctx.digest_length); -} - -static int -lib_hmac_block_length(const struct mrb_hmac *hmac) -{ - return hmac->ctx.block_length; -} - -static int -lib_hmac_digest_length(const struct mrb_hmac *hmac) -{ - return hmac->ctx.digest_length; -} - -static void -lib_hmac_init(mrb_state *mrb, struct mrb_hmac *hmac, int type, const unsigned char *key, mrb_int keylen) -{ - void (*ctor)(picohash_ctx_t *) = md_type_md(type); - -#if MRB_INT_MAX > SIZE_MAX - if (keylen > SIZE_MAX) - mrb_raise(mrb, E_ARGUMENT_ERROR, "too long key"); -#endif - if (ctor == NULL) - mrb_raise(mrb, E_NOTIMP_ERROR, "not supported"); - picohash_init_hmac(&hmac->ctx, ctor, key, keylen); -} - -static void -lib_hmac_update(mrb_state *mrb, struct mrb_hmac *hmac, unsigned char *data, mrb_int len) -{ -#if MRB_INT_MAX > SIZE_MAX - if (len > SIZE_MAX) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "too long string (not supported yet)"); - } -#endif - picohash_update(&hmac->ctx, data, len); -} - -#elif defined(USE_DIGEST_OPENSSL) -/* - * OpenSSL Implementation - */ - -#define HAVE_MD5 - -#ifndef OPENSSL_NO_RIPEMD -#define HAVE_RMD160 -#endif - -#define HAVE_SHA1 -#ifdef SHA256_DIGEST_LENGTH -#define HAVE_SHA256 -#endif -#ifdef SHA512_DIGEST_LENGTH -#define HAVE_SHA384 -#define HAVE_SHA512 -#endif - -struct mrb_md { - EVP_MD_CTX *ctx; -}; - -struct mrb_hmac { - HMAC_CTX ctx; - const EVP_MD *md; -}; - -static void -lib_md_free(mrb_state *mrb, void *ptr) -{ - struct mrb_md *md = ptr; - - if (md != NULL) { - if (md->ctx != NULL) { - EVP_MD_CTX_destroy(md->ctx); - } - mrb_free(mrb, md); - } -} - -static void -lib_hmac_free(mrb_state *mrb, void *ptr) -{ - struct mrb_hmac *hmac = ptr; - - if (hmac != NULL) { - HMAC_CTX_cleanup(&hmac->ctx); - mrb_free(mrb, hmac); - } -} - -static struct mrb_data_type mrb_md_type = { "MD", lib_md_free }; -static struct mrb_data_type mrb_hmac_type = { "HMAC", lib_hmac_free }; - -static void -lib_init(void) -{ - OpenSSL_add_all_digests(); -} - -static int -lib_md_block_length(const struct mrb_md *md) -{ - return EVP_MD_CTX_block_size(md->ctx); -} - -static mrb_value -lib_md_digest(mrb_state *mrb, const struct mrb_md *md) -{ - EVP_MD_CTX ctx; - unsigned int mdlen; - unsigned char mdstr[EVP_MAX_MD_SIZE]; - - EVP_MD_CTX_copy(&ctx, md->ctx); - EVP_DigestFinal(&ctx, mdstr, &mdlen); - return mrb_str_new(mrb, (char *)mdstr, mdlen); -} - -static mrb_value -lib_md_digest_bang(mrb_state *mrb, struct mrb_md *md) -{ - unsigned int mdlen; - unsigned char mdstr[EVP_MAX_MD_SIZE]; - - EVP_DigestFinal_ex(md->ctx, mdstr, &mdlen); - EVP_DigestInit_ex(md->ctx, EVP_MD_CTX_md(md->ctx), NULL); - return mrb_str_new(mrb, (char *)mdstr, mdlen); -} - -static int -lib_md_digest_length(const struct mrb_md *md) -{ - return EVP_MD_CTX_size(md->ctx); -} - -const EVP_MD * -md_type_md(int type) -{ - switch (type) { - case MD_TYPE_MD5: return EVP_md5(); -#ifdef HAVE_RMD160 - case MD_TYPE_RMD160: return EVP_ripemd160(); -#endif - case MD_TYPE_SHA1: return EVP_sha1(); -#ifdef HAVE_SHA256 - case MD_TYPE_SHA256: return EVP_sha256(); -#endif -#ifdef HAVE_SHA512 - case MD_TYPE_SHA384: return EVP_sha384(); - case MD_TYPE_SHA512: return EVP_sha512(); -#endif - default: return NULL; - } -} - -static void -lib_md_init(mrb_state *mrb, struct mrb_md *md, int type) -{ - const EVP_MD *evpmd; - - md->ctx = NULL; - evpmd = md_type_md(type); - if (!evpmd) { - mrb_raise(mrb, E_NOTIMP_ERROR, "not supported"); - } - md->ctx = EVP_MD_CTX_create(); - EVP_DigestInit_ex(md->ctx, evpmd, NULL); -} - -static void -lib_md_init_copy(mrb_state *mrb, struct mrb_md *mdnew, struct mrb_md *mdold) -{ - mdnew->ctx = EVP_MD_CTX_create(); - EVP_DigestInit_ex(mdnew->ctx, EVP_MD_CTX_md(mdold->ctx), NULL); -} - -static void -lib_md_reset(mrb_state *mrb, struct mrb_md *md) -{ - //EVP_MD_CTX_init(&md->ctx); - EVP_DigestInit_ex(md->ctx, EVP_MD_CTX_md(md->ctx), NULL); -} - -static void -lib_md_update(mrb_state *mrb, struct mrb_md *md, unsigned char *str, mrb_int len) -{ -#if MRB_INT_MAX > SIZE_MAX - if (len > SIZE_MAX) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "too long string (not supported yet)"); - } -#endif - EVP_DigestUpdate(md->ctx, str, len); -} - -static mrb_value -lib_hmac_digest(mrb_state *mrb, const struct mrb_hmac *hmac) -{ - HMAC_CTX ctx; - unsigned int mdlen; - unsigned char mdstr[EVP_MAX_MD_SIZE]; - - memcpy(&ctx, &hmac->ctx, sizeof(ctx)); - HMAC_Final(&ctx, mdstr, &mdlen); - return mrb_str_new(mrb, (char *)mdstr, mdlen); -} - -static int -lib_hmac_block_length(const struct mrb_hmac *hmac) -{ - return EVP_MD_block_size(hmac->md); -} - -static int -lib_hmac_digest_length(const struct mrb_hmac *hmac) -{ - return EVP_MD_size(hmac->md); -} - -static void -lib_hmac_init(mrb_state *mrb, struct mrb_hmac *hmac, int type, const unsigned char *key, mrb_int keylen) -{ -#if MRB_INT_MAX > INT_MAX - if (keylen > INT_MAX) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "too long key"); - } -#endif - hmac->md = md_type_md(type); - HMAC_CTX_init(&hmac->ctx); - HMAC_Init_ex(&hmac->ctx, key, keylen, hmac->md, NULL); -} - -static void -lib_hmac_update(mrb_state *mrb, struct mrb_hmac *hmac, unsigned char *data, mrb_int len) -{ -#if MRB_INT_MAX > INT_MAX - if (len > INT_MAX) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "too long string (not supported yet)"); - } -#endif - HMAC_Update(&hmac->ctx, data, len); -} - -#elif defined(USE_DIGEST_OSX_COMMONCRYPTO) -/* - * Mac OS X CommonCrypto Implementation - */ - -#define HAVE_MD5 -/* #define HAVE_RMD160 */ -#define HAVE_SHA1 -#define HAVE_SHA256 -#define HAVE_SHA384 -#define HAVE_SHA512 - -struct mrb_md { - int type; - void *ctx; - int ctx_size; -}; - -struct mrb_hmac { - int type; - CCHmacContext ctx; -}; - -static int -md_ctx_size(int type) -{ - switch (type) { - case MD_TYPE_MD5: return sizeof(CC_MD5_CTX); - case MD_TYPE_SHA1: return sizeof(CC_SHA1_CTX); - case MD_TYPE_SHA256: return sizeof(CC_SHA256_CTX); - case MD_TYPE_SHA384: return sizeof(CC_SHA512_CTX); /* ! */ - case MD_TYPE_SHA512: return sizeof(CC_SHA512_CTX); - default: return 0; - } -} - -static void -lib_md_free(mrb_state *mrb, void *ptr) -{ - struct mrb_md *md = ptr; - - memset(md->ctx, 0, md_ctx_size(md->type)); - mrb_free(mrb, md->ctx); - mrb_free(mrb, md); -} - -static void -lib_hmac_free(mrb_state *mrb, void *ptr) -{ - struct mrb_hmac *hmac = ptr; - - memset(&hmac->ctx, 0, sizeof(hmac->ctx)); - mrb_free(mrb, hmac); -} - -static struct mrb_data_type mrb_md_type = { "MD", lib_md_free }; -static struct mrb_data_type mrb_hmac_type = { "HMAC", lib_hmac_free }; - -#define MAX_DIGEST_LENGTH CC_SHA512_DIGEST_LENGTH - -union ctx_union { - CC_MD5_CTX md5; - CC_SHA1_CTX sha1; - CC_SHA256_CTX sha256; - /* we don't have CC_SHA384_CTX! */ - CC_SHA512_CTX sha512; -}; - -static void -lib_init(void) -{ -} - -static int -md_block_length(int type) -{ - switch (type) { - case MD_TYPE_MD5: return CC_MD5_BLOCK_BYTES; - case MD_TYPE_SHA1: return CC_SHA1_BLOCK_BYTES; - case MD_TYPE_SHA256: return CC_SHA256_BLOCK_BYTES; - case MD_TYPE_SHA384: return CC_SHA384_BLOCK_BYTES; - case MD_TYPE_SHA512: return CC_SHA512_BLOCK_BYTES; - default: return 0; - } -} - -static int -lib_md_block_length(const struct mrb_md *md) -{ - return md_block_length(md->type); -} - -static void -md_init(int type, void *ctxp) -{ - switch (type) { - case MD_TYPE_MD5: CC_MD5_Init(ctxp); break; - case MD_TYPE_SHA1: CC_SHA1_Init(ctxp); break; - case MD_TYPE_SHA256: CC_SHA256_Init(ctxp); break; - case MD_TYPE_SHA384: CC_SHA384_Init(ctxp); break; - case MD_TYPE_SHA512: CC_SHA512_Init(ctxp); break; - default: break; - } -} - -static void -md_final(int type, unsigned char *str, void *ctx) -{ - switch (type) { - case MD_TYPE_MD5: CC_MD5_Final(str, ctx); break; - case MD_TYPE_SHA1: CC_SHA1_Final(str, ctx); break; - case MD_TYPE_SHA256: CC_SHA256_Final(str, ctx); break; - case MD_TYPE_SHA384: CC_SHA384_Final(str, ctx); break; - case MD_TYPE_SHA512: CC_SHA512_Final(str, ctx); break; - default: break; - } -} - -static int -md_digest_length(int type) -{ - switch (type) { - case MD_TYPE_MD5: return 16; - case MD_TYPE_SHA1: return 20; - case MD_TYPE_SHA256: return 32; - case MD_TYPE_SHA384: return 48; - case MD_TYPE_SHA512: return 64; - default: return 0; - } -} - -static mrb_value -lib_md_digest(mrb_state *mrb, const struct mrb_md *md) -{ - union ctx_union ctx; - unsigned char mdstr[MAX_DIGEST_LENGTH]; - - memcpy(&ctx, md->ctx, md_ctx_size(md->type)); - md_final(md->type, mdstr, &ctx); - return mrb_str_new(mrb, (char *)mdstr, md_digest_length(md->type)); -} - -static mrb_value -lib_md_digest_bang(mrb_state *mrb, struct mrb_md *md) -{ - unsigned char mdstr[MAX_DIGEST_LENGTH]; - - md_final(md->type, mdstr, md->ctx); - md_init(md->type, md->ctx); - return mrb_str_new(mrb, (char *)mdstr, md_digest_length(md->type)); -} - -static int -lib_md_digest_length(const struct mrb_md *md) -{ - return md_digest_length(md->type); -} - -static void -lib_md_init(mrb_state *mrb, struct mrb_md *md, int type) -{ - int ctxsize; - - ctxsize = md_ctx_size(type); - if (ctxsize == 0) { - mrb_raise(mrb, E_NOTIMP_ERROR, "not supported"); - } - md->type = type; - md->ctx = NULL; - md->ctx = mrb_malloc(mrb, ctxsize); - md_init(type, md->ctx); -} - -static void -lib_md_init_copy(mrb_state *mrb, struct mrb_md *mdnew, struct mrb_md *mdold) -{ - lib_md_init(mrb, mdnew, mdold->type); -} - -static void -lib_md_reset(mrb_state *mrb, struct mrb_md *md) -{ - md_init(md->type, md->ctx); -} - -static void -lib_md_update(mrb_state *mrb, struct mrb_md *md, unsigned char *data, mrb_int len) -{ - if (sizeof(len) > sizeof(CC_LONG)) { - if (len != (CC_LONG)len) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "too long string (not supported yet)"); - } - } - switch (md->type) { - case MD_TYPE_MD5: CC_MD5_Update(md->ctx, data, len); break; - case MD_TYPE_SHA1: CC_SHA1_Update(md->ctx, data, len); break; - case MD_TYPE_SHA256: CC_SHA256_Update(md->ctx, data, len); break; - case MD_TYPE_SHA384: CC_SHA384_Update(md->ctx, data, len); break; - case MD_TYPE_SHA512: CC_SHA512_Update(md->ctx, data, len); break; - default: break; - } -} - -static int -lib_hmac_block_length(const struct mrb_hmac *hmac) -{ - return md_block_length(hmac->type); -} - -static mrb_value -lib_hmac_digest(mrb_state *mrb, const struct mrb_hmac *hmac) -{ - CCHmacContext ctx; - unsigned char str[MAX_DIGEST_LENGTH]; - - memcpy(&ctx, &hmac->ctx, sizeof(ctx)); - CCHmacFinal(&ctx, str); - return mrb_str_new(mrb, (const char *)str, md_digest_length(hmac->type)); -} - -static int -lib_hmac_digest_length(const struct mrb_hmac *hmac) -{ - return md_digest_length(hmac->type); -} - -static void -lib_hmac_init(mrb_state *mrb, struct mrb_hmac *hmac, int type, const unsigned char *key, mrb_int keylen) -{ - CCHmacAlgorithm algorithm; - -#if MRB_INT_MAX > SIZE_MAX - if (len > SIZE_MAX) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "too long key"); - } -#endif - switch (type) { - case MD_TYPE_MD5: algorithm = kCCHmacAlgMD5; break; - case MD_TYPE_SHA1: algorithm = kCCHmacAlgSHA1; break; - case MD_TYPE_SHA256: algorithm = kCCHmacAlgSHA256; break; - case MD_TYPE_SHA384: algorithm = kCCHmacAlgSHA384; break; - case MD_TYPE_SHA512: algorithm = kCCHmacAlgSHA512; break; - default: - mrb_raisef(mrb, E_RUNTIME_ERROR, "mruby-digest: internal error: unexpected HMAC type: %S", mrb_fixnum_value(type)); - algorithm = 0; - break; - } - hmac->type = type; - CCHmacInit(&hmac->ctx, algorithm, key, keylen); -} - -static void -lib_hmac_update(mrb_state *mrb, struct mrb_hmac *hmac, unsigned char *data, mrb_int len) -{ -#if MRB_INT_MAX > SIZE_MAX - if (len > SIZE_MAX) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "too long string"); - } -#endif - CCHmacUpdate(&hmac->ctx, data, len); -} - -#endif - -static void -basecheck(mrb_state *mrb, mrb_value self, struct mrb_md **mdp) -{ - struct RClass *c; - struct mrb_md *md; - mrb_value t; - - c = mrb_obj_class(mrb, self); - t = mrb_const_get(mrb, mrb_obj_value(c), mrb_intern_lit(mrb, TYPESYM)); - if (mrb_nil_p(t)) { - mrb_raise(mrb, E_NOTIMP_ERROR, "Digest::Base is an abstract class"); - } - md = (struct mrb_md *)DATA_PTR(self); - if (!md) { - mrb_raise(mrb, E_RUNTIME_ERROR, "no md found (BUG?)"); - } - if (mdp) *mdp = md; -} - -static mrb_value -mrb_digest_block_length(mrb_state *mrb, mrb_value self) -{ - struct mrb_md *md; - - basecheck(mrb, self, &md); - return mrb_fixnum_value(lib_md_block_length(md)); -} - -static mrb_value -mrb_digest_digest(mrb_state *mrb, mrb_value self) -{ - struct mrb_md *md; - - md = (struct mrb_md *)DATA_PTR(self); - if (!md) return mrb_nil_value(); - return lib_md_digest(mrb, md); -} - -static mrb_value -mrb_digest_digest_bang(mrb_state *mrb, mrb_value self) -{ - struct mrb_md *md; - - md = (struct mrb_md *)DATA_PTR(self); - if (!md) return mrb_nil_value(); - return lib_md_digest_bang(mrb, md); -} - -static mrb_value -mrb_digest_digest_length(mrb_state *mrb, mrb_value self) -{ - struct mrb_md *md; - - basecheck(mrb, self, &md); - return mrb_fixnum_value(lib_md_digest_length(md)); -} - -static mrb_value -digest2hexdigest(mrb_state *mrb, mrb_value b) -{ - mrb_value h; - int i, len; - char *bp, buf[3]; - - bp = RSTRING_PTR(b); - len = RSTRING_LEN(b); - h = mrb_str_buf_new(mrb, len * 2); - for (i = 0; i < len; i++) { - snprintf(buf, sizeof(buf), "%02x", (unsigned char )bp[i]); - mrb_str_buf_cat(mrb, h, buf, 2); - } - return h; -} - -static mrb_value -mrb_digest_hexdigest(mrb_state *mrb, mrb_value self) -{ - return digest2hexdigest(mrb, mrb_digest_digest(mrb, self)); -} - -static mrb_value -mrb_digest_init(mrb_state *mrb, mrb_value self) -{ - struct RClass *c; - struct mrb_md *md; - mrb_value t; - - md = (struct mrb_md *)DATA_PTR(self); - if (md) { - lib_md_free(mrb, md); - } - DATA_TYPE(self) = &mrb_md_type; - DATA_PTR(self) = NULL; - - c = mrb_obj_class(mrb, self); - if (!mrb_const_defined(mrb, mrb_obj_value(c), mrb_intern_lit(mrb, TYPESYM))) { - mrb_raise(mrb, E_NOTIMP_ERROR, "Digest::Base is an abstract class"); - } - t = mrb_const_get(mrb, mrb_obj_value(c), mrb_intern_lit(mrb, TYPESYM)); -#if 0 - if (lib_md_supported(t)) { - mrb_raise(mrb, E_NOTIMP_ERROR, "unknown algorithm"); - } -#endif - - md = (struct mrb_md *)mrb_malloc(mrb, sizeof(*md)); - DATA_PTR(self) = md; - lib_md_init(mrb, md, mrb_fixnum(t)); - return self; -} - -static mrb_value -mrb_digest_init_copy(mrb_state *mrb, mrb_value copy) -{ - struct mrb_md *m1, *m2; - mrb_value src; - - mrb_get_args(mrb, "o", &src); - if (mrb_obj_equal(mrb, copy, src)) return copy; - if (!mrb_obj_is_instance_of(mrb, src, mrb_obj_class(mrb, copy))) { - mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class"); - } - if (!DATA_PTR(copy)) { - DATA_PTR(copy) = mrb_malloc(mrb, sizeof(struct mrb_md)); - DATA_TYPE(copy) = &mrb_md_type; - } - m1 = DATA_PTR(src); - m2 = DATA_PTR(copy); - lib_md_init_copy(mrb, m2, m1); - return copy; -} - -static mrb_value -mrb_digest_reset(mrb_state *mrb, mrb_value self) -{ - struct mrb_md *md; - - md = (struct mrb_md *)DATA_PTR(self); - if (!md) return mrb_nil_value(); - lib_md_reset(mrb, md); - return self; -} - -static mrb_value -mrb_digest_update(mrb_state *mrb, mrb_value self) -{ - struct mrb_md *md; - mrb_int len; - char *str; - - md = (struct mrb_md *)DATA_PTR(self); - if (!md) return mrb_nil_value(); - mrb_get_args(mrb, "s", &str, &len); - lib_md_update(mrb, md, (unsigned char *)str, len); - return self; -} - -static mrb_value -mrb_hmac_block_length(mrb_state *mrb, mrb_value self) -{ - struct mrb_hmac *hmac; - - hmac = (struct mrb_hmac *)DATA_PTR(self); - if (!hmac) return mrb_nil_value(); - return mrb_fixnum_value(lib_hmac_block_length(hmac)); -} - -static mrb_value -mrb_hmac_digest(mrb_state *mrb, mrb_value self) -{ - struct mrb_hmac *hmac; - - hmac = (struct mrb_hmac *)DATA_PTR(self); - if (!hmac) return mrb_nil_value(); - return lib_hmac_digest(mrb, hmac); -} - -static mrb_value -mrb_hmac_digest_length(mrb_state *mrb, mrb_value self) -{ - struct mrb_hmac *hmac; - - hmac = (struct mrb_hmac *)DATA_PTR(self); - if (!hmac) return mrb_nil_value(); - return mrb_fixnum_value(lib_hmac_digest_length(hmac)); -} - -static mrb_value -mrb_hmac_hexdigest(mrb_state *mrb, mrb_value self) -{ - return digest2hexdigest(mrb, mrb_hmac_digest(mrb, self)); -} - -static mrb_value -mrb_hmac_init(mrb_state *mrb, mrb_value self) -{ - struct mrb_hmac *hmac; - mrb_value digest, t; - mrb_int keylen; - char *key; - - hmac = (struct mrb_hmac *)DATA_PTR(self); - if (hmac) { - lib_hmac_free(mrb, hmac); - } - DATA_TYPE(self) = &mrb_hmac_type; - DATA_PTR(self) = NULL; - - mrb_get_args(mrb, "so", &key, &keylen, &digest); - t = mrb_const_get(mrb, digest, mrb_intern_lit(mrb, TYPESYM)); - if (mrb_nil_p(t)) { - mrb_raise(mrb, E_RUNTIME_ERROR, "not a digester"); - } - - hmac = (struct mrb_hmac *)mrb_malloc(mrb, sizeof(*hmac)); - DATA_PTR(self) = hmac; - lib_hmac_init(mrb, hmac, mrb_fixnum(t), (unsigned char *)key, keylen); - return self; -} - -static mrb_value -mrb_hmac_init_copy(mrb_state *mrb, mrb_value copy) -{ - mrb_raise(mrb, E_RUNTIME_ERROR, "cannot duplicate HMAC"); - return copy; -} - -static mrb_value -mrb_hmac_update(mrb_state *mrb, mrb_value self) -{ - struct mrb_hmac *hmac; - mrb_int len; - char *str; - - hmac = (struct mrb_hmac *)DATA_PTR(self); - if (!hmac) return mrb_nil_value(); - mrb_get_args(mrb, "s", &str, &len); - lib_hmac_update(mrb, hmac, (unsigned char *)str, len); - return self; -} - - -void -mrb_mruby_digest_gem_init(mrb_state *mrb) -{ - struct RClass *b, *d, *h; - - lib_init(); - - d = mrb_define_module(mrb, "Digest"); - - b = mrb_define_class_under(mrb, d, "Base", mrb->object_class); - mrb_define_method(mrb, b, "block_length", mrb_digest_block_length, MRB_ARGS_NONE()); - mrb_define_method(mrb, b, "digest", mrb_digest_digest, MRB_ARGS_NONE()); - mrb_define_method(mrb, b, "digest!", mrb_digest_digest_bang, MRB_ARGS_NONE()); /* XXX: can be defined in mrblib... */ - mrb_define_method(mrb, b, "digest_length", mrb_digest_digest_length, MRB_ARGS_NONE()); - //mrb_define_method(mrb, b, "file", mrb_digest_file, MRB_ARGS_REQ(1)); - mrb_define_method(mrb, b, "hexdigest", mrb_digest_hexdigest, MRB_ARGS_NONE()); - //mrb_define_method(mrb, b, "hexdigest!", mrb_digest_hexdigest_bang, MRB_ARGS_NONE()); /* XXX: can be defined in mrblib... */ - mrb_define_method(mrb, b, "initialize", mrb_digest_init, MRB_ARGS_NONE()); - mrb_define_method(mrb, b, "initialize_copy", mrb_digest_init_copy, MRB_ARGS_REQ(1)); - mrb_define_method(mrb, b, "reset", mrb_digest_reset, MRB_ARGS_NONE()); - mrb_define_method(mrb, b, "update", mrb_digest_update, MRB_ARGS_REQ(1)); - -#define DEFCLASS(n) \ -do { \ - struct RClass *a = mrb_define_class_under(mrb, d, #n, b); \ - MRB_SET_INSTANCE_TT(a, MRB_TT_DATA); \ - mrb_define_const(mrb, a, TYPESYM, mrb_fixnum_value(MD_TYPE_##n)); \ -} while (0) - -#ifdef HAVE_MD5 - DEFCLASS(MD5); -#endif -#ifdef HAVE_RMD160 - DEFCLASS(RMD160); -#endif -#ifdef HAVE_SHA1 - DEFCLASS(SHA1); -#endif -#ifdef HAVE_SHA256 - DEFCLASS(SHA256); -#endif -#ifdef HAVE_SHA384 - DEFCLASS(SHA384); -#endif -#ifdef HAVE_SHA512 - DEFCLASS(SHA512); -#endif - - h = mrb_define_class_under(mrb, d, "HMAC", mrb->object_class); - MRB_SET_INSTANCE_TT(h, MRB_TT_DATA); - mrb_define_method(mrb, h, "block_length", mrb_hmac_block_length, MRB_ARGS_NONE()); - mrb_define_method(mrb, h, "digest", mrb_hmac_digest, MRB_ARGS_NONE()); - mrb_define_method(mrb, h, "digest_length", mrb_hmac_digest_length, MRB_ARGS_NONE()); - mrb_define_method(mrb, h, "hexdigest", mrb_hmac_hexdigest, MRB_ARGS_NONE()); - mrb_define_method(mrb, h, "initialize", mrb_hmac_init, MRB_ARGS_REQ(2)); - mrb_define_method(mrb, h, "initialize_copy", mrb_hmac_init_copy, MRB_ARGS_REQ(1)); - mrb_define_method(mrb, h, "update", mrb_hmac_update, MRB_ARGS_REQ(1)); -} - -void -mrb_mruby_digest_gem_final(mrb_state *mrb) -{ -} diff --git a/debian/vendor-h2o/deps/mruby-digest/src/picohash.h b/debian/vendor-h2o/deps/mruby-digest/src/picohash.h deleted file mode 100644 index 4c0206d..0000000 --- a/debian/vendor-h2o/deps/mruby-digest/src/picohash.h +++ /dev/null @@ -1,751 +0,0 @@ -/* - * The code is placed under public domain by Kazuho Oku <kazuhooku@gmail.com>. - * - * The MD5 implementation is based on a public domain implementation written by - * Solar Designer <solar@openwall.com> in 2001, which is used by Dovecot. - * - * The SHA1 implementation is based on a public domain implementation written - * by Wei Dai and other contributors for libcrypt, used also in liboauth. - * - * The SHA224/SHA256 implementation is based on a public domain implementation - * by Sam Hocevar <sam@hocevar.net> for LibTomCrypt. - */ -#ifndef _picohash_h_ -#define _picohash_h_ - -#include <assert.h> -#include <inttypes.h> -#include <string.h> - -#ifdef __BIG_ENDIAN__ -#define _PICOHASH_BIG_ENDIAN -#elif defined __LITTLE_ENDIAN__ -/* override */ -#elif defined __BYTE_ORDER -#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ -#define _PICOHASH_BIG_ENDIAN -#endif -#else // ! defined __LITTLE_ENDIAN__ -#include <endian.h> // machine/endian.h -#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ -#define _PICOHASH_BIG_ENDIAN -#endif -#endif - -#define PICOHASH_MD5_BLOCK_LENGTH 64 -#define PICOHASH_MD5_DIGEST_LENGTH 16 - -typedef struct { - uint_fast32_t lo, hi; - uint_fast32_t a, b, c, d; - unsigned char buffer[64]; - uint_fast32_t block[PICOHASH_MD5_DIGEST_LENGTH]; -} _picohash_md5_ctx_t; - -static void _picohash_md5_init(_picohash_md5_ctx_t *ctx); -static void _picohash_md5_update(_picohash_md5_ctx_t *ctx, const void *data, size_t size); -static void _picohash_md5_final(_picohash_md5_ctx_t *ctx, void *digest); - -#define PICOHASH_SHA1_BLOCK_LENGTH 64 -#define PICOHASH_SHA1_DIGEST_LENGTH 20 - -typedef struct { - uint32_t buffer[PICOHASH_SHA1_BLOCK_LENGTH / 4]; - uint32_t state[PICOHASH_SHA1_DIGEST_LENGTH / 4]; - uint64_t byteCount; - uint8_t bufferOffset; -} _picohash_sha1_ctx_t; - -static void _picohash_sha1_init(_picohash_sha1_ctx_t *ctx); -static void _picohash_sha1_update(_picohash_sha1_ctx_t *ctx, const void *input, size_t len); -static void _picohash_sha1_final(_picohash_sha1_ctx_t *ctx, void *digest); - -#define PICOHASH_SHA256_BLOCK_LENGTH 64 -#define PICOHASH_SHA256_DIGEST_LENGTH 32 -#define PICOHASH_SHA224_BLOCK_LENGTH PICOHASH_SHA256_BLOCK_LENGTH -#define PICOHASH_SHA224_DIGEST_LENGTH 28 - -typedef struct { - uint64_t length; - uint32_t state[PICOHASH_SHA256_DIGEST_LENGTH / 4]; - uint32_t curlen; - unsigned char buf[PICOHASH_SHA256_BLOCK_LENGTH]; -} _picohash_sha256_ctx_t; - -static void _picohash_sha256_init(_picohash_sha256_ctx_t *ctx); -static void _picohash_sha256_update(_picohash_sha256_ctx_t *ctx, const void *data, size_t len); -static void _picohash_sha256_final(_picohash_sha256_ctx_t *ctx, void *digest); -static void _picohash_sha224_init(_picohash_sha256_ctx_t *ctx); -static void _picohash_sha224_final(_picohash_sha256_ctx_t *ctx, void *digest); - -#define PICOHASH_MAX_BLOCK_LENGTH 64 -#define PICOHASH_MAX_DIGEST_LENGTH 32 - -typedef struct { - union { - _picohash_md5_ctx_t _md5; - _picohash_sha1_ctx_t _sha1; - _picohash_sha256_ctx_t _sha256; - }; - size_t block_length; - size_t digest_length; - void (*_reset)(void *ctx); - void (*_update)(void *ctx, const void *input, size_t len); - void (*_final)(void *ctx, void *digest); - struct { - unsigned char key[PICOHASH_MAX_BLOCK_LENGTH]; - void (*hash_reset)(void *ctx); - void (*hash_final)(void *ctx, void *digest); - } _hmac; -} picohash_ctx_t; - -static void picohash_init_md5(picohash_ctx_t *ctx); -static void picohash_init_sha1(picohash_ctx_t *ctx); -static void picohash_init_sha224(picohash_ctx_t *ctx); -static void picohash_init_sha256(picohash_ctx_t *ctx); -static void picohash_update(picohash_ctx_t *ctx, const void *input, size_t len); -static void picohash_final(picohash_ctx_t *ctx, void *digest); -static void picohash_reset(picohash_ctx_t *ctx); - -static void picohash_init_hmac(picohash_ctx_t *ctx, void (*initf)(picohash_ctx_t *), const void *key, size_t key_len); - -/* following are private definitions */ - -/* - * The basic MD5 functions. - * - * F is optimized compared to its RFC 1321 definition just like in Colin - * Plumb's implementation. - */ -#define _PICOHASH_MD5_F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) -#define _PICOHASH_MD5_G(x, y, z) ((y) ^ ((z) & ((x) ^ (y)))) -#define _PICOHASH_MD5_H(x, y, z) ((x) ^ (y) ^ (z)) -#define _PICOHASH_MD5_I(x, y, z) ((y) ^ ((x) | ~(z))) - -/* - * The MD5 transformation for all four rounds. - */ -#define _PICOHASH_MD5_STEP(f, a, b, c, d, x, t, s) \ - (a) += f((b), (c), (d)) + (x) + (t); \ - (a) = (((a) << (s)) | (((a)&0xffffffff) >> (32 - (s)))); \ - (a) += (b); - -/* - * SET reads 4 input bytes in little-endian byte order and stores them - * in a properly aligned word in host byte order. - * - * The check for little-endian architectures which tolerate unaligned - * memory accesses is just an optimization. Nothing will break if it - * doesn't work. - */ -#if defined(__i386__) || defined(__x86_64__) || defined(__vax__) -#define _PICOHASH_MD5_SET(n) (*(const uint32_t *)&ptr[(n)*4]) -#define _PICOHASH_MD5_GET(n) _PICOHASH_MD5_SET(n) -#else -#define _PICOHASH_MD5_SET(n) \ - (ctx->block[(n)] = (uint_fast32_t)ptr[(n)*4] | ((uint_fast32_t)ptr[(n)*4 + 1] << 8) | ((uint_fast32_t)ptr[(n)*4 + 2] << 16) | \ - ((uint_fast32_t)ptr[(n)*4 + 3] << 24)) -#define _PICOHASH_MD5_GET(n) (ctx->block[(n)]) -#endif - -/* - * This processes one or more 64-byte data blocks, but does NOT update - * the bit counters. There're no alignment requirements. - */ -static const void *_picohash_md5_body(_picohash_md5_ctx_t *ctx, const void *data, size_t size) -{ - const unsigned char *ptr; - uint_fast32_t a, b, c, d; - uint_fast32_t saved_a, saved_b, saved_c, saved_d; - - ptr = data; - - a = ctx->a; - b = ctx->b; - c = ctx->c; - d = ctx->d; - - do { - saved_a = a; - saved_b = b; - saved_c = c; - saved_d = d; - - /* Round 1 */ - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, a, b, c, d, _PICOHASH_MD5_SET(0), 0xd76aa478, 7) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, d, a, b, c, _PICOHASH_MD5_SET(1), 0xe8c7b756, 12) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, c, d, a, b, _PICOHASH_MD5_SET(2), 0x242070db, 17) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, b, c, d, a, _PICOHASH_MD5_SET(3), 0xc1bdceee, 22) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, a, b, c, d, _PICOHASH_MD5_SET(4), 0xf57c0faf, 7) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, d, a, b, c, _PICOHASH_MD5_SET(5), 0x4787c62a, 12) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, c, d, a, b, _PICOHASH_MD5_SET(6), 0xa8304613, 17) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, b, c, d, a, _PICOHASH_MD5_SET(7), 0xfd469501, 22) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, a, b, c, d, _PICOHASH_MD5_SET(8), 0x698098d8, 7) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, d, a, b, c, _PICOHASH_MD5_SET(9), 0x8b44f7af, 12) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, c, d, a, b, _PICOHASH_MD5_SET(10), 0xffff5bb1, 17) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, b, c, d, a, _PICOHASH_MD5_SET(11), 0x895cd7be, 22) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, a, b, c, d, _PICOHASH_MD5_SET(12), 0x6b901122, 7) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, d, a, b, c, _PICOHASH_MD5_SET(13), 0xfd987193, 12) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, c, d, a, b, _PICOHASH_MD5_SET(14), 0xa679438e, 17) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_F, b, c, d, a, _PICOHASH_MD5_SET(15), 0x49b40821, 22) - - /* Round 2 */ - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, a, b, c, d, _PICOHASH_MD5_GET(1), 0xf61e2562, 5) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, d, a, b, c, _PICOHASH_MD5_GET(6), 0xc040b340, 9) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, c, d, a, b, _PICOHASH_MD5_GET(11), 0x265e5a51, 14) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, b, c, d, a, _PICOHASH_MD5_GET(0), 0xe9b6c7aa, 20) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, a, b, c, d, _PICOHASH_MD5_GET(5), 0xd62f105d, 5) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, d, a, b, c, _PICOHASH_MD5_GET(10), 0x02441453, 9) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, c, d, a, b, _PICOHASH_MD5_GET(15), 0xd8a1e681, 14) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, b, c, d, a, _PICOHASH_MD5_GET(4), 0xe7d3fbc8, 20) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, a, b, c, d, _PICOHASH_MD5_GET(9), 0x21e1cde6, 5) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, d, a, b, c, _PICOHASH_MD5_GET(14), 0xc33707d6, 9) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, c, d, a, b, _PICOHASH_MD5_GET(3), 0xf4d50d87, 14) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, b, c, d, a, _PICOHASH_MD5_GET(8), 0x455a14ed, 20) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, a, b, c, d, _PICOHASH_MD5_GET(13), 0xa9e3e905, 5) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, d, a, b, c, _PICOHASH_MD5_GET(2), 0xfcefa3f8, 9) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, c, d, a, b, _PICOHASH_MD5_GET(7), 0x676f02d9, 14) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_G, b, c, d, a, _PICOHASH_MD5_GET(12), 0x8d2a4c8a, 20) - - /* Round 3 */ - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, a, b, c, d, _PICOHASH_MD5_GET(5), 0xfffa3942, 4) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, d, a, b, c, _PICOHASH_MD5_GET(8), 0x8771f681, 11) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, c, d, a, b, _PICOHASH_MD5_GET(11), 0x6d9d6122, 16) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, b, c, d, a, _PICOHASH_MD5_GET(14), 0xfde5380c, 23) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, a, b, c, d, _PICOHASH_MD5_GET(1), 0xa4beea44, 4) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, d, a, b, c, _PICOHASH_MD5_GET(4), 0x4bdecfa9, 11) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, c, d, a, b, _PICOHASH_MD5_GET(7), 0xf6bb4b60, 16) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, b, c, d, a, _PICOHASH_MD5_GET(10), 0xbebfbc70, 23) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, a, b, c, d, _PICOHASH_MD5_GET(13), 0x289b7ec6, 4) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, d, a, b, c, _PICOHASH_MD5_GET(0), 0xeaa127fa, 11) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, c, d, a, b, _PICOHASH_MD5_GET(3), 0xd4ef3085, 16) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, b, c, d, a, _PICOHASH_MD5_GET(6), 0x04881d05, 23) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, a, b, c, d, _PICOHASH_MD5_GET(9), 0xd9d4d039, 4) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, d, a, b, c, _PICOHASH_MD5_GET(12), 0xe6db99e5, 11) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, c, d, a, b, _PICOHASH_MD5_GET(15), 0x1fa27cf8, 16) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_H, b, c, d, a, _PICOHASH_MD5_GET(2), 0xc4ac5665, 23) - - /* Round 4 */ - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, a, b, c, d, _PICOHASH_MD5_GET(0), 0xf4292244, 6) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, d, a, b, c, _PICOHASH_MD5_GET(7), 0x432aff97, 10) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, c, d, a, b, _PICOHASH_MD5_GET(14), 0xab9423a7, 15) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, b, c, d, a, _PICOHASH_MD5_GET(5), 0xfc93a039, 21) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, a, b, c, d, _PICOHASH_MD5_GET(12), 0x655b59c3, 6) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, d, a, b, c, _PICOHASH_MD5_GET(3), 0x8f0ccc92, 10) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, c, d, a, b, _PICOHASH_MD5_GET(10), 0xffeff47d, 15) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, b, c, d, a, _PICOHASH_MD5_GET(1), 0x85845dd1, 21) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, a, b, c, d, _PICOHASH_MD5_GET(8), 0x6fa87e4f, 6) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, d, a, b, c, _PICOHASH_MD5_GET(15), 0xfe2ce6e0, 10) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, c, d, a, b, _PICOHASH_MD5_GET(6), 0xa3014314, 15) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, b, c, d, a, _PICOHASH_MD5_GET(13), 0x4e0811a1, 21) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, a, b, c, d, _PICOHASH_MD5_GET(4), 0xf7537e82, 6) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, d, a, b, c, _PICOHASH_MD5_GET(11), 0xbd3af235, 10) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, c, d, a, b, _PICOHASH_MD5_GET(2), 0x2ad7d2bb, 15) - _PICOHASH_MD5_STEP(_PICOHASH_MD5_I, b, c, d, a, _PICOHASH_MD5_GET(9), 0xeb86d391, 21) - - a += saved_a; - b += saved_b; - c += saved_c; - d += saved_d; - - ptr += 64; - } while (size -= 64); - - ctx->a = a; - ctx->b = b; - ctx->c = c; - ctx->d = d; - - return ptr; -} - -inline void _picohash_md5_init(_picohash_md5_ctx_t *ctx) -{ - ctx->a = 0x67452301; - ctx->b = 0xefcdab89; - ctx->c = 0x98badcfe; - ctx->d = 0x10325476; - - ctx->lo = 0; - ctx->hi = 0; -} - -inline void _picohash_md5_update(_picohash_md5_ctx_t *ctx, const void *data, size_t size) -{ - uint_fast32_t saved_lo; - unsigned long used, free; - - saved_lo = ctx->lo; - if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo) - ctx->hi++; - ctx->hi += size >> 29; - - used = saved_lo & 0x3f; - - if (used) { - free = 64 - used; - - if (size < free) { - memcpy(&ctx->buffer[used], data, size); - return; - } - - memcpy(&ctx->buffer[used], data, free); - data = (const unsigned char *)data + free; - size -= free; - _picohash_md5_body(ctx, ctx->buffer, 64); - } - - if (size >= 64) { - data = _picohash_md5_body(ctx, data, size & ~(unsigned long)0x3f); - size &= 0x3f; - } - - memcpy(ctx->buffer, data, size); -} - -inline void _picohash_md5_final(_picohash_md5_ctx_t *ctx, void *_digest) -{ - unsigned char *digest = _digest; - unsigned long used, free; - - used = ctx->lo & 0x3f; - - ctx->buffer[used++] = 0x80; - - free = 64 - used; - - if (free < 8) { - memset(&ctx->buffer[used], 0, free); - _picohash_md5_body(ctx, ctx->buffer, 64); - used = 0; - free = 64; - } - - memset(&ctx->buffer[used], 0, free - 8); - - ctx->lo <<= 3; - ctx->buffer[56] = ctx->lo; - ctx->buffer[57] = ctx->lo >> 8; - ctx->buffer[58] = ctx->lo >> 16; - ctx->buffer[59] = ctx->lo >> 24; - ctx->buffer[60] = ctx->hi; - ctx->buffer[61] = ctx->hi >> 8; - ctx->buffer[62] = ctx->hi >> 16; - ctx->buffer[63] = ctx->hi >> 24; - - _picohash_md5_body(ctx, ctx->buffer, 64); - - digest[0] = ctx->a; - digest[1] = ctx->a >> 8; - digest[2] = ctx->a >> 16; - digest[3] = ctx->a >> 24; - digest[4] = ctx->b; - digest[5] = ctx->b >> 8; - digest[6] = ctx->b >> 16; - digest[7] = ctx->b >> 24; - digest[8] = ctx->c; - digest[9] = ctx->c >> 8; - digest[10] = ctx->c >> 16; - digest[11] = ctx->c >> 24; - digest[12] = ctx->d; - digest[13] = ctx->d >> 8; - digest[14] = ctx->d >> 16; - digest[15] = ctx->d >> 24; - - memset(ctx, 0, sizeof(*ctx)); -} - -#define _PICOHASH_SHA1_K0 0x5a827999 -#define _PICOHASH_SHA1_K20 0x6ed9eba1 -#define _PICOHASH_SHA1_K40 0x8f1bbcdc -#define _PICOHASH_SHA1_K60 0xca62c1d6 - -static inline uint32_t _picohash_sha1_rol32(uint32_t number, uint8_t bits) -{ - return ((number << bits) | (number >> (32 - bits))); -} - -static inline void _picohash_sha1_hash_block(_picohash_sha1_ctx_t *s) -{ - uint8_t i; - uint32_t a, b, c, d, e, t; - - a = s->state[0]; - b = s->state[1]; - c = s->state[2]; - d = s->state[3]; - e = s->state[4]; - for (i = 0; i < 80; i++) { - if (i >= 16) { - t = s->buffer[(i + 13) & 15] ^ s->buffer[(i + 8) & 15] ^ s->buffer[(i + 2) & 15] ^ s->buffer[i & 15]; - s->buffer[i & 15] = _picohash_sha1_rol32(t, 1); - } - if (i < 20) { - t = (d ^ (b & (c ^ d))) + _PICOHASH_SHA1_K0; - } else if (i < 40) { - t = (b ^ c ^ d) + _PICOHASH_SHA1_K20; - } else if (i < 60) { - t = ((b & c) | (d & (b | c))) + _PICOHASH_SHA1_K40; - } else { - t = (b ^ c ^ d) + _PICOHASH_SHA1_K60; - } - t += _picohash_sha1_rol32(a, 5) + e + s->buffer[i & 15]; - e = d; - d = c; - c = _picohash_sha1_rol32(b, 30); - b = a; - a = t; - } - s->state[0] += a; - s->state[1] += b; - s->state[2] += c; - s->state[3] += d; - s->state[4] += e; -} - -static inline void _picohash_sha1_add_uncounted(_picohash_sha1_ctx_t *s, uint8_t data) -{ - uint8_t *const b = (uint8_t *)s->buffer; -#ifdef _PICOHASH_BIG_ENDIAN - b[s->bufferOffset] = data; -#else - b[s->bufferOffset ^ 3] = data; -#endif - s->bufferOffset++; - if (s->bufferOffset == PICOHASH_SHA1_BLOCK_LENGTH) { - _picohash_sha1_hash_block(s); - s->bufferOffset = 0; - } -} - -inline void _picohash_sha1_init(_picohash_sha1_ctx_t *s) -{ - s->state[0] = 0x67452301; - s->state[1] = 0xefcdab89; - s->state[2] = 0x98badcfe; - s->state[3] = 0x10325476; - s->state[4] = 0xc3d2e1f0; - s->byteCount = 0; - s->bufferOffset = 0; -} - -inline void _picohash_sha1_update(_picohash_sha1_ctx_t *s, const void *_data, size_t len) -{ - const uint8_t *data = _data; - for (; len != 0; --len) { - ++s->byteCount; - _picohash_sha1_add_uncounted(s, *data++); - } -} - -inline void _picohash_sha1_final(_picohash_sha1_ctx_t *s, void *digest) -{ - // Pad with 0x80 followed by 0x00 until the end of the block - _picohash_sha1_add_uncounted(s, 0x80); - while (s->bufferOffset != 56) - _picohash_sha1_add_uncounted(s, 0x00); - - // Append length in the last 8 bytes - _picohash_sha1_add_uncounted(s, s->byteCount >> 53); // Shifting to multiply by 8 - _picohash_sha1_add_uncounted(s, s->byteCount >> 45); // as SHA-1 supports bitstreams as well as - _picohash_sha1_add_uncounted(s, s->byteCount >> 37); // byte. - _picohash_sha1_add_uncounted(s, s->byteCount >> 29); - _picohash_sha1_add_uncounted(s, s->byteCount >> 21); - _picohash_sha1_add_uncounted(s, s->byteCount >> 13); - _picohash_sha1_add_uncounted(s, s->byteCount >> 5); - _picohash_sha1_add_uncounted(s, s->byteCount << 3); - -#ifndef SHA_BIG_ENDIAN - { // Swap byte order back - int i; - for (i = 0; i < 5; i++) { - s->state[i] = (((s->state[i]) << 24) & 0xff000000) | (((s->state[i]) << 8) & 0x00ff0000) | - (((s->state[i]) >> 8) & 0x0000ff00) | (((s->state[i]) >> 24) & 0x000000ff); - } - } -#endif - - memcpy(digest, s->state, sizeof(s->state)); -} - -#define _picohash_sha256_ch(x, y, z) (z ^ (x & (y ^ z))) -#define _picohash_sha256_maj(x, y, z) (((x | y) & z) | (x & y)) -#define _picohash_sha256_s(x, y) \ - (((((uint32_t)(x)&0xFFFFFFFFUL) >> (uint32_t)((y)&31)) | ((uint32_t)(x) << (uint32_t)(32 - ((y)&31)))) & 0xFFFFFFFFUL) -#define _picohash_sha256_r(x, n) (((x)&0xFFFFFFFFUL) >> (n)) -#define _picohash_sha256_sigma0(x) (_picohash_sha256_s(x, 2) ^ _picohash_sha256_s(x, 13) ^ _picohash_sha256_s(x, 22)) -#define _picohash_sha256_sigma1(x) (_picohash_sha256_s(x, 6) ^ _picohash_sha256_s(x, 11) ^ _picohash_sha256_s(x, 25)) -#define _picohash_sha256_gamma0(x) (_picohash_sha256_s(x, 7) ^ _picohash_sha256_s(x, 18) ^ _picohash_sha256_r(x, 3)) -#define _picohash_sha256_gamma1(x) (_picohash_sha256_s(x, 17) ^ _picohash_sha256_s(x, 19) ^ _picohash_sha256_r(x, 10)) -#define _picohash_sha256_rnd(a, b, c, d, e, f, g, h, i) \ - t0 = h + _picohash_sha256_sigma1(e) + _picohash_sha256_ch(e, f, g) + K[i] + W[i]; \ - t1 = _picohash_sha256_sigma0(a) + _picohash_sha256_maj(a, b, c); \ - d += t0; \ - h = t0 + t1; - -static inline void _picohash_sha256_compress(_picohash_sha256_ctx_t *ctx, unsigned char *buf) -{ - static const uint32_t K[64] = { - 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, - 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL, 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL, - 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, - 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL, - 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL, 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, - 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, - 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL, 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL, - 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL}; - uint32_t S[8], W[64], t, t0, t1; - int i; - - /* copy state into S */ - for (i = 0; i < 8; i++) - S[i] = ctx->state[i]; - - /* copy the state into 512-bits into W[0..15] */ - for (i = 0; i < 16; i++) - W[i] = - (uint32_t)buf[4 * i] << 24 | (uint32_t)buf[4 * i + 1] << 16 | (uint32_t)buf[4 * i + 2] << 8 | (uint32_t)buf[4 * i + 3]; - - /* fill W[16..63] */ - for (i = 16; i < 64; i++) - W[i] = _picohash_sha256_gamma1(W[i - 2]) + W[i - 7] + _picohash_sha256_gamma0(W[i - 15]) + W[i - 16]; - - /* Compress */ - for (i = 0; i < 64; ++i) { - _picohash_sha256_rnd(S[0], S[1], S[2], S[3], S[4], S[5], S[6], S[7], i); - t = S[7]; - S[7] = S[6]; - S[6] = S[5]; - S[5] = S[4]; - S[4] = S[3]; - S[3] = S[2]; - S[2] = S[1]; - S[1] = S[0]; - S[0] = t; - } - - /* feedback */ - for (i = 0; i < 8; i++) - ctx->state[i] = ctx->state[i] + S[i]; -} - -static inline void _picohash_sha256_do_final(_picohash_sha256_ctx_t *ctx, void *digest, size_t len) -{ - unsigned char *out = digest; - size_t i; - - /* increase the length of the message */ - ctx->length += ctx->curlen * 8; - - /* append the '1' bit */ - ctx->buf[ctx->curlen++] = (unsigned char)0x80; - - /* if the length is currently above 56 bytes we append zeros - * then compress. Then we can fall back to padding zeros and length - * encoding like normal. - */ - if (ctx->curlen > 56) { - while (ctx->curlen < 64) { - ctx->buf[ctx->curlen++] = (unsigned char)0; - } - _picohash_sha256_compress(ctx, ctx->buf); - ctx->curlen = 0; - } - - /* pad upto 56 bytes of zeroes */ - while (ctx->curlen < 56) { - ctx->buf[ctx->curlen++] = (unsigned char)0; - } - - /* store length */ - for (i = 0; i != 8; ++i) - ctx->buf[56 + i] = ctx->length >> (56 - 8 * i); - _picohash_sha256_compress(ctx, ctx->buf); - - /* copy output */ - for (i = 0; i != len / 4; ++i) { - out[i * 4] = ctx->state[i] >> 24; - out[i * 4 + 1] = ctx->state[i] >> 16; - out[i * 4 + 2] = ctx->state[i] >> 8; - out[i * 4 + 3] = ctx->state[i]; - } -} - -inline void _picohash_sha256_init(_picohash_sha256_ctx_t *ctx) -{ - ctx->curlen = 0; - ctx->length = 0; - ctx->state[0] = 0x6A09E667UL; - ctx->state[1] = 0xBB67AE85UL; - ctx->state[2] = 0x3C6EF372UL; - ctx->state[3] = 0xA54FF53AUL; - ctx->state[4] = 0x510E527FUL; - ctx->state[5] = 0x9B05688CUL; - ctx->state[6] = 0x1F83D9ABUL; - ctx->state[7] = 0x5BE0CD19UL; -} - -inline void _picohash_sha256_update(_picohash_sha256_ctx_t *ctx, const void *data, size_t len) -{ - const unsigned char *in = data; - size_t n; - - while (len > 0) { - if (ctx->curlen == 0 && len >= PICOHASH_SHA256_BLOCK_LENGTH) { - _picohash_sha256_compress(ctx, (unsigned char *)in); - ctx->length += PICOHASH_SHA256_BLOCK_LENGTH * 8; - in += PICOHASH_SHA256_BLOCK_LENGTH; - len -= PICOHASH_SHA256_BLOCK_LENGTH; - } else { - n = PICOHASH_SHA256_BLOCK_LENGTH - ctx->curlen; - if (n > len) - n = len; - memcpy(ctx->buf + ctx->curlen, in, (size_t)n); - ctx->curlen += n; - in += n; - len -= n; - if (ctx->curlen == 64) { - _picohash_sha256_compress(ctx, ctx->buf); - ctx->length += 8 * PICOHASH_SHA256_BLOCK_LENGTH; - ctx->curlen = 0; - } - } - } -} - -inline void _picohash_sha256_final(_picohash_sha256_ctx_t *ctx, void *digest) -{ - _picohash_sha256_do_final(ctx, digest, PICOHASH_SHA256_DIGEST_LENGTH); -} - -inline void _picohash_sha224_init(_picohash_sha256_ctx_t *ctx) -{ - ctx->curlen = 0; - ctx->length = 0; - ctx->state[0] = 0xc1059ed8UL; - ctx->state[1] = 0x367cd507UL; - ctx->state[2] = 0x3070dd17UL; - ctx->state[3] = 0xf70e5939UL; - ctx->state[4] = 0xffc00b31UL; - ctx->state[5] = 0x68581511UL; - ctx->state[6] = 0x64f98fa7UL; - ctx->state[7] = 0xbefa4fa4UL; -} - -inline void _picohash_sha224_final(_picohash_sha256_ctx_t *ctx, void *digest) -{ - _picohash_sha256_do_final(ctx, digest, PICOHASH_SHA224_DIGEST_LENGTH); -} - -inline void picohash_init_md5(picohash_ctx_t *ctx) -{ - ctx->block_length = PICOHASH_MD5_BLOCK_LENGTH; - ctx->digest_length = PICOHASH_MD5_DIGEST_LENGTH; - ctx->_reset = (void *)_picohash_md5_init; - ctx->_update = (void *)_picohash_md5_update; - ctx->_final = (void *)_picohash_md5_final; - - _picohash_md5_init(&ctx->_md5); -} - -inline void picohash_init_sha1(picohash_ctx_t *ctx) -{ - ctx->block_length = PICOHASH_SHA1_BLOCK_LENGTH; - ctx->digest_length = PICOHASH_SHA1_DIGEST_LENGTH; - ctx->_reset = (void *)_picohash_sha1_init; - ctx->_update = (void *)_picohash_sha1_update; - ctx->_final = (void *)_picohash_sha1_final; - _picohash_sha1_init(&ctx->_sha1); -} - -inline void picohash_init_sha224(picohash_ctx_t *ctx) -{ - ctx->block_length = PICOHASH_SHA224_BLOCK_LENGTH; - ctx->digest_length = PICOHASH_SHA224_DIGEST_LENGTH; - ctx->_reset = (void *)_picohash_sha224_init; - ctx->_update = (void *)_picohash_sha256_update; - ctx->_final = (void *)_picohash_sha224_final; - _picohash_sha224_init(&ctx->_sha256); -} - -inline void picohash_init_sha256(picohash_ctx_t *ctx) -{ - ctx->block_length = PICOHASH_SHA256_BLOCK_LENGTH; - ctx->digest_length = PICOHASH_SHA256_DIGEST_LENGTH; - ctx->_reset = (void *)_picohash_sha256_init; - ctx->_update = (void *)_picohash_sha256_update; - ctx->_final = (void *)_picohash_sha256_final; - _picohash_sha256_init(&ctx->_sha256); -} - -inline void picohash_update(picohash_ctx_t *ctx, const void *input, size_t len) -{ - ctx->_update(ctx, input, len); -} - -inline void picohash_final(picohash_ctx_t *ctx, void *digest) -{ - ctx->_final(ctx, digest); -} - -inline void picohash_reset(picohash_ctx_t *ctx) -{ - ctx->_reset(ctx); -} - -static inline void _picohash_hmac_apply_key(picohash_ctx_t *ctx, unsigned char delta) -{ - size_t i; - for (i = 0; i != ctx->block_length; ++i) - ctx->_hmac.key[i] ^= delta; - picohash_update(ctx, ctx->_hmac.key, ctx->block_length); - for (i = 0; i != ctx->block_length; ++i) - ctx->_hmac.key[i] ^= delta; -} - -static void _picohash_hmac_final(picohash_ctx_t *ctx, void *digest) -{ - unsigned char inner_digest[PICOHASH_MAX_DIGEST_LENGTH]; - - ctx->_hmac.hash_final(ctx, inner_digest); - - ctx->_hmac.hash_reset(ctx); - _picohash_hmac_apply_key(ctx, 0x5c); - picohash_update(ctx, inner_digest, ctx->digest_length); - memset(inner_digest, 0, ctx->digest_length); - - ctx->_hmac.hash_final(ctx, digest); -} - -static inline void _picohash_hmac_reset(picohash_ctx_t *ctx) -{ - ctx->_hmac.hash_reset(ctx); - _picohash_hmac_apply_key(ctx, 0x36); -} - -inline void picohash_init_hmac(picohash_ctx_t *ctx, void (*initf)(picohash_ctx_t *), const void *key, size_t key_len) -{ - initf(ctx); - - memset(ctx->_hmac.key, 0, ctx->block_length); - if (key_len > ctx->block_length) { - /* hash the key if it is too long */ - picohash_update(ctx, key, key_len); - picohash_final(ctx, ctx->_hmac.key); - ctx->_hmac.hash_reset(ctx); - } else { - memcpy(ctx->_hmac.key, key, key_len); - } - - /* replace reset and final function */ - ctx->_hmac.hash_reset = ctx->_reset; - ctx->_hmac.hash_final = ctx->_final; - ctx->_reset = (void *)_picohash_hmac_reset; - ctx->_final = (void *)_picohash_hmac_final; - - /* start calculating the inner hash */ - _picohash_hmac_apply_key(ctx, 0x36); -} - -#endif |