diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/hmac/hmac.c | 79 |
1 files changed, 42 insertions, 37 deletions
diff --git a/src/lib/libcrypto/hmac/hmac.c b/src/lib/libcrypto/hmac/hmac.c index fb09129963..da363b7950 100644 --- a/src/lib/libcrypto/hmac/hmac.c +++ b/src/lib/libcrypto/hmac/hmac.c | |||
| @@ -58,13 +58,10 @@ | |||
| 58 | #include <stdio.h> | 58 | #include <stdio.h> |
| 59 | #include <stdlib.h> | 59 | #include <stdlib.h> |
| 60 | #include <string.h> | 60 | #include <string.h> |
| 61 | #include "hmac.h" | 61 | #include <openssl/hmac.h> |
| 62 | 62 | ||
| 63 | void HMAC_Init(ctx,key,len,md) | 63 | void HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, |
| 64 | HMAC_CTX *ctx; | 64 | const EVP_MD *md, ENGINE *impl) |
| 65 | unsigned char *key; | ||
| 66 | int len; | ||
| 67 | EVP_MD *md; | ||
| 68 | { | 65 | { |
| 69 | int i,j,reset=0; | 66 | int i,j,reset=0; |
| 70 | unsigned char pad[HMAC_MAX_MD_CBLOCK]; | 67 | unsigned char pad[HMAC_MAX_MD_CBLOCK]; |
| @@ -83,47 +80,50 @@ EVP_MD *md; | |||
| 83 | j=EVP_MD_block_size(md); | 80 | j=EVP_MD_block_size(md); |
| 84 | if (j < len) | 81 | if (j < len) |
| 85 | { | 82 | { |
| 86 | EVP_DigestInit(&ctx->md_ctx,md); | 83 | EVP_DigestInit_ex(&ctx->md_ctx,md, impl); |
| 87 | EVP_DigestUpdate(&ctx->md_ctx,key,len); | 84 | EVP_DigestUpdate(&ctx->md_ctx,key,len); |
| 88 | EVP_DigestFinal(&(ctx->md_ctx),ctx->key, | 85 | EVP_DigestFinal_ex(&(ctx->md_ctx),ctx->key, |
| 89 | &ctx->key_length); | 86 | &ctx->key_length); |
| 90 | } | 87 | } |
| 91 | else | 88 | else |
| 92 | { | 89 | { |
| 93 | memcpy(ctx->key,key,len); | 90 | memcpy(ctx->key,key,len); |
| 94 | memset(&(ctx->key[len]),0,sizeof(ctx->key)-len); | ||
| 95 | ctx->key_length=len; | 91 | ctx->key_length=len; |
| 96 | } | 92 | } |
| 93 | if(ctx->key_length != HMAC_MAX_MD_CBLOCK) | ||
| 94 | memset(&ctx->key[ctx->key_length], 0, | ||
| 95 | HMAC_MAX_MD_CBLOCK - ctx->key_length); | ||
| 97 | } | 96 | } |
| 98 | 97 | ||
| 99 | if (reset) | 98 | if (reset) |
| 100 | { | 99 | { |
| 101 | for (i=0; i<HMAC_MAX_MD_CBLOCK; i++) | 100 | for (i=0; i<HMAC_MAX_MD_CBLOCK; i++) |
| 102 | pad[i]=0x36^ctx->key[i]; | 101 | pad[i]=0x36^ctx->key[i]; |
| 103 | EVP_DigestInit(&ctx->i_ctx,md); | 102 | EVP_DigestInit_ex(&ctx->i_ctx,md, impl); |
| 104 | EVP_DigestUpdate(&ctx->i_ctx,pad,EVP_MD_block_size(md)); | 103 | EVP_DigestUpdate(&ctx->i_ctx,pad,EVP_MD_block_size(md)); |
| 105 | 104 | ||
| 106 | for (i=0; i<HMAC_MAX_MD_CBLOCK; i++) | 105 | for (i=0; i<HMAC_MAX_MD_CBLOCK; i++) |
| 107 | pad[i]=0x5c^ctx->key[i]; | 106 | pad[i]=0x5c^ctx->key[i]; |
| 108 | EVP_DigestInit(&ctx->o_ctx,md); | 107 | EVP_DigestInit_ex(&ctx->o_ctx,md, impl); |
| 109 | EVP_DigestUpdate(&ctx->o_ctx,pad,EVP_MD_block_size(md)); | 108 | EVP_DigestUpdate(&ctx->o_ctx,pad,EVP_MD_block_size(md)); |
| 110 | } | 109 | } |
| 110 | EVP_MD_CTX_copy_ex(&ctx->md_ctx,&ctx->i_ctx); | ||
| 111 | } | ||
| 111 | 112 | ||
| 112 | memcpy(&ctx->md_ctx,&ctx->i_ctx,sizeof(ctx->i_ctx)); | 113 | void HMAC_Init(HMAC_CTX *ctx, const void *key, int len, |
| 114 | const EVP_MD *md) | ||
| 115 | { | ||
| 116 | if(key && md) | ||
| 117 | HMAC_CTX_init(ctx); | ||
| 118 | HMAC_Init_ex(ctx,key,len,md, NULL); | ||
| 113 | } | 119 | } |
| 114 | 120 | ||
| 115 | void HMAC_Update(ctx,data,len) | 121 | void HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, int len) |
| 116 | HMAC_CTX *ctx; | ||
| 117 | unsigned char *data; | ||
| 118 | int len; | ||
| 119 | { | 122 | { |
| 120 | EVP_DigestUpdate(&(ctx->md_ctx),data,len); | 123 | EVP_DigestUpdate(&ctx->md_ctx,data,len); |
| 121 | } | 124 | } |
| 122 | 125 | ||
| 123 | void HMAC_Final(ctx,md,len) | 126 | void HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len) |
| 124 | HMAC_CTX *ctx; | ||
| 125 | unsigned char *md; | ||
| 126 | unsigned int *len; | ||
| 127 | { | 127 | { |
| 128 | int j; | 128 | int j; |
| 129 | unsigned int i; | 129 | unsigned int i; |
| @@ -131,35 +131,40 @@ unsigned int *len; | |||
| 131 | 131 | ||
| 132 | j=EVP_MD_block_size(ctx->md); | 132 | j=EVP_MD_block_size(ctx->md); |
| 133 | 133 | ||
| 134 | EVP_DigestFinal(&(ctx->md_ctx),buf,&i); | 134 | EVP_DigestFinal_ex(&ctx->md_ctx,buf,&i); |
| 135 | memcpy(&(ctx->md_ctx),&(ctx->o_ctx),sizeof(ctx->o_ctx)); | 135 | EVP_MD_CTX_copy_ex(&ctx->md_ctx,&ctx->o_ctx); |
| 136 | EVP_DigestUpdate(&(ctx->md_ctx),buf,i); | 136 | EVP_DigestUpdate(&ctx->md_ctx,buf,i); |
| 137 | EVP_DigestFinal(&(ctx->md_ctx),md,len); | 137 | EVP_DigestFinal_ex(&ctx->md_ctx,md,len); |
| 138 | } | ||
| 139 | |||
| 140 | void HMAC_CTX_init(HMAC_CTX *ctx) | ||
| 141 | { | ||
| 142 | EVP_MD_CTX_init(&ctx->i_ctx); | ||
| 143 | EVP_MD_CTX_init(&ctx->o_ctx); | ||
| 144 | EVP_MD_CTX_init(&ctx->md_ctx); | ||
| 138 | } | 145 | } |
| 139 | 146 | ||
| 140 | void HMAC_cleanup(ctx) | 147 | void HMAC_CTX_cleanup(HMAC_CTX *ctx) |
| 141 | HMAC_CTX *ctx; | ||
| 142 | { | 148 | { |
| 143 | memset(ctx,0,sizeof(HMAC_CTX)); | 149 | EVP_MD_CTX_cleanup(&ctx->i_ctx); |
| 150 | EVP_MD_CTX_cleanup(&ctx->o_ctx); | ||
| 151 | EVP_MD_CTX_cleanup(&ctx->md_ctx); | ||
| 152 | memset(ctx,0,sizeof *ctx); | ||
| 144 | } | 153 | } |
| 145 | 154 | ||
| 146 | unsigned char *HMAC(evp_md,key,key_len,d,n,md,md_len) | 155 | unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, |
| 147 | EVP_MD *evp_md; | 156 | const unsigned char *d, int n, unsigned char *md, |
| 148 | unsigned char *key; | 157 | unsigned int *md_len) |
| 149 | int key_len; | ||
| 150 | unsigned char *d; | ||
| 151 | int n; | ||
| 152 | unsigned char *md; | ||
| 153 | unsigned int *md_len; | ||
| 154 | { | 158 | { |
| 155 | HMAC_CTX c; | 159 | HMAC_CTX c; |
| 156 | static unsigned char m[EVP_MAX_MD_SIZE]; | 160 | static unsigned char m[EVP_MAX_MD_SIZE]; |
| 157 | 161 | ||
| 158 | if (md == NULL) md=m; | 162 | if (md == NULL) md=m; |
| 163 | HMAC_CTX_init(&c); | ||
| 159 | HMAC_Init(&c,key,key_len,evp_md); | 164 | HMAC_Init(&c,key,key_len,evp_md); |
| 160 | HMAC_Update(&c,d,n); | 165 | HMAC_Update(&c,d,n); |
| 161 | HMAC_Final(&c,md,md_len); | 166 | HMAC_Final(&c,md,md_len); |
| 162 | HMAC_cleanup(&c); | 167 | HMAC_CTX_cleanup(&c); |
| 163 | return(md); | 168 | return(md); |
| 164 | } | 169 | } |
| 165 | 170 | ||
