помогите найти ошибку в реализации HMAC-SHA256

Тема в разделе "WASM.CRYPTO", создана пользователем bi0s269, 28 сен 2008.

  1. bi0s269

    bi0s269 New Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    68
    Код (Text):
    1. #define SHA256_HMAC_BLOCK_LEN 64
    2.  
    3. typedef struct {
    4.     SHA256_CTX sha256;
    5.     CW_UINT8   k_ipad[SHA256_HMAC_BLOCK_LEN];
    6.     CW_UINT8   k_opad[SHA256_HMAC_BLOCK_LEN];
    7. } HMAC256_CTX;
    Код (Text):
    1. void hmac256_init(HMAC256_CTX *ctx, const void *key, CW_UINT32 keylen)
    2. {
    3.     SHA256_CTX sha256;
    4.     int        i;
    5.    
    6.     mlock(ctx->k_ipad, sizeof(ctx->k_ipad));
    7.     mlock(ctx->k_opad, sizeof(ctx->k_opad));
    8.    
    9.     memset(ctx->k_ipad, 0, sizeof(ctx->k_ipad));
    10.     memset(ctx->k_opad, 0, sizeof(ctx->k_opad));
    11.  
    12.     if (keylen > SHA256_HMAC_BLOCK_LEN) {
    13.         sha256_init(&sha256);
    14.         sha256_update(&sha256, key, keylen);
    15.         sha256_final(&sha256, ctx->k_ipad);
    16.         memcpy(ctx->k_opad, ctx->k_ipad, SHA256_DIGEST_LEN);
    17.     } else {
    18.         memcpy(ctx->k_ipad, key, keylen);
    19.         memcpy(ctx->k_opad, key, keylen);    
    20.     }
    21.    
    22.     for (i = 0; i < SHA256_HMAC_BLOCK_LEN; i++) {
    23.         ctx->k_ipad[i] ^= 0x36;
    24.         ctx->k_opad[i] ^= 0x5C;
    25.     }
    26. }
    27.  
    28. void hmac256_update_first(HMAC256_CTX *ctx, const void *buffer, CW_UINT32 len)
    29. {
    30.     sha256_init(&ctx->sha256);
    31.     sha256_update(&ctx->sha256, ctx->k_ipad, sizeof(ctx->k_ipad));
    32.     sha256_update(&ctx->sha256, buffer, len);
    33. }
    34.  
    35. void __inline hmac256_update_next(HMAC256_CTX *ctx, const void *buffer, CW_UINT32 len)
    36. {
    37.     sha256_update(&ctx->sha256, buffer, len);
    38. }
    39.  
    40. void hmac256_final(HMAC256_CTX *ctx, void *result)
    41. {
    42.     sha256_final(&ctx->sha256, result);
    43.  
    44.     sha256_init(&ctx->sha256);
    45.     sha256_update(&ctx->sha256, ctx->k_opad, sizeof(ctx->k_opad));
    46.     sha256_update(&ctx->sha256, result, sizeof(result));
    47.     sha256_final(&ctx->sha256, result);
    48. }
    49.  
    50. void hmac256_burn(HMAC256_CTX *ctx)
    51. {
    52.     sha256_burn(&ctx->sha256);
    53.    
    54.     memset(ctx->k_ipad, 0, sizeof(ctx->k_ipad));
    55.     memset(ctx->k_opad, 0, sizeof(ctx->k_opad));
    56.    
    57.     munlock(ctx->k_ipad, sizeof(ctx->k_ipad));
    58.     munlock(ctx->k_opad, sizeof(ctx->k_opad));
    59. }
    Вот такой вот код. Не проходит тесты по проверочным векторам (http://www.ipa.go.jp/security/rfc/RFC4868EN.html#[SHA256+])
    Код самой функции SHA-256 тест проходит.

    Код (Text):
    1. typedef struct {
    2.     u8 *key;
    3.     u8 *data;
    4.     u8 *hmac;
    5. } SHA256_HMAC_TEXT;
    6.  
    7. static const SHA256_HMAC_TEXT hmac256_vect[] = {
    8.     {"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
    9.      "Hi There",
    10.      "\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"},
    11.     {"Jefe",
    12.      "what do ya want for nothing?",
    13.      "\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"}
    14. };
     
  2. CreatorCray

    CreatorCray Member

    Публикаций:
    0
    Регистрация:
    5 авг 2006
    Сообщения:
    201
    Думаю что тут

    void *result
    ...
    sha256_update(&ctx->sha256, result, sizeof(result));
     
  3. bi0s269

    bi0s269 New Member

    Публикаций:
    0
    Регистрация:
    2 ноя 2007
    Сообщения:
    68
    Спасибо. дейсвительно "дыбильная" ошибка :)