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