]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/hmac/hmac.c
2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
13 #include "internal/cryptlib.h"
14 #include <openssl/hmac.h>
15 #include <openssl/opensslconf.h>
18 int HMAC_Init_ex(HMAC_CTX
*ctx
, const void *key
, int len
,
19 const EVP_MD
*md
, ENGINE
*impl
)
22 unsigned char pad
[HMAC_MAX_MD_CBLOCK
];
24 /* If we are changing MD then we must have a key */
25 if (md
!= NULL
&& md
!= ctx
->md
&& (key
== NULL
|| len
< 0))
39 j
= EVP_MD_block_size(md
);
40 OPENSSL_assert(j
<= (int)sizeof(ctx
->key
));
42 if (!EVP_DigestInit_ex(ctx
->md_ctx
, md
, impl
))
44 if (!EVP_DigestUpdate(ctx
->md_ctx
, key
, len
))
46 if (!EVP_DigestFinal_ex(ctx
->md_ctx
, ctx
->key
,
50 if (len
< 0 || len
> (int)sizeof(ctx
->key
))
52 memcpy(ctx
->key
, key
, len
);
53 ctx
->key_length
= len
;
55 if (ctx
->key_length
!= HMAC_MAX_MD_CBLOCK
)
56 memset(&ctx
->key
[ctx
->key_length
], 0,
57 HMAC_MAX_MD_CBLOCK
- ctx
->key_length
);
61 for (i
= 0; i
< HMAC_MAX_MD_CBLOCK
; i
++)
62 pad
[i
] = 0x36 ^ ctx
->key
[i
];
63 if (!EVP_DigestInit_ex(ctx
->i_ctx
, md
, impl
))
65 if (!EVP_DigestUpdate(ctx
->i_ctx
, pad
, EVP_MD_block_size(md
)))
68 for (i
= 0; i
< HMAC_MAX_MD_CBLOCK
; i
++)
69 pad
[i
] = 0x5c ^ ctx
->key
[i
];
70 if (!EVP_DigestInit_ex(ctx
->o_ctx
, md
, impl
))
72 if (!EVP_DigestUpdate(ctx
->o_ctx
, pad
, EVP_MD_block_size(md
)))
75 if (!EVP_MD_CTX_copy_ex(ctx
->md_ctx
, ctx
->i_ctx
))
82 #if OPENSSL_API_COMPAT < 0x10100000L
83 int HMAC_Init(HMAC_CTX
*ctx
, const void *key
, int len
, const EVP_MD
*md
)
87 return HMAC_Init_ex(ctx
, key
, len
, md
, NULL
);
91 int HMAC_Update(HMAC_CTX
*ctx
, const unsigned char *data
, size_t len
)
95 return EVP_DigestUpdate(ctx
->md_ctx
, data
, len
);
98 int HMAC_Final(HMAC_CTX
*ctx
, unsigned char *md
, unsigned int *len
)
101 unsigned char buf
[EVP_MAX_MD_SIZE
];
106 if (!EVP_DigestFinal_ex(ctx
->md_ctx
, buf
, &i
))
108 if (!EVP_MD_CTX_copy_ex(ctx
->md_ctx
, ctx
->o_ctx
))
110 if (!EVP_DigestUpdate(ctx
->md_ctx
, buf
, i
))
112 if (!EVP_DigestFinal_ex(ctx
->md_ctx
, md
, len
))
119 size_t HMAC_size(const HMAC_CTX
*ctx
)
121 return EVP_MD_size((ctx
)->md
);
124 HMAC_CTX
*HMAC_CTX_new(void)
126 HMAC_CTX
*ctx
= OPENSSL_zalloc(sizeof(HMAC_CTX
));
129 if (!HMAC_CTX_reset(ctx
)) {
137 static void hmac_ctx_cleanup(HMAC_CTX
*ctx
)
139 EVP_MD_CTX_reset(ctx
->i_ctx
);
140 EVP_MD_CTX_reset(ctx
->o_ctx
);
141 EVP_MD_CTX_reset(ctx
->md_ctx
);
144 memset(ctx
->key
, 0, sizeof(HMAC_MAX_MD_CBLOCK
));
147 void HMAC_CTX_free(HMAC_CTX
*ctx
)
150 hmac_ctx_cleanup(ctx
);
151 EVP_MD_CTX_free(ctx
->i_ctx
);
152 EVP_MD_CTX_free(ctx
->o_ctx
);
153 EVP_MD_CTX_free(ctx
->md_ctx
);
158 int HMAC_CTX_reset(HMAC_CTX
*ctx
)
160 hmac_ctx_cleanup(ctx
);
161 if (ctx
->i_ctx
== NULL
)
162 ctx
->i_ctx
= EVP_MD_CTX_new();
163 if (ctx
->i_ctx
== NULL
)
165 if (ctx
->o_ctx
== NULL
)
166 ctx
->o_ctx
= EVP_MD_CTX_new();
167 if (ctx
->o_ctx
== NULL
)
169 if (ctx
->md_ctx
== NULL
)
170 ctx
->md_ctx
= EVP_MD_CTX_new();
171 if (ctx
->md_ctx
== NULL
)
176 hmac_ctx_cleanup(ctx
);
180 int HMAC_CTX_copy(HMAC_CTX
*dctx
, HMAC_CTX
*sctx
)
182 if (!HMAC_CTX_reset(dctx
))
184 if (!EVP_MD_CTX_copy_ex(dctx
->i_ctx
, sctx
->i_ctx
))
186 if (!EVP_MD_CTX_copy_ex(dctx
->o_ctx
, sctx
->o_ctx
))
188 if (!EVP_MD_CTX_copy_ex(dctx
->md_ctx
, sctx
->md_ctx
))
190 memcpy(dctx
->key
, sctx
->key
, HMAC_MAX_MD_CBLOCK
);
191 dctx
->key_length
= sctx
->key_length
;
195 hmac_ctx_cleanup(dctx
);
199 unsigned char *HMAC(const EVP_MD
*evp_md
, const void *key
, int key_len
,
200 const unsigned char *d
, size_t n
, unsigned char *md
,
201 unsigned int *md_len
)
204 static unsigned char m
[EVP_MAX_MD_SIZE
];
205 static const unsigned char dummy_key
[1] = {'\0'};
209 if ((c
= HMAC_CTX_new()) == NULL
)
212 /* For HMAC_Init_ex, NULL key signals reuse. */
213 if (key
== NULL
&& key_len
== 0) {
217 if (!HMAC_Init_ex(c
, key
, key_len
, evp_md
, NULL
))
219 if (!HMAC_Update(c
, d
, n
))
221 if (!HMAC_Final(c
, md
, md_len
))
230 void HMAC_CTX_set_flags(HMAC_CTX
*ctx
, unsigned long flags
)
232 EVP_MD_CTX_set_flags(ctx
->i_ctx
, flags
);
233 EVP_MD_CTX_set_flags(ctx
->o_ctx
, flags
);
234 EVP_MD_CTX_set_flags(ctx
->md_ctx
, flags
);