diff --git a/src/ec/curve25519/ed25519.rs b/src/ec/curve25519/ed25519.rs index 538715a49..1c3c8d34a 100644 --- a/src/ec/curve25519/ed25519.rs +++ b/src/ec/curve25519/ed25519.rs @@ -57,18 +57,9 @@ impl<'a> Ed25519KeyPair { let mut seed = [0u8; SEED_LEN]; try!(rng.fill(&mut seed)); let key_pair = Ed25519KeyPair::from_seed_(&seed); - let mut bytes = [0; ED25519_PKCS8_V2_LEN]; - let (before_seed, after_seed) = - PKCS8_TEMPLATE.split_at(PKCS8_SEED_INDEX); - let seed_end_index = PKCS8_SEED_INDEX + SEED_LEN; - bytes[..PKCS8_SEED_INDEX].copy_from_slice(before_seed); - bytes[PKCS8_SEED_INDEX..seed_end_index].copy_from_slice(&seed); - bytes[seed_end_index..(seed_end_index + after_seed.len())] - .copy_from_slice(after_seed); - bytes[(seed_end_index + after_seed.len())..] - .copy_from_slice(key_pair.public_key_bytes()); - + pkcs8::wrap_key(PKCS8_TEMPLATE, PKCS8_SEED_INDEX, &seed[..], + key_pair.public_key_bytes(), &mut bytes[..]); Ok(bytes) } diff --git a/src/pkcs8.rs b/src/pkcs8.rs index f3b6dbd12..46092f8dc 100644 --- a/src/pkcs8.rs +++ b/src/pkcs8.rs @@ -79,3 +79,20 @@ pub fn unwrap_key<'a>(version: Version, input: untrusted::Input<'a>, }) }) } + +/// Formats a private key "prefix||private_key||middle||public_key" where +/// `template` is "prefix||middle" split at position `private_key_index`. +pub fn wrap_key(template: &[u8], private_key_index: usize, private_key: &[u8], + public_key: &[u8], bytes: &mut [u8]) { + let (before_private_key, after_private_key) = + template.split_at(private_key_index); + let private_key_end_index = private_key_index + private_key.len(); + bytes[..private_key_index].copy_from_slice(before_private_key); + bytes[private_key_index..private_key_end_index] + .copy_from_slice(&private_key); + bytes[private_key_end_index.. + (private_key_end_index + after_private_key.len())] + .copy_from_slice(after_private_key); + bytes[(private_key_end_index + after_private_key.len())..] + .copy_from_slice(public_key); +}