summaryrefslogtreecommitdiff
path: root/ext/crypto/x25519.rs
diff options
context:
space:
mode:
authorFilip Skokan <panva.ip@gmail.com>2022-10-04 08:06:25 +0200
committerGitHub <noreply@github.com>2022-10-03 23:06:25 -0700
commit7742ad77fa94c402d59a890c67a11da55886c68b (patch)
tree8d70af9ec2ce2176acc16df89fe5146d59fdd6cf /ext/crypto/x25519.rs
parentfde938116d8b44a87579d6b65dcba79cbe988809 (diff)
fix(ext/crypto): curve25519 import export (#16140)
Diffstat (limited to 'ext/crypto/x25519.rs')
-rw-r--r--ext/crypto/x25519.rs37
1 files changed, 35 insertions, 2 deletions
diff --git a/ext/crypto/x25519.rs b/ext/crypto/x25519.rs
index b606f4ca0..1e64e9909 100644
--- a/ext/crypto/x25519.rs
+++ b/ext/crypto/x25519.rs
@@ -1,10 +1,13 @@
use curve25519_dalek::montgomery::MontgomeryPoint;
+use deno_core::error::AnyError;
use deno_core::op;
+use deno_core::ZeroCopyBuf;
use elliptic_curve::pkcs8::PrivateKeyInfo;
use elliptic_curve::subtle::ConstantTimeEq;
use rand::rngs::OsRng;
use rand::RngCore;
use spki::der::Decode;
+use spki::der::Encode;
#[op(fast)]
pub fn op_generate_x25519_keypair(pkey: &mut [u8], pubkey: &mut [u8]) {
@@ -66,6 +69,7 @@ pub fn op_import_spki_x25519(key_data: &[u8], out: &mut [u8]) -> bool {
#[op(fast)]
pub fn op_import_pkcs8_x25519(key_data: &[u8], out: &mut [u8]) -> bool {
// 2-3.
+ // This should probably use OneAsymmetricKey instead
let pk_info = match PrivateKeyInfo::from_der(key_data) {
Ok(pk_info) => pk_info,
Err(_) => return false,
@@ -81,9 +85,38 @@ pub fn op_import_pkcs8_x25519(key_data: &[u8], out: &mut [u8]) -> bool {
}
// 6.
// CurvePrivateKey ::= OCTET STRING
- if pk_info.private_key.len() != 32 {
+ if pk_info.private_key.len() != 34 {
return false;
}
- out.copy_from_slice(pk_info.private_key);
+ out.copy_from_slice(&pk_info.private_key[2..]);
true
}
+
+#[op]
+pub fn op_export_spki_x25519(pubkey: &[u8]) -> Result<ZeroCopyBuf, AnyError> {
+ let key_info = spki::SubjectPublicKeyInfo {
+ algorithm: spki::AlgorithmIdentifier {
+ // id-X25519
+ oid: X25519_OID,
+ parameters: None,
+ },
+ subject_public_key: pubkey,
+ };
+ Ok(key_info.to_vec()?.into())
+}
+
+#[op]
+pub fn op_export_pkcs8_x25519(pkey: &[u8]) -> Result<ZeroCopyBuf, AnyError> {
+ // This should probably use OneAsymmetricKey instead
+ let pk_info = rsa::pkcs8::PrivateKeyInfo {
+ public_key: None,
+ algorithm: rsa::pkcs8::AlgorithmIdentifier {
+ // id-X25519
+ oid: X25519_OID,
+ parameters: None,
+ },
+ private_key: pkey, // OCTET STRING
+ };
+
+ Ok(pk_info.to_vec()?.into())
+}