예제 #1
0
/* 'do it all in one go' subroutine     */
void hmac_sha(const unsigned char key[], unsigned long key_len,
          const unsigned char data[], unsigned long data_len,
          unsigned char mac[], unsigned long mac_len)
{   hmac_ctx    cx[1];

    hmac_sha_begin(cx);
    hmac_sha_key(key, key_len, cx);
    hmac_sha_data(data, data_len, cx);
    hmac_sha_end(mac, mac_len, cx);
}
예제 #2
0
int fcrypt_init(
    int mode,                               /* the mode to be used (input)          */
    const unsigned char pwd[],              /* the user specified password (input)  */
    unsigned int pwd_len,                   /* the length of the password (input)   */
    const unsigned char salt[],             /* the salt (input)                     */
#ifdef PASSWORD_VERIFIER
    unsigned char pwd_ver[PWD_VER_LENGTH],  /* 2 byte password verifier (output)    */
#endif
    fcrypt_ctx      cx[1])                  /* the file encryption context (output) */
{
    unsigned char kbuf[2 * MAX_KEY_LENGTH + PWD_VER_LENGTH];

    if(pwd_len > MAX_PWD_LENGTH)
        return PASSWORD_TOO_LONG;

    if(mode < 1 || mode > 3)
        return BAD_MODE;

    cx->mode = mode;
    cx->pwd_len = pwd_len;
    /* initialise the encryption nonce and buffer pos   */
    cx->encr_pos = BLOCK_SIZE;

    /* if we need a random component in the encryption  */
    /* nonce, this is where it would have to be set     */
    memset(cx->nonce, 0, BLOCK_SIZE * sizeof(unsigned char));
    /* initialise for authentication			        */
    hmac_sha_begin(cx->auth_ctx);

    /* derive the encryption and authetication keys and the password verifier   */
    derive_key(pwd, pwd_len, salt, SALT_LENGTH(mode), KEYING_ITERATIONS,
                        kbuf, 2 * KEY_LENGTH(mode) + PWD_VER_LENGTH);
    /* set the encryption key							*/
    aes_encrypt_key(kbuf, KEY_LENGTH(mode), cx->encr_ctx);
    /* set the authentication key						*/
    hmac_sha_key(kbuf + KEY_LENGTH(mode), KEY_LENGTH(mode), cx->auth_ctx);
#ifdef PASSWORD_VERIFIER
    memcpy(pwd_ver, kbuf + 2 * KEY_LENGTH(mode), PWD_VER_LENGTH);
#endif
    /* clear the buffer holding the derived key values	*/
    memset(kbuf, 0, 2 * KEY_LENGTH(mode) + PWD_VER_LENGTH);

    return GOOD_RETURN;
}
예제 #3
0
파일: hmac_test.c 프로젝트: HydAu/SHA
int main()
{   unsigned int    i, j, k, key_len = 64;
    unsigned char   mac[HMAC_MAX_OUTPUT_SIZE];

#ifdef SHA_1
    for(i = 0; i < SHA1_TESTS; ++i)
    {
        hmac_sha(HMAC_SHA1, t_sha1[i].key, t_sha1[i].key_len, t_sha1[i].text, t_sha1[i].txt_len, mac, t_sha1[i].mac_len);

        printf("\nHMAC-SHA1 test %i, ", i + 1);
        printf("key %s", memcmp(t_sha1[i].mac, mac, t_sha1[i].mac_len) ? "is bad" : "is good");
        printf("\n");
        for(j = 0; j < t_sha1[i].mac_len; j += 4)
            printf("0x%02x%02x%02x%02x ", mac[j], mac[j + 1], mac[j + 2], mac[j + 3]);
        printf("\n");
    }

    for(i = 0; i < SHA1_TESTS; ++i)
    {   hmac_ctx    cx[1];

        hmac_sha_begin(HMAC_SHA1, cx);
        hmac_sha_key(t_sha1[i].key, t_sha1[i].key_len / 2, cx);
        hmac_sha_key(t_sha1[i].key + t_sha1[i].key_len / 2, t_sha1[i].key_len - t_sha1[i].key_len / 2, cx);

        hmac_sha_data(t_sha1[i].text, t_sha1[i].txt_len / 2, cx);
        hmac_sha_data(t_sha1[i].text + t_sha1[i].txt_len / 2, t_sha1[i].txt_len - t_sha1[i].txt_len / 2, cx);

        hmac_sha_end(mac, t_sha1[i].mac_len, cx);

        printf("\nHMAC-SHA1 test %i, ", i + 1);
        printf("mac %s", memcmp(t_sha1[i].mac, mac, t_sha1[i].mac_len) ? "is bad" : "is good");
        printf("\n");
        for(j = 0; j < t_sha1[i].mac_len; j += 4)
            printf("0x%02x%02x%02x%02x ", mac[j], mac[j + 1], mac[j + 2], mac[j + 3]);
        printf("\n");
    }
#endif

#ifdef SHA_256
    for(i = 0; i < SHA256_TESTS; ++i)
    {
        hmac_sha(HMAC_SHA256, t_sha256[i].key, t_sha256[i].key_len, t_sha256[i].text,
                                t_sha256[i].txt_len, mac,t_sha256[i].mac_len);

        printf("\nHMAC-SHA256 test %i, ", i + 1);
        printf("mac %s", memcmp(t_sha256[i].mac, mac, t_sha256[i].mac_len)
                                                ? "is bad" : "is good");

        for(j = 0; j < t_sha256[i].mac_len; j += 4)
        {
            if(j % 16 == 0)
                printf("\n");
            printf("0x%02x%02x%02x%02x ", mac[j], mac[j + 1], mac[j + 2], mac[j + 3]);
        }
        printf("\n");
    }

    for(i = 0; i < SHA256_TESTS; ++i)
    {   hmac_ctx    cx[1];

        hmac_sha_begin(HMAC_SHA256, cx);
        hmac_sha_key(t_sha256[i].key, t_sha256[i].key_len / 2, cx);
        hmac_sha_key(t_sha256[i].key + t_sha256[i].key_len / 2,
                        t_sha256[i].key_len - t_sha256[i].key_len / 2, cx);

        hmac_sha_data(t_sha256[i].text, t_sha256[i].txt_len / 2, cx);
        hmac_sha_data(t_sha256[i].text + t_sha256[i].txt_len / 2,
                        t_sha256[i].txt_len - t_sha256[i].txt_len / 2, cx);

        hmac_sha_end(mac, t_sha256[i].mac_len, cx);

        printf("\nHMAC-SHA256 test %i, ", i + 1);
        printf("mac %s", memcmp(t_sha256[i].mac, mac, t_sha256[i].mac_len)
                                                ? "is bad" : "is good");

        for(j = 0; j < t_sha256[i].mac_len; j += 4)
        {
            if(j % 16 == 0)
                printf("\n");
            printf("0x%02x%02x%02x%02x ", mac[j], mac[j + 1], mac[j + 2], mac[j + 3]);
        }
        printf("\n");
    }
#endif

#ifdef SHA_224
    for(i = 0; i < SHA2_TESTS; ++i)
    {   hmac_ctx cx[1];
        hmac_sha_begin(HMAC_SHA224, cx);
        hmac_sha_key(t_s2[i].key, t_s2[i].key_len / 2, cx);
        hmac_sha_key(t_s2[i].key + t_s2[i].key_len / 2,
                    t_s2[i].key_len - t_s2[i].key_len / 2, cx);

        hmac_sha_data(t_s2[i].text, t_s2[i].txt_len / 2, cx);
        hmac_sha_data(t_s2[i].text + t_s2[i].txt_len / 2,
                        t_s2[i].txt_len - t_s2[i].txt_len / 2, cx);

        hmac_sha_end(mac, t_s2[i].mac_len[0], cx);

        printf("\nHMAC-SHA224 test %i, ", i + 1);
        printf("mac %s", memcmp(t_s2[i].r224, mac, t_s2[i].mac_len[0])
                                                ? "is bad" : "is good");
        for(k = 0; k < t_s2[i].mac_len[0]; k += 4)
        {
            if(k % 16 == 0)
                printf("\n");
            printf("0x%02x%02x%02x%02x ", mac[k], mac[k + 1], mac[k + 2], mac[k + 3]);
        }
        printf("\n");
    }
#endif

#ifdef SHA_256
    for(i = 0; i < SHA2_TESTS; ++i)
    {   hmac_ctx cx[1];
        hmac_sha_begin(HMAC_SHA256, cx);
        hmac_sha_key(t_s2[i].key, t_s2[i].key_len / 2, cx);
        hmac_sha_key(t_s2[i].key + t_s2[i].key_len / 2,
                    t_s2[i].key_len - t_s2[i].key_len / 2, cx);

        hmac_sha_data(t_s2[i].text, t_s2[i].txt_len / 2, cx);
        hmac_sha_data(t_s2[i].text + t_s2[i].txt_len / 2,
                        t_s2[i].txt_len - t_s2[i].txt_len / 2, cx);

        hmac_sha_end(mac, t_s2[i].mac_len[1], cx);

        printf("\nHMAC-SHA256 test %i, ", i + 1);
        printf("mac %s", memcmp(t_s2[i].r256, mac, t_s2[i].mac_len[1])
                                                ? "is bad" : "is good");
        for(k = 0; k < t_s2[i].mac_len[1]; k += 4)
        {
            if(k % 16 == 0)
                printf("\n");
            printf("0x%02x%02x%02x%02x ", mac[k], mac[k + 1], mac[k + 2], mac[k + 3]);
        }
        printf("\n");
    }
#endif

#ifdef SHA_384
    for(i = 0; i < SHA2_TESTS; ++i)
    {   hmac_ctx cx[1];
        hmac_sha_begin(HMAC_SHA384, cx);
        hmac_sha_key(t_s2[i].key, t_s2[i].key_len / 2, cx);
        hmac_sha_key(t_s2[i].key + t_s2[i].key_len / 2,
                    t_s2[i].key_len - t_s2[i].key_len / 2, cx);

        hmac_sha_data(t_s2[i].text, t_s2[i].txt_len / 2, cx);
        hmac_sha_data(t_s2[i].text + t_s2[i].txt_len / 2,
                        t_s2[i].txt_len - t_s2[i].txt_len / 2, cx);

        hmac_sha_end(mac, t_s2[i].mac_len[2], cx);

        printf("\nHMAC-SHA384 test %i, ", i + 1);
        printf("mac %s", memcmp(t_s2[i].r384, mac, t_s2[i].mac_len[2])
                                                ? "is bad" : "is good");
        for(k = 0; k < t_s2[i].mac_len[2]; k += 4)
        {
            if(k % 16 == 0)
                printf("\n");
            printf("0x%02x%02x%02x%02x ", mac[k], mac[k + 1], mac[k + 2], mac[k + 3]);
        }
        printf("\n");
    }
#endif

#ifdef SHA_512
    for(i = 0; i < SHA2_TESTS; ++i)
    {   hmac_ctx cx[1];
        hmac_sha_begin(HMAC_SHA512, cx);
        hmac_sha_key(t_s2[i].key, t_s2[i].key_len / 2, cx);
        hmac_sha_key(t_s2[i].key + t_s2[i].key_len / 2,
                    t_s2[i].key_len - t_s2[i].key_len / 2, cx);

        hmac_sha_data(t_s2[i].text, t_s2[i].txt_len / 2, cx);
        hmac_sha_data(t_s2[i].text + t_s2[i].txt_len / 2,
                        t_s2[i].txt_len - t_s2[i].txt_len / 2, cx);

        hmac_sha_end(mac, t_s2[i].mac_len[3], cx);

        printf("\nHMAC-SHA512 test %i, ", i + 1);
        printf("mac %s", memcmp(t_s2[i].r512, mac, t_s2[i].mac_len[3])
                                                ? "is bad" : "is good");
        for(k = 0; k < t_s2[i].mac_len[3]; k += 4)
        {
            if(k % 16 == 0)
                printf("\n");
            printf("0x%02x%02x%02x%02x ", mac[k], mac[k + 1], mac[k + 2], mac[k + 3]);
        }
        printf("\n");
    }
#endif

    printf("\n\n");
    return 0;
}