core/crypto/ecdsa: Add private_key_set and public_key_set

This commit is contained in:
Yawning Angel
2026-04-20 19:13:39 +09:00
parent 0af538c70a
commit bd7b67317d

View File

@@ -194,6 +194,32 @@ private_key_bytes :: proc(priv_key: ^Private_Key, dst: []byte) {
}
}
// private_key_set sets priv_key to src.
private_key_set :: proc(priv_key, src: ^Private_Key) {
if src == nil || src._curve == .Invalid {
private_key_clear(priv_key)
return
}
priv_key._curve = src._curve
reflect.set_union_variant_typeid(
priv_key._impl,
_PRIV_IMPL_IDS[priv_key._curve],
)
#partial switch priv_key._curve {
case .SECP256R1:
secec.sc_set(&priv_key._impl.(secec.Scalar_p256r1), &src._impl.(secec.Scalar_p256r1))
case .SECP384R1:
secec.sc_set(&priv_key._impl.(secec.Scalar_p384r1), &src._impl.(secec.Scalar_p384r1))
case:
panic("crypto/ecdh: invalid curve")
}
public_key_set(&priv_key._pub_key, &src._pub_key)
}
// private_key_equal returns true if and only if (⟺) the private keys are equal,
// in constant time.
private_key_equal :: proc(p, q: ^Private_Key) -> bool {
@@ -262,6 +288,16 @@ public_key_set_bytes :: proc(pub_key: ^Public_Key, curve: Curve, b: []byte) -> b
return true
}
// public_key_set sets pub_key to src.
public_key_set :: proc(pub_key, src: ^Public_Key) {
if src == nil || src._curve == .Invalid {
public_key_clear(pub_key)
return
}
pub_key^ = src^
}
// public_key_set_priv sets pub_key to the public component of priv_key.
public_key_set_priv :: proc(pub_key: ^Public_Key, priv_key: ^Private_Key) {
ensure(priv_key._curve != .Invalid, "crypto/ecdsa: uninitialized private key")