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::{DERWriter,construct_der};
20 use super::models::ObjectIdentifier;
21 #[cfg(feature = "chrono")]
22 use 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.
55 pub 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     /// ```
encode_der<'a>(&self, writer: DERWriter<'a>)84     fn encode_der<'a>(&self, writer: DERWriter<'a>);
85 }
86 
87 /// Encodes a value to DER-encoded ASN.1 data.
encode_der<T:DEREncodable>(value: &T) -> Vec<u8>88 pub fn encode_der<T:DEREncodable>(value: &T) -> Vec<u8> {
89     construct_der(|writer| {
90         value.encode_der(writer)
91     })
92 }
93 
94 impl<T> DEREncodable for Vec<T> where T: DEREncodable {
encode_der(&self, writer: DERWriter)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 
104 impl<T> DEREncodable for [T] where T: DEREncodable {
encode_der(&self, writer: DERWriter)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 
114 impl DEREncodable for i64 {
encode_der(&self, writer: DERWriter)115     fn encode_der(&self, writer: DERWriter) {
116         writer.write_i64(*self)
117     }
118 }
119 
120 impl DEREncodable for u64 {
encode_der(&self, writer: DERWriter)121     fn encode_der(&self, writer: DERWriter) {
122         writer.write_u64(*self)
123     }
124 }
125 
126 impl DEREncodable for i32 {
encode_der(&self, writer: DERWriter)127     fn encode_der(&self, writer: DERWriter) {
128         writer.write_i32(*self)
129     }
130 }
131 
132 impl DEREncodable for u32 {
encode_der(&self, writer: DERWriter)133     fn encode_der(&self, writer: DERWriter) {
134         writer.write_u32(*self)
135     }
136 }
137 
138 impl DEREncodable for i16 {
encode_der(&self, writer: DERWriter)139     fn encode_der(&self, writer: DERWriter) {
140         writer.write_i16(*self)
141     }
142 }
143 
144 impl DEREncodable for u16 {
encode_der(&self, writer: DERWriter)145     fn encode_der(&self, writer: DERWriter) {
146         writer.write_u16(*self)
147     }
148 }
149 
150 #[cfg(feature = "num-bigint")]
151 impl DEREncodable for BigInt {
encode_der(&self, writer: DERWriter)152     fn encode_der(&self, writer: DERWriter) {
153         writer.write_bigint(self)
154     }
155 }
156 
157 #[cfg(feature = "num-bigint")]
158 impl DEREncodable for BigUint {
encode_der(&self, writer: DERWriter)159     fn encode_der(&self, writer: DERWriter) {
160         writer.write_biguint(self)
161     }
162 }
163 
164 impl DEREncodable for bool {
encode_der(&self, writer: DERWriter)165     fn encode_der(&self, writer: DERWriter) {
166         writer.write_bool(*self)
167     }
168 }
169 
170 #[cfg(feature = "bit-vec")]
171 impl DEREncodable for BitVec {
encode_der(&self, writer: DERWriter)172     fn encode_der(&self, writer: DERWriter) {
173         writer.write_bitvec(self)
174     }
175 }
176 
177 impl DEREncodable for Vec<u8> {
encode_der(&self, writer: DERWriter)178     fn encode_der(&self, writer: DERWriter) {
179         writer.write_bytes(self)
180     }
181 }
182 
183 impl DEREncodable for [u8] {
encode_der(&self, writer: DERWriter)184     fn encode_der(&self, writer: DERWriter) {
185         writer.write_bytes(self)
186     }
187 }
188 
189 impl DEREncodable for String {
encode_der(&self, writer: DERWriter)190     fn encode_der(&self, writer: DERWriter) {
191         writer.write_utf8string(self)
192     }
193 }
194 
195 impl DEREncodable for str {
encode_der(&self, writer: DERWriter)196     fn encode_der(&self, writer: DERWriter) {
197         writer.write_utf8string(self)
198     }
199 }
200 
201 impl DEREncodable for ObjectIdentifier {
encode_der(&self, writer: DERWriter)202     fn encode_der(&self, writer: DERWriter) {
203         writer.write_oid(self)
204     }
205 }
206 
207 #[cfg(feature = "chrono")]
208 impl DEREncodable for UTCTime {
encode_der(&self, writer: DERWriter)209     fn encode_der(&self, writer: DERWriter) {
210         writer.write_utctime(self)
211     }
212 }
213 
214 #[cfg(feature = "chrono")]
215 impl DEREncodable for GeneralizedTime{
encode_der(&self, writer: DERWriter)216     fn encode_der(&self, writer: DERWriter) {
217         writer.write_generalized_time(self)
218     }
219 }
220 
221 impl DEREncodable for () {
encode_der(&self, writer: DERWriter)222     fn encode_der(&self, writer: DERWriter) {
223         writer.write_null()
224     }
225 }
226 
227 impl<T0> DEREncodable for (T0,) where T0: DEREncodable {
encode_der(&self, writer: DERWriter)228     fn encode_der(&self, writer: DERWriter) {
229         writer.write_sequence(|writer| {
230             self.0.encode_der(writer.next());
231         })
232     }
233 }
234 
235 impl<T0, T1> DEREncodable for (T0, T1)
236         where T0: DEREncodable, T1: DEREncodable {
encode_der(&self, writer: DERWriter)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 
245 impl<T0, T1, T2> DEREncodable for (T0, T1, T2)
246         where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable {
encode_der(&self, writer: DERWriter)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 
256 impl<T0, T1, T2, T3> DEREncodable for (T0, T1, T2, T3)
257         where T0: DEREncodable, T1: DEREncodable, T2: DEREncodable,
258             T3: DEREncodable {
encode_der(&self, writer: DERWriter)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 
269 impl<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 {
encode_der(&self, writer: DERWriter)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 
283 impl<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 {
encode_der(&self, writer: DERWriter)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 
298 impl<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 {
encode_der(&self, writer: DERWriter)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 
315 impl<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 {
encode_der(&self, writer: DERWriter)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 
334 impl<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 {
encode_der(&self, writer: DERWriter)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 
354 impl<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 {
encode_der(&self, writer: DERWriter)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 
376 impl<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 {
encode_der(&self, writer: DERWriter)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 
399 impl<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 {
encode_der(&self, writer: DERWriter)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 }
422