1#![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
24pub trait DEREncodable {
56 fn encode_der<'a>(&self, writer: DERWriter<'a>);
85}
86
87pub 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}