1#![forbid(missing_docs)]
10
11use alloc::vec::Vec;
12use alloc::string::String;
13
14#[cfg(feature = "num-bigint")]
15use num_bigint::{BigInt,BigUint};
16#[cfg(feature = "bit-vec")]
17use bit_vec::BitVec;
18
19use super::{ASN1Result,BERMode,BERReader,parse_ber_general};
20use super::models::{ObjectIdentifier,TaggedDerValue};
21#[cfg(feature = "time")]
22use super::models::{UTCTime,GeneralizedTime};
23
24pub trait BERDecodable: Sized {
57 fn decode_ber<'a, 'b>(reader: BERReader<'a, 'b>) -> ASN1Result<Self>;
88}
89
90pub fn decode_ber_general<T:BERDecodable>(src: &[u8], mode: BERMode)
95 -> ASN1Result<T> {
96 parse_ber_general(src, mode, |reader| {
97 T::decode_ber(reader)
98 })
99}
100
101pub fn decode_ber<T:BERDecodable>(src: &[u8]) -> ASN1Result<T> {
114 decode_ber_general(src, BERMode::Ber)
115}
116
117pub fn decode_der<T:BERDecodable>(src: &[u8]) -> ASN1Result<T> {
130 decode_ber_general(src, BERMode::Der)
131}
132
133impl<T> BERDecodable for Vec<T> where T: BERDecodable {
134 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
135 reader.read_sequence(|reader| {
136 let mut ret = Vec::new();
137 loop {
138 let result = reader.read_optional(|reader| {
139 T::decode_ber(reader)
140 })?;
141 match result {
142 Some(result) => {
143 ret.push(result);
144 },
145 None => {
146 break;
147 }
148 };
149 }
150 return Ok(ret);
151 })
152 }
153}
154
155impl BERDecodable for i64 {
156 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
157 reader.read_i64()
158 }
159}
160
161impl BERDecodable for u64 {
162 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
163 reader.read_u64()
164 }
165}
166
167impl BERDecodable for i32 {
168 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
169 reader.read_i32()
170 }
171}
172
173impl BERDecodable for u32 {
174 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
175 reader.read_u32()
176 }
177}
178
179impl BERDecodable for i16 {
180 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
181 reader.read_i16()
182 }
183}
184
185impl BERDecodable for u16 {
186 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
187 reader.read_u16()
188 }
189}
190
191#[cfg(feature = "num-bigint")]
192impl BERDecodable for BigInt {
193 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
194 reader.read_bigint()
195 }
196}
197
198#[cfg(feature = "num-bigint")]
199impl BERDecodable for BigUint {
200 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
201 reader.read_biguint()
202 }
203}
204
205impl BERDecodable for bool {
206 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
207 reader.read_bool()
208 }
209}
210
211#[cfg(feature = "bit-vec")]
212impl BERDecodable for BitVec {
213 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
214 reader.read_bitvec()
215 }
216}
217
218impl BERDecodable for Vec<u8> {
219 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
220 reader.read_bytes()
221 }
222}
223
224impl BERDecodable for String {
225 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
226 reader.read_utf8string()
227 }
228}
229
230impl BERDecodable for ObjectIdentifier {
231 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
232 reader.read_oid()
233 }
234}
235
236#[cfg(feature = "time")]
237impl BERDecodable for UTCTime {
238 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
239 reader.read_utctime()
240 }
241}
242
243#[cfg(feature = "time")]
244impl BERDecodable for GeneralizedTime {
245 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
246 reader.read_generalized_time()
247 }
248}
249
250impl BERDecodable for () {
251 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
252 reader.read_null()
253 }
254}
255
256impl<T0> BERDecodable for (T0,)
257 where T0: BERDecodable {
258 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
259 reader.read_sequence(|reader| {
260 let t0 = T0::decode_ber(reader.next())?;
261 return Ok((t0,));
262 })
263 }
264}
265
266impl<T0, T1> BERDecodable for (T0, T1)
267 where T0: BERDecodable, T1: BERDecodable {
268 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
269 reader.read_sequence(|reader| {
270 let t0 = T0::decode_ber(reader.next())?;
271 let t1 = T1::decode_ber(reader.next())?;
272 return Ok((t0, t1));
273 })
274 }
275}
276
277impl<T0, T1, T2> BERDecodable for (T0, T1, T2)
278 where T0: BERDecodable, T1: BERDecodable, T2: BERDecodable {
279 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
280 reader.read_sequence(|reader| {
281 let t0 = T0::decode_ber(reader.next())?;
282 let t1 = T1::decode_ber(reader.next())?;
283 let t2 = T2::decode_ber(reader.next())?;
284 return Ok((t0, t1, t2));
285 })
286 }
287}
288
289impl<T0, T1, T2, T3> BERDecodable for (T0, T1, T2, T3)
290 where T0: BERDecodable, T1: BERDecodable, T2: BERDecodable,
291 T3: BERDecodable {
292 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
293 reader.read_sequence(|reader| {
294 let t0 = T0::decode_ber(reader.next())?;
295 let t1 = T1::decode_ber(reader.next())?;
296 let t2 = T2::decode_ber(reader.next())?;
297 let t3 = T3::decode_ber(reader.next())?;
298 return Ok((t0, t1, t2, t3));
299 })
300 }
301}
302
303impl<T0, T1, T2, T3, T4> BERDecodable for (T0, T1, T2, T3, T4)
304 where T0: BERDecodable, T1: BERDecodable, T2: BERDecodable,
305 T3: BERDecodable, T4: BERDecodable {
306 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
307 reader.read_sequence(|reader| {
308 let t0 = T0::decode_ber(reader.next())?;
309 let t1 = T1::decode_ber(reader.next())?;
310 let t2 = T2::decode_ber(reader.next())?;
311 let t3 = T3::decode_ber(reader.next())?;
312 let t4 = T4::decode_ber(reader.next())?;
313 return Ok((t0, t1, t2, t3, t4));
314 })
315 }
316}
317
318impl<T0, T1, T2, T3, T4, T5> BERDecodable for (T0, T1, T2, T3, T4, T5)
319 where T0: BERDecodable, T1: BERDecodable, T2: BERDecodable,
320 T3: BERDecodable, T4: BERDecodable, T5: BERDecodable {
321 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
322 reader.read_sequence(|reader| {
323 let t0 = T0::decode_ber(reader.next())?;
324 let t1 = T1::decode_ber(reader.next())?;
325 let t2 = T2::decode_ber(reader.next())?;
326 let t3 = T3::decode_ber(reader.next())?;
327 let t4 = T4::decode_ber(reader.next())?;
328 let t5 = T5::decode_ber(reader.next())?;
329 return Ok((t0, t1, t2, t3, t4, t5));
330 })
331 }
332}
333
334impl<T0, T1, T2, T3, T4, T5, T6> BERDecodable for (T0, T1, T2, T3, T4, T5, T6)
335 where T0: BERDecodable, T1: BERDecodable, T2: BERDecodable,
336 T3: BERDecodable, T4: BERDecodable, T5: BERDecodable,
337 T6: BERDecodable {
338 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
339 reader.read_sequence(|reader| {
340 let t0 = T0::decode_ber(reader.next())?;
341 let t1 = T1::decode_ber(reader.next())?;
342 let t2 = T2::decode_ber(reader.next())?;
343 let t3 = T3::decode_ber(reader.next())?;
344 let t4 = T4::decode_ber(reader.next())?;
345 let t5 = T5::decode_ber(reader.next())?;
346 let t6 = T6::decode_ber(reader.next())?;
347 return Ok((t0, t1, t2, t3, t4, t5, t6));
348 })
349 }
350}
351
352impl<T0, T1, T2, T3, T4, T5, T6, T7> BERDecodable
353 for (T0, T1, T2, T3, T4, T5, T6, T7)
354 where T0: BERDecodable, T1: BERDecodable, T2: BERDecodable,
355 T3: BERDecodable, T4: BERDecodable, T5: BERDecodable,
356 T6: BERDecodable, T7: BERDecodable {
357 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
358 reader.read_sequence(|reader| {
359 let t0 = T0::decode_ber(reader.next())?;
360 let t1 = T1::decode_ber(reader.next())?;
361 let t2 = T2::decode_ber(reader.next())?;
362 let t3 = T3::decode_ber(reader.next())?;
363 let t4 = T4::decode_ber(reader.next())?;
364 let t5 = T5::decode_ber(reader.next())?;
365 let t6 = T6::decode_ber(reader.next())?;
366 let t7 = T7::decode_ber(reader.next())?;
367 return Ok((t0, t1, t2, t3, t4, t5, t6, t7));
368 })
369 }
370}
371
372impl<T0, T1, T2, T3, T4, T5, T6, T7, T8> BERDecodable
373 for (T0, T1, T2, T3, T4, T5, T6, T7, T8)
374 where T0: BERDecodable, T1: BERDecodable, T2: BERDecodable,
375 T3: BERDecodable, T4: BERDecodable, T5: BERDecodable,
376 T6: BERDecodable, T7: BERDecodable, T8: BERDecodable {
377 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
378 reader.read_sequence(|reader| {
379 let t0 = T0::decode_ber(reader.next())?;
380 let t1 = T1::decode_ber(reader.next())?;
381 let t2 = T2::decode_ber(reader.next())?;
382 let t3 = T3::decode_ber(reader.next())?;
383 let t4 = T4::decode_ber(reader.next())?;
384 let t5 = T5::decode_ber(reader.next())?;
385 let t6 = T6::decode_ber(reader.next())?;
386 let t7 = T7::decode_ber(reader.next())?;
387 let t8 = T8::decode_ber(reader.next())?;
388 return Ok((t0, t1, t2, t3, t4, t5, t6, t7, t8));
389 })
390 }
391}
392
393impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> BERDecodable
394 for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)
395 where T0: BERDecodable, T1: BERDecodable, T2: BERDecodable,
396 T3: BERDecodable, T4: BERDecodable, T5: BERDecodable,
397 T6: BERDecodable, T7: BERDecodable, T8: BERDecodable,
398 T9: BERDecodable {
399 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
400 reader.read_sequence(|reader| {
401 let t0 = T0::decode_ber(reader.next())?;
402 let t1 = T1::decode_ber(reader.next())?;
403 let t2 = T2::decode_ber(reader.next())?;
404 let t3 = T3::decode_ber(reader.next())?;
405 let t4 = T4::decode_ber(reader.next())?;
406 let t5 = T5::decode_ber(reader.next())?;
407 let t6 = T6::decode_ber(reader.next())?;
408 let t7 = T7::decode_ber(reader.next())?;
409 let t8 = T8::decode_ber(reader.next())?;
410 let t9 = T9::decode_ber(reader.next())?;
411 return Ok((t0, t1, t2, t3, t4, t5, t6, t7, t8, t9));
412 })
413 }
414}
415
416impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> BERDecodable
417 for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
418 where T0: BERDecodable, T1: BERDecodable, T2: BERDecodable,
419 T3: BERDecodable, T4: BERDecodable, T5: BERDecodable,
420 T6: BERDecodable, T7: BERDecodable, T8: BERDecodable,
421 T9: BERDecodable, T10: BERDecodable {
422 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
423 reader.read_sequence(|reader| {
424 let t0 = T0::decode_ber(reader.next())?;
425 let t1 = T1::decode_ber(reader.next())?;
426 let t2 = T2::decode_ber(reader.next())?;
427 let t3 = T3::decode_ber(reader.next())?;
428 let t4 = T4::decode_ber(reader.next())?;
429 let t5 = T5::decode_ber(reader.next())?;
430 let t6 = T6::decode_ber(reader.next())?;
431 let t7 = T7::decode_ber(reader.next())?;
432 let t8 = T8::decode_ber(reader.next())?;
433 let t9 = T9::decode_ber(reader.next())?;
434 let t10 = T10::decode_ber(reader.next())?;
435 return Ok((t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10));
436 })
437 }
438}
439
440impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> BERDecodable
441 for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)
442 where T0: BERDecodable, T1: BERDecodable, T2: BERDecodable,
443 T3: BERDecodable, T4: BERDecodable, T5: BERDecodable,
444 T6: BERDecodable, T7: BERDecodable, T8: BERDecodable,
445 T9: BERDecodable, T10: BERDecodable, T11: BERDecodable {
446 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
447 reader.read_sequence(|reader| {
448 let t0 = T0::decode_ber(reader.next())?;
449 let t1 = T1::decode_ber(reader.next())?;
450 let t2 = T2::decode_ber(reader.next())?;
451 let t3 = T3::decode_ber(reader.next())?;
452 let t4 = T4::decode_ber(reader.next())?;
453 let t5 = T5::decode_ber(reader.next())?;
454 let t6 = T6::decode_ber(reader.next())?;
455 let t7 = T7::decode_ber(reader.next())?;
456 let t8 = T8::decode_ber(reader.next())?;
457 let t9 = T9::decode_ber(reader.next())?;
458 let t10 = T10::decode_ber(reader.next())?;
459 let t11 = T11::decode_ber(reader.next())?;
460 return Ok((t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11));
461 })
462 }
463}
464
465impl BERDecodable for TaggedDerValue {
466 fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
467 reader.read_tagged_der()
468 }
469}