diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/hmac/hmac.c | 51 |
1 files changed, 35 insertions, 16 deletions
diff --git a/src/lib/libcrypto/hmac/hmac.c b/src/lib/libcrypto/hmac/hmac.c index e1ec79e093..026dbe8f66 100644 --- a/src/lib/libcrypto/hmac/hmac.c +++ b/src/lib/libcrypto/hmac/hmac.c | |||
| @@ -60,8 +60,8 @@ | |||
| 60 | #include <string.h> | 60 | #include <string.h> |
| 61 | #include <openssl/hmac.h> | 61 | #include <openssl/hmac.h> |
| 62 | 62 | ||
| 63 | void HMAC_Init(HMAC_CTX *ctx, const void *key, int len, | 63 | void HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, |
| 64 | const EVP_MD *md) | 64 | const EVP_MD *md, ENGINE *impl) |
| 65 | { | 65 | { |
| 66 | int i,j,reset=0; | 66 | int i,j,reset=0; |
| 67 | unsigned char pad[HMAC_MAX_MD_CBLOCK]; | 67 | unsigned char pad[HMAC_MAX_MD_CBLOCK]; |
| @@ -70,8 +70,9 @@ void HMAC_Init(HMAC_CTX *ctx, const void *key, int len, | |||
| 70 | { | 70 | { |
| 71 | reset=1; | 71 | reset=1; |
| 72 | ctx->md=md; | 72 | ctx->md=md; |
| 73 | EVP_MD_CTX_init(&ctx->md_ctx); | ||
| 73 | } | 74 | } |
| 74 | else | 75 | else |
| 75 | md=ctx->md; | 76 | md=ctx->md; |
| 76 | 77 | ||
| 77 | if (key != NULL) | 78 | if (key != NULL) |
| @@ -80,9 +81,9 @@ void HMAC_Init(HMAC_CTX *ctx, const void *key, int len, | |||
| 80 | j=EVP_MD_block_size(md); | 81 | j=EVP_MD_block_size(md); |
| 81 | if (j < len) | 82 | if (j < len) |
| 82 | { | 83 | { |
| 83 | EVP_DigestInit(&ctx->md_ctx,md); | 84 | EVP_DigestInit_ex(&ctx->md_ctx,md, impl); |
| 84 | EVP_DigestUpdate(&ctx->md_ctx,key,len); | 85 | EVP_DigestUpdate(&ctx->md_ctx,key,len); |
| 85 | EVP_DigestFinal(&(ctx->md_ctx),ctx->key, | 86 | EVP_DigestFinal_ex(&(ctx->md_ctx),ctx->key, |
| 86 | &ctx->key_length); | 87 | &ctx->key_length); |
| 87 | } | 88 | } |
| 88 | else | 89 | else |
| @@ -99,21 +100,28 @@ void HMAC_Init(HMAC_CTX *ctx, const void *key, int len, | |||
| 99 | { | 100 | { |
| 100 | for (i=0; i<HMAC_MAX_MD_CBLOCK; i++) | 101 | for (i=0; i<HMAC_MAX_MD_CBLOCK; i++) |
| 101 | pad[i]=0x36^ctx->key[i]; | 102 | pad[i]=0x36^ctx->key[i]; |
| 102 | EVP_DigestInit(&ctx->i_ctx,md); | 103 | EVP_DigestInit_ex(&ctx->i_ctx,md, impl); |
| 103 | EVP_DigestUpdate(&ctx->i_ctx,pad,EVP_MD_block_size(md)); | 104 | EVP_DigestUpdate(&ctx->i_ctx,pad,EVP_MD_block_size(md)); |
| 104 | 105 | ||
| 105 | for (i=0; i<HMAC_MAX_MD_CBLOCK; i++) | 106 | for (i=0; i<HMAC_MAX_MD_CBLOCK; i++) |
| 106 | pad[i]=0x5c^ctx->key[i]; | 107 | pad[i]=0x5c^ctx->key[i]; |
| 107 | EVP_DigestInit(&ctx->o_ctx,md); | 108 | EVP_DigestInit_ex(&ctx->o_ctx,md, impl); |
| 108 | EVP_DigestUpdate(&ctx->o_ctx,pad,EVP_MD_block_size(md)); | 109 | EVP_DigestUpdate(&ctx->o_ctx,pad,EVP_MD_block_size(md)); |
| 109 | } | 110 | } |
| 111 | EVP_MD_CTX_copy_ex(&ctx->md_ctx,&ctx->i_ctx); | ||
| 112 | } | ||
| 110 | 113 | ||
| 111 | memcpy(&ctx->md_ctx,&ctx->i_ctx,sizeof(ctx->i_ctx)); | 114 | void HMAC_Init(HMAC_CTX *ctx, const void *key, int len, |
| 115 | const EVP_MD *md) | ||
| 116 | { | ||
| 117 | if(key && md) | ||
| 118 | HMAC_CTX_init(ctx); | ||
| 119 | HMAC_Init_ex(ctx,key,len,md, NULL); | ||
| 112 | } | 120 | } |
| 113 | 121 | ||
| 114 | void HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, int len) | 122 | void HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, int len) |
| 115 | { | 123 | { |
| 116 | EVP_DigestUpdate(&(ctx->md_ctx),data,len); | 124 | EVP_DigestUpdate(&ctx->md_ctx,data,len); |
| 117 | } | 125 | } |
| 118 | 126 | ||
| 119 | void HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len) | 127 | void HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len) |
| @@ -124,15 +132,25 @@ void HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len) | |||
| 124 | 132 | ||
| 125 | j=EVP_MD_block_size(ctx->md); | 133 | j=EVP_MD_block_size(ctx->md); |
| 126 | 134 | ||
| 127 | EVP_DigestFinal(&(ctx->md_ctx),buf,&i); | 135 | EVP_DigestFinal_ex(&ctx->md_ctx,buf,&i); |
| 128 | memcpy(&(ctx->md_ctx),&(ctx->o_ctx),sizeof(ctx->o_ctx)); | 136 | EVP_MD_CTX_copy_ex(&ctx->md_ctx,&ctx->o_ctx); |
| 129 | EVP_DigestUpdate(&(ctx->md_ctx),buf,i); | 137 | EVP_DigestUpdate(&ctx->md_ctx,buf,i); |
| 130 | EVP_DigestFinal(&(ctx->md_ctx),md,len); | 138 | EVP_DigestFinal_ex(&ctx->md_ctx,md,len); |
| 139 | } | ||
| 140 | |||
| 141 | void HMAC_CTX_init(HMAC_CTX *ctx) | ||
| 142 | { | ||
| 143 | EVP_MD_CTX_init(&ctx->i_ctx); | ||
| 144 | EVP_MD_CTX_init(&ctx->o_ctx); | ||
| 145 | EVP_MD_CTX_init(&ctx->md_ctx); | ||
| 131 | } | 146 | } |
| 132 | 147 | ||
| 133 | void HMAC_cleanup(HMAC_CTX *ctx) | 148 | void HMAC_CTX_cleanup(HMAC_CTX *ctx) |
| 134 | { | 149 | { |
| 135 | memset(ctx,0,sizeof(HMAC_CTX)); | 150 | EVP_MD_CTX_cleanup(&ctx->i_ctx); |
| 151 | EVP_MD_CTX_cleanup(&ctx->o_ctx); | ||
| 152 | EVP_MD_CTX_cleanup(&ctx->md_ctx); | ||
| 153 | memset(ctx,0,sizeof *ctx); | ||
| 136 | } | 154 | } |
| 137 | 155 | ||
| 138 | unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, | 156 | unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, |
| @@ -143,10 +161,11 @@ unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, | |||
| 143 | static unsigned char m[EVP_MAX_MD_SIZE]; | 161 | static unsigned char m[EVP_MAX_MD_SIZE]; |
| 144 | 162 | ||
| 145 | if (md == NULL) md=m; | 163 | if (md == NULL) md=m; |
| 164 | HMAC_CTX_init(&c); | ||
| 146 | HMAC_Init(&c,key,key_len,evp_md); | 165 | HMAC_Init(&c,key,key_len,evp_md); |
| 147 | HMAC_Update(&c,d,n); | 166 | HMAC_Update(&c,d,n); |
| 148 | HMAC_Final(&c,md,md_len); | 167 | HMAC_Final(&c,md,md_len); |
| 149 | HMAC_cleanup(&c); | 168 | HMAC_CTX_cleanup(&c); |
| 150 | return(md); | 169 | return(md); |
| 151 | } | 170 | } |
| 152 | 171 | ||
