我正在使用cryptography和openssl使用python库x25519。
通过查找EVP_PKEY_derive
我可以看到:
ret = ctx->op.kex.exchange->derive(ctx->op.kex.exchprovctx, key, pkeylen,
SIZE_MAX);
我正在寻找的是x25519的generate方法的实现。
但是无法在openSSL代码中找到它。
有人知道我在哪里可以找到它吗?
答案 0 :(得分:1)
您正在查看OpenSSL 3.0(主分支)代码。该代码目前处于不断变化的状态,因为所有内部管道均被重写。您最好查看1.1.1分支。
X25519的派生代码在这里:
此文件中包含大多数有趣的代码:
https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/crypto/ec/curve25519.c
答案 1 :(得分:0)
我终于找到了代码所在的位置:libcrypto,可以在openbsd project中找到。
编辑:以下段落适用于经典的椭圆曲线,不适用于X25519
请参阅@Matt Caswell的答案
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。