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.rs55
1 files changed, 41 insertions, 14 deletions
diff --git a/ext/node/crypto/mod.rs b/ext/node/crypto/mod.rs
index 597779328..f9a61b456 100644
--- a/ext/node/crypto/mod.rs
+++ b/ext/node/crypto/mod.rs
@@ -17,23 +17,38 @@ use rsa::RsaPublicKey;
mod digest;
-#[op]
-pub fn op_node_create_hash(
- state: &mut OpState,
- algorithm: String,
-) -> Result<ResourceId, AnyError> {
- Ok(state.resource_table.add(digest::Context::new(&algorithm)?))
+#[op(fast)]
+pub fn op_node_create_hash(state: &mut OpState, algorithm: &str) -> u32 {
+ state
+ .resource_table
+ .add(match digest::Context::new(algorithm) {
+ Ok(context) => context,
+ Err(_) => return 0,
+ })
}
-#[op]
-pub fn op_node_hash_update(
- state: &mut OpState,
- rid: ResourceId,
- data: &[u8],
-) -> Result<(), AnyError> {
- let context = state.resource_table.get::<digest::Context>(rid)?;
+#[op(fast)]
+pub fn op_node_hash_update(state: &mut OpState, rid: u32, data: &[u8]) -> bool {
+ let context = match state.resource_table.get::<digest::Context>(rid) {
+ Ok(context) => context,
+ _ => return false,
+ };
context.update(data);
- Ok(())
+ true
+}
+
+#[op(fast)]
+pub fn op_node_hash_update_str(
+ state: &mut OpState,
+ rid: u32,
+ data: &str,
+) -> bool {
+ let context = match state.resource_table.get::<digest::Context>(rid) {
+ Ok(context) => context,
+ _ => return false,
+ };
+ context.update(data.as_bytes());
+ true
}
#[op]
@@ -48,6 +63,18 @@ pub fn op_node_hash_digest(
}
#[op]
+pub fn op_node_hash_digest_hex(
+ state: &mut OpState,
+ rid: ResourceId,
+) -> Result<String, AnyError> {
+ let context = state.resource_table.take::<digest::Context>(rid)?;
+ let context = Rc::try_unwrap(context)
+ .map_err(|_| type_error("Hash context is already in use"))?;
+ let digest = context.digest()?;
+ Ok(hex::encode(digest))
+}
+
+#[op]
pub fn op_node_hash_clone(
state: &mut OpState,
rid: ResourceId,