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

时间:2019-12-19 15:48:02

标签: openssl cryptography x25519

我正在使用cryptographyopenssl使用python库x25519

通过查找EVP_PKEY_derive

的代码

我可以看到:

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

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

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

2 个答案:

答案 0 :(得分:1)

您正在查看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

答案 1 :(得分:0)

我终于找到了代码所在的位置:libcrypto,可以在openbsd project中找到。

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

可以在here中找到

EVP_PKEY_derive方法。 它使用:

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