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" 14d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#include "sha384_i.h" 15d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#include "sha512_i.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "sha1_i.h" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "md5_i.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct crypto_hash { 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enum crypto_hash_alg alg; 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt union { 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct MD5Context md5; 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct SHA1Context sha1; 241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_SHA256 251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct sha256_state sha256; 261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_SHA256 */ 27d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#ifdef CONFIG_INTERNAL_SHA384 28d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt struct sha384_state sha384; 29d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#endif /* CONFIG_INTERNAL_SHA384 */ 30d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#ifdef CONFIG_INTERNAL_SHA512 31d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt struct sha512_state sha512; 32d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#endif /* CONFIG_INTERNAL_SHA512 */ 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } u; 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 key[64]; 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t key_len; 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct crypto_hash * crypto_hash_init(enum crypto_hash_alg alg, const u8 *key, 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t key_len) 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct crypto_hash *ctx; 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 k_pad[64]; 441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 tk[32]; 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx = os_zalloc(sizeof(*ctx)); 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctx == NULL) 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->alg = alg; 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (alg) { 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_MD5: 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Init(&ctx->u.md5); 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_SHA1: 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Init(&ctx->u.sha1); 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_SHA256 611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case CRYPTO_HASH_ALG_SHA256: 621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_init(&ctx->u.sha256); 631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_SHA256 */ 65d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#ifdef CONFIG_INTERNAL_SHA384 66d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt case CRYPTO_HASH_ALG_SHA384: 67d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt sha384_init(&ctx->u.sha384); 68d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt break; 69d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#endif /* CONFIG_INTERNAL_SHA384 */ 70d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#ifdef CONFIG_INTERNAL_SHA512 71d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt case CRYPTO_HASH_ALG_SHA512: 72d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt sha512_init(&ctx->u.sha512); 73d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt break; 74d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#endif /* CONFIG_INTERNAL_SHA512 */ 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_HMAC_MD5: 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (key_len > sizeof(k_pad)) { 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Init(&ctx->u.md5); 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Update(&ctx->u.md5, key, key_len); 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Final(tk, &ctx->u.md5); 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key = tk; 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_len = 16; 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ctx->key, key, key_len); 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->key_len = key_len; 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(k_pad, key, key_len); 871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (key_len < sizeof(k_pad)) 881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len); 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < sizeof(k_pad); i++) 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt k_pad[i] ^= 0x36; 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Init(&ctx->u.md5); 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Update(&ctx->u.md5, k_pad, sizeof(k_pad)); 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_HMAC_SHA1: 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (key_len > sizeof(k_pad)) { 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Init(&ctx->u.sha1); 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Update(&ctx->u.sha1, key, key_len); 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Final(tk, &ctx->u.sha1); 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key = tk; 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_len = 20; 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ctx->key, key, key_len); 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctx->key_len = key_len; 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(k_pad, key, key_len); 1061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (key_len < sizeof(k_pad)) 1071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len); 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < sizeof(k_pad); i++) 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt k_pad[i] ^= 0x36; 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Init(&ctx->u.sha1); 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Update(&ctx->u.sha1, k_pad, sizeof(k_pad)); 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_SHA256 1141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case CRYPTO_HASH_ALG_HMAC_SHA256: 1151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (key_len > sizeof(k_pad)) { 1161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_init(&ctx->u.sha256); 1171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_process(&ctx->u.sha256, key, key_len); 1181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_done(&ctx->u.sha256, tk); 1191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt key = tk; 1201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt key_len = 32; 1211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 1221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(ctx->key, key, key_len); 1231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ctx->key_len = key_len; 1241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(k_pad, key, key_len); 1261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (key_len < sizeof(k_pad)) 1271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memset(k_pad + key_len, 0, sizeof(k_pad) - key_len); 1281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt for (i = 0; i < sizeof(k_pad); i++) 1291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt k_pad[i] ^= 0x36; 1301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_init(&ctx->u.sha256); 1311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_process(&ctx->u.sha256, k_pad, sizeof(k_pad)); 1321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 1331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_SHA256 */ 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctx); 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ctx; 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid crypto_hash_update(struct crypto_hash *ctx, const u8 *data, size_t len) 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctx == NULL) 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ctx->alg) { 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_MD5: 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_HMAC_MD5: 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Update(&ctx->u.md5, data, len); 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_SHA1: 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_HMAC_SHA1: 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Update(&ctx->u.sha1, data, len); 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_SHA256 1581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case CRYPTO_HASH_ALG_SHA256: 1591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case CRYPTO_HASH_ALG_HMAC_SHA256: 1601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_process(&ctx->u.sha256, data, len); 1611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 1621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_SHA256 */ 163d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#ifdef CONFIG_INTERNAL_SHA384 164d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt case CRYPTO_HASH_ALG_SHA384: 165d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt sha384_process(&ctx->u.sha384, data, len); 166d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt break; 167d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#endif /* CONFIG_INTERNAL_SHA384 */ 168d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#ifdef CONFIG_INTERNAL_SHA512 169d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt case CRYPTO_HASH_ALG_SHA512: 170d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt sha512_process(&ctx->u.sha512, data, len); 171d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt break; 172d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#endif /* CONFIG_INTERNAL_SHA512 */ 1731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt default: 1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint crypto_hash_finish(struct crypto_hash *ctx, u8 *mac, size_t *len) 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt u8 k_pad[64]; 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t i; 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctx == NULL) 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -2; 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (mac == NULL || len == NULL) { 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctx); 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (ctx->alg) { 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_MD5: 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*len < 16) { 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 16; 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctx); 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 16; 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Final(mac, &ctx->u.md5); 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_SHA1: 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*len < 20) { 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 20; 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctx); 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 20; 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Final(mac, &ctx->u.sha1); 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_SHA256 2121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case CRYPTO_HASH_ALG_SHA256: 2131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (*len < 32) { 2141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *len = 32; 2151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(ctx); 2161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 2171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *len = 32; 2191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_done(&ctx->u.sha256, mac); 2201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 2211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_SHA256 */ 222d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#ifdef CONFIG_INTERNAL_SHA384 223d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt case CRYPTO_HASH_ALG_SHA384: 224d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt if (*len < 48) { 225d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt *len = 48; 226d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt os_free(ctx); 227d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt return -1; 228d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt } 229d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt *len = 48; 230d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt sha384_done(&ctx->u.sha384, mac); 231d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt break; 232d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#endif /* CONFIG_INTERNAL_SHA384 */ 233d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#ifdef CONFIG_INTERNAL_SHA512 234d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt case CRYPTO_HASH_ALG_SHA512: 235d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt if (*len < 64) { 236d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt *len = 64; 237d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt os_free(ctx); 238d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt return -1; 239d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt } 240d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt *len = 64; 241d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt sha512_done(&ctx->u.sha512, mac); 242d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt break; 243d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt#endif /* CONFIG_INTERNAL_SHA512 */ 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_HMAC_MD5: 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*len < 16) { 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 16; 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctx); 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 16; 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Final(mac, &ctx->u.md5); 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(k_pad, ctx->key, ctx->key_len); 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(k_pad + ctx->key_len, 0, 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(k_pad) - ctx->key_len); 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < sizeof(k_pad); i++) 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt k_pad[i] ^= 0x5c; 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Init(&ctx->u.md5); 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Update(&ctx->u.md5, k_pad, sizeof(k_pad)); 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Update(&ctx->u.md5, mac, 16); 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MD5Final(mac, &ctx->u.md5); 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case CRYPTO_HASH_ALG_HMAC_SHA1: 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*len < 20) { 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 20; 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctx); 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = 20; 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Final(mac, &ctx->u.sha1); 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(k_pad, ctx->key, ctx->key_len); 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(k_pad + ctx->key_len, 0, 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sizeof(k_pad) - ctx->key_len); 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < sizeof(k_pad); i++) 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt k_pad[i] ^= 0x5c; 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Init(&ctx->u.sha1); 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Update(&ctx->u.sha1, k_pad, sizeof(k_pad)); 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Update(&ctx->u.sha1, mac, 20); 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SHA1Final(mac, &ctx->u.sha1); 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_SHA256 2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case CRYPTO_HASH_ALG_HMAC_SHA256: 2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (*len < 32) { 2871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *len = 32; 2881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(ctx); 2891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 2901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *len = 32; 2921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_done(&ctx->u.sha256, mac); 2941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(k_pad, ctx->key, ctx->key_len); 2961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memset(k_pad + ctx->key_len, 0, 2971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sizeof(k_pad) - ctx->key_len); 2981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt for (i = 0; i < sizeof(k_pad); i++) 2991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt k_pad[i] ^= 0x5c; 3001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_init(&ctx->u.sha256); 3011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_process(&ctx->u.sha256, k_pad, sizeof(k_pad)); 3021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_process(&ctx->u.sha256, mac, 32); 3031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt sha256_done(&ctx->u.sha256, mac); 3041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 3051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_SHA256 */ 3061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt default: 3071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(ctx); 3081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctx); 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint crypto_global_init(void) 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid crypto_global_deinit(void) 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 326