Привет всем, есть у меня код который использует ECC из библиотеки OpenSSL, этот код надо заменить аналогичными функциями из libtomcrypt. Некий девайс генерирует подпись и отправляет его мне, у меня есть public_key с помощью которого я должен проверить эту подпись, но проблема в том что код c OpenSSL работает а код c libtomcrypt нет. Есть подозрения что я делаю что то не так как надо. Кривая строится из указанных ранее параметров. вот код: Код (Text): EC_KEY *aacs_key() { EC_GROUP *group; EC_KEY *key = EC_KEY_new(); if (key == NULL) { return NULL; } group = aacs_group(); if (!EC_KEY_set_group(key, group)) { EC_KEY_free(key); EC_GROUP_free(group); return NULL; } else { return key; } } EC_GROUP *aacs_group() { EC_GROUP *group = NULL; EC_POINT *P = NULL; BN_CTX *ctx = NULL; BIGNUM *p = NULL, *a = NULL, *b = NULL, *x = NULL, *y = NULL, *order = NULL; int ok = 0; const char data_p[] = "900812823637587646514106462588455890498729007071"; const char data_a[] = "-3"; const char data_b[] = "366394034647231750324370400222002566844354703832"; const char data_x[] = "264865613959729647018113670854605162895977008838"; const char data_y[] = "51841075954883162510413392745168936296187808697"; const char data_r[] = "900812823637587646514106555566573588779770753047"; if ((ctx = BN_CTX_new()) == NULL) { ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_MALLOC_FAILURE); goto err; } if ((p = BN_new()) == NULL || (a = BN_new()) == NULL || (b = BN_new()) == NULL || (x = BN_new()) == NULL || (y = BN_new()) == NULL || (order = BN_new()) == NULL) { ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_MALLOC_FAILURE); goto err; } if (!BN_dec2bn(&p, data_p) || !BN_dec2bn(&a, data_a) || !BN_dec2bn(&b, data_b)) { ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB); goto err; } if ((group = EC_GROUP_new_curve_GFp(p, a, b, ctx)) == NULL) { ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); goto err; } if ((P = EC_POINT_new(group)) == NULL) { ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); goto err; } if (!BN_dec2bn(&x, data_x) || !BN_dec2bn(&y, data_y)) { ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB); goto err; } if (!EC_POINT_set_affine_coordinates_GF2m(group, P, x, y, ctx)) { ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); goto err; } if (!BN_dec2bn(&order, data_r) || !BN_set_word(x, 1)) { ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB); goto err; } if (!EC_GROUP_set_generator(group, P, order, x)) { ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); goto err; } ok=1; err: if (!ok) { EC_GROUP_free(group); group = NULL; } if (P) EC_POINT_free(P); if (ctx) BN_CTX_free(ctx); if (p) BN_free(p); if (a) BN_free(a); if (b) BN_free(b); if (order) BN_free(order); if (x) BN_free(x); if (y) BN_free(y); return group; } int aacs_set_cert(/*out*/ EC_KEY *key, const unsigned char *cert) { EC_POINT * public_key = NULL; BIGNUM * x = NULL; BIGNUM * y = NULL; const EC_GROUP * group = EC_KEY_get0_group(key); if ((cert[1] != 0) || (cert[2] != 0x00) || (cert[3] != 0x5C)) { return -1; } if ((x = BN_bin2bn(cert+12, 20, NULL)) == NULL) { return -2; } if ((y = BN_bin2bn(cert+32, 20, NULL)) == NULL) { BN_clear_free(x); return -3; } if ((public_key = EC_POINT_new(group)) == NULL) { BN_clear_free(x); BN_clear_free(y); return -4; } if (!EC_POINT_set_affine_coordinates_GFp(group, public_key, x, y, NULL)) { BN_clear_free(x); BN_clear_free(y); EC_POINT_free(public_key); return -5; } BN_clear_free(x); BN_clear_free(y); int rv = EC_KEY_set_public_key(key, public_key); EC_POINT_free(public_key); return rv; } int make_key(const unsigned char * priv_key) { unsigned char md_value[EVP_MAX_MD_SIZE]; unsigned int md_len; EVP_MD_CTX mdctx; EC_KEY *key = NULL; ECDSA_SIG *sig = NULL; BIGNUM *priv_key_bn = NULL; int ret = -1; if ((key = aacs_key()) == NULL) { ret = -2; goto err; } if (!aacs_set_cert(key, cert)) { ret = -3; goto err; } if (((priv_key_bn = BN_bin2bn(priv_key, 20, NULL)) == NULL) || !EC_KEY_set_private_key(key, priv_key_bn)) { ret = -4; goto err; } } в этом коде как я понял генерируется ключ, нужно его переделать с использованием libtomcrypt. в libtomcrypt для этого надо использовать функцию ecc_make_key_ex - который использует параметры кривой установленные пользователем. Я прав? нужна помощь!