diff options
Diffstat (limited to 'src/lib/libcrypto/hmac/hmac.c')
-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 | ||