3
3
use crate :: {
4
4
Any , ByteSlice , Encodable , Encoder , Error , ErrorKind , Header , Length , Result , Tag , Tagged ,
5
5
} ;
6
- use core:: { convert:: TryFrom , marker:: PhantomData } ;
7
- use typenum:: Unsigned ;
6
+ use core:: convert:: TryFrom ;
8
7
9
8
/// "Big" unsigned ASN.1 `INTEGER` type.
10
9
///
@@ -19,16 +18,12 @@ use typenum::Unsigned;
19
18
///
20
19
/// Currently supported sizes are 1 - 512 bytes.
21
20
#[ derive( Copy , Clone , Debug , Eq , PartialEq ) ]
22
- #[ cfg_attr( docsrs, doc( cfg( feature = "big-uint" ) ) ) ]
23
- pub struct BigUInt < ' a , N : BigUIntSize > {
21
+ pub struct BigUInt < ' a , const N : usize > {
24
22
/// Inner value
25
23
inner : ByteSlice < ' a > ,
26
-
27
- /// Integer size in bytes
28
- size : PhantomData < N > ,
29
24
}
30
25
31
- impl < ' a , N : BigUIntSize > BigUInt < ' a , N > {
26
+ impl < ' a , const N : usize > BigUInt < ' a , N > {
32
27
/// Create a new [`BigUInt`] from a byte slice.
33
28
///
34
29
/// Slice may be less than or equal to `N` bytes.
@@ -38,15 +33,12 @@ impl<'a, N: BigUIntSize> BigUInt<'a, N> {
38
33
bytes = & bytes[ 1 ..] ;
39
34
}
40
35
41
- if bytes. len ( ) > N :: to_usize ( ) {
36
+ if bytes. len ( ) > N {
42
37
return Err ( ErrorKind :: Length { tag : Self :: TAG } . into ( ) ) ;
43
38
}
44
39
45
40
ByteSlice :: new ( bytes)
46
- . map ( |inner| Self {
47
- inner,
48
- size : PhantomData ,
49
- } )
41
+ . map ( |inner| Self { inner } )
50
42
. map_err ( |_| ErrorKind :: Length { tag : Self :: TAG } . into ( ) )
51
43
}
52
44
@@ -86,13 +78,13 @@ impl<'a, N: BigUIntSize> BigUInt<'a, N> {
86
78
}
87
79
}
88
80
89
- impl < ' a , N : BigUIntSize > From < & BigUInt < ' a , N > > for BigUInt < ' a , N > {
81
+ impl < ' a , const N : usize > From < & BigUInt < ' a , N > > for BigUInt < ' a , N > {
90
82
fn from ( value : & BigUInt < ' a , N > ) -> BigUInt < ' a , N > {
91
83
* value
92
84
}
93
85
}
94
86
95
- impl < ' a , N : BigUIntSize > TryFrom < Any < ' a > > for BigUInt < ' a , N > {
87
+ impl < ' a , const N : usize > TryFrom < Any < ' a > > for BigUInt < ' a , N > {
96
88
type Error = Error ;
97
89
98
90
fn try_from ( any : Any < ' a > ) -> Result < BigUInt < ' a , N > > {
@@ -112,8 +104,8 @@ impl<'a, N: BigUIntSize> TryFrom<Any<'a>> for BigUInt<'a, N> {
112
104
// The `INTEGER` type always encodes a signed value, so for unsigned
113
105
// values the leading `0x00` byte may need to be removed.
114
106
// TODO(tarcieri): validate leading 0 byte was required
115
- if bytes. len ( ) > N :: to_usize ( ) {
116
- if bytes. len ( ) != N :: to_usize ( ) . checked_add ( 1 ) . unwrap ( ) {
107
+ if bytes. len ( ) > N {
108
+ if bytes. len ( ) != N . checked_add ( 1 ) . unwrap ( ) {
117
109
return Err ( ErrorKind :: Length { tag : Self :: TAG } . into ( ) ) ;
118
110
}
119
111
@@ -128,7 +120,7 @@ impl<'a, N: BigUIntSize> TryFrom<Any<'a>> for BigUInt<'a, N> {
128
120
}
129
121
}
130
122
131
- impl < ' a , N : BigUIntSize > Encodable for BigUInt < ' a , N > {
123
+ impl < ' a , const N : usize > Encodable for BigUInt < ' a , N > {
132
124
fn encoded_len ( & self ) -> Result < Length > {
133
125
self . header ( ) ?. encoded_len ( ) ? + self . inner_len ( ) ?
134
126
}
@@ -145,64 +137,19 @@ impl<'a, N: BigUIntSize> Encodable for BigUInt<'a, N> {
145
137
}
146
138
}
147
139
148
- impl < ' a , N : BigUIntSize > Tagged for BigUInt < ' a , N > {
140
+ impl < ' a , const N : usize > Tagged for BigUInt < ' a , N > {
149
141
const TAG : Tag = Tag :: Integer ;
150
142
}
151
143
152
- /// Marker trait for allowed [`BigUInt`] sizes.
153
- #[ cfg_attr( docsrs, doc( cfg( feature = "big-uint" ) ) ) ]
154
- pub trait BigUIntSize : Unsigned { }
155
-
156
- macro_rules! impl_size {
157
- ( $( $int: ident) ,+) => {
158
- $( impl BigUIntSize for typenum:: consts:: $int { } ) +
159
- } ;
160
- }
161
-
162
- // Sizes supported by the current implementation (1 - 512 bytes)
163
- impl_size ! (
164
- U1 , U2 , U3 , U4 , U5 , U6 , U7 , U8 , U9 , U10 , U11 , U12 , U13 , U14 , U15 , U16 , U17 , U18 , U19 , U20 , U21 ,
165
- U22 , U23 , U24 , U25 , U26 , U27 , U28 , U29 , U30 , U31 , U32 , U33 , U34 , U35 , U36 , U37 , U38 , U39 , U40 ,
166
- U41 , U42 , U43 , U44 , U45 , U46 , U47 , U48 , U49 , U50 , U51 , U52 , U53 , U54 , U55 , U56 , U57 , U58 , U59 ,
167
- U60 , U61 , U62 , U63 , U64 , U65 , U66 , U67 , U68 , U69 , U70 , U71 , U72 , U73 , U74 , U75 , U76 , U77 , U78 ,
168
- U79 , U80 , U81 , U82 , U83 , U84 , U85 , U86 , U87 , U88 , U89 , U90 , U91 , U92 , U93 , U94 , U95 , U96 , U97 ,
169
- U98 , U99 , U100 , U101 , U102 , U103 , U104 , U105 , U106 , U107 , U108 , U109 , U110 , U111 , U112 , U113 ,
170
- U114 , U115 , U116 , U117 , U118 , U119 , U120 , U121 , U122 , U123 , U124 , U125 , U126 , U127 , U128 , U129 ,
171
- U130 , U131 , U132 , U133 , U134 , U135 , U136 , U137 , U138 , U139 , U140 , U141 , U142 , U143 , U144 , U145 ,
172
- U146 , U147 , U148 , U149 , U150 , U151 , U152 , U153 , U154 , U155 , U156 , U157 , U158 , U159 , U160 , U161 ,
173
- U162 , U163 , U164 , U165 , U166 , U167 , U168 , U169 , U170 , U171 , U172 , U173 , U174 , U175 , U176 , U177 ,
174
- U178 , U179 , U180 , U181 , U182 , U183 , U184 , U185 , U186 , U187 , U188 , U189 , U190 , U191 , U192 , U193 ,
175
- U194 , U195 , U196 , U197 , U198 , U199 , U200 , U201 , U202 , U203 , U204 , U205 , U206 , U207 , U208 , U209 ,
176
- U210 , U211 , U212 , U213 , U214 , U215 , U216 , U217 , U218 , U219 , U220 , U221 , U222 , U223 , U224 , U225 ,
177
- U226 , U227 , U228 , U229 , U230 , U231 , U232 , U233 , U234 , U235 , U236 , U237 , U238 , U239 , U240 , U241 ,
178
- U242 , U243 , U244 , U245 , U246 , U247 , U248 , U249 , U250 , U251 , U252 , U253 , U254 , U255 , U256 , U257 ,
179
- U258 , U259 , U260 , U261 , U262 , U263 , U264 , U265 , U266 , U267 , U268 , U269 , U270 , U271 , U272 , U273 ,
180
- U274 , U275 , U276 , U277 , U278 , U279 , U280 , U281 , U282 , U283 , U284 , U285 , U286 , U287 , U288 , U289 ,
181
- U290 , U291 , U292 , U293 , U294 , U295 , U296 , U297 , U298 , U299 , U300 , U301 , U302 , U303 , U304 , U305 ,
182
- U306 , U307 , U308 , U309 , U310 , U311 , U312 , U313 , U314 , U315 , U316 , U317 , U318 , U319 , U320 , U321 ,
183
- U322 , U323 , U324 , U325 , U326 , U327 , U328 , U329 , U330 , U331 , U332 , U333 , U334 , U335 , U336 , U337 ,
184
- U338 , U339 , U340 , U341 , U342 , U343 , U344 , U345 , U346 , U347 , U348 , U349 , U350 , U351 , U352 , U353 ,
185
- U354 , U355 , U356 , U357 , U358 , U359 , U360 , U361 , U362 , U363 , U364 , U365 , U366 , U367 , U368 , U369 ,
186
- U370 , U371 , U372 , U373 , U374 , U375 , U376 , U377 , U378 , U379 , U380 , U381 , U382 , U383 , U384 , U385 ,
187
- U386 , U387 , U388 , U389 , U390 , U391 , U392 , U393 , U394 , U395 , U396 , U397 , U398 , U399 , U400 , U401 ,
188
- U402 , U403 , U404 , U405 , U406 , U407 , U408 , U409 , U410 , U411 , U412 , U413 , U414 , U415 , U416 , U417 ,
189
- U418 , U419 , U420 , U421 , U422 , U423 , U424 , U425 , U426 , U427 , U428 , U429 , U430 , U431 , U432 , U433 ,
190
- U434 , U435 , U436 , U437 , U438 , U439 , U440 , U441 , U442 , U443 , U444 , U445 , U446 , U447 , U448 , U449 ,
191
- U450 , U451 , U452 , U453 , U454 , U455 , U456 , U457 , U458 , U459 , U460 , U461 , U462 , U463 , U464 , U465 ,
192
- U466 , U467 , U468 , U469 , U470 , U471 , U472 , U473 , U474 , U475 , U476 , U477 , U478 , U479 , U480 , U481 ,
193
- U482 , U483 , U484 , U485 , U486 , U487 , U488 , U489 , U490 , U491 , U492 , U493 , U494 , U495 , U496 , U497 ,
194
- U498 , U499 , U500 , U501 , U502 , U503 , U504 , U505 , U506 , U507 , U508 , U509 , U510 , U511 , U512
195
- ) ;
196
-
197
144
#[ cfg( test) ]
198
145
mod tests {
199
146
use super :: BigUInt ;
200
147
use crate :: { asn1:: integer:: tests:: * , Any , Decodable , ErrorKind , Result , Tag } ;
201
148
use core:: convert:: TryInto ;
202
149
203
150
// TODO(tarcieri): tests for more integer sizes
204
- type BigU8 < ' a > = BigUInt < ' a , typenum :: U1 > ;
205
- type BigU16 < ' a > = BigUInt < ' a , typenum :: U16 > ;
151
+ type BigU8 < ' a > = BigUInt < ' a , 1 > ;
152
+ type BigU16 < ' a > = BigUInt < ' a , 2 > ;
206
153
207
154
/// Parse a `BitU1` from an ASN.1 `Any` value to test decoding behaviors.
208
155
fn parse_bigu8_from_any ( bytes : & [ u8 ] ) -> Result < BigU8 < ' _ > > {
0 commit comments