scclib
Stable Cloud Computing C++ Library
der.h
Go to the documentation of this file.
1 /*
2 BSD 3-Clause License
3 
4 Copyright (c) 2022, Stable Cloud Computing, Inc.
5 
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8 
9 1. Redistributions of source code must retain the above copyright notice, this
10  list of conditions and the following disclaimer.
11 
12 2. Redistributions in binary form must reproduce the above copyright notice,
13  this list of conditions and the following disclaimer in the documentation
14  and/or other materials provided with the distribution.
15 
16 3. Neither the name of the copyright holder nor the names of its
17  contributors may be used to endorse or promote products derived from
18  this software without specific prior written permission.
19 
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31 #ifndef _SCC_CRYPTO_DER_H
32 #define _SCC_CRYPTO_DER_H
33 
34 #include <string>
35 #include <iostream>
36 #include <vector>
37 #include <chrono>
38 #include <ctime>
39 #include <cstring>
40 #include <memory>
41 #include <crypto/bignum.h>
42 #include <crypto/secvec.h>
43 
44 namespace scc::crypto {
45 
81 class BitString
82 {
83  friend class DerBitString;
84  std::vector<uint8_t> m_data; // bit string bits 0-width at the beginning. The rest will be padded with zeroes.
85  uint32_t m_width; // bit width will always be <= m_data width
86 public:
87  BitString() : m_width(0) {}
88  virtual ~BitString() {}
89 
91  uint32_t width() const { return m_width; }
92 
94  uint32_t pad_bits() const
95  {
96  return m_width%8 == 0 ? 0 : 8 - m_width%8;
97  }
98 
100  void width(uint32_t v)
101  {
102  m_width = v;
103  m_data.resize(((v+7)&~7)/8, '\x00');
104  for (uint32_t i = 0; i < pad_bits(); i++)
105  {
106  m_data.at(m_data.size()-1) &= ~(1 << i); // set the bits in the last byte to 0
107  }
108  }
109 
114  void set(const std::vector<uint8_t>& v, size_t w)
115  {
116  m_data = v;
117  width(w);
118  }
119  void set(const std::vector<char>& v, size_t w)
120  {
121  m_data.clear();
122  m_data.insert(m_data.begin(), v.begin(), v.end());
123  width(w);
124  }
125 
127  bool is_bit_set(uint32_t bit) const
128  {
129  if (bit >= m_width) return false;
130 
131  uint8_t mask = 1 << (7-bit%8); // msb is bit 0
132 
133  return (m_data.at(bit/8) & mask) == mask ? true : false;
134  }
135 
137  void set_bit(uint32_t bit, bool set=true)
138  {
139  if (bit >= m_width) return;
140 
141  uint8_t mask = 1 << (7-bit%8);
142 
143  if (set) m_data.at(bit/8) |= mask;
144  else m_data.at(bit/8) &= ~mask;
145  }
146 
148  void clear_bit(uint32_t bit)
149  {
150  set_bit(bit, false);
151  }
152 
154  void get(std::vector<uint8_t>& v) const
155  {
156  v = m_data; // the last bits are always set to 0
157  }
158  void get(std::vector<char>& v) const
159  {
160  v.clear();
161  v.insert(v.begin(), m_data.begin(), m_data.end());
162  }
163 };
164 
165 class DerBase;
166 using BasePtr = std::shared_ptr<DerBase>;
167 
168 using oid_value = std::vector<uint32_t>;
169 
174 class DerBase
175 {
176  friend class DerDocument;
177  friend class X509Cert;
178 
179  std::vector<uint8_t> m_dat;
180  size_t m_eloff;
181  size_t m_elsz;
182  size_t m_hdrsz;
183 protected:
184  uint8_t m_tag;
185  uint32_t m_id;
186 public:
187  enum Tag
188  {
189  id_mask = 0x1f, // bits 1-5 are the tag id, if they are all 1s, this is a multi-byte id
190  construct_mask = 0x20, // bit 6 is the constructed mask (otherwise primitive)
191  class_mask = 0xc0, // bits 7-8 are the class, 00 means universal
192  class_application = 0x40, // 01
193  class_context = 0x80, // 10
194  class_private = 0xc0, // 11
195  length_multi_mask = 0x80, // bit 8 is on if this is a multi-byte length
196  length_bytes_mask = 0x7f, // bits 1-7 give length for multi-byte length
197  type_boolean = 1,
198  type_integer = 2,
199  type_bit_string = 3,
200  type_octet_string = 4,
201  type_null = 5,
202  type_object_identifier = 6,
203  type_utf8_string = 12, // 0x0c
204  type_sequence = 16, // 0x10
205  type_set = 17, // 0x11
206  type_printable_string = 19, // 0x13
207  type_teletex_string = 20, // 0x14
208  type_ia5_string = 22, // 0x16
209  type_utc_time = 23, // 0x17
210  type_generalized_time = 24, // 0x18
211  type_visible_string = 26, // 0x1a
212  type_universal_string = 28, // 0x1c
213  type_bmp_string = 30, // 0x1e
214  };
215 
220  DerBase(uint8_t tag = 0) : m_eloff(0), m_elsz(0), m_hdrsz(0), m_tag(tag), m_id(0) {}
221  virtual ~DerBase()
222  {
223  explicit_bzero(m_dat.data(), m_dat.size());
224  }
225 
227  static BasePtr create(int);
229  static BasePtr create(const std::vector<uint8_t>&, size_t);
230 
239  static BasePtr context_to_explicit(const BasePtr&);
240 
248  static BasePtr explicit_to_context(const BasePtr& BasePtr, uint32_t);
249 
261  static BasePtr context_to_implicit(const BasePtr&, uint32_t);
262 
271  static BasePtr implicit_to_context(const BasePtr& BasePtr, uint32_t);
272 
274  size_t eloff() const { return m_eloff; }
275  void eloff(size_t v) { m_eloff = v; }
277  size_t elsz() const { return m_elsz; }
278  void elsz(size_t v) { m_elsz = v; }
280  size_t hdrsz() const { return m_hdrsz; }
281  void hdrsz(size_t v) { m_hdrsz = v; }
282 
284  size_t pre_len() const;
286  virtual size_t len() const { return m_dat.size(); }
287 
289  virtual void parse(const std::vector<uint8_t>& v) { m_dat = v; }
290 
292  virtual void dump_pre(std::vector<char>&) const;
294  virtual void dump_data(std::vector<char>&) const;
295 
297  virtual std::string str(uint32_t=100) const;
299  virtual std::string data_str() const;
300 
301  virtual std::string name() const { return "DerBase"; }
302 
304  std::vector<uint8_t>& data() { return m_dat; }
305 
307  void get_base(std::vector<uint8_t>& v) const
308  {
309  v = m_dat;
310  }
312  void set_base(const std::vector<uint8_t>& v)
313  {
314  m_dat = v;
315  }
316  void set_base(const std::vector<char>& v)
317  {
318  m_dat.assign(v.begin(), v.end());
319  }
320 
325  uint32_t id() const
326  {
327  return (m_tag & id_mask) == id_mask ? m_id : m_tag & id_mask;
328  }
329  void id(uint32_t v)
330  {
331  if (v < id_mask)
332  {
333  m_tag = (m_tag & ~id_mask) | v; // set the low bits to v
334  m_id = 0;
335  }
336  else
337  {
338  m_tag |= id_mask; // set the low bits to 1
339  m_id = v;
340  }
341  }
342 
344  std::string id_str() const;
345 
347  uint8_t type_class() const { return m_tag & class_mask; }
349  void type_class(uint8_t f) { m_tag = (m_tag & ~class_mask) | (f & class_mask); }
350 
352  bool uni_class() const { return (m_tag & class_mask) == 0; }
354  bool app_class() const { return (m_tag & class_mask) == class_application; }
356  bool context_class() const { return (m_tag & class_mask) == class_context; }
358  bool priv_class() const { return (m_tag & class_mask) == class_private; }
359 
361  std::string class_str() const;
362 
364  bool constructed() const { return m_tag & construct_mask ? true : false; }
366  void constructed(bool cons) { m_tag = cons ? m_tag | construct_mask : m_tag & ~construct_mask; }
367 
369  std::string construct_str() const;
370 
372  bool is_seq() const;
374  bool is_set() const;
376  bool is_contain() const
377  {
378  return is_seq() || is_set();
379  }
380 
382  std::vector<BasePtr>& contain();
383 
385  bool is_integer() const;
388 
390  bool is_bit_string() const;
393 
395  bool is_octet_string() const;
397  bool is_printable_string() const;
399  bool is_utf8_string() const;
401  bool is_ia5_string() const;
403  bool is_bmp_string() const;
405  bool is_universal_string() const;
407  bool is_teletex_string() const;
409  bool is_visible_string() const;
411  bool is_string() const
412  {
415  }
416 
418  std::string string();
420  void string(const std::string&);
421 
423  void string_get(std::vector<char>&);
424  void string_get(std::vector<uint8_t>&);
425 
427  void string_set(const std::vector<char>&);
428  void string_set(const std::vector<uint8_t>&);
429 
431  bool is_null() const;
432 
434  bool is_boolean() const;
436  bool boolean();
438  void boolean(bool);
439 
441  bool is_utc_time() const;
443  bool is_generalized_time() const;
445  bool is_time() const
446  {
447  return is_utc_time() || is_generalized_time();
448  }
450  time_t time_epoch();
452  std::chrono::system_clock::time_point time_point()
453  {
454  return std::chrono::system_clock::from_time_t(time_epoch());
455  }
456 
458  bool is_object_id() const;
460  oid_value object_id();
462  void object_id(const oid_value&);
463 };
464 
467 class DerContainerBase : public DerBase, public std::vector<BasePtr>
468 {
469 public:
470  DerContainerBase(uint8_t tag) : DerBase(tag) {}
471  virtual ~DerContainerBase();
472  virtual std::string data_str() const;
473  virtual void parse(const std::vector<uint8_t>& v) { } // containers do not parse their data
474  virtual void dump_data(std::vector<char>& v) const { } // containers do not dump their data
475  virtual size_t len() const;
476  virtual std::string name() const = 0;
477 };
478 
487 {
488 public:
489  DerSequence(uint8_t tag = DerBase::construct_mask | DerBase::type_sequence) : DerContainerBase(tag) {}
490  virtual ~DerSequence() {}
491  virtual std::string name() const { return "DerSequence"; }
492 };
493 
501 class DerSet : public DerContainerBase
502 {
503 public:
504  DerSet(uint8_t tag = DerBase::construct_mask | DerBase::type_set) : DerContainerBase(tag) {}
505  virtual ~DerSet() {}
506  virtual std::string name() const { return "DerSet"; }
507 };
508 
509 class DerNull : public DerBase
510 {
511 public:
512  DerNull(uint8_t tag = DerBase::type_null) : DerBase(tag) {}
513  virtual ~DerNull() {}
514 
515  virtual void parse(const std::vector<uint8_t>&) {}
516 
517  virtual std::string data_str() const { return ""; }
518  virtual void dump_data(std::vector<char>& v) const { v.resize(0); }
519  virtual size_t len() const { return 0; }
520  virtual std::string name() const { return "DerNull"; }
521 };
522 
523 class DerBoolean : public DerBase
524 {
525  bool m_bool;
526 public:
527  DerBoolean(uint8_t tag = DerBase::type_boolean) : DerBase(tag) {}
528  virtual ~DerBoolean()
529  {
530  explicit_bzero(&m_bool, sizeof(bool));
531  }
532 
533  virtual void parse(const std::vector<uint8_t>&);
534 
535  virtual std::string data_str() const { return m_bool ? " true" : " false"; }
536  virtual void dump_data(std::vector<char>& v) const;
537  virtual size_t len() const { return 1; }
538  virtual std::string name() const { return "DerBoolean"; }
539 
540  bool get() const { return m_bool; }
541  void set(bool b) { m_bool = b; }
542 };
543 
555 {
556  oid_value m_v = {0,0};
557 
558 public:
559  DerObjectIdentifier(uint8_t tag = DerBase::type_object_identifier) : DerBase(tag) {}
560  virtual ~DerObjectIdentifier()
561  {
562  explicit_bzero(m_v.data(), m_v.size());
563  }
564 
565  virtual void parse(const std::vector<uint8_t>&);
566 
567  virtual std::string data_str() const;
568  virtual size_t len() const;
569  virtual void dump_data(std::vector<char>& v) const;
570  virtual std::string name() const { return "DerObjectIdentifier"; }
571 
572  oid_value& data()
573  {
574  return m_v;
575  }
576 
579  void set(const oid_value& v);
580 
581  void get(oid_value& v) const
582  {
583  v = m_v;
584  }
585 
586  std::string oid_str() const;
587 };
588 
595 class DerTimeBase : public DerBase
596 {
597 protected:
598  time_t m_t;
599 public:
600  DerTimeBase(uint8_t tag) : DerBase(tag), m_t(0) {}
601  virtual ~DerTimeBase()
602  {
603  explicit_bzero(&m_t, sizeof(time_t));
604  }
605 
607  time_t epoch() const { return m_t; }
609  void epoch(time_t v) { m_t = v; }
610 
612  void set_time(int year, int month, int day, int hour, int minute, int second);
614  void set_time(int year, int month, int day, int hour, int minute, int second, int tzmins);
615 
616  virtual std::string name() const = 0;
617  virtual std::string data_str() const;
618 };
619 
625 class DerUtcTime : public DerTimeBase
626 {
627 public:
628  DerUtcTime(uint8_t tag = DerBase::type_utc_time) : DerTimeBase(tag) {}
629  virtual ~DerUtcTime() {}
630 
631  virtual void parse(const std::vector<uint8_t>&);
632 
633  virtual void dump_data(std::vector<char>& v) const;
634  virtual size_t len() const;
635  virtual std::string name() const { return "DerUtcTime"; }
636 };
637 
645 {
646 public:
647  DerGeneralizedTime(uint8_t tag = DerBase::type_generalized_time) : DerTimeBase(tag) {}
648  virtual ~DerGeneralizedTime() {}
649 
650  virtual void parse(const std::vector<uint8_t>&);
651 
652  virtual void dump_data(std::vector<char>& v) const;
653  virtual size_t len() const;
654  virtual std::string name() const { return "DerGeneralizedTime"; }
655 };
656 
660 class DerStringBase : public DerBase
661 {
662  std::vector<uint8_t> m_val;
663 
664 public:
665  DerStringBase(uint8_t tag) : DerBase(tag) {}
666  virtual ~DerStringBase()
667  {
668  explicit_bzero(m_val.data(), m_val.size());
669  }
670 
671  virtual void parse(const std::vector<uint8_t>&);
672 
673  virtual std::string data_str() const;
674  virtual void dump_data(std::vector<char>& v) const;
675  virtual size_t len() const { return m_val.size(); }
676  virtual std::string name() const = 0;
677 
678  std::string string()
679  {
680  return std::string(m_val.begin(), m_val.end());
681  }
682 
683  void get(std::vector<uint8_t>& v)
684  {
685  v = m_val;
686  }
687 
688  void get(std::vector<char>& v)
689  {
690  v.clear();
691  v.insert(v.begin(), m_val.begin(), m_val.end());
692  }
693 
694  void get(std::string& v)
695  {
696  v.clear();
697  v.insert(v.begin(), m_val.begin(), m_val.end());
698  }
699 
700  void set(const std::vector<uint8_t>& v)
701  {
702  m_val = v;
703  }
704 
705  void set(const std::vector<char>& v)
706  {
707  m_val.clear();
708  m_val.insert(m_val.begin(), v.begin(), v.end());
709  }
710 
711  void set(const std::string& v)
712  {
713  m_val.clear();
714  m_val.insert(m_val.begin(), v.begin(), v.end());
715  }
716 };
717 
719 {
720 public:
721  DerTeletexString(uint8_t tag = DerBase::type_teletex_string) : DerStringBase(tag) {}
722  virtual ~DerTeletexString() {}
723  virtual std::string name() const { return "DerTeletexString"; }
724 };
725 
727 {
728 public:
729  DerVisibleString(uint8_t tag = DerBase::type_visible_string) : DerStringBase(tag) {}
730  virtual ~DerVisibleString() {}
731  virtual std::string name() const { return "DerVisibleString"; }
732 };
733 
735 {
736 public:
737  DerUniversalString(uint8_t tag = DerBase::type_universal_string) : DerStringBase(tag) {}
738  virtual ~DerUniversalString() {}
739  virtual std::string name() const { return "DerUniversalString"; }
740 };
741 
743 {
744 public:
745  DerOctetString(uint8_t tag = DerBase::type_octet_string) : DerStringBase(tag) {}
746  virtual ~DerOctetString() {}
747  virtual std::string name() const { return "DerOctetString"; }
748 };
749 
751 {
752 public:
753  DerUtf8String(uint8_t tag = DerBase::type_utf8_string) : DerStringBase(tag) {}
754  virtual ~DerUtf8String() {}
755  virtual std::string name() const { return "DerUtf8String"; }
756 };
757 
759 {
760 public:
761  DerPrintableString(uint8_t tag = DerBase::type_printable_string) : DerStringBase(tag) {}
762  virtual ~DerPrintableString() {}
763  virtual std::string name() const { return "DerPrintableString"; }
764 };
765 
767 {
768 public:
769  DerIa5String(uint8_t tag = DerBase::type_ia5_string) : DerStringBase(tag) {}
770  virtual ~DerIa5String() {}
771  virtual std::string name() const { return "DerIa5String"; }
772 };
773 
775 {
776 public:
777  DerBmpString(uint8_t tag = DerBase::type_bmp_string) : DerStringBase(tag) {}
778  virtual ~DerBmpString() {}
779  virtual std::string name() const { return "DerBmpString"; }
780 };
781 
782 class DerInteger : public DerBase
783 {
784  scc::crypto::Bignum m_bn;
785 public:
786  DerInteger(uint8_t tag = DerBase::type_integer) : DerBase(tag) {}
787  virtual ~DerInteger() {} // Bignum memory is cleared on delete
788 
789  virtual void parse(const std::vector<uint8_t>&);
790 
791  virtual std::string data_str() const;
792  virtual size_t len() const;
793  virtual void dump_data(std::vector<char>&) const;
794  virtual std::string name() const { return "DerInteger"; }
795 
798  scc::crypto::Bignum& data() { return m_bn; }
799 
800  void set(const scc::crypto::Bignum& bn) { m_bn = bn; }
801 };
802 
803 class DerBitString : public DerBase, public BitString
804 {
805 public:
806  DerBitString(uint8_t tag = DerBase::type_bit_string) : DerBase(tag) {}
807  virtual ~DerBitString() {}
808 
809  virtual void parse(const std::vector<uint8_t>&);
810 
811  virtual std::string data_str() const;
812  virtual size_t len() const;
813  virtual void dump_data(std::vector<char>& v) const;
814  virtual std::string name() const { return "DerBitString"; }
815 };
816 
824 {
825  friend class X509Cert;
826  BasePtr m_root;
827 protected:
828  friend class X509Cert;
829  SecVecUchar m_bin;
830  void parse_bin();
831  void dump_bin();
832 public:
833  DerDocument() {}
834  virtual ~DerDocument() {}
835 
836  DerDocument(const DerDocument&) = delete; // copy not allowed
837  DerDocument& operator=(const DerDocument&) = delete; // copy not allowed
839  {
840  m_root.reset(b.m_root.get());
841  b.m_root.reset();
842  }
843  DerDocument& operator=(DerDocument&& b)
844  {
845  m_root.reset(b.m_root.get());
846  b.m_root.reset();
847  return *this;
848  }
849 
851  bool equal(const DerDocument&) const;
852 
855  void dump_bin(std::vector<char>& v) const
856  {
857  v.clear();
858  v.insert(v.end(), m_bin.begin(), m_bin.end());
859  }
860 
870  static BasePtr parse_element(const std::vector<uint8_t>&, size_t = 0);
871 
872  static BasePtr parse_element(const std::vector<char>& v, size_t idx = 0)
873  {
874  std::vector<uint8_t> b(v.begin(), v.end());
875  return parse_element(b, idx);
876  }
877 
882  static void dump_element(const BasePtr&, std::vector<uint8_t>&);
883  static void dump_element(const BasePtr& b, std::vector<char>& v)
884  {
885  SecVecUchar d;
886  dump_element(b, d);
887  v.insert(v.end(), d.begin(), d.end());
888  }
889 
898  static std::string print_element(const BasePtr&, bool = false, const std::string& = " |");
899 
904  virtual void parse(const std::vector<char>&);
905 
908  virtual void parse(std::istream&);
909 
914  virtual void dump(std::vector<char>&);
915 
918  virtual void dump(std::ostream&);
919 
926  std::string str(bool = false) const;
927 
932  DerBase& root();
933 
936  BasePtr root_ptr() const { return m_root; }
937 
940  void clear()
941  {
942  m_root.reset();
943  }
944 };
945 
950 class PemDocument : public DerDocument
951 {
952  unsigned m_chars_per_line;
953  std::string m_label;
954 public:
955  PemDocument(unsigned chars_per_line = 64) : DerDocument(), m_chars_per_line(chars_per_line) {}
956  PemDocument(const std::string& label, unsigned chars_per_line = 64) : DerDocument(), m_chars_per_line(chars_per_line), m_label(label) {}
957  virtual ~PemDocument() {}
958 
959  unsigned chars_per_line() const { return m_chars_per_line; }
960  void chars_per_line(unsigned v) { m_chars_per_line = v; }
961  std::string label() const { return m_label; }
962  void label(std::string v) { m_label = v; }
963 
972  virtual void parse(std::istream&);
973 
976  virtual void parse(const std::vector<char>&);
977 
986  virtual void dump(std::vector<char>&);
987 
992  virtual void dump(std::ostream&);
993 };
994 
998 } // namespace
999 
1001 std::ostream& operator<<(std::ostream&, const scc::crypto::DerBase&);
1003 std::ostream& operator<<(std::ostream&, const scc::crypto::DerDocument&);
1005 std::ostream& operator<<(std::ostream&, const std::vector<uint32_t>&);
1006 
1007 #endif
Big number arithmetic.
Big number.
Definition: bignum.h:59
Bit string.
Definition: der.h:82
bool is_bit_set(uint32_t bit) const
Is the bit set? First bit is bit 0.
Definition: der.h:127
uint32_t pad_bits() const
Number of padding bits (0 bits at the end of the last byte).
Definition: der.h:94
void get(std::vector< uint8_t > &v) const
Resize and get the vector.
Definition: der.h:154
void clear_bit(uint32_t bit)
Clear a bit.
Definition: der.h:148
void width(uint32_t v)
Set width in bits.
Definition: der.h:100
uint32_t width() const
Bit width.
Definition: der.h:91
void set(const std::vector< uint8_t > &v, size_t w)
Set the bit string from a bit string input.
Definition: der.h:114
void set_bit(uint32_t bit, bool set=true)
Set a bit.
Definition: der.h:137
ASN.1 base.
Definition: der.h:175
scc::crypto::Bignum & integer()
Return reference to a scc::crypto::Bignum.
Definition: der.cc:232
bool app_class() const
Application class.
Definition: der.h:354
bool is_utf8_string() const
Is this a utf8 (ascii) string?
Definition: der.cc:261
BitString & bit_string()
Return reference to bit string.
Definition: der.cc:244
bool is_teletex_string() const
Is this a teletex (ascii) string?
Definition: der.cc:281
virtual void dump_pre(std::vector< char > &) const
Dump prefix data.
Definition: der.cc:143
void get_base(std::vector< uint8_t > &v) const
Get raw data.
Definition: der.h:307
void set_base(const std::vector< uint8_t > &v)
Set raw data.
Definition: der.h:312
time_t time_epoch()
Epoch time.
Definition: der.cc:367
virtual std::string data_str() const
Print vizualized data.
Definition: der.cc:529
static BasePtr explicit_to_context(const BasePtr &BasePtr, uint32_t)
Convert explicit to context.
Definition: der.cc:1057
static BasePtr implicit_to_context(const BasePtr &BasePtr, uint32_t)
Convert implicit to context.
Definition: der.cc:1090
bool is_bit_string() const
Is this a DerBitString?
Definition: der.cc:239
bool is_universal_string() const
Is this a univeral (ascii) string?
Definition: der.cc:276
bool context_class() const
Context class.
Definition: der.h:356
size_t elsz() const
Binary vector element length, not including the header.
Definition: der.h:277
bool is_visible_string() const
Is this a visible (ascii) string?
Definition: der.cc:286
virtual void parse(const std::vector< uint8_t > &v)
Parse raw data into the object.
Definition: der.h:289
DerBase(uint8_t tag=0)
Construct a base object.
Definition: der.h:220
oid_value object_id()
Return the object identifier value.
Definition: der.cc:379
bool priv_class() const
Private class.
Definition: der.h:358
std::chrono::system_clock::time_point time_point()
Time point.
Definition: der.h:452
static BasePtr context_to_explicit(const BasePtr &)
Change a context element to explicit.
Definition: der.cc:1048
bool is_boolean() const
Is this a boolean type?
Definition: der.cc:338
bool is_utc_time() const
Is this a utc time type?
Definition: der.cc:357
bool is_contain() const
Is this a container type?
Definition: der.h:376
bool boolean()
Return boolean value.
Definition: der.cc:343
bool is_octet_string() const
Is this an octet string (8 bit chars)?
Definition: der.cc:251
void constructed(bool cons)
Set constructed flag.
Definition: der.h:366
static BasePtr create(int)
Create a base pointer, using only the tag byte.
Definition: der.cc:59
size_t pre_len() const
The length of prefix bytes (tag/id, and length).
Definition: der.cc:109
bool is_seq() const
Is this a sequence type?
Definition: der.cc:210
bool is_string() const
Is this a generic ascii string?
Definition: der.h:411
bool is_time() const
Is this a time type?
Definition: der.h:445
bool uni_class() const
Universal class.
Definition: der.h:352
std::vector< uint8_t > & data()
Underlying data.
Definition: der.h:304
std::string string()
Return string.
Definition: der.cc:291
void string_set(const std::vector< char > &)
Set string vector.
Definition: der.cc:312
void type_class(uint8_t f)
Set type class.
Definition: der.h:349
std::vector< BasePtr > & contain()
Return container, or throw an error if this is not a container.
Definition: der.cc:220
bool constructed() const
Constructed flag (bit 6).
Definition: der.h:364
std::string class_str() const
String version of the classification.
Definition: der.cc:434
bool is_ia5_string() const
Is this an ia5 (ascii) string?
Definition: der.cc:266
virtual void dump_data(std::vector< char > &) const
Dump data.
Definition: der.cc:200
uint8_t type_class() const
Classification of the type (bits 7-8)
Definition: der.h:347
static BasePtr context_to_implicit(const BasePtr &, uint32_t)
Change a context element to implicit.
Definition: der.cc:1072
bool is_bmp_string() const
Is this a bmp (ascii) string?
Definition: der.cc:271
bool is_null() const
Is this a null type?
Definition: der.cc:333
bool is_printable_string() const
Is this a printable string?
Definition: der.cc:256
bool is_set() const
Is this a set type?
Definition: der.cc:215
void string_get(std::vector< char > &)
Get string vector.
Definition: der.cc:326
size_t hdrsz() const
Header size of the element (tag, id, and length bytes).
Definition: der.h:280
size_t eloff() const
Offset of the element into the binary vector.
Definition: der.h:274
bool is_integer() const
Is this a DerInteger?
Definition: der.cc:227
bool is_object_id() const
Is this an object identifier?
Definition: der.cc:374
std::string construct_str() const
String version of the construct flag.
Definition: der.cc:450
virtual std::string str(uint32_t=100) const
Print summary line to maximum width.
Definition: der.cc:459
std::string id_str() const
String version of the id.
Definition: der.cc:393
virtual size_t len() const
Length of the data.
Definition: der.h:286
bool is_generalized_time() const
Is this as generalized time type?
Definition: der.cc:362
uint32_t id() const
Tag id of the type.
Definition: der.h:325
virtual void parse(const std::vector< uint8_t > &)
Parse raw data into the object.
Definition: der.cc:977
virtual std::string data_str() const
Print vizualized data.
Definition: der.cc:1000
virtual size_t len() const
Length of the data.
Definition: der.cc:1033
virtual void dump_data(std::vector< char > &v) const
Dump data.
Definition: der.cc:1038
virtual std::string data_str() const
Print vizualized data.
Definition: der.h:535
virtual void dump_data(std::vector< char > &v) const
Dump data.
Definition: der.cc:941
virtual size_t len() const
Length of the data.
Definition: der.h:537
virtual void parse(const std::vector< uint8_t > &)
Parse raw data into the object.
Definition: der.cc:936
Container base class.
Definition: der.h:468
virtual size_t len() const
Length of the data.
Definition: der.cc:472
virtual void parse(const std::vector< uint8_t > &v)
Parse raw data into the object.
Definition: der.h:473
virtual void dump_data(std::vector< char > &v) const
Dump data.
Definition: der.h:474
virtual std::string data_str() const
Print vizualized data.
Definition: der.cc:483
DER document.
Definition: der.h:824
void clear()
Clear the document.
Definition: der.h:940
void dump_bin(std::vector< char > &v) const
Dump the binary vector.
Definition: der.h:855
bool equal(const DerDocument &) const
Compare binary data.
Definition: der.cc:1256
std::string str(bool=false) const
Debug string dump.
Definition: der.cc:1347
virtual void dump(std::vector< char > &)
Dump and append to a buffer.
Definition: der.cc:1276
static std::string print_element(const BasePtr &, bool=false, const std::string &=" |")
Print an element and any sub-elements to a string.
Definition: der.cc:1336
BasePtr root_ptr() const
Return the root pointer.
Definition: der.h:936
static void dump_element(const BasePtr &, std::vector< uint8_t > &)
Dump an element to a data vector.
Definition: der.cc:1231
virtual void parse(const std::vector< char > &)
Parse a buffer from a binary DER-formatted vector.
Definition: der.cc:1217
DerBase & root()
Root DerBase.
Definition: der.cc:1297
static BasePtr parse_element(const std::vector< uint8_t > &, size_t=0)
Parse an element from a data vector.
Definition: der.cc:1171
Generalized time.
Definition: der.h:645
virtual void dump_data(std::vector< char > &v) const
Dump data.
Definition: der.cc:867
virtual void parse(const std::vector< uint8_t > &)
Parse raw data into the object.
Definition: der.cc:810
virtual size_t len() const
Length of the data.
Definition: der.cc:893
virtual std::string data_str() const
Print vizualized data.
Definition: der.cc:951
virtual void dump_data(std::vector< char > &) const
Dump data.
Definition: der.cc:972
virtual size_t len() const
Length of the data.
Definition: der.cc:967
scc::crypto::Bignum & data()
Return the integer (an scc::crypto::Bignum)
Definition: der.h:798
virtual void parse(const std::vector< uint8_t > &)
Parse raw data into the object.
Definition: der.cc:946
virtual void parse(const std::vector< uint8_t > &)
Parse raw data into the object.
Definition: der.h:515
virtual void dump_data(std::vector< char > &v) const
Dump data.
Definition: der.h:518
virtual std::string data_str() const
Print vizualized data.
Definition: der.h:517
virtual size_t len() const
Length of the data.
Definition: der.h:519
Object identifier class.
Definition: der.h:555
virtual void dump_data(std::vector< char > &v) const
Dump data.
Definition: der.cc:623
virtual void parse(const std::vector< uint8_t > &)
Parse raw data into the object.
Definition: der.cc:563
void set(const oid_value &v)
Set oid values.
Definition: der.cc:649
virtual std::string data_str() const
Print vizualized data.
Definition: der.cc:593
virtual size_t len() const
Length of the data.
Definition: der.cc:607
An ASN.1 SEQUENCE or SEQUENCE OF type.
Definition: der.h:487
An ASN.1 SET or SET OF type.
Definition: der.h:502
All strings derive from simple string base class.
Definition: der.h:661
virtual void dump_data(std::vector< char > &v) const
Dump data.
Definition: der.cc:927
virtual void parse(const std::vector< uint8_t > &)
Parse raw data into the object.
Definition: der.cc:908
virtual size_t len() const
Length of the data.
Definition: der.h:675
virtual std::string data_str() const
Print vizualized data.
Definition: der.cc:918
Time base class.
Definition: der.h:596
void epoch(time_t v)
Set epoch time.
Definition: der.h:609
virtual std::string data_str() const
Print vizualized data.
Definition: der.cc:693
time_t epoch() const
Epoch time (seconds since Jan 1, 1970), in the local time zone.
Definition: der.h:607
void set_time(int year, int month, int day, int hour, int minute, int second)
Set time in the local time zone.
Definition: der.cc:677
virtual void parse(const std::vector< uint8_t > &)
Parse raw data into the object.
Definition: der.cc:739
virtual void dump_data(std::vector< char > &v) const
Dump data.
Definition: der.cc:759
virtual size_t len() const
Length of the data.
Definition: der.cc:781
PEM formatted DER document.
Definition: der.h:951
virtual void parse(std::istream &)
Parse document from an input stream.
Definition: der.cc:1369
virtual void dump(std::vector< char > &)
PEM-formatted dump to a buffer.
Definition: der.cc:1422
std::ostream & operator<<(std::ostream &, const scc::crypto::DerBase &)
Print out base and all sub-elements.
Definition: der.cc:54
Secure vector.
X.509 certificate.
Definition: cert.h:1305