Замена функций на OpenSSL на функции libtomcrypt

Тема в разделе "WASM.CRYPTO", создана пользователем _akmal_, 16 окт 2010.

  1. _akmal_

    _akmal_ New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2010
    Сообщения:
    1
    Привет всем, есть у меня код который использует ECC из библиотеки OpenSSL, этот код надо заменить аналогичными функциями из libtomcrypt.
    Некий девайс генерирует подпись и отправляет его мне, у меня есть public_key с помощью которого я должен проверить эту подпись, но проблема в том что код c OpenSSL работает а код c libtomcrypt нет. Есть подозрения что я делаю что то не так как надо.
    Кривая строится из указанных ранее параметров.

    вот код:

    Код (Text):
    1. EC_KEY *aacs_key() {
    2.    EC_GROUP *group;
    3.    EC_KEY *key = EC_KEY_new();
    4.    if (key == NULL) {
    5.       return NULL;
    6.    }
    7.  
    8.    group = aacs_group();
    9.    if (!EC_KEY_set_group(key, group)) {
    10.       EC_KEY_free(key);
    11.       EC_GROUP_free(group);
    12.       return NULL;
    13.    } else {
    14.       return key;
    15.    }
    16. }
    17.  
    18. EC_GROUP *aacs_group() {
    19.    EC_GROUP *group = NULL;
    20.    EC_POINT *P = NULL;
    21.    BN_CTX    *ctx = NULL;
    22.    BIGNUM    *p = NULL, *a = NULL, *b = NULL, *x = NULL, *y = NULL, *order = NULL;
    23.    int   ok = 0;
    24.  
    25.    const char data_p[] = "900812823637587646514106462588455890498729007071";
    26.    const char data_a[] = "-3";
    27.    const char data_b[] = "366394034647231750324370400222002566844354703832";
    28.    const char data_x[] = "264865613959729647018113670854605162895977008838";
    29.    const char data_y[] = "51841075954883162510413392745168936296187808697";
    30.    const char data_r[] = "900812823637587646514106555566573588779770753047";
    31.  
    32.    if ((ctx = BN_CTX_new()) == NULL) {
    33.       ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_MALLOC_FAILURE);
    34.       goto err;
    35.    }
    36.    if ((p = BN_new()) == NULL || (a = BN_new()) == NULL ||
    37.       (b = BN_new()) == NULL || (x = BN_new()) == NULL ||
    38.       (y = BN_new()) == NULL || (order = BN_new()) == NULL) {
    39.       ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_MALLOC_FAILURE);
    40.       goto err;
    41.    }
    42.  
    43.    if (!BN_dec2bn(&p, data_p) || !BN_dec2bn(&a, data_a)
    44.       || !BN_dec2bn(&b, data_b)) {
    45.       ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB);
    46.       goto err;
    47.    }
    48.  
    49.    if ((group = EC_GROUP_new_curve_GFp(p, a, b, ctx)) == NULL) {
    50.       ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
    51.       goto err;
    52.    }
    53.  
    54.    if ((P = EC_POINT_new(group)) == NULL) {
    55.       ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
    56.       goto err;
    57.    }
    58.  
    59.    if (!BN_dec2bn(&x, data_x) || !BN_dec2bn(&y, data_y)) {
    60.       ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB);
    61.       goto err;
    62.    }
    63.    if (!EC_POINT_set_affine_coordinates_GF2m(group, P, x, y, ctx)) {
    64.       ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
    65.       goto err;
    66.    }
    67.    if (!BN_dec2bn(&order, data_r) || !BN_set_word(x, 1)) {
    68.       ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB);
    69.       goto err;
    70.    }
    71.    if (!EC_GROUP_set_generator(group, P, order, x)) {
    72.       ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
    73.       goto err;
    74.    }
    75.    ok=1;
    76. err:
    77.    if (!ok) {
    78.       EC_GROUP_free(group);
    79.       group = NULL;
    80.    }
    81.    if (P)
    82.       EC_POINT_free(P);
    83.    if (ctx)
    84.       BN_CTX_free(ctx);
    85.    if (p)
    86.       BN_free(p);
    87.    if (a)
    88.       BN_free(a);
    89.    if (b)
    90.       BN_free(b);
    91.    if (order)
    92.       BN_free(order);
    93.    if (x)
    94.       BN_free(x);
    95.    if (y)
    96.       BN_free(y);
    97.    return group;
    98. }
    99.  
    100. int aacs_set_cert(/*out*/ EC_KEY *key, const unsigned char *cert) {
    101.    EC_POINT * public_key = NULL;
    102.    BIGNUM   * x = NULL;
    103.    BIGNUM   * y = NULL;
    104.    const EC_GROUP * group = EC_KEY_get0_group(key);
    105.  
    106.  
    107.    if ((cert[1] != 0) || (cert[2] != 0x00) || (cert[3] != 0x5C)) {
    108.       return -1;
    109.    }
    110.  
    111.    if ((x = BN_bin2bn(cert+12, 20, NULL)) == NULL) {
    112.       return -2;
    113.    }
    114.  
    115.    if ((y = BN_bin2bn(cert+32, 20, NULL)) == NULL) {
    116.       BN_clear_free(x);
    117.       return -3;
    118.    }
    119.  
    120.    if ((public_key = EC_POINT_new(group)) == NULL) {
    121.       BN_clear_free(x);
    122.       BN_clear_free(y);
    123.       return -4;
    124.    }
    125.  
    126.    if (!EC_POINT_set_affine_coordinates_GFp(group, public_key, x, y, NULL)) {
    127.       BN_clear_free(x);
    128.       BN_clear_free(y);
    129.       EC_POINT_free(public_key);
    130.       return -5;
    131.    }
    132.  
    133.    BN_clear_free(x);
    134.    BN_clear_free(y);
    135.    
    136.    int rv = EC_KEY_set_public_key(key, public_key);
    137.    EC_POINT_free(public_key);
    138.  
    139.    return rv;
    140. }
    141.  
    142. int make_key(const unsigned char * priv_key)
    143. {
    144.    unsigned char md_value[EVP_MAX_MD_SIZE];
    145.    unsigned int md_len;
    146.    EVP_MD_CTX mdctx;
    147.    EC_KEY *key = NULL;
    148.    ECDSA_SIG *sig = NULL;
    149.    BIGNUM *priv_key_bn = NULL;
    150.    int ret = -1;
    151.  
    152.    if ((key = aacs_key()) == NULL) {
    153.       ret = -2;
    154.       goto err;
    155.    }
    156.  
    157.    if (!aacs_set_cert(key, cert)) {
    158.       ret = -3;
    159.       goto err;
    160.    }
    161.  
    162.    if (((priv_key_bn = BN_bin2bn(priv_key, 20, NULL)) == NULL) || !EC_KEY_set_private_key(key, priv_key_bn)) {
    163.       ret = -4;
    164.       goto err;
    165.    }
    166. }
    в этом коде как я понял генерируется ключ, нужно его переделать с использованием libtomcrypt.

    в libtomcrypt для этого надо использовать функцию ecc_make_key_ex - который использует параметры кривой установленные пользователем. Я прав?

    нужна помощь!