2 * Crypto wrapper for internal crypto implementation
3 * Copyright (c) 2006-2011, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
18 enum crypto_hash_alg alg;
20 struct MD5Context md5;
21 struct SHA1Context sha1;
23 struct sha256_state sha256;
24 #endif /* CONFIG_SHA256 */
31 struct crypto_hash * crypto_hash_init(enum crypto_hash_alg alg, const u8 *key,
34 struct crypto_hash *ctx;
39 ctx = os_zalloc(sizeof(*ctx));
46 case CRYPTO_HASH_ALG_MD5:
49 case CRYPTO_HASH_ALG_SHA1:
50 SHA1Init(&ctx->u.sha1);
53 case CRYPTO_HASH_ALG_SHA256:
54 sha256_init(&ctx->u.sha256);
56 #endif /* CONFIG_SHA256 */
57 case CRYPTO_HASH_ALG_HMAC_MD5:
58 if (key_len > sizeof(k_pad)) {
60 MD5Update(&ctx->u.md5, key, key_len);
61 MD5Final(tk, &ctx->u.md5);
65 os_memcpy(ctx->key, key, key_len);
66 ctx->key_len = key_len;
68 os_memcpy(k_pad, key, key_len);
69 if (key_len < sizeof(k_pad))
70 os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len);
71 for (i = 0; i < sizeof(k_pad); i++)
74 MD5Update(&ctx->u.md5, k_pad, sizeof(k_pad));
76 case CRYPTO_HASH_ALG_HMAC_SHA1:
77 if (key_len > sizeof(k_pad)) {
78 SHA1Init(&ctx->u.sha1);
79 SHA1Update(&ctx->u.sha1, key, key_len);
80 SHA1Final(tk, &ctx->u.sha1);
84 os_memcpy(ctx->key, key, key_len);
85 ctx->key_len = key_len;
87 os_memcpy(k_pad, key, key_len);
88 if (key_len < sizeof(k_pad))
89 os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len);
90 for (i = 0; i < sizeof(k_pad); i++)
92 SHA1Init(&ctx->u.sha1);
93 SHA1Update(&ctx->u.sha1, k_pad, sizeof(k_pad));
96 case CRYPTO_HASH_ALG_HMAC_SHA256:
97 if (key_len > sizeof(k_pad)) {
98 sha256_init(&ctx->u.sha256);
99 sha256_process(&ctx->u.sha256, key, key_len);
100 sha256_done(&ctx->u.sha256, tk);
104 os_memcpy(ctx->key, key, key_len);
105 ctx->key_len = key_len;
107 os_memcpy(k_pad, key, key_len);
108 if (key_len < sizeof(k_pad))
109 os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len);
110 for (i = 0; i < sizeof(k_pad); i++)
112 sha256_init(&ctx->u.sha256);
113 sha256_process(&ctx->u.sha256, k_pad, sizeof(k_pad));
115 #endif /* CONFIG_SHA256 */
125 void crypto_hash_update(struct crypto_hash *ctx, const u8 *data, size_t len)
131 case CRYPTO_HASH_ALG_MD5:
132 case CRYPTO_HASH_ALG_HMAC_MD5:
133 MD5Update(&ctx->u.md5, data, len);
135 case CRYPTO_HASH_ALG_SHA1:
136 case CRYPTO_HASH_ALG_HMAC_SHA1:
137 SHA1Update(&ctx->u.sha1, data, len);
140 case CRYPTO_HASH_ALG_SHA256:
141 case CRYPTO_HASH_ALG_HMAC_SHA256:
142 sha256_process(&ctx->u.sha256, data, len);
144 #endif /* CONFIG_SHA256 */
151 int crypto_hash_finish(struct crypto_hash *ctx, u8 *mac, size_t *len)
159 if (mac == NULL || len == NULL) {
165 case CRYPTO_HASH_ALG_MD5:
172 MD5Final(mac, &ctx->u.md5);
174 case CRYPTO_HASH_ALG_SHA1:
181 SHA1Final(mac, &ctx->u.sha1);
184 case CRYPTO_HASH_ALG_SHA256:
191 sha256_done(&ctx->u.sha256, mac);
193 #endif /* CONFIG_SHA256 */
194 case CRYPTO_HASH_ALG_HMAC_MD5:
202 MD5Final(mac, &ctx->u.md5);
204 os_memcpy(k_pad, ctx->key, ctx->key_len);
205 os_memset(k_pad + ctx->key_len, 0,
206 sizeof(k_pad) - ctx->key_len);
207 for (i = 0; i < sizeof(k_pad); i++)
209 MD5Init(&ctx->u.md5);
210 MD5Update(&ctx->u.md5, k_pad, sizeof(k_pad));
211 MD5Update(&ctx->u.md5, mac, 16);
212 MD5Final(mac, &ctx->u.md5);
214 case CRYPTO_HASH_ALG_HMAC_SHA1:
222 SHA1Final(mac, &ctx->u.sha1);
224 os_memcpy(k_pad, ctx->key, ctx->key_len);
225 os_memset(k_pad + ctx->key_len, 0,
226 sizeof(k_pad) - ctx->key_len);
227 for (i = 0; i < sizeof(k_pad); i++)
229 SHA1Init(&ctx->u.sha1);
230 SHA1Update(&ctx->u.sha1, k_pad, sizeof(k_pad));
231 SHA1Update(&ctx->u.sha1, mac, 20);
232 SHA1Final(mac, &ctx->u.sha1);
235 case CRYPTO_HASH_ALG_HMAC_SHA256:
243 sha256_done(&ctx->u.sha256, mac);
245 os_memcpy(k_pad, ctx->key, ctx->key_len);
246 os_memset(k_pad + ctx->key_len, 0,
247 sizeof(k_pad) - ctx->key_len);
248 for (i = 0; i < sizeof(k_pad); i++)
250 sha256_init(&ctx->u.sha256);
251 sha256_process(&ctx->u.sha256, k_pad, sizeof(k_pad));
252 sha256_process(&ctx->u.sha256, mac, 32);
253 sha256_done(&ctx->u.sha256, mac);
255 #endif /* CONFIG_SHA256 */
267 int crypto_global_init(void)
273 void crypto_global_deinit(void)