@@ -5,6 +5,8 @@ use super::{
55#[ cfg( feature = "mac" ) ]
66use crate :: MacMarker ;
77use crate :: { CollisionResistance , CustomizedInit , HashMarker , VarOutputCustomized } ;
8+ #[ cfg( feature = "oid" ) ]
9+ use const_oid:: { AssociatedOid , ObjectIdentifier } ;
810use core:: {
911 fmt,
1012 marker:: PhantomData ,
@@ -16,20 +18,26 @@ use crypto_common::{
1618 hazmat:: { DeserializeStateError , SerializableState , SerializedState , SubSerializedStateSize } ,
1719 typenum:: { IsLess , IsLessOrEqual , Le , LeEq , NonZero , Sum , U1 , U256 } ,
1820} ;
21+
22+ /// Dummy type used with [`CtVariableCoreWrapper`] in cases when
23+ /// resulting hash does not have a known OID.
24+ #[ derive( Copy , Clone , Debug , Eq , PartialEq , Hash ) ]
25+ pub struct NoOid ;
26+
1927/// Wrapper around [`VariableOutputCore`] which selects output size
2028/// at compile time.
2129#[ derive( Clone ) ]
22- pub struct CtVariableCoreWrapper < T , OutSize >
30+ pub struct CtVariableCoreWrapper < T , OutSize , O = NoOid >
2331where
2432 T : VariableOutputCore ,
2533 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
2634 LeEq < OutSize , T :: OutputSize > : NonZero ,
2735{
2836 inner : T ,
29- _out : PhantomData < OutSize > ,
37+ _out : PhantomData < ( OutSize , O ) > ,
3038}
3139
32- impl < T , OutSize > HashMarker for CtVariableCoreWrapper < T , OutSize >
40+ impl < T , OutSize , O > HashMarker for CtVariableCoreWrapper < T , OutSize , O >
3341where
3442 T : VariableOutputCore + HashMarker ,
3543 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
3846}
3947
4048#[ cfg( feature = "mac" ) ]
41- impl < T , OutSize > MacMarker for CtVariableCoreWrapper < T , OutSize >
49+ impl < T , OutSize , O > MacMarker for CtVariableCoreWrapper < T , OutSize , O >
4250where
4351 T : VariableOutputCore + MacMarker ,
4452 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
5563 type CollisionResistance = T :: CollisionResistance ;
5664}
5765
58- impl < T , OutSize > BlockSizeUser for CtVariableCoreWrapper < T , OutSize >
66+ impl < T , OutSize , O > BlockSizeUser for CtVariableCoreWrapper < T , OutSize , O >
5967where
6068 T : VariableOutputCore ,
6169 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
6472 type BlockSize = T :: BlockSize ;
6573}
6674
67- impl < T , OutSize > UpdateCore for CtVariableCoreWrapper < T , OutSize >
75+ impl < T , OutSize , O > UpdateCore for CtVariableCoreWrapper < T , OutSize , O >
6876where
6977 T : VariableOutputCore ,
7078 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
7684 }
7785}
7886
79- impl < T , OutSize > OutputSizeUser for CtVariableCoreWrapper < T , OutSize >
87+ impl < T , OutSize , O > OutputSizeUser for CtVariableCoreWrapper < T , OutSize , O >
8088where
8189 T : VariableOutputCore ,
8290 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
8593 type OutputSize = OutSize ;
8694}
8795
88- impl < T , OutSize > BufferKindUser for CtVariableCoreWrapper < T , OutSize >
96+ impl < T , OutSize , O > BufferKindUser for CtVariableCoreWrapper < T , OutSize , O >
8997where
9098 T : VariableOutputCore ,
9199 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
94102 type BufferKind = T :: BufferKind ;
95103}
96104
97- impl < T , OutSize > FixedOutputCore for CtVariableCoreWrapper < T , OutSize >
105+ impl < T , OutSize , O > FixedOutputCore for CtVariableCoreWrapper < T , OutSize , O >
98106where
99107 T : VariableOutputCore ,
100108 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
@@ -117,7 +125,7 @@ where
117125 }
118126}
119127
120- impl < T , OutSize > Default for CtVariableCoreWrapper < T , OutSize >
128+ impl < T , OutSize , O > Default for CtVariableCoreWrapper < T , OutSize , O >
121129where
122130 T : VariableOutputCore ,
123131 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
@@ -132,7 +140,7 @@ where
132140 }
133141}
134142
135- impl < T , OutSize > CustomizedInit for CtVariableCoreWrapper < T , OutSize >
143+ impl < T , OutSize , O > CustomizedInit for CtVariableCoreWrapper < T , OutSize , O >
136144where
137145 T : VariableOutputCore + VarOutputCustomized ,
138146 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
@@ -147,7 +155,7 @@ where
147155 }
148156}
149157
150- impl < T , OutSize > Reset for CtVariableCoreWrapper < T , OutSize >
158+ impl < T , OutSize , O > Reset for CtVariableCoreWrapper < T , OutSize , O >
151159where
152160 T : VariableOutputCore ,
153161 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
@@ -159,7 +167,7 @@ where
159167 }
160168}
161169
162- impl < T , OutSize > AlgorithmName for CtVariableCoreWrapper < T , OutSize >
170+ impl < T , OutSize , O > AlgorithmName for CtVariableCoreWrapper < T , OutSize , O >
163171where
164172 T : VariableOutputCore + AlgorithmName ,
165173 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
@@ -172,16 +180,27 @@ where
172180 }
173181}
174182
183+ #[ cfg( feature = "oid" ) ]
184+ impl < T , OutSize , O > AssociatedOid for CtVariableCoreWrapper < T , OutSize , O >
185+ where
186+ T : VariableOutputCore ,
187+ O : AssociatedOid ,
188+ OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
189+ LeEq < OutSize , T :: OutputSize > : NonZero ,
190+ {
191+ const OID : ObjectIdentifier = O :: OID ;
192+ }
193+
175194#[ cfg( feature = "zeroize" ) ]
176- impl < T , OutSize > zeroize:: ZeroizeOnDrop for CtVariableCoreWrapper < T , OutSize >
195+ impl < T , OutSize , O > zeroize:: ZeroizeOnDrop for CtVariableCoreWrapper < T , OutSize , O >
177196where
178197 T : VariableOutputCore + zeroize:: ZeroizeOnDrop ,
179198 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
180199 LeEq < OutSize , T :: OutputSize > : NonZero ,
181200{
182201}
183202
184- impl < T , OutSize > fmt:: Debug for CtVariableCoreWrapper < T , OutSize >
203+ impl < T , OutSize , O > fmt:: Debug for CtVariableCoreWrapper < T , OutSize , O >
185204where
186205 T : VariableOutputCore + AlgorithmName ,
187206 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
@@ -192,10 +211,26 @@ where
192211 }
193212}
194213
214+ /// Implement dummy type with hidden docs which is used to "carry" hasher
215+ /// OID for [`CtVariableCoreWrapper`].
216+ #[ macro_export]
217+ macro_rules! impl_oid_carrier {
218+ ( $name: ident, $oid: literal) => {
219+ #[ doc( hidden) ]
220+ #[ derive( Copy , Clone , Debug , Eq , PartialEq , Hash ) ]
221+ pub struct $name;
222+
223+ #[ cfg( feature = "oid" ) ]
224+ impl AssociatedOid for $name {
225+ const OID : ObjectIdentifier = ObjectIdentifier :: new_unwrap( $oid) ;
226+ }
227+ } ;
228+ }
229+
195230type CtVariableCoreWrapperSerializedStateSize < T > =
196231 Sum < <T as SerializableState >:: SerializedStateSize , U1 > ;
197232
198- impl < T , OutSize > SerializableState for CtVariableCoreWrapper < T , OutSize >
233+ impl < T , OutSize , O > SerializableState for CtVariableCoreWrapper < T , OutSize , O >
199234where
200235 T : VariableOutputCore + SerializableState ,
201236 OutSize : ArraySize + IsLessOrEqual < T :: OutputSize > ,
0 commit comments