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>(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}