Код (Text): #define SHA256_HMAC_BLOCK_LEN 64 typedef struct { SHA256_CTX sha256; CW_UINT8 k_ipad[SHA256_HMAC_BLOCK_LEN]; CW_UINT8 k_opad[SHA256_HMAC_BLOCK_LEN]; } HMAC256_CTX; Код (Text): void hmac256_init(HMAC256_CTX *ctx, const void *key, CW_UINT32 keylen) { SHA256_CTX sha256; int i; mlock(ctx->k_ipad, sizeof(ctx->k_ipad)); mlock(ctx->k_opad, sizeof(ctx->k_opad)); memset(ctx->k_ipad, 0, sizeof(ctx->k_ipad)); memset(ctx->k_opad, 0, sizeof(ctx->k_opad)); if (keylen > SHA256_HMAC_BLOCK_LEN) { sha256_init(&sha256); sha256_update(&sha256, key, keylen); sha256_final(&sha256, ctx->k_ipad); memcpy(ctx->k_opad, ctx->k_ipad, SHA256_DIGEST_LEN); } else { memcpy(ctx->k_ipad, key, keylen); memcpy(ctx->k_opad, key, keylen); } for (i = 0; i < SHA256_HMAC_BLOCK_LEN; i++) { ctx->k_ipad[i] ^= 0x36; ctx->k_opad[i] ^= 0x5C; } } void hmac256_update_first(HMAC256_CTX *ctx, const void *buffer, CW_UINT32 len) { sha256_init(&ctx->sha256); sha256_update(&ctx->sha256, ctx->k_ipad, sizeof(ctx->k_ipad)); sha256_update(&ctx->sha256, buffer, len); } void __inline hmac256_update_next(HMAC256_CTX *ctx, const void *buffer, CW_UINT32 len) { sha256_update(&ctx->sha256, buffer, len); } void hmac256_final(HMAC256_CTX *ctx, void *result) { sha256_final(&ctx->sha256, result); sha256_init(&ctx->sha256); sha256_update(&ctx->sha256, ctx->k_opad, sizeof(ctx->k_opad)); sha256_update(&ctx->sha256, result, sizeof(result)); sha256_final(&ctx->sha256, result); } void hmac256_burn(HMAC256_CTX *ctx) { sha256_burn(&ctx->sha256); memset(ctx->k_ipad, 0, sizeof(ctx->k_ipad)); memset(ctx->k_opad, 0, sizeof(ctx->k_opad)); munlock(ctx->k_ipad, sizeof(ctx->k_ipad)); munlock(ctx->k_opad, sizeof(ctx->k_opad)); } Вот такой вот код. Не проходит тесты по проверочным векторам (http://www.ipa.go.jp/security/rfc/RFC4868EN.html#[SHA256+]) Код самой функции SHA-256 тест проходит. Код (Text): typedef struct { u8 *key; u8 *data; u8 *hmac; } SHA256_HMAC_TEXT; static const SHA256_HMAC_TEXT hmac256_vect[] = { {"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", "Hi There", "\xb0\x34\x4c\x61\xd8\xdb\x38\x53\x5c\xa8\xaf\xce\xaf\x0b\xf1\x2b\x88\x1d\xc2\x00\xc9\x83\x3d\xa7\x26\xe9\x37\x6c\x2e\x32\xcf\xf7"}, {"Jefe", "what do ya want for nothing?", "\x5b\xdc\xc1\x46\xbf\x60\x75\x4e\x6a\x04\x24\x26\x08\x95\x75\xc7\x5a\x00\x3f\x08\x9d\x27\x39\x83\x9d\xec\x58\xb9\x64\xec\x38\x43"} };