在哪里可以找到 Curve25519 派生方法的实现?

Where can I find the Curve25519 derive method implementation?

我正在玩 python 库 cryptography using openssl and x25519

通过寻找EVP_PKEY_derive

的代码

我可以看到:

ret = ctx->op.kex.exchange->derive(ctx->op.kex.exchprovctx, key, pkeylen,
                                       SIZE_MAX);

我正在寻找的是 x25519 的派生方法的实现。
但是无法在openSSL代码中找到它。

有人知道我在哪里可以找到它吗?

您正在查看 OpenSSL 3.0(主分支)代码。该代码目前处于不断变化的状态,因为正在重写所有内部管道。您可能最好查看 1.1.1 分支。

X25519 导出代码在这里:

https://github.com/openssl/openssl/blob/bf4006a6f9be691ba6eef0e8629e63369a033ccf/crypto/ec/ecx_meth.c#L684-L695

此文件中包含大部分有趣的代码:

https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/crypto/ec/curve25519.c

我终于找到了代码所在的位置:libcrypto which can be found in the openbsd project

编辑:以下段落适用于经典椭圆曲线,而非 X25519
请参阅@Matt Caswell 的回答

EVP_PKEY_derive方法可以找到here。 它使用:

return ctx->pmeth->derive(ctx, key, pkeylen);

导致 definition:

.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