2 * Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the Institute nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 #include <sys/types.h>
41 HMAC_CTX_init(HMAC_CTX
*ctx
)
43 memset(ctx
, 0, sizeof(*ctx
));
47 HMAC_CTX_cleanup(HMAC_CTX
*ctx
)
50 memset(ctx
->buf
, 0, ctx
->key_length
);
55 memset(ctx
->ipad
, 0, ctx
->key_length
);
60 memset(ctx
->ipad
, 0, ctx
->key_length
);
65 EVP_MD_CTX_destroy(ctx
->ctx
);
71 HMAC_size(const HMAC_CTX
*ctx
)
73 return EVP_MD_size(ctx
->md
);
77 HMAC_Init_ex(HMAC_CTX
*ctx
,
89 memset(ctx
->buf
, 0, ctx
->key_length
);
92 ctx
->key_length
= EVP_MD_size(ctx
->md
);
93 ctx
->buf
= malloc(ctx
->key_length
);
99 if (keylen
> EVP_MD_block_size(ctx
->md
)) {
100 EVP_Digest(key
, keylen
, ctx
->buf
, NULL
, ctx
->md
, engine
);
102 keylen
= EVP_MD_size(ctx
->md
);
106 memset(ctx
->opad
, 0, ctx
->key_length
);
110 memset(ctx
->ipad
, 0, ctx
->key_length
);
114 ctx
->opad
= malloc(EVP_MD_block_size(ctx
->md
));
115 ctx
->ipad
= malloc(EVP_MD_block_size(ctx
->md
));
116 memset(ctx
->ipad
, 0x36, EVP_MD_block_size(ctx
->md
));
117 memset(ctx
->opad
, 0x5c, EVP_MD_block_size(ctx
->md
));
119 for (i
= 0, p
= ctx
->ipad
; i
< keylen
; i
++)
120 p
[i
] ^= ((const unsigned char *)key
)[i
];
121 for (i
= 0, p
= ctx
->opad
; i
< keylen
; i
++)
122 p
[i
] ^= ((const unsigned char *)key
)[i
];
124 ctx
->ctx
= EVP_MD_CTX_create();
126 EVP_DigestInit_ex(ctx
->ctx
, ctx
->md
, ctx
->engine
);
127 EVP_DigestUpdate(ctx
->ctx
, ctx
->ipad
, EVP_MD_block_size(ctx
->md
));
131 HMAC_Update(HMAC_CTX
*ctx
, const void *data
, size_t len
)
133 EVP_DigestUpdate(ctx
->ctx
, data
, len
);
137 HMAC_Final(HMAC_CTX
*ctx
, void *md
, unsigned int *len
)
139 EVP_DigestFinal_ex(ctx
->ctx
, ctx
->buf
, NULL
);
141 EVP_DigestInit_ex(ctx
->ctx
, ctx
->md
, ctx
->engine
);
142 EVP_DigestUpdate(ctx
->ctx
, ctx
->opad
, EVP_MD_block_size(ctx
->md
));
143 EVP_DigestUpdate(ctx
->ctx
, ctx
->buf
, ctx
->key_length
);
144 EVP_DigestFinal_ex(ctx
->ctx
, md
, len
);
148 HMAC(const EVP_MD
*md
,
149 const void *key
, size_t key_size
,
150 const void *data
, size_t data_size
,
151 void *hash
, unsigned int *hash_len
)
156 HMAC_Init_ex(&ctx
, key
, key_size
, md
, NULL
);
157 HMAC_Update(&ctx
, data
, data_size
);
158 HMAC_Final(&ctx
, hash
, hash_len
);
159 HMAC_CTX_cleanup(&ctx
);