Где я могу найти реализацию метода извлечения Curve25519?
Я играю с криптографией библиотеки Python, используя openssl и x25519.
В поисках кода EVP_PKEY_derive
Я вижу:
ret = ctx->op.kex.exchange->derive(ctx->op.kex.exchprovctx, key, pkeylen,
SIZE_MAX);
Я ищу реализацию метода derive для x25519.
Но найти его в коде openSSL невозможно.
Кто-нибудь знает, где его найти?
2 ответа
Вы смотрите на код OpenSSL 3.0 (основная ветка). Этот код сейчас находится в состоянии изменения, потому что вся внутренняя система переписывается. Вам, вероятно, лучше взглянуть на ветку 1.1.1.
Производный код X25519 находится здесь:
С большей частью интересного кода в этом файле:
https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/crypto/ec/curve25519.c
Наконец-то я нашел, где живет код: libcrypto, который можно найти в проекте openbsd.
РЕДАКТИРОВАТЬ: приведенный ниже абзац предназначен для классической эллиптической кривой, а не для X25519.
См. Ответ @Matt Caswell.
EVP_PKEY_derive можно найти здесь. Оно использует:
return ctx->pmeth->derive(ctx, key, pkeylen);
приводит к определению:
.derive = pkey_ec_kdf_derive,
ведущий к pkey_ec_kdf_derive и, наконец, к pkey_ec_derive:
static int
pkey_ec_derive(EVP_PKEY_CTX * ctx, unsigned char *key, size_t * keylen)
{
int ret;
size_t outlen;
const EC_POINT *pubkey = NULL;
EC_KEY *eckey;
EC_PKEY_CTX *dctx = ctx->data;
if (!ctx->pkey || !ctx->peerkey) {
ECerror(EC_R_KEYS_NOT_SET);
return 0;
}
eckey = dctx->co_key ? dctx->co_key : ctx->pkey->pkey.ec;
if (!key) {
const EC_GROUP *group;
group = EC_KEY_get0_group(eckey);
*keylen = (EC_GROUP_get_degree(group) + 7) / 8;
return 1;
}
pubkey = EC_KEY_get0_public_key(ctx->peerkey->pkey.ec);
/*
* NB: unlike PKCS#3 DH, if *outlen is less than maximum size this is
* not an error, the result is truncated.
*/
outlen = *keylen;
ret = ECDH_compute_key(key, outlen, pubkey, eckey, 0);
if (ret <= 0)
return 0;
*keylen = ret;
return 1;
}
который использует ECDH_compute_key, как ожидалось.