Merge pull request #874 from rohit-lshift/priv-key-from-num
Added a function to create a EcKey<Private> from its parts
This commit is contained in:
commit
66a2ad76b7
|
|
@ -729,6 +729,33 @@ impl EcKey<Private> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Constructs an public/private key pair given a curve, a private key and a public key point.
|
||||
pub fn from_private_components(
|
||||
group: &EcGroupRef,
|
||||
private_number: &BigNumRef,
|
||||
public_key: &EcPointRef,
|
||||
) -> Result<EcKey<Private>, ErrorStack> {
|
||||
unsafe {
|
||||
cvt_p(ffi::EC_KEY_new())
|
||||
.map(|p| EcKey::from_ptr(p))
|
||||
.and_then(|key| {
|
||||
cvt(ffi::EC_KEY_set_group(key.as_ptr(), group.as_ptr())).map(|_| key)
|
||||
})
|
||||
.and_then(|key| {
|
||||
cvt(ffi::EC_KEY_set_private_key(
|
||||
key.as_ptr(),
|
||||
private_number.as_ptr(),
|
||||
)).map(|_| key)
|
||||
})
|
||||
.and_then(|key| {
|
||||
cvt(ffi::EC_KEY_set_public_key(
|
||||
key.as_ptr(),
|
||||
public_key.as_ptr(),
|
||||
)).map(|_| key)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private_key_from_pem! {
|
||||
/// Deserializes a private key from a PEM-encoded ECPrivateKey structure.
|
||||
///
|
||||
|
|
@ -845,6 +872,18 @@ mod test {
|
|||
assert!(ec_key.check_key().is_ok());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn key_from_private_components() {
|
||||
let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap();
|
||||
let key = EcKey::generate(&group).unwrap();
|
||||
|
||||
let dup_key = EcKey::from_private_components(&group, key.private_key(), key.public_key()).unwrap();
|
||||
let res = dup_key.check_key().unwrap();
|
||||
|
||||
assert!(res == ());
|
||||
assert!(key.private_key() == dup_key.private_key());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn key_from_affine_coordinates() {
|
||||
let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap();
|
||||
|
|
|
|||
Loading…
Reference in New Issue