Coverage Report

Created: 2025-10-29 07:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/yasna-0.5.2/src/deserializer/mod.rs
Line
Count
Source
1
// Copyright 2016 Masaki Hara
2
//
3
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6
// option. This file may not be copied, modified, or distributed
7
// except according to those terms.
8
9
#![forbid(missing_docs)]
10
11
use alloc::vec::Vec;
12
use alloc::string::String;
13
14
#[cfg(feature = "num-bigint")]
15
use num_bigint::{BigInt,BigUint};
16
#[cfg(feature = "bit-vec")]
17
use bit_vec::BitVec;
18
19
use super::{ASN1Result,BERMode,BERReader,parse_ber_general};
20
use super::models::{ObjectIdentifier,TaggedDerValue};
21
#[cfg(feature = "time")]
22
use super::models::{UTCTime,GeneralizedTime};
23
24
/// Types decodable in BER.
25
///
26
/// # Examples
27
///
28
/// ```
29
/// use yasna;
30
/// let asn : i64 = yasna::decode_der(&[2, 3, 0, 255, 255]).unwrap();
31
/// assert_eq!(asn, 65535);
32
/// ```
33
///
34
/// # Limitations
35
///
36
/// Rust types don't correspond to ASN.1 types one-to-one. Not all kinds
37
/// of ASN.1 types can be decoded via default `BERDecodable` implementation.
38
///
39
/// If you want to decode ASN.1, you may implement `BERDecodable` for your
40
/// own types or use [`parse_der`](crate::parse_der)/
41
/// [`parse_ber`](crate::parse_ber).
42
///
43
/// # Default implementations
44
///
45
/// - The decoder for `Vec<T>` is implemented as SEQUENCE OF decoder.
46
/// - `()` as NULL decoder.
47
/// - Tuples (except `()`) as SEQUENCE decoder.
48
/// - `Vec<u8>` as OCTETSTRING decoder.
49
/// - `BitVec` as BITSTRING decoder.
50
/// - `String` as UTF8String decoder.
51
/// - `i64`, `u64`, `i32`, `u32`, `i16`, `u16`, `BigInt`, `BigUint`
52
///   as INTEGER decoder. (`u8` is avoided because of confliction.)
53
/// - `bool` as BOOLEAN decoder.
54
/// - `ObjectIdentifier` as OBJECTT IDENTIFIER decoder.
55
/// - `UTCTime`/`GeneralizedTime` as UTCTime/GeneralizedTime decoder.
56
pub trait BERDecodable: Sized {
57
    /// Reads an ASN.1 value from `BERReader` and converts it to `Self`.
58
    ///
59
    /// # Examples
60
    ///
61
    /// ```
62
    /// use yasna::{BERDecodable,BERReader,ASN1Result};
63
    /// struct Entry {
64
    ///     name: String,
65
    ///     age: i64,
66
    /// }
67
    ///
68
    /// impl BERDecodable for Entry {
69
    ///     fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
70
    ///         reader.read_sequence(|reader| {
71
    ///             let name = reader.next().read_visible_string()?;
72
    ///             let age = reader.next().read_i64()?;
73
    ///             return Ok(Entry {
74
    ///                 name: name,
75
    ///                 age: age,
76
    ///             });
77
    ///         })
78
    ///     }
79
    /// }
80
    /// fn main() {
81
    ///     let entry : Entry = yasna::decode_der(
82
    ///         &[48, 9, 26, 4, 74, 111, 104, 110, 2, 1, 32]).unwrap();
83
    ///     assert_eq!(entry.name, "John");
84
    ///     assert_eq!(entry.age, 32);
85
    /// }
86
    /// ```
87
    fn decode_ber<'a, 'b>(reader: BERReader<'a, 'b>) -> ASN1Result<Self>;
88
}
89
90
/// Decodes DER/BER-encoded data.
91
///
92
/// [`decode_ber`] and [`decode_der`] are shorthands
93
/// for this function.
94
0
pub fn decode_ber_general<T:BERDecodable>(src: &[u8], mode: BERMode)
95
0
        -> ASN1Result<T> {
96
0
    parse_ber_general(src, mode, |reader| {
97
0
        T::decode_ber(reader)
98
0
    })
99
0
}
100
101
/// Reads an ASN.1 value from `&[u8]`.
102
///
103
/// If you want to accept only DER-encoded data,
104
/// use [`decode_der`].
105
///
106
/// # Examples
107
///
108
/// ```
109
/// use yasna;
110
/// let asn : i64 = yasna::decode_ber(&[2, 3, 0, 255, 255]).unwrap();
111
/// assert_eq!(asn, 65535);
112
/// ```
113
0
pub fn decode_ber<T:BERDecodable>(src: &[u8]) -> ASN1Result<T> {
114
0
    decode_ber_general(src, BERMode::Ber)
115
0
}
116
117
/// Reads an ASN.1 value from `&[u8]`.
118
///
119
/// If you want to decode BER-encoded data in general,
120
/// use [`decode_ber`].
121
///
122
/// # Examples
123
///
124
/// ```
125
/// use yasna;
126
/// let asn : i64 = yasna::decode_der(&[2, 3, 0, 255, 255]).unwrap();
127
/// assert_eq!(asn, 65535);
128
/// ```
129
0
pub fn decode_der<T:BERDecodable>(src: &[u8]) -> ASN1Result<T> {
130
0
    decode_ber_general(src, BERMode::Der)
131
0
}
132
133
impl<T> BERDecodable for Vec<T> where T: BERDecodable {
134
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
135
0
        reader.read_sequence(|reader| {
136
0
            let mut ret = Vec::new();
137
            loop {
138
0
                let result = reader.read_optional(|reader| {
139
0
                    T::decode_ber(reader)
140
0
                })?;
141
0
                match result {
142
0
                    Some(result) => {
143
0
                        ret.push(result);
144
0
                    },
145
                    None => {
146
0
                        break;
147
                    }
148
                };
149
            }
150
0
            return Ok(ret);
151
0
        })
152
0
    }
