crypto_internal.c revision c5ec7f57ead87efa365800228aa0b09a12d9e6c4
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Crypto wrapper for internal crypto implementation 31f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Copyright (c) 2006-2011, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h" 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h" 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "crypto.h" 131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#include "sha256_i.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "sha1_i.h" 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "md5_i.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct crypto_hash { 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enum crypto_hash_alg alg; 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union { 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct MD5Context md5; 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct SHA1Context sha1; 221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_SHA256 231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct sha256_state sha256; 241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_SHA256 */ 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } u; 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 key[64]; 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t key_len; 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct crypto_hash * crypto_hash_init(enum crypto_hash_alg alg, const u8 *key, 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t key_len) 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct crypto_hash *ctx; 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 k_pad[64]; 361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 tk[32]; 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx = os_zalloc(sizeof(*ctx)); 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctx == NULL) 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->alg = alg; 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (alg) { 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_MD5: 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Init(&ctx->u.md5); 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_SHA1: 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Init(&ctx->u.sha1); 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_SHA256 531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case CRYPTO_HASH_ALG_SHA256: 541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_init(&ctx->u.sha256); 551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_SHA256 */ 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_HMAC_MD5: 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (key_len > sizeof(k_pad)) { 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Init(&ctx->u.md5); 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Update(&ctx->u.md5, key, key_len); 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Final(tk, &ctx->u.md5); 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key = tk; 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_len = 16; 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ctx->key, key, key_len); 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->key_len = key_len; 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(k_pad, key, key_len); 691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (key_len < sizeof(k_pad)) 701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len); 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < sizeof(k_pad); i++) 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt k_pad[i] ^= 0x36; 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Init(&ctx->u.md5); 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Update(&ctx->u.md5, k_pad, sizeof(k_pad)); 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_HMAC_SHA1: 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (key_len > sizeof(k_pad)) { 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Init(&ctx->u.sha1); 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Update(&ctx->u.sha1, key, key_len); 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Final(tk, &ctx->u.sha1); 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key = tk; 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_len = 20; 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ctx->key, key, key_len); 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->key_len = key_len; 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(k_pad, key, key_len); 881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (key_len < sizeof(k_pad)) 891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len); 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < sizeof(k_pad); i++) 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt k_pad[i] ^= 0x36; 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Init(&ctx->u.sha1); 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Update(&ctx->u.sha1, k_pad, sizeof(k_pad)); 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_SHA256 961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case CRYPTO_HASH_ALG_HMAC_SHA256: 971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (key_len > sizeof(k_pad)) { 981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_init(&ctx->u.sha256); 991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_process(&ctx->u.sha256, key, key_len); 1001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_done(&ctx->u.sha256, tk); 1011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt key = tk; 1021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt key_len = 32; 1031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 1041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(ctx->key, key, key_len); 1051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ctx->key_len = key_len; 1061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(k_pad, key, key_len); 1081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (key_len < sizeof(k_pad)) 1091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len); 1101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt for (i = 0; i < sizeof(k_pad); i++) 1111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt k_pad[i] ^= 0x36; 1121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_init(&ctx->u.sha256); 1131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_process(&ctx->u.sha256, k_pad, sizeof(k_pad)); 1141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 1151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_SHA256 */ 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctx); 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ctx; 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid crypto_hash_update(struct crypto_hash *ctx, const u8 *data, size_t len) 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctx == NULL) 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ctx->alg) { 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_MD5: 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_HMAC_MD5: 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Update(&ctx->u.md5, data, len); 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_SHA1: 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_HMAC_SHA1: 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Update(&ctx->u.sha1, data, len); 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_SHA256 1401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case CRYPTO_HASH_ALG_SHA256: 1411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case CRYPTO_HASH_ALG_HMAC_SHA256: 1421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_process(&ctx->u.sha256, data, len); 1431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 1441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_SHA256 */ 1451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt default: 1461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint crypto_hash_finish(struct crypto_hash *ctx, u8 *mac, size_t *len) 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 k_pad[64]; 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctx == NULL) 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -2; 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (mac == NULL || len == NULL) { 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctx); 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ctx->alg) { 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_MD5: 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*len < 16) { 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 16; 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctx); 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 16; 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Final(mac, &ctx->u.md5); 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_SHA1: 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*len < 20) { 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 20; 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctx); 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 20; 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Final(mac, &ctx->u.sha1); 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_SHA256 1841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case CRYPTO_HASH_ALG_SHA256: 1851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (*len < 32) { 1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *len = 32; 1871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(ctx); 1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 1901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *len = 32; 1911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_done(&ctx->u.sha256, mac); 1921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 1931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_SHA256 */ 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_HMAC_MD5: 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*len < 16) { 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 16; 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctx); 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 16; 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Final(mac, &ctx->u.md5); 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(k_pad, ctx->key, ctx->key_len); 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(k_pad + ctx->key_len, 0, 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(k_pad) - ctx->key_len); 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < sizeof(k_pad); i++) 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt k_pad[i] ^= 0x5c; 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Init(&ctx->u.md5); 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Update(&ctx->u.md5, k_pad, sizeof(k_pad)); 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Update(&ctx->u.md5, mac, 16); 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Final(mac, &ctx->u.md5); 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_HMAC_SHA1: 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*len < 20) { 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 20; 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctx); 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 20; 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Final(mac, &ctx->u.sha1); 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(k_pad, ctx->key, ctx->key_len); 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(k_pad + ctx->key_len, 0, 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(k_pad) - ctx->key_len); 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < sizeof(k_pad); i++) 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt k_pad[i] ^= 0x5c; 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Init(&ctx->u.sha1); 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Update(&ctx->u.sha1, k_pad, sizeof(k_pad)); 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Update(&ctx->u.sha1, mac, 20); 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Final(mac, &ctx->u.sha1); 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_SHA256 2351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case CRYPTO_HASH_ALG_HMAC_SHA256: 2361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (*len < 32) { 2371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *len = 32; 2381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(ctx); 2391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 2401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *len = 32; 2421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_done(&ctx->u.sha256, mac); 2441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(k_pad, ctx->key, ctx->key_len); 2461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memset(k_pad + ctx->key_len, 0, 2471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sizeof(k_pad) - ctx->key_len); 2481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt for (i = 0; i < sizeof(k_pad); i++) 2491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt k_pad[i] ^= 0x5c; 2501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_init(&ctx->u.sha256); 2511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_process(&ctx->u.sha256, k_pad, sizeof(k_pad)); 2521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_process(&ctx->u.sha256, mac, 32); 2531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_done(&ctx->u.sha256, mac); 2541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 2551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_SHA256 */ 2561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt default: 2571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(ctx); 2581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctx); 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint crypto_global_init(void) 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid crypto_global_deinit(void) 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 276