Где я могу найти реализацию метода извлечения 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/bf4006a6f9be691ba6eef0e8629e63369a033ccf/crypto/ec/ecx_meth.c

С большей частью интересного кода в этом файле:

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, как ожидалось.

Другие вопросы по тегам