0

我正在使用opensslx25519玩 python 库密码学

通过寻找代码EVP_PKEY_derive

我可以看到:

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

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

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

4

2 回答 2

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

于 2019-12-20T09:05:36.510 回答
0

我终于找到了代码所在的位置:可以在openbsd 项目中找到的libcrypto

编辑:以下段落适用于经典椭圆曲线,而不是 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

于 2019-12-23T10:28:12.063 回答