summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/hmac/hmac.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/hmac/hmac.c')
-rw-r--r--src/lib/libcrypto/hmac/hmac.c79
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
63void HMAC_Init(ctx,key,len,md) 63void HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len,
64HMAC_CTX *ctx; 64 const EVP_MD *md, ENGINE *impl)
65unsigned char *key;
66int len;
67EVP_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)); 113void 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
115void HMAC_Update(ctx,data,len) 121void HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, int len)
116HMAC_CTX *ctx;
117unsigned char *data;
118int len;
119 { 122 {
120 EVP_DigestUpdate(&(ctx->md_ctx),data,len); 123 EVP_DigestUpdate(&ctx->md_ctx,data,len);
121 } 124 }
122 125
123void HMAC_Final(ctx,md,len) 126void HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len)
124HMAC_CTX *ctx;
125unsigned char *md;
126unsigned 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
140void 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
140void HMAC_cleanup(ctx) 147void HMAC_CTX_cleanup(HMAC_CTX *ctx)
141HMAC_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
146unsigned char *HMAC(evp_md,key,key_len,d,n,md,md_len) 155unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len,
147EVP_MD *evp_md; 156 const unsigned char *d, int n, unsigned char *md,
148unsigned char *key; 157 unsigned int *md_len)
149int key_len;
150unsigned char *d;
151int n;
152unsigned char *md;
153unsigned 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