diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2023-02-20 22:22:28 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-20 22:22:28 +0530 |
commit | ea7ca00c895c401af57a7201f3c41524333e7939 (patch) | |
tree | a238ea54a003111ab6c1b7b1cb14e0669cb4f7af /ext/node/crypto/mod.rs | |
parent | a16c11c5d10052c688ba4c2eca09fd1a225e395a (diff) |
perf: use ops for node:crypto ciphers (#17819)
Towards #17809
Diffstat (limited to 'ext/node/crypto/mod.rs')
-rw-r--r-- | ext/node/crypto/mod.rs | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/ext/node/crypto/mod.rs b/ext/node/crypto/mod.rs index be92dc7ef..597779328 100644 --- a/ext/node/crypto/mod.rs +++ b/ext/node/crypto/mod.rs @@ -4,9 +4,17 @@ use deno_core::error::AnyError; use deno_core::op; use deno_core::OpState; use deno_core::ResourceId; +use deno_core::StringOrBuffer; use deno_core::ZeroCopyBuf; use std::rc::Rc; +use rsa::padding::PaddingScheme; +use rsa::pkcs8::DecodePrivateKey; +use rsa::pkcs8::DecodePublicKey; +use rsa::PublicKey; +use rsa::RsaPrivateKey; +use rsa::RsaPublicKey; + mod digest; #[op] @@ -47,3 +55,74 @@ pub fn op_node_hash_clone( let context = state.resource_table.get::<digest::Context>(rid)?; Ok(state.resource_table.add(context.as_ref().clone())) } + +#[op] +pub fn op_node_private_encrypt( + key: StringOrBuffer, + msg: StringOrBuffer, + padding: u32, +) -> Result<ZeroCopyBuf, AnyError> { + let key = RsaPrivateKey::from_pkcs8_pem((&key).try_into()?)?; + + let mut rng = rand::thread_rng(); + match padding { + 1 => Ok( + key + .encrypt(&mut rng, PaddingScheme::new_pkcs1v15_encrypt(), &msg)? + .into(), + ), + 4 => Ok( + key + .encrypt(&mut rng, PaddingScheme::new_oaep::<sha1::Sha1>(), &msg)? + .into(), + ), + _ => Err(type_error("Unknown padding")), + } +} + +#[op] +pub fn op_node_private_decrypt( + key: StringOrBuffer, + msg: StringOrBuffer, + padding: u32, +) -> Result<ZeroCopyBuf, AnyError> { + let key = RsaPrivateKey::from_pkcs8_pem((&key).try_into()?)?; + + match padding { + 1 => Ok( + key + .decrypt(PaddingScheme::new_pkcs1v15_encrypt(), &msg)? + .into(), + ), + 4 => Ok( + key + .decrypt(PaddingScheme::new_oaep::<sha1::Sha1>(), &msg)? + .into(), + ), + _ => Err(type_error("Unknown padding")), + } +} + +#[op] +pub fn op_node_public_encrypt( + key: StringOrBuffer, + msg: StringOrBuffer, + padding: u32, +) -> Result<ZeroCopyBuf, AnyError> { + let key = RsaPublicKey::from_public_key_pem((&key).try_into()?)?; + + let mut rng = rand::thread_rng(); + match padding { + 1 => Ok( + key + .encrypt(&mut rng, PaddingScheme::new_pkcs1v15_encrypt(), &msg)? + .into(), + ), + 4 => Ok( + key + .encrypt(&mut rng, PaddingScheme::new_oaep::<sha1::Sha1>(), &msg)? + .into(), + ), + _ => Err(type_error("Unknown padding")), + } +} |