yasna/serializer/
mod.rs

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
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::{DERWriter,construct_der};
20use super::models::ObjectIdentifier;
21#[cfg(feature = "time")]
22use super::models::{UTCTime,GeneralizedTime};
23
24/// Types encodable in DER.
25///
26/// # Examples
27///
28/// ```
29/// use yasna;
30/// let der = yasna::encode_der::<i64>(&65535);
31/// assert_eq!(&der, &[2, 3, 0, 255, 255]);
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 encoded via default `DEREncodable` implementation.
38///
39/// If you want to encode ASN.1, you may implement `DEREncodable` for your
40/// own types or use [`construct_der`].
41///
42/// # Default implementations
43///
44/// - The encoder for `Vec<T>`/`[T]` is implemented as SEQUENCE OF encoder.
45/// - `()` as NULL encoder.
46/// - Tuples (except `()`) as SEQUENCE encoder.
47/// - `Vec<u8>`/`[u8]` as OCTETSTRING encoder.
48/// - `BitVec` as BITSTRING encoder.
49/// - `String`/`str` as UTF8String encoder.
50/// - `i64`, `u64`, `i32`, `u32`, `i16`, `u16`, `BigInt`, `BigUint`
51///   as INTEGER encoder. (`u8` is avoided because of confliction.)
52/// - `bool` as BOOLEAN encoder.
53/// - `ObjectIdentifier` as OBJECTT IDENTIFIER encoder.
54/// - `UTCTime`/`GeneralizedTime` as UTCTime/GeneralizedTime encoder.
55pub trait DEREncodable {
56    /// Writes the value as an DER-encoded ASN.1 value.
57    ///
58    /// # Examples
59    ///
60    /// ```
61    /// use yasna::{DEREncodable,DERWriter};
62    /// struct Entry {
63    ///     name: String,
64    ///     age: i64,
65    /// }
66    ///
67    /// impl DEREncodable for Entry {
68    ///     fn encode_der(&self, writer: DERWriter) {
69    ///         writer.write_sequence(|writer| {
70    ///             writer.next().write_visible_string(&self.name);
71    ///             writer.next().write_i64(self.age);
72    ///         })
73    ///     }
74    /// }
75    /// fn main() {
76    ///     let entry = Entry {
77    ///         name: String::from("John"),
78    ///         age: 32,
79    ///     };
80    ///     let der = yasna::encode_der(&entry);
81    ///     assert_eq!(&der, &[48, 9, 26, 4, 74, 111, 104, 110, 2, 1, 32]);
82    /// }
83    /// ```
84    fn encode_der<'a>(&self, writer: DERWriter<'a>);
85}
86
87/// Encodes a value to DER-encoded ASN.1 data.
88pub fn encode_der<T: DEREncodable + ?Sized>(value: &T) -> Vec<u8> {
89    construct_der(|writer| {
90        value.encode_der(writer)
91    })
92}
93
94impl<T> DEREncodable for &T where T: DEREncodable + ?Sized {
95    fn encode_der(&self, writer: DERWriter) {
96        (**self).encode_der(writer)
97    }
98}
99
100impl<T> DEREncodable for Vec<T> where T: DEREncodable {
101    fn encode_der(&self, writer: DERWriter) {
102        writer.write_sequence(|writer| {
103            for elem in self.iter() {
104                elem.encode_der(writer.next());
105            }
106        })
107    }
108}
109
110impl<T> DEREncodable for [T] where T: DEREncodable {
111    fn encode_der(&self, writer: DERWriter) {
112        writer.write_sequence(|writer| {
113            for elem in self.iter() {
114                elem.encode_der(writer.next());
115            }
116        })
117    }
118}
119
120impl DEREncodable for i64 {
121    fn encode_der(&self, writer: DERWriter) {
122        writer.write_i64(*self)
123    }
124}
125
126impl DEREncodable for u64 {
127    fn encode_der(&self, writer: DERWriter) {
128        writer.write_u64(*self)
129    }
130}
131
132impl DEREncodable for i32 {
133    fn encode_der(&self, writer: DERWriter) {
134        writer.write_i32(*self)
135    }
136}
137
138impl DEREncodable for u32 {
139    fn encode_der(&self, writer: DERWriter) {
140        writer.write_u32(*self)
141    }
142}
143
144impl DEREncodable for i16 {
145    fn encode_der(&self, writer: DERWriter) {
146        writer.write_i16(*self)
147    }
148}
149
150impl DEREncodable for u16 {
151    fn encode_der(&self, writer: DERWriter) {
152        writer.write_u16(*self)
153    }
154}
155
156#[cfg(feature = "num-bigint")]
157impl DEREncodable for BigInt {
158    fn encode_der(&self, writer: DERWriter) {
159        writer.write_bigint(self)
160    }
161}
162
163#[cfg(feature = "num-bigint")]
164impl DEREncodable for BigUint {
165    fn encode_der(&self, writer: DERWriter) {
166        writer.write_biguint(self)
167    }
168}
169
170impl DEREncodable for bool {
171    fn encode_der(&self, writer: DERWriter) {
172        writer.write_bool(*self)
173    }
174}
175
176#[cfg(feature = "bit-vec")]
177impl DEREncodable for BitVec {
178    fn encode_der(&self, writer: DERWriter) {
179        writer.write_bitvec(self)
180    }
181}
182
183impl DEREncodable for Vec<u8> {
184    fn encode_der(&self, writer: DERWriter) {
185        writer.write_bytes(self)
186    }
187}
188
189impl DEREncodable for [u8] {
190    fn encode_der(&self, writer: DERWriter) {
191        writer.write_bytes(self)
192    }
193}
194
195impl DEREncodable for String {
196    fn encode_der(&self, writer: DERWriter) {
197        writer.write_utf8string(self)
198    }
199}
200
201impl DEREncodable for str {
202    fn encode_der(&self, writer: DERWriter) {
203        writer.write_utf8string(self)
204    }
205}
206
207impl DEREncodable for ObjectIdentifier {
208    fn encode_der(&self, writer: DERWriter) {
209        writer.write_oid(self)
210    }
211}
212
213#[cfg(feature = "time")]
214impl DEREncodable for UTCTime {
215    fn encode_der(&self, writer: DERWriter) {
216        writer.write_utctime(self)
217    }
218}
219
220#[cfg(feature = "time")]
221impl DEREncodable for GeneralizedTime{
222    fn encode_der(&self, writer: DERWriter) {
223        writer.write_generalized_time(self)
224    }
225}
226
227impl DEREncodable for () {
228    fn encode_der(&self, writer: DERWriter) {
229        writer.write_null()
230    }
231}
232
233impl<T0> DEREncodable for (T0,) where T0: DEREncodable {
234    fn encode_der(&self, writer: DERWriter) {
235        writer.write_sequence(|writer| {
236            self.0.encode_der(writer.next());
237        })
238    }
239}
240
241impl<T0, T1> DEREncodable for (T0, T1)
242        where T0: DEREncodable, T1: DEREncodable {
243    fn encode_der(&self, writer: DERWriter) {
244        writer.write_sequence(|writer| {
245            self.0.encode_der(writer.next());
246            self.1.encode_der(writer.next());
247        })
248    }
249}
250
251impl<T0, T1, T2> DEREncodable for (T0, T1, T2)
252        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable {
253    fn encode_der(&self, writer: DERWriter) {
254        writer.write_sequence(|writer| {
255            self.0.encode_der(writer.next());
256            self.1.encode_der(writer.next());
257            self.2.encode_der(writer.next());
258        })
259    }
260}
261
262impl<T0, T1, T2, T3> DEREncodable for (T0, T1, T2, T3)
263        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
264            T3: DEREncodable {
265    fn encode_der(&self, writer: DERWriter) {
266        writer.write_sequence(|writer| {
267            self.0.encode_der(writer.next());
268            self.1.encode_der(writer.next());
269            self.2.encode_der(writer.next());
270            self.3.encode_der(writer.next());
271        })
272    }
273}
274
275impl<T0, T1, T2, T3, T4> DEREncodable for (T0, T1, T2, T3, T4)
276        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
277            T3: DEREncodable, T4: DEREncodable {
278    fn encode_der(&self, writer: DERWriter) {
279        writer.write_sequence(|writer| {
280            self.0.encode_der(writer.next());
281            self.1.encode_der(writer.next());
282            self.2.encode_der(writer.next());
283            self.3.encode_der(writer.next());
284            self.4.encode_der(writer.next());
285        })
286    }
287}
288
289impl<T0, T1, T2, T3, T4, T5> DEREncodable for (T0, T1, T2, T3, T4, T5)
290        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
291            T3: DEREncodable, T4: DEREncodable, T5: DEREncodable {
292    fn encode_der(&self, writer: DERWriter) {
293        writer.write_sequence(|writer| {
294            self.0.encode_der(writer.next());
295            self.1.encode_der(writer.next());
296            self.2.encode_der(writer.next());
297            self.3.encode_der(writer.next());
298            self.4.encode_der(writer.next());
299            self.5.encode_der(writer.next());
300        })
301    }
302}
303
304impl<T0, T1, T2, T3, T4, T5, T6> DEREncodable for (T0, T1, T2, T3, T4, T5, T6)
305        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
306            T3: DEREncodable, T4: DEREncodable, T5: DEREncodable,
307            T6: DEREncodable {
308    fn encode_der(&self, writer: DERWriter) {
309        writer.write_sequence(|writer| {
310            self.0.encode_der(writer.next());
311            self.1.encode_der(writer.next());
312            self.2.encode_der(writer.next());
313            self.3.encode_der(writer.next());
314            self.4.encode_der(writer.next());
315            self.5.encode_der(writer.next());
316            self.6.encode_der(writer.next());
317        })
318    }
319}
320
321impl<T0, T1, T2, T3, T4, T5, T6, T7> DEREncodable
322        for (T0, T1, T2, T3, T4, T5, T6, T7)
323        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
324            T3: DEREncodable, T4: DEREncodable, T5: DEREncodable,
325            T6: DEREncodable, T7: DEREncodable {
326    fn encode_der(&self, writer: DERWriter) {
327        writer.write_sequence(|writer| {
328            self.0.encode_der(writer.next());
329            self.1.encode_der(writer.next());
330            self.2.encode_der(writer.next());
331            self.3.encode_der(writer.next());
332            self.4.encode_der(writer.next());
333            self.5.encode_der(writer.next());
334            self.6.encode_der(writer.next());
335            self.7.encode_der(writer.next());
336        })
337    }
338}
339
340impl<T0, T1, T2, T3, T4, T5, T6, T7, T8> DEREncodable
341        for (T0, T1, T2, T3, T4, T5, T6, T7, T8)
342        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
343            T3: DEREncodable, T4: DEREncodable, T5: DEREncodable,
344            T6: DEREncodable, T7: DEREncodable, T8: DEREncodable {
345    fn encode_der(&self, writer: DERWriter) {
346        writer.write_sequence(|writer| {
347            self.0.encode_der(writer.next());
348            self.1.encode_der(writer.next());
349            self.2.encode_der(writer.next());
350            self.3.encode_der(writer.next());
351            self.4.encode_der(writer.next());
352            self.5.encode_der(writer.next());
353            self.6.encode_der(writer.next());
354            self.7.encode_der(writer.next());
355            self.8.encode_der(writer.next());
356        })
357    }
358}
359
360impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> DEREncodable
361        for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)
362        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
363            T3: DEREncodable, T4: DEREncodable, T5: DEREncodable,
364            T6: DEREncodable, T7: DEREncodable, T8: DEREncodable,
365            T9: DEREncodable {
366    fn encode_der(&self, writer: DERWriter) {
367        writer.write_sequence(|writer| {
368            self.0.encode_der(writer.next());
369            self.1.encode_der(writer.next());
370            self.2.encode_der(writer.next());
371            self.3.encode_der(writer.next());
372            self.4.encode_der(writer.next());
373            self.5.encode_der(writer.next());
374            self.6.encode_der(writer.next());
375            self.7.encode_der(writer.next());
376            self.8.encode_der(writer.next());
377            self.9.encode_der(writer.next());
378        })
379    }
380}
381
382impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> DEREncodable
383        for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
384        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
385            T3: DEREncodable, T4: DEREncodable, T5: DEREncodable,
386            T6: DEREncodable, T7: DEREncodable, T8: DEREncodable,
387            T9: DEREncodable, T10: DEREncodable {
388    fn encode_der(&self, writer: DERWriter) {
389        writer.write_sequence(|writer| {
390            self.0.encode_der(writer.next());
391            self.1.encode_der(writer.next());
392            self.2.encode_der(writer.next());
393            self.3.encode_der(writer.next());
394            self.4.encode_der(writer.next());
395            self.5.encode_der(writer.next());
396            self.6.encode_der(writer.next());
397            self.7.encode_der(writer.next());
398            self.8.encode_der(writer.next());
399            self.9.encode_der(writer.next());
400            self.10.encode_der(writer.next());
401        })
402    }
403}
404
405impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> DEREncodable
406        for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)
407        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
408            T3: DEREncodable, T4: DEREncodable, T5: DEREncodable,
409            T6: DEREncodable, T7: DEREncodable, T8: DEREncodable,
410            T9: DEREncodable, T10: DEREncodable, T11: DEREncodable {
411    fn encode_der(&self, writer: DERWriter) {
412        writer.write_sequence(|writer| {
413            self.0.encode_der(writer.next());
414            self.1.encode_der(writer.next());
415            self.2.encode_der(writer.next());
416            self.3.encode_der(writer.next());
417            self.4.encode_der(writer.next());
418            self.5.encode_der(writer.next());
419            self.6.encode_der(writer.next());
420            self.7.encode_der(writer.next());
421            self.8.encode_der(writer.next());
422            self.9.encode_der(writer.next());
423            self.10.encode_der(writer.next());
424            self.11.encode_der(writer.next());
425        })
426    }
427}
428
429#[cfg(test)]
430mod tests {
431    use crate::encode_der;
432
433    #[test]
434    fn serialize_slice() {
435        let arr = [0u8; 16];
436        let data_slice: &[u8] = &arr;
437        encode_der(data_slice);
438    }
439
440    #[test]
441    fn serialize_tuple_of_slices() {
442        let arr = [0u8; 16];
443        let data_tuple: (&[u8], &[u8]) = (&arr[..], &arr[..]);
444        encode_der(&data_tuple);
445    }
446}