153
}
154
155
impl BERDecodable for i64 {
156
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
157
0
        reader.read_i64()
158
0
    }
159
}
160
161
impl BERDecodable for u64 {
162
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
163
0
        reader.read_u64()
164
0
    }
165
}
166
167
impl BERDecodable for i32 {
168
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
169
0
        reader.read_i32()
170
0
    }
171
}
172
173
impl BERDecodable for u32 {
174
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
175
0
        reader.read_u32()
176
0
    }
177
}
178
179
impl BERDecodable for i16 {
180
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
181
0
        reader.read_i16()
182
0
    }
183
}
184
185
impl BERDecodable for u16 {
186
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
187
0
        reader.read_u16()
188
0
    }
189
}
190
191
#[cfg(feature = "num-bigint")]
192
impl BERDecodable for BigInt {
193
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
194
        reader.read_bigint()
195
    }
196
}
197
198
#[cfg(feature = "num-bigint")]
199
impl BERDecodable for BigUint {
200
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
201
        reader.read_biguint()
202
    }
203
}
204
205
impl BERDecodable for bool {
206
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
207
0
        reader.read_bool()
208
0
    }
209
}
210
211
#[cfg(feature = "bit-vec")]
212
impl BERDecodable for BitVec {
213
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
214
        reader.read_bitvec()
215
    }
216
}
217
218
impl BERDecodable for Vec<u8> {
219
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
220
0
        reader.read_bytes()
221
0
    }
222
}
223
224
impl BERDecodable for String {
225
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
226
0
        reader.read_utf8string()
227
0
    }
228
}
229
230
impl BERDecodable for ObjectIdentifier {
231
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
232
0
        reader.read_oid()
233
0
    }
234
}
235
236
#[cfg(feature = "time")]
237
impl BERDecodable for UTCTime {
238
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
239
0
        reader.read_utctime()
240
0
    }
241
}
242
243
#[cfg(feature = "time")]
244
impl BERDecodable for GeneralizedTime {
245
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
246
0
        reader.read_generalized_time()
247
0
    }
248
}
249
250
impl BERDecodable for () {
251
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
252
0
        reader.read_null()
253
0
    }
254
}
255
256
impl<T0> BERDecodable for (T0,)
257
        where T0: BERDecodable {
258
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
259
0
        reader.read_sequence(|reader| {
260
0
            let t0 = T0::decode_ber(reader.next())?;
261
0
            return Ok((t0,));
262
0
        })
263
0
    }
264
}
265
266
impl<T0, T1> BERDecodable for (T0, T1)
267
        where T0: BERDecodable, T1: BERDecodable {
268
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
269
0
        reader.read_sequence(|reader| {
270
0
            let t0 = T0::decode_ber(reader.next())?;
271
0
            let t1 = T1::decode_ber(reader.next())?;
272
0
            return Ok((t0, t1));
273
0
        })
274
0
    }
275
}
276
277
impl<T0, T1, T2> BERDecodable for (T0, T1, T2)
278
        where T0: BERDecodable, T1: BERDecodable, T2: BERDecodable {
279
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
280
0
        reader.read_sequence(|reader| {
281
0
            let t0 = T0::decode_ber(reader.next())?;
282
0
            let t1 = T1::decode_ber(reader.next())?;
283
0
            let t2 = T2::decode_ber(reader.next())?;
284
0
            return Ok((t0, t1, t2));
285
0
        })
286
0
    }
287
}
288
289
impl<T0, T1, T2, T3> BERDecodable for (T0, T1, T2, T3)
290
        where T0: BERDecodable, T1: BERDecodable, T2: BERDecodable,
291
            T3: BERDecodable {
292
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
293
0
        reader.read_sequence(|reader| {
294
0
            let t0 = T0::decode_ber(reader.next())?;
295
0
            let t1 = T1::decode_ber(reader.next())?;
296
0
            let t2 = T2::decode_ber(reader.next())?;
297
0
            let t3 = T3::decode_ber(reader.next())?;
298
0
            return Ok((t0, t1, t2, t3));
299
0
        })
300
0
    }
301
}
302
303
impl<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
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
307
0
        reader.read_sequence(|reader| {
308
0
            let t0 = T0::decode_ber(reader.next())?;
309
0
            let t1 = T1::decode_ber(reader.next())?;
310
0
            let t2 = T2::decode_ber(reader.next())?;
311
0
            let t3 = T3::decode_ber(reader.next())?;
312
0
            let t4 = T4::decode_ber(reader.next())?;
313
0
            return Ok((t0, t1, t2, t3, t4));
314
0
        })
315
0
    }
316
}
317
318
impl<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
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
322
0
        reader.read_sequence(|reader| {
323
0
            let t0 = T0::decode_ber(reader.next())?;
324
0
            let t1 = T1::decode_ber(reader.next())?;
325
0
            let t2 = T2::decode_ber(reader.next())?;
326
0
            let t3 = T3::decode_ber(reader.next())?;
327
0
            let t4 = T4::decode_ber(reader.next())?;
328
0
            let t5 = T5::decode_ber(reader.next())?;
329
0
            return Ok((t0, t1, t2, t3, t4, t5));
330
0
        })
331
0
    }
332
}
333
334
impl<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
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
339
0
        reader.read_sequence(|reader| {
340
0
            let t0 = T0::decode_ber(reader.next())?;
341
0
            let t1 = T1::decode_ber(reader.next())?;
342
0
            let t2 = T2::decode_ber(reader.next())?;
343
0
            let t3 = T3::decode_ber(reader.next())?;
344
0
            let t4 = T4::decode_ber(reader.next())?;
345
0
            let t5 = T5::decode_ber(reader.next())?;
346
0
            let t6 = T6::decode_ber(reader.next())?;
347
0
            return Ok((t0, t1, t2, t3, t4, t5, t6));
348
0
        })
349
0
    }
350
}
351
352
impl<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
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
358
0
        reader.read_sequence(|reader| {
359
0
            let t0 = T0::decode_ber(reader.next())?;
360
0
            let t1 = T1::decode_ber(reader.next())?;
361
0
            let t2 = T2::decode_ber(reader.next())?;
362
0
            let t3 = T3::decode_ber(reader.next())?;
363
0
            let t4 = T4::decode_ber(reader.next())?;
364
0
            let t5 = T5::decode_ber(reader.next())?;
365
0
            let t6 = T6::decode_ber(reader.next())?;
366
0
            let t7 = T7::decode_ber(reader.next())?;
367
0
            return Ok((t0, t1, t2, t3, t4, t5, t6, t7));
368
0
        })
369
0
    }
370
}
371
372
impl<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
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
378
0
        reader.read_sequence(|reader| {
379
0
            let t0 = T0::decode_ber(reader.next())?;
380
0
            let t1 = T1::decode_ber(reader.next())?;
381
0
            let t2 = T2::decode_ber(reader.next())?;
382
0
            let t3 = T3::decode_ber(reader.next())?;
383
0
            let t4 = T4::decode_ber(reader.next())?;
384
0
            let t5 = T5::decode_ber(reader.next())?;
385
0
            let t6 = T6::decode_ber(reader.next())?;
386
0
            let t7 = T7::decode_ber(reader.next())?;
387
0
            let t8 = T8::decode_ber(reader.next())?;
388
0
            return Ok((t0, t1, t2, t3, t4, t5, t6, t7, t8));
389
0
        })
390
0
    }
391
}
392
393
impl<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
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
400
0
        reader.read_sequence(|reader| {
401
0
            let t0 = T0::decode_ber(reader.next())?;
402
0
            let t1 = T1::decode_ber(reader.next())?;
403
0
            let t2 = T2::decode_ber(reader.next())?;
404
0
            let t3 = T3::decode_ber(reader.next())?;
405
0
            let t4 = T4::decode_ber(reader.next())?;
406
0
            let t5 = T5::decode_ber(reader.next())?;
407
0
            let t6 = T6::decode_ber(reader.next())?;
408
0
            let t7 = T7::decode_ber(reader.next())?;
409
0
            let t8 = T8::decode_ber(reader.next())?;
410
0
            let t9 = T9::decode_ber(reader.next())?;
411
0
            return Ok((t0, t1, t2, t3, t4, t5, t6, t7, t8, t9));
412
0
        })
413
0
    }
414
}
415
416
impl<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
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
423
0
        reader.read_sequence(|reader| {
424
0
            let t0 = T0::decode_ber(reader.next())?;
425
0
            let t1 = T1::decode_ber(reader.next())?;
426
0
            let t2 = T2::decode_ber(reader.next())?;
427
0
            let t3 = T3::decode_ber(reader.next())?;
428
0
            let t4 = T4::decode_ber(reader.next())?;
429
0
            let t5 = T5::decode_ber(reader.next())?;
430
0
            let t6 = T6::decode_ber(reader.next())?;
431
0
            let t7 = T7::decode_ber(reader.next())?;
432
0
            let t8 = T8::decode_ber(reader.next())?;
433
0
            let t9 = T9::decode_ber(reader.next())?;
434
0
            let t10 = T10::decode_ber(reader.next())?;
435
0
            return Ok((t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10));
436
0
        })
437
0
    }
438
}
439
440
impl<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
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
447
0
        reader.read_sequence(|reader| {
448
0
            let t0 = T0::decode_ber(reader.next())?;
449
0
            let t1 = T1::decode_ber(reader.next())?;
450
0
            let t2 = T2::decode_ber(reader.next())?;
451
0
            let t3 = T3::decode_ber(reader.next())?;
452
0
            let t4 = T4::decode_ber(reader.next())?;
453
0
            let t5 = T5::decode_ber(reader.next())?;
454
0
            let t6 = T6::decode_ber(reader.next())?;
455
0
            let t7 = T7::decode_ber(reader.next())?;
456
0
            let t8 = T8::decode_ber(reader.next())?;
457
0
            let t9 = T9::decode_ber(reader.next())?;
458
0
            let t10 = T10::decode_ber(reader.next())?;
459
0
            let t11 = T11::decode_ber(reader.next())?;
460
0
            return Ok((t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11));
461
0
        })
462
0
    }
463
}
464
465
impl BERDecodable for TaggedDerValue  {
466
0
    fn decode_ber(reader: BERReader) -> ASN1Result<Self> {
467
0
        reader.read_tagged_der()
468
0
    }
469
}