8 HMAC_CTX_init(HMAC_CTX *ctx)
10 memset(ctx, 0, sizeof(*ctx));
14 HMAC_CTX_cleanup(HMAC_CTX *ctx)
17 memset(ctx->buf, 0, ctx->key_length);
22 memset(ctx->ipad, 0, ctx->key_length);
27 memset(ctx->ipad, 0, ctx->key_length);
32 EVP_MD_CTX_destroy(ctx->ctx);
38 HMAC_size(const HMAC_CTX *ctx)
40 return EVP_MD_size(ctx->md);
44 HMAC_Init_ex(HMAC_CTX *ctx,
57 ctx->key_length = EVP_MD_size(ctx->md);
58 ctx->buf = malloc(ctx->key_length);
64 if (keylen > EVP_MD_block_size(ctx->md)) {
65 EVP_Digest(key, keylen, ctx->buf, NULL, ctx->md, engine);
67 keylen = EVP_MD_size(ctx->md);
75 ctx->opad = malloc(EVP_MD_block_size(ctx->md));
76 ctx->ipad = malloc(EVP_MD_block_size(ctx->md));
77 memset(ctx->ipad, 0x36, EVP_MD_block_size(ctx->md));
78 memset(ctx->opad, 0x5c, EVP_MD_block_size(ctx->md));
80 for (i = 0, p = ctx->ipad; i < keylen; i++)
81 p[i] ^= ((const unsigned char *)key)[i];
82 for (i = 0, p = ctx->opad; i < keylen; i++)
83 p[i] ^= ((const unsigned char *)key)[i];
85 ctx->ctx = EVP_MD_CTX_create();
87 EVP_DigestInit_ex(ctx->ctx, ctx->md, ctx->engine);
88 EVP_DigestUpdate(ctx->ctx, ctx->ipad, EVP_MD_block_size(ctx->md));
92 HMAC_Update(HMAC_CTX *ctx, const void *data, size_t len)
94 EVP_DigestUpdate(ctx->ctx, data, len);
98 HMAC_Final(HMAC_CTX *ctx, void *md, unsigned int *len)
100 EVP_DigestFinal_ex(ctx->ctx, ctx->buf, NULL);
102 EVP_DigestInit_ex(ctx->ctx, ctx->md, ctx->engine);
103 EVP_DigestUpdate(ctx->ctx, ctx->opad, EVP_MD_block_size(ctx->md));
104 EVP_DigestUpdate(ctx->ctx, ctx->buf, ctx->key_length);
105 EVP_DigestFinal_ex(ctx->ctx, md, len);
109 HMAC(const EVP_MD *md,
110 const void *key, size_t key_size,
111 const void *data, size_t data_size,
112 void *hash, unsigned int *hash_len)
117 HMAC_Init_ex(&ctx, key, key_size, md, NULL);
118 HMAC_Update(&ctx, data, data_size);
119 HMAC_Final(&ctx, hash, hash_len);
120 HMAC_CTX_cleanup(&ctx);