Changes between Initial Version and Version 1 of Ticket #19979, comment 1


Ignore:
Timestamp:
Oct 23, 2016, 4:20:45 PM (3 years ago)
Author:
icanhasaccount
Comment:

Legend:

Unmodified
Added
Removed
Modified
  • Ticket #19979, comment 1

    initial v1  
    33
    44I had a quick look at this today - the implementation in openssl seems to fail (
    5 error:0F073041:common libcrypto routines:CRYPTO_memdup:malloc failure) when the key length is zero (Its one of the tests for the current implementation in test_crypto.c).
     5error:0F073041:common libcrypto routines:CRYPTO_memdup:malloc failure) when the key length is zero (Its one of the tests for the current implementation in test_crypto.c). Example below as attachments are flagged as spam:
    66
    7 I tried to upload a test but trac thinks its spam ><
     7#include <stdlib.h>
     8#include <stdint.h>
     9#include <stdio.h>
     10#include <string.h>
     11
     12#include <openssl/err.h>
     13#include <openssl/evp.h>
     14#include <openssl/kdf.h>
     15
     16#define N_KEYS 3
     17
     18static const char *keys[] = {
     19        "",
     20        "Tor",
     21        "AN ALARMING ITEM TO FIND ON YOUR CREDIT-RATING STATEMENT"
     22};
     23
     24static const char *expected[] = {
     25        /* "" */
     26        "d3490ed48b12a48f9547861583573fe3f19aafe3f81dc7fc75"
     27        "eeed96d741b3290f941576c1f9f0b2d463d1ec7ab2c6bf71cd"
     28        "d7f826c6298c00dbfe6711635d7005f0269493edf6046cc7e7"
     29        "dcf6abe0d20c77cf363e8ffe358927817a3d3e73712cee28d8",
     30        /* Tor */
     31        "5521492a85139a8d9107a2d5c0d9c91610d0f95989975ebee6"
     32        "c02a4f8d622a6cfdf9b7c7edd3832e2760ded1eac309b76f8d"
     33        "66c4a3c4d6225429b3a016e3c3d45911152fc87bc2de9630c3"
     34        "961be9fdb9f93197ea8e5977180801926d3321fa21513e59ac",
     35        /* AN ALARMING ITEM TO FIND ON YOUR CREDIT-RATING STATEMENT */
     36        "a2aa9b50da7e481d30463adb8f233ff06e9571a0ca6ab6df0f"
     37        "b206fa34e5bc78d063fc291501beec53b36e5a0e434561200c"
     38        "5f8bd13e0f88b3459600b4dc21d69363e2895321c06184879d"
     39        "94b18f078411be70b767c7fc40679a9440a0c95ea83a23efbf"
     40};
     41
     42int
     43crypto_expand_key_material_rfc5869_sha256(
     44                                    const uint8_t *key_in, size_t key_in_len,
     45                                    const uint8_t *salt_in, size_t salt_in_len,
     46                                    const uint8_t *info_in, size_t info_in_len,
     47                                    uint8_t *key_out, size_t key_out_len)
     48{
     49        EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL);
     50
     51        if (info_in_len > 1024)
     52                goto fail;
     53
     54        if (EVP_PKEY_derive_init(pctx) <= 0)
     55                goto fail;
     56
     57        if (EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()) <= 0)
     58                goto fail;
     59
     60        if (EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt_in, salt_in_len) <= 0)
     61                goto fail;
     62
     63        if (EVP_PKEY_CTX_set1_hkdf_key(pctx, key_in, key_in_len) <= 0)
     64                goto fail; if (EVP_PKEY_CTX_add1_hkdf_info(pctx, info_in, info_in_len) <= 0)
     65                goto fail;
     66
     67        if (EVP_PKEY_derive(pctx, key_out, &key_out_len) <= 0)
     68                goto fail;
     69
     70        EVP_PKEY_CTX_free(pctx);
     71
     72        return 0;
     73
     74fail:
     75        EVP_PKEY_CTX_free(pctx);
     76        return -1;
     77}
     78
     79void
     80dump_key_material(const uint8_t *key, const size_t key_sz)
     81{
     82        for (size_t i = 0; i < key_sz; i++)
     83                fprintf(stdout, "%02x", key[i]);
     84
     85        fprintf(stdout, "\n");
     86}
     87
     88int
     89main(int argc, char **argv)
     90{
     91        uint8_t key_material[100];
     92        const uint8_t salt[] = "ntor-curve25519-sha256-1:key_extract";
     93        const size_t salt_len = strlen((char*)salt);
     94        const uint8_t m_expand[] = "ntor-curve25519-sha256-1:key_expand";
     95        const size_t m_expand_len = strlen((char*)m_expand);
     96
     97        OpenSSL_add_all_algorithms();
     98
     99        for (size_t i = 0; i < N_KEYS; i++) {
     100                memset(key_material, 0, sizeof(key_material));
     101                const int res = crypto_expand_key_material_rfc5869_sha256(
     102                                (uint8_t *)keys[i],
     103                                strlen(keys[i]), salt, salt_len,
     104                                m_expand, m_expand_len,
     105                                key_material, sizeof(key_material));
     106                if (res == -1) {
     107                        fprintf(stdout, "Failed for key: \"%s\"\n", keys[i]);
     108                        fprintf(stdout, "Expected: \n%s\n", expected[i]);
     109                        const unsigned long err = ERR_get_error();
     110                        fprintf(stdout, "OpenSSL says wut: %s\n",
     111                                ERR_error_string(err, NULL));
     112                        continue;
     113                }
     114                fprintf(stdout, "For key: %s\n", keys[i]);
     115                fprintf(stdout, "Expected: \n%s\n", expected[i]);
     116                fprintf(stdout, "Actual: \n");
     117                dump_key_material(key_material, sizeof(key_material));
     118        }
     119
     120        EVP_cleanup();
     121}