summaryrefslogtreecommitdiff
path: root/ext/node/ops/crypto/keys.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ext/node/ops/crypto/keys.rs')
-rw-r--r--ext/node/ops/crypto/keys.rs35
1 files changed, 17 insertions, 18 deletions
diff --git a/ext/node/ops/crypto/keys.rs b/ext/node/ops/crypto/keys.rs
index 87e0e5439..cebafd584 100644
--- a/ext/node/ops/crypto/keys.rs
+++ b/ext/node/ops/crypto/keys.rs
@@ -522,7 +522,7 @@ impl KeyObjectHandle {
key: &[u8],
format: &str,
typ: &str,
- _passphrase: Option<&[u8]>,
+ passphrase: Option<&[u8]>,
) -> Result<KeyObjectHandle, AnyError> {
let document = match format {
"pem" => {
@@ -542,23 +542,22 @@ impl KeyObjectHandle {
Document::from_pkcs1_der(document.as_bytes())
.map_err(|_| type_error("invalid PKCS#1 public key"))?
}
- EncryptedPrivateKeyInfo::PEM_LABEL => {
- // FIXME
- return Err(type_error(
- "deriving public key from encrypted private key",
- ));
- }
- PrivateKeyInfo::PEM_LABEL => {
- // FIXME
- return Err(type_error("public key cannot be a private key"));
- }
- sec1::EcPrivateKey::PEM_LABEL => {
- // FIXME
- return Err(type_error("deriving public key from ec private key"));
- }
- rsa::pkcs1::RsaPrivateKey::PEM_LABEL => {
- // FIXME
- return Err(type_error("deriving public key from rsa private key"));
+ EncryptedPrivateKeyInfo::PEM_LABEL
+ | PrivateKeyInfo::PEM_LABEL
+ | sec1::EcPrivateKey::PEM_LABEL
+ | rsa::pkcs1::RsaPrivateKey::PEM_LABEL => {
+ let handle = KeyObjectHandle::new_asymmetric_private_key_from_js(
+ key, format, typ, passphrase,
+ )?;
+ match handle {
+ KeyObjectHandle::AsymmetricPrivate(private) => {
+ return Ok(KeyObjectHandle::AsymmetricPublic(
+ private.to_public_key(),
+ ))
+ }
+ KeyObjectHandle::AsymmetricPublic(_)
+ | KeyObjectHandle::Secret(_) => unreachable!(),
+ }
}
// TODO: handle x509 certificates as public keys
_ => {