我终于找到了代码所在的位置:可以在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。