在哪里可以找到 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/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。
我正在玩 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/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。