summaryrefslogtreecommitdiff
path: root/ext/node/crypto/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ext/node/crypto/mod.rs')
-rw-r--r--ext/node/crypto/mod.rs79
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")),
+ }
+}