polyval/backend/
intrinsics.rs1use crate::{Block, Key, ParBlocks, Tag, field_element::FieldElement};
4
5#[cfg_attr(target_arch = "aarch64", path = "intrinsics/armv8.rs")]
6#[cfg_attr(
7 any(target_arch = "x86", target_arch = "x86_64"),
8 path = "intrinsics/x86.rs"
9)]
10mod intrinsics_impl;
11use intrinsics_impl::InitToken;
12
13#[cfg(feature = "zeroize")]
14use zeroize::Zeroize;
15
16#[derive(Clone)]
18pub(crate) struct State {
19 expanded_key: ExpandedKey,
21
22 acc: FieldElement,
24
25 init_token: InitToken,
27}
28
29impl State {
30 pub(crate) fn new(h: &Key) -> Self {
31 let (init_token, has_intrinsics) = InitToken::init_get();
32
33 let expanded_key = if has_intrinsics {
34 unsafe { intrinsics_impl::expand_key(&h.0) }
36 } else {
37 ExpandedKey {
40 h1: FieldElement::from(*h),
41 ..Default::default()
42 }
43 };
44
45 let y = FieldElement::default();
46
47 Self {
48 expanded_key,
49 acc: y,
50 init_token,
51 }
52 }
53
54 pub(crate) fn proc_block(&mut self, block: &Block) {
55 self.acc = if self.has_intrinsics() {
56 unsafe { intrinsics_impl::proc_block(&self.expanded_key, self.acc, block) }
58 } else {
59 (self.acc + block.into()) * self.expanded_key.h1
60 };
61 }
62
63 pub(crate) fn proc_par_blocks(&mut self, par_blocks: &ParBlocks) {
64 if self.has_intrinsics() {
65 self.acc = unsafe {
67 intrinsics_impl::proc_par_blocks(&self.expanded_key, self.acc, par_blocks)
68 };
69 } else {
70 for block in par_blocks {
72 self.proc_block(block);
73 }
74 }
75 }
76
77 pub(crate) fn finalize(&self) -> Tag {
78 self.acc.into()
79 }
80
81 pub(crate) fn reset(&mut self) {
82 self.acc = FieldElement::default();
83 }
84
85 #[inline]
86 fn has_intrinsics(&self) -> bool {
87 self.init_token.get()
88 }
89}
90
91#[cfg(feature = "zeroize")]
92impl Zeroize for State {
93 fn zeroize(&mut self) {
94 self.expanded_key.zeroize();
95 self.acc.zeroize();
96 }
97}
98
99#[derive(Clone, Default)]
103pub(crate) struct ExpandedKey {
104 h1: FieldElement,
106 d1: FieldElement,
108 h2: FieldElement,
110 d2: FieldElement,
112 h3: FieldElement,
114 d3: FieldElement,
116 h4: FieldElement,
118 d4: FieldElement,
120}
121
122#[cfg(feature = "zeroize")]
123impl Zeroize for ExpandedKey {
124 fn zeroize(&mut self) {
125 self.h1.zeroize();
126 self.d1.zeroize();
127 self.h2.zeroize();
128 self.d2.zeroize();
129 self.h3.zeroize();
130 self.d3.zeroize();
131 self.h4.zeroize();
132 self.d4.zeroize();
133 }
134}