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>(value: &T) -> Vec<u8> {
89    construct_der(|writer| {
90        value.encode_der(writer)
91    })
92}
93
94impl<T> DEREncodable for Vec<T> where T: DEREncodable {
95    fn encode_der(&self, writer: DERWriter) {
96        writer.write_sequence(|writer| {
97            for elem in self.iter() {
98                elem.encode_der(writer.next());
99            }
100        })
101    }
102}
103
104impl<T> DEREncodable for [T] where T: DEREncodable {
105    fn encode_der(&self, writer: DERWriter) {
106        writer.write_sequence(|writer| {
107            for elem in self.iter() {
108                elem.encode_der(writer.next());
109            }
110        })
111    }
112}
113
114impl DEREncodable for i64 {
115    fn encode_der(&self, writer: DERWriter) {
116        writer.write_i64(*self)
117    }
118}
119
120impl DEREncodable for u64 {
121    fn encode_der(&self, writer: DERWriter) {
122        writer.write_u64(*self)
123    }
124}
125
126impl DEREncodable for i32 {
127    fn encode_der(&self, writer: DERWriter) {
128        writer.write_i32(*self)
129    }
130}
131
132impl DEREncodable for u32 {
133    fn encode_der(&self, writer: DERWriter) {
134        writer.write_u32(*self)
135    }
136}
137
138impl DEREncodable for i16 {
139    fn encode_der(&self, writer: DERWriter) {
140        writer.write_i16(*self)
141    }
142}
143
144impl DEREncodable for u16 {
145    fn encode_der(&self, writer: DERWriter) {
146        writer.write_u16(*self)
147    }
148}
149
150#[cfg(feature = "num-bigint")]
151impl DEREncodable for BigInt {
152    fn encode_der(&self, writer: DERWriter) {
153        writer.write_bigint(self)
154    }
155}
156
157#[cfg(feature = "num-bigint")]
158impl DEREncodable for BigUint {
159    fn encode_der(&self, writer: DERWriter) {
160        writer.write_biguint(self)
161    }
162}
163
164impl DEREncodable for bool {
165    fn encode_der(&self, writer: DERWriter) {
166        writer.write_bool(*self)
167    }
168}
169
170#[cfg(feature = "bit-vec")]
171impl DEREncodable for BitVec {
172    fn encode_der(&self, writer: DERWriter) {
173        writer.write_bitvec(self)
174    }
175}
176
177impl DEREncodable for Vec<u8> {
178    fn encode_der(&self, writer: DERWriter) {
179        writer.write_bytes(self)
180    }
181}
182
183impl DEREncodable for [u8] {
184    fn encode_der(&self, writer: DERWriter) {
185        writer.write_bytes(self)
186    }
187}
188
189impl DEREncodable for String {
190    fn encode_der(&self, writer: DERWriter) {
191        writer.write_utf8string(self)
192    }
193}
194
195impl DEREncodable for str {
196    fn encode_der(&self, writer: DERWriter) {
197        writer.write_utf8string(self)
198    }
199}
200
201impl DEREncodable for ObjectIdentifier {
202    fn encode_der(&self, writer: DERWriter) {
203        writer.write_oid(self)
204    }
205}
206
207#[cfg(feature = "time")]
208impl DEREncodable for UTCTime {
209    fn encode_der(&self, writer: DERWriter) {
210        writer.write_utctime(self)
211    }
212}
213
214#[cfg(feature = "time")]
215impl DEREncodable for GeneralizedTime{
216    fn encode_der(&self, writer: DERWriter) {
217        writer.write_generalized_time(self)
218    }
219}
220
221impl DEREncodable for () {
222    fn encode_der(&self, writer: DERWriter) {
223        writer.write_null()
224    }
225}
226
227impl<T0> DEREncodable for (T0,) where T0: DEREncodable {
228    fn encode_der(&self, writer: DERWriter) {
229        writer.write_sequence(|writer| {
230            self.0.encode_der(writer.next());
231        })
232    }
233}
234
235impl<T0, T1> DEREncodable for (T0, T1)
236        where T0: DEREncodable, T1: DEREncodable {
237    fn encode_der(&self, writer: DERWriter) {
238        writer.write_sequence(|writer| {
239            self.0.encode_der(writer.next());
240            self.1.encode_der(writer.next());
241        })
242    }
243}
244
245impl<T0, T1, T2> DEREncodable for (T0, T1, T2)
246        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable {
247    fn encode_der(&self, writer: DERWriter) {
248        writer.write_sequence(|writer| {
249            self.0.encode_der(writer.next());
250            self.1.encode_der(writer.next());
251            self.2.encode_der(writer.next());
252        })
253    }
254}
255
256impl<T0, T1, T2, T3> DEREncodable for (T0, T1, T2, T3)
257        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
258            T3: DEREncodable {
259    fn encode_der(&self, writer: DERWriter) {
260        writer.write_sequence(|writer| {
261            self.0.encode_der(writer.next());
262            self.1.encode_der(writer.next());
263            self.2.encode_der(writer.next());
264            self.3.encode_der(writer.next());
265        })
266    }
267}
268
269impl<T0, T1, T2, T3, T4> DEREncodable for (T0, T1, T2, T3, T4)
270        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
271            T3: DEREncodable, T4: DEREncodable {
272    fn encode_der(&self, writer: DERWriter) {
273        writer.write_sequence(|writer| {
274            self.0.encode_der(writer.next());
275            self.1.encode_der(writer.next());
276            self.2.encode_der(writer.next());
277            self.3.encode_der(writer.next());
278            self.4.encode_der(writer.next());
279        })
280    }
281}
282
283impl<T0, T1, T2, T3, T4, T5> DEREncodable for (T0, T1, T2, T3, T4, T5)
284        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
285            T3: DEREncodable, T4: DEREncodable, T5: DEREncodable {
286    fn encode_der(&self, writer: DERWriter) {
287        writer.write_sequence(|writer| {
288            self.0.encode_der(writer.next());
289            self.1.encode_der(writer.next());
290            self.2.encode_der(writer.next());
291            self.3.encode_der(writer.next());
292            self.4.encode_der(writer.next());
293            self.5.encode_der(writer.next());
294        })
295    }
296}
297
298impl<T0, T1, T2, T3, T4, T5, T6> DEREncodable for (T0, T1, T2, T3, T4, T5, T6)
299        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
300            T3: DEREncodable, T4: DEREncodable, T5: DEREncodable,
301            T6: DEREncodable {
302    fn encode_der(&self, writer: DERWriter) {
303        writer.write_sequence(|writer| {
304            self.0.encode_der(writer.next());
305            self.1.encode_der(writer.next());
306            self.2.encode_der(writer.next());
307            self.3.encode_der(writer.next());
308            self.4.encode_der(writer.next());
309            self.5.encode_der(writer.next());
310            self.6.encode_der(writer.next());
311        })
312    }
313}
314
315impl<T0, T1, T2, T3, T4, T5, T6, T7> DEREncodable
316        for (T0, T1, T2, T3, T4, T5, T6, T7)
317        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
318            T3: DEREncodable, T4: DEREncodable, T5: DEREncodable,
319            T6: DEREncodable, T7: DEREncodable {
320    fn encode_der(&self, writer: DERWriter) {
321        writer.write_sequence(|writer| {
322            self.0.encode_der(writer.next());
323            self.1.encode_der(writer.next());
324            self.2.encode_der(writer.next());
325            self.3.encode_der(writer.next());
326            self.4.encode_der(writer.next());
327            self.5.encode_der(writer.next());
328            self.6.encode_der(writer.next());
329            self.7.encode_der(writer.next());
330        })
331    }
332}
333
334impl<T0, T1, T2, T3, T4, T5, T6, T7, T8> DEREncodable
335        for (T0, T1, T2, T3, T4, T5, T6, T7, T8)
336        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
337            T3: DEREncodable, T4: DEREncodable, T5: DEREncodable,
338            T6: DEREncodable, T7: DEREncodable, T8: DEREncodable {
339    fn encode_der(&self, writer: DERWriter) {
340        writer.write_sequence(|writer| {
341            self.0.encode_der(writer.next());
342            self.1.encode_der(writer.next());
343            self.2.encode_der(writer.next());
344            self.3.encode_der(writer.next());
345            self.4.encode_der(writer.next());
346            self.5.encode_der(writer.next());
347            self.6.encode_der(writer.next());
348            self.7.encode_der(writer.next());
349            self.8.encode_der(writer.next());
350        })
351    }
352}
353
354impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> DEREncodable
355        for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)
356        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
357            T3: DEREncodable, T4: DEREncodable, T5: DEREncodable,
358            T6: DEREncodable, T7: DEREncodable, T8: DEREncodable,
359            T9: DEREncodable {
360    fn encode_der(&self, writer: DERWriter) {
361        writer.write_sequence(|writer| {
362            self.0.encode_der(writer.next());
363            self.1.encode_der(writer.next());
364            self.2.encode_der(writer.next());
365            self.3.encode_der(writer.next());
366            self.4.encode_der(writer.next());
367            self.5.encode_der(writer.next());
368            self.6.encode_der(writer.next());
369            self.7.encode_der(writer.next());
370            self.8.encode_der(writer.next());
371            self.9.encode_der(writer.next());
372        })
373    }
374}
375
376impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> DEREncodable
377        for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
378        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
379            T3: DEREncodable, T4: DEREncodable, T5: DEREncodable,
380            T6: DEREncodable, T7: DEREncodable, T8: DEREncodable,
381            T9: DEREncodable, T10: DEREncodable {
382    fn encode_der(&self, writer: DERWriter) {
383        writer.write_sequence(|writer| {
384            self.0.encode_der(writer.next());
385            self.1.encode_der(writer.next());
386            self.2.encode_der(writer.next());
387            self.3.encode_der(writer.next());
388            self.4.encode_der(writer.next());
389            self.5.encode_der(writer.next());
390            self.6.encode_der(writer.next());
391            self.7.encode_der(writer.next());
392            self.8.encode_der(writer.next());
393            self.9.encode_der(writer.next());
394            self.10.encode_der(writer.next());
395        })
396    }
397}
398
399impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> DEREncodable
400        for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)
401        where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
402            T3: DEREncodable, T4: DEREncodable, T5: DEREncodable,
403            T6: DEREncodable, T7: DEREncodable, T8: DEREncodable,
404            T9: DEREncodable, T10: DEREncodable, T11: DEREncodable {
405    fn encode_der(&self, writer: DERWriter) {
406        writer.write_sequence(|writer| {
407            self.0.encode_der(writer.next());
408            self.1.encode_der(writer.next());
409            self.2.encode_der(writer.next());
410            self.3.encode_der(writer.next());
411            self.4.encode_der(writer.next());
412            self.5.encode_der(writer.next());
413            self.6.encode_der(writer.next());
414            self.7.encode_der(writer.next());
415            self.8.encode_der(writer.next());
416            self.9.encode_der(writer.next());
417            self.10.encode_der(writer.next());
418            self.11.encode_der(writer.next());
419        })
420    }
421}