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 #[link_name = "miden::core::crypto::hashes::poseidon2::merge"]
76 fn extern_poseidon2_merge(
77 a0: Felt,
78 a1: Felt,
79 a2: Felt,
80 a3: Felt,
81 b0: Felt,
82 b1: Felt,
83 b2: Felt,
84 b3: Felt,
85 result_ptr: *mut Felt,
86 );
87}
88
89#[inline]
98#[cfg(all(target_family = "wasm", miden))]
99pub fn merge(digests: [Digest; 2]) -> Digest {
100 unsafe {
101 let mut ret_area = ::core::mem::MaybeUninit::<Word>::uninit();
102 let result_ptr = ret_area.as_mut_ptr() as *mut Felt;
103
104 extern_poseidon2_merge(
105 digests[0].inner.a,
106 digests[0].inner.b,
107 digests[0].inner.c,
108 digests[0].inner.d,
109 digests[1].inner.a,
110 digests[1].inner.b,
111 digests[1].inner.c,
112 digests[1].inner.d,
113 result_ptr,
114 );
115
116 Digest::from_word(ret_area.assume_init())
117 }
118}
119
120#[inline]
123#[cfg(not(all(target_family = "wasm", miden)))]
124pub fn merge(_digests: [Digest; 2]) -> Digest {
125 unimplemented!("crypto intrinsics are only available when targeting the Miden VM")
126}