Move PKCS#8 document formatting to ring::pkcs8.

This commit is contained in:
Brian Smith 2017-05-07 18:12:05 -10:00
parent d66730fa19
commit 3685458651
2 changed files with 19 additions and 11 deletions

View File

@ -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)
}

View File

@ -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);
}