chacha20blake3 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/chacha20blake3/src/lib.rs +34 -0
- data/lib/chacha20blake3/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9d875e3dca3b733cb6a6cac6f3c00539e5ea670e4128a5b2107da9c99cee63e9
|
|
4
|
+
data.tar.gz: 9c1b971c5f768b1ac59d0195e6c979f8979571eebebac242e1cd4a516b250e44
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9a140c81d80fb12ce9176a5fee9e2b828d9f32ff8ba27033ea7dd593d4a8584dc94373302ded86f2d1c9d20a5b5af8a5c789ed5327174fb9ad88aac46c6988d4
|
|
7
|
+
data.tar.gz: 01c1369aaea777a152ce78f1c0f14cb6b214faadf2e5dffdf38a68ece66922b92bfd087385f37b0be3cf3e4fb3055176b47602a009f440fe1f4d348f9c564fa1
|
|
@@ -310,6 +310,39 @@ fn stream_message_index(rb_self: &Stream) -> u64 {
|
|
|
310
310
|
*rb_self.counter.lock().unwrap()
|
|
311
311
|
}
|
|
312
312
|
|
|
313
|
+
fn blake3_derive_key(ruby: &Ruby, args: &[Value]) -> Result<RString, Error> {
|
|
314
|
+
let parsed = scan_args::<(RString, RString), (), (), (), RHash, ()>(args)?;
|
|
315
|
+
let (rb_context, rb_material) = parsed.required;
|
|
316
|
+
let kw = get_kwargs::<_, (), (Option<usize>,), ()>(parsed.keywords, &[], &["length"])?;
|
|
317
|
+
let (opt_length,) = kw.optional;
|
|
318
|
+
let length = opt_length.unwrap_or(32);
|
|
319
|
+
|
|
320
|
+
if length == 0 || length > 65535 {
|
|
321
|
+
return Err(Error::new(
|
|
322
|
+
ruby.exception_arg_error(),
|
|
323
|
+
format!("length must be 1..65535, got {length}"),
|
|
324
|
+
));
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// SAFETY: copy context string before any allocation
|
|
328
|
+
let context = unsafe { std::str::from_utf8(rb_context.as_slice()) }
|
|
329
|
+
.map_err(|_| Error::new(ruby.exception_arg_error(), "context must be valid UTF-8"))?
|
|
330
|
+
.to_owned();
|
|
331
|
+
|
|
332
|
+
let mut output_buf = vec![0u8; length];
|
|
333
|
+
unsafe {
|
|
334
|
+
let mut deriver = blake3::Hasher::new_derive_key(&context);
|
|
335
|
+
deriver.update(rb_material.as_slice());
|
|
336
|
+
let mut reader = deriver.finalize_xof();
|
|
337
|
+
reader.fill(&mut output_buf);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
let output = ruby.str_from_slice(&output_buf);
|
|
341
|
+
output.freeze();
|
|
342
|
+
Ok(output)
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
|
|
313
346
|
fn generate_key(ruby: &Ruby) -> Result<RString, Error> {
|
|
314
347
|
let mut key = [0u8; KEY_SIZE];
|
|
315
348
|
getrandom::getrandom(&mut key).map_err(|e| {
|
|
@@ -365,6 +398,7 @@ fn init(ruby: &Ruby) -> Result<(), Error> {
|
|
|
365
398
|
|
|
366
399
|
module.define_module_function("generate_key", function!(generate_key, 0))?;
|
|
367
400
|
module.define_module_function("generate_nonce", function!(generate_nonce, 0))?;
|
|
401
|
+
module.define_module_function("derive_key", function!(blake3_derive_key, -1))?;
|
|
368
402
|
|
|
369
403
|
Ok(())
|
|
370
404
|
}
|