diff --git a/core/crypto/ecdsa/ecdsa.odin b/core/crypto/ecdsa/ecdsa.odin index 6c71feef7..350bab3ec 100644 --- a/core/crypto/ecdsa/ecdsa.odin +++ b/core/crypto/ecdsa/ecdsa.odin @@ -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")