miden_stdlib_sys/intrinsics/
crypto.rs1#![allow(warnings)]
5
6use crate::intrinsics::{Felt, Word};
7
8#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
12#[repr(transparent)]
13pub struct Digest {
14 pub inner: Word,
15}
16
17impl Digest {
18 #[inline]
20 pub fn new(felts: [Felt; 4]) -> Self {
21 Self {
22 inner: Word::from(felts),
23 }
24 }
25
26 #[inline]
28 pub const fn from_word(word: Word) -> Self {
29 Self { inner: word }
30 }
31}
32
33impl From<Word> for Digest {
34 #[inline]
35 fn from(word: Word) -> Self {
36 Self::from_word(word)
37 }
38}
39
40impl From<Digest> for Word {
41 #[inline]
42 fn from(digest: Digest) -> Self {
43 digest.inner
44 }
45}
46
47impl From<[Felt; 4]> for Digest {
48 #[inline]
49 fn from(felts: [Felt; 4]) -> Self {
50 Self::new(felts)
51 }
52}
53
54impl From<Digest> for [Felt; 4] {
55 #[inline]
56 fn from(digest: Digest) -> Self {
57 digest.inner.into()
58 }
59}
60
61#[cfg(all(target_family = "wasm", miden))]
65unsafe extern "C" {
66 #[link_name = "intrinsics::crypto::hmerge"]
74 fn extern_hmerge(
75 digests_ptr: *const Felt,
77 result_ptr: *mut Felt,
79 );
80}
81
82#[inline]
91#[cfg(all(target_family = "wasm", miden))]
92pub fn merge(digests: [Digest; 2]) -> Digest {
93 unsafe {
94 let mut ret_area = ::core::mem::MaybeUninit::<Word>::uninit();
95 let result_ptr = ret_area.as_mut_ptr().addr() as u32;
96
97 let digests_ptr = digests.as_ptr().addr() as u32;
98 extern_hmerge(digests_ptr as *const Felt, result_ptr as *mut Felt);
99
100 Digest::from_word(ret_area.assume_init())
101 }
102}
103
104#[inline]
107#[cfg(not(all(target_family = "wasm", miden)))]
108pub fn merge(_digests: [Digest; 2]) -> Digest {
109 unimplemented!("crypto intrinsics are only available when targeting the Miden VM")
110}