miden_stdlib_sys/intrinsics/
crypto.rs1#![allow(warnings, clippy::infallible_try_from)]
5
6use core::convert::Infallible;
7
8use crate::intrinsics::{Felt, Word};
9
10#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
14#[repr(transparent)]
15pub struct Digest {
16 pub inner: Word,
17}
18
19impl Digest {
20 #[inline]
22 pub fn new(felts: [Felt; 4]) -> Self {
23 Self {
24 inner: Word::from(felts),
25 }
26 }
27
28 #[inline]
30 pub const fn from_word(word: Word) -> Self {
31 Self { inner: word }
32 }
33}
34
35impl TryFrom<Word> for Digest {
36 type Error = Infallible;
37
38 #[inline]
39 fn try_from(word: Word) -> Result<Self, Self::Error> {
40 Ok(Self::from_word(word))
41 }
42}
43
44impl From<Digest> for Word {
45 #[inline]
46 fn from(digest: Digest) -> Self {
47 digest.inner
48 }
49}
50
51impl From<[Felt; 4]> for Digest {
52 #[inline]
53 fn from(felts: [Felt; 4]) -> Self {
54 Self::new(felts)
55 }
56}
57
58impl From<Digest> for [Felt; 4] {
59 #[inline]
60 fn from(digest: Digest) -> Self {
61 (&digest.inner).into()
62 }
63}
64
65#[cfg(all(target_family = "wasm", miden))]
66unsafe extern "C" {
67 #[cfg_attr(all(target_family = "wasm", miden), linkage = "extern_weak")]
76 #[link_name = "miden::core::crypto::hashes::poseidon2::merge"]
77 fn extern_poseidon2_merge(
78 a0: Felt,
79 a1: Felt,
80 a2: Felt,
81 a3: Felt,
82 b0: Felt,
83 b1: Felt,
84 b2: Felt,
85 b3: Felt,
86 result_ptr: *mut Felt,
87 );
88}
89
90#[inline]
99#[cfg(all(target_family = "wasm", miden))]
100pub fn merge(digests: [Digest; 2]) -> Digest {
101 use crate::intrinsics::WordAligned;
102
103 unsafe {
104 let mut ret_area = ::core::mem::MaybeUninit::<WordAligned<Word>>::uninit();
105 let result_ptr = ret_area.as_mut_ptr() as *mut Felt;
106
107 extern_poseidon2_merge(
108 digests[0].inner.a,
109 digests[0].inner.b,
110 digests[0].inner.c,
111 digests[0].inner.d,
112 digests[1].inner.a,
113 digests[1].inner.b,
114 digests[1].inner.c,
115 digests[1].inner.d,
116 result_ptr,
117 );
118
119 Digest::from_word(ret_area.assume_init().into_inner())
120 }
121}
122
123#[inline]
126#[cfg(not(all(target_family = "wasm", miden)))]
127pub fn merge(_digests: [Digest; 2]) -> Digest {
128 unimplemented!("crypto intrinsics are only available when targeting the Miden VM")
129}