_ZN5Botan10BER_ObjectC2Ev:
  122|   193k|      BER_Object() : m_type_tag(ASN1_Type::NoObject), m_class_tag(ASN1_Class::Universal) {}
_ZNK5Botan10BER_Object6is_setEv:
  132|   293k|      bool is_set() const { return m_type_tag != ASN1_Type::NoObject; }
_ZNK5Botan10BER_Object7taggingEv:
  134|   101k|      uint32_t tagging() const { return type_tag() | class_tag(); }
_ZNK5Botan10BER_Object8type_tagEv:
  136|   101k|      ASN1_Type type_tag() const { return m_type_tag; }
_ZNK5Botan10BER_Object9class_tagEv:
  138|   101k|      ASN1_Class class_tag() const { return m_class_tag; }
_ZNK5Botan10BER_Object4typeEv:
  140|  78.1k|      ASN1_Type type() const { return m_type_tag; }
_ZNK5Botan10BER_Object9get_classEv:
  142|  65.2k|      ASN1_Class get_class() const { return m_class_tag; }
_ZNK5Botan10BER_Object4bitsEv:
  144|   117k|      const uint8_t* bits() const { return m_value.data(); }
_ZNK5Botan10BER_Object6lengthEv:
  146|   247k|      size_t length() const { return m_value.size(); }
_ZN5Botan10BER_Object12mutable_bitsEm:
  163|  97.7k|      uint8_t* mutable_bits(size_t length) {
  164|  97.7k|         m_value.resize(length);
  165|  97.7k|         return m_value.data();
  166|  97.7k|      }
_ZN5Botan3OIDC2Ev:
  212|  3.94k|      explicit OID() {}
_ZN5Botan3OIDC2ESt16initializer_listIjE:
  223|    251|      explicit OID(std::initializer_list<uint32_t> init) : m_id(init) {
  224|    251|         BOTAN_ARG_CHECK(m_id.size() > 2 && m_id[0] <= 2 && (m_id[0] != 2 || m_id[1] <= 39), "Invalid OID");
  ------------------
  |  |   30|    251|   do {                                                          \
  |  |   31|  1.32k|      if(!(expr))                                                \
  |  |  ------------------
  |  |  |  Branch (31:12): [True: 251, False: 0]
  |  |  |  Branch (31:12): [True: 251, False: 0]
  |  |  |  Branch (31:12): [True: 178, False: 73]
  |  |  |  Branch (31:12): [True: 73, False: 0]
  |  |  ------------------
  |  |   32|    251|         Botan::throw_invalid_argument(msg, __func__, __FILE__); \
  |  |   33|    251|   } while(0)
  |  |  ------------------
  |  |  |  Branch (33:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  225|    251|      }
_ZNK5Botan3OID14get_componentsEv:
  271|  6.65k|      const std::vector<uint32_t>& get_components() const { return m_id; }
_ZNK5Botan11ASN1_String5valueEv:
  407|  2.78k|      const std::string& value() const { return m_utf8_str; }
_ZN5Botan10intersectsENS_10ASN1_ClassES0_:
   70|   182k|inline bool intersects(ASN1_Class x, ASN1_Class y) { return static_cast<uint32_t>(x) & static_cast<uint32_t>(y); }
_ZN5BotanorENS_9ASN1_TypeENS_10ASN1_ClassE:
   80|   101k|inline uint32_t operator|(ASN1_Type x, ASN1_Class y) { return static_cast<uint32_t>(x) | static_cast<uint32_t>(y); }
_ZN5BotanorENS_10ASN1_ClassENS_9ASN1_TypeE:
   82|  3.94k|inline uint32_t operator|(ASN1_Class x, ASN1_Type y) { return static_cast<uint32_t>(x) | static_cast<uint32_t>(y); }
_ZN5Botan11ASN1_ObjectC2Ev:
  111|  13.0k|      ASN1_Object() = default;
_ZN5Botan11ASN1_ObjectD2Ev:
  114|  8.73k|      virtual ~ASN1_Object() = default;
_ZN5Botan9ASN1_TimeC2Ev:
  354|  4.81k|      ASN1_Time() = default;
_ZN5Botan10BER_ObjectaSEOS0_:
  130|  57.0k|      BER_Object& operator=(BER_Object&& other) = default;
_ZN5Botan11ASN1_ObjectC2ERKS0_:
  112|    502|      ASN1_Object(const ASN1_Object&) = default;

_ZN5Botan14ASN1_FormatterC2Ebm:
   33|  2.68k|            m_print_context_specific(print_context_specific), m_max_depth(max_depth) {}

_ZN5Botan13ignore_paramsIJRhEEEvDpOT_:
  114|  4.03k|void ignore_params(T&&... args) {
  115|  4.03k|   (ignore_param(args), ...);
  116|  4.03k|}
_ZN5Botan12ignore_paramIRhEEvOT_:
  111|  4.03k|void ignore_param(T&&) {}
_ZN5Botan13ignore_paramsIJRmEEEvDpOT_:
  114|    673|void ignore_params(T&&... args) {
  115|    673|   (ignore_param(args), ...);
  116|    673|}
_ZN5Botan12ignore_paramIRmEEvOT_:
  111|    673|void ignore_param(T&&) {}

_ZN5Botan11BER_Decoder6decodeERNS_6BigIntE:
  183|  1.42k|      BER_Decoder& decode(BigInt& out) { return decode(out, ASN1_Type::Integer, ASN1_Class::Universal); }
_ZN5Botan11BER_Decoder6decodeERb:
  173|    644|      BER_Decoder& decode(bool& out) { return decode(out, ASN1_Type::Boolean, ASN1_Class::Universal); }
_ZN5Botan11BER_Decoder6decodeINSt3__19allocatorIhEEEERS0_RNS2_6vectorIhT_EENS_9ASN1_TypeE:
  195|  16.0k|      BER_Decoder& decode(std::vector<uint8_t, Alloc>& out, ASN1_Type real_type) {
  196|  16.0k|         return decode(out, real_type, real_type, ASN1_Class::Universal);
  197|  16.0k|      }

_ZN5Botan6BigIntC2Ev:
   39|  1.66k|      BigInt() = default;
_ZN5Botan6BigIntD2Ev:
  147|  2.89k|      ~BigInt() { const_time_unpoison(); }
_ZNK5Botan6BigInt19const_time_unpoisonEv:
  710|  2.89k|      void const_time_unpoison() const {}
_ZN5Botan6BigIntaSEOS0_:
  152|  1.22k|      BigInt& operator=(BigInt&& other) {
  153|  1.22k|         if(this != &other)
  ------------------
  |  Branch (153:13): [True: 1.22k, False: 0]
  ------------------
  154|  1.22k|            this->swap(other);
  155|       |
  156|  1.22k|         return (*this);
  157|  1.22k|      }
_ZN5Botan6BigInt4swapERS0_:
  168|  1.22k|      void swap(BigInt& other) {
  169|  1.22k|         m_data.swap(other.m_data);
  170|  1.22k|         std::swap(m_signedness, other.m_signedness);
  171|  1.22k|      }
_ZN5Botan6BigInt5clearEv:
  366|  1.66k|      void clear() {
  367|  1.66k|         m_data.set_to_zero();
  368|  1.66k|         m_signedness = Positive;
  369|  1.66k|      }
_ZNK5Botan6BigInt7is_zeroEv:
  424|    673|      bool is_zero() const { return (sig_words() == 0); }
_ZNK5Botan6BigInt4signEv:
  536|    673|      Sign sign() const { return (m_signedness); }
_ZNK5Botan6BigInt12reverse_signEv:
  541|    673|      Sign reverse_sign() const {
  542|    673|         if(sign() == Positive)
  ------------------
  |  Branch (542:13): [True: 673, False: 0]
  ------------------
  543|    673|            return Negative;
  544|      0|         return Positive;
  545|    673|      }
_ZN5Botan6BigInt9flip_signEv:
  550|    673|      void flip_sign() { set_sign(reverse_sign()); }
_ZN5Botan6BigInt8set_signENS0_4SignE:
  556|    673|      void set_sign(Sign sign) {
  557|    673|         if(sign == Negative && is_zero())
  ------------------
  |  Branch (557:13): [True: 673, False: 0]
  |  Branch (557:33): [True: 0, False: 673]
  ------------------
  558|      0|            sign = Positive;
  559|       |
  560|    673|         m_signedness = sign;
  561|    673|      }
_ZNK5Botan6BigInt9sig_wordsEv:
  578|    673|      size_t sig_words() const { return m_data.sig_words(); }
_ZN5Botan6BigInt4Data11set_to_zeroEv:
  851|  1.66k|            void set_to_zero() {
  852|  1.66k|               m_reg.resize(m_reg.capacity());
  853|  1.66k|               clear_mem(m_reg.data(), m_reg.size());
  854|  1.66k|               m_sig_words = 0;
  855|  1.66k|            }
_ZN5Botan6BigInt4Data4swapERS1_:
  900|  1.22k|            void swap(Data& other) {
  901|  1.22k|               m_reg.swap(other.m_reg);
  902|  1.22k|               std::swap(m_sig_words, other.m_sig_words);
  903|  1.22k|            }
_ZN5Botan6BigInt4Data4swapERNSt3__16vectorImNS_16secure_allocatorImEEEE:
  905|  1.22k|            void swap(secure_vector<word>& reg) {
  906|  1.22k|               m_reg.swap(reg);
  907|  1.22k|               invalidate_sig_words();
  908|  1.22k|            }
_ZNK5Botan6BigInt4Data20invalidate_sig_wordsEv:
  910|  1.22k|            void invalidate_sig_words() const { m_sig_words = sig_words_npos; }
_ZNK5Botan6BigInt4Data9sig_wordsEv:
  912|    673|            size_t sig_words() const {
  913|    673|               if(m_sig_words == sig_words_npos) {
  ------------------
  |  Branch (913:19): [True: 673, False: 0]
  ------------------
  914|    673|                  m_sig_words = calc_sig_words();
  915|    673|               } else {
  916|      0|                  BOTAN_DEBUG_ASSERT(m_sig_words == calc_sig_words());
  ------------------
  |  |   99|      0|      do {                          \
  |  |  100|      0|      } while(0)
  |  |  ------------------
  |  |  |  Branch (100:15): [Folded - Ignored]
  |  |  ------------------
  ------------------
  917|      0|               }
  918|    673|               return m_sig_words;
  919|    673|            }

_ZN5Botan17DataSource_MemoryC2EPKhm:
  118|  85.9k|      DataSource_Memory(const uint8_t in[], size_t length) : m_source(in, in + length), m_offset(0) {}
_ZN5Botan17DataSource_MemoryC2ENSt3__16vectorIhNS_16secure_allocatorIhEEEE:
  124|  60.2k|      explicit DataSource_Memory(secure_vector<uint8_t> in) : m_source(std::move(in)), m_offset(0) {}
_ZN5Botan10DataSourceC2Ev:
   91|   146k|      DataSource() = default;
_ZN5Botan10DataSourceD2Ev:
   92|   146k|      virtual ~DataSource() = default;

_ZN5Botan8high_bitIjEEmT_:
   60|  1.50k|{
   61|  1.50k|   size_t hb = 0;
   62|       |
   63|  9.04k|   for(size_t s = 8 * sizeof(T) / 2; s > 0; s /= 2) {
  ------------------
  |  Branch (63:38): [True: 7.53k, False: 1.50k]
  ------------------
   64|  7.53k|      const size_t z = s * ((~ct_is_zero(n >> s)) & 1);
   65|  7.53k|      hb += z;
   66|  7.53k|      n >>= z;
   67|  7.53k|   }
   68|       |
   69|  1.50k|   hb += n;
   70|       |
   71|  1.50k|   return hb;
   72|  1.50k|}
_ZN5Botan10ct_is_zeroIjEET_S1_:
   35|  7.53k|{
   36|  7.53k|   return expand_top_bit<T>(~x & (x - 1));
   37|  7.53k|}
_ZN5Botan14expand_top_bitIjEET_S1_:
   25|  7.53k|{
   26|  7.53k|   return static_cast<T>(0) - (a >> (sizeof(T) * 8 - 1));
   27|  7.53k|}
_ZN5Botan17significant_bytesImEEmT_:
   82|  2.34k|{
   83|  2.34k|   size_t b = 0;
   84|       |
   85|  9.37k|   for(size_t s = 8 * sizeof(n) / 2; s >= 8; s /= 2) {
  ------------------
  |  Branch (85:38): [True: 7.03k, False: 2.34k]
  ------------------
   86|  7.03k|      const size_t z = s * (~ct_is_zero(n >> s) & 1);
   87|  7.03k|      b += z / 8;
   88|  7.03k|      n >>= z;
   89|  7.03k|   }
   90|       |
   91|  2.34k|   b += (n != 0);
   92|       |
   93|  2.34k|   return b;
   94|  2.34k|}
_ZN5Botan10ct_is_zeroImEET_S1_:
   35|  21.2k|{
   36|  21.2k|   return expand_top_bit<T>(~x & (x - 1));
   37|  21.2k|}
_ZN5Botan14expand_top_bitImEET_S1_:
   25|  21.2k|{
   26|  21.2k|   return static_cast<T>(0) - (a >> (sizeof(T) * 8 - 1));
   27|  21.2k|}

_ZN5Botan13reverse_bytesEt:
   19|  7.87k|inline constexpr uint16_t reverse_bytes(uint16_t x) {
   20|  7.87k|#if BOTAN_COMPILER_HAS_BUILTIN(__builtin_bswap16)
   21|  7.87k|   return __builtin_bswap16(x);
   22|       |#else
   23|       |   return static_cast<uint16_t>((x << 8) | (x >> 8));
   24|       |#endif
   25|  7.87k|}
_ZN5Botan13reverse_bytesEj:
   33|  2.31k|inline constexpr uint32_t reverse_bytes(uint32_t x) {
   34|  2.31k|#if BOTAN_COMPILER_HAS_BUILTIN(__builtin_bswap32)
   35|  2.31k|   return __builtin_bswap32(x);
   36|       |#else
   37|       |   // MSVC at least recognizes this as a bswap
   38|       |   return ((x & 0x000000FF) << 24) | ((x & 0x0000FF00) << 8) | ((x & 0x00FF0000) >> 8) | ((x & 0xFF000000) >> 24);
   39|       |#endif
   40|  2.31k|}
_ZN5Botan13reverse_bytesEm:
   48|  11.1k|inline constexpr uint64_t reverse_bytes(uint64_t x) {
   49|  11.1k|#if BOTAN_COMPILER_HAS_BUILTIN(__builtin_bswap64)
   50|  11.1k|   return __builtin_bswap64(x);
   51|       |#else
   52|       |   uint32_t hi = static_cast<uint32_t>(x >> 32);
   53|       |   uint32_t lo = static_cast<uint32_t>(x);
   54|       |
   55|       |   hi = reverse_bytes(hi);
   56|       |   lo = reverse_bytes(lo);
   57|       |
   58|       |   return (static_cast<uint64_t>(lo) << 32) | hi;
   59|       |#endif
   60|  11.1k|}

_ZN5Botan2CT4MaskIhE3setEv:
   99|  4.03k|      static Mask<T> set() { return Mask<T>(static_cast<T>(~0)); }
_ZN5Botan2CT4MaskIhEC2Eh:
  279|  4.03k|      Mask(T m) : m_mask(m) {}
_ZNK5Botan2CT4MaskIhE5valueEv:
  276|  4.03k|      T value() const { return m_mask; }
_ZNK5Botan2CT4MaskIhE6is_setEv:
  271|  4.03k|      bool is_set() const { return unpoisoned_value() != 0; }
_ZNK5Botan2CT4MaskIhE16unpoisoned_valueEv:
  262|  4.03k|      T unpoisoned_value() const {
  263|  4.03k|         T r = value();
  264|  4.03k|         CT::unpoison(r);
  265|  4.03k|         return r;
  266|  4.03k|      }
_ZN5Botan2CT8unpoisonIhEEvRT_:
   66|  4.03k|inline void unpoison(T& p) {
   67|       |#if defined(BOTAN_HAS_VALGRIND)
   68|       |   VALGRIND_MAKE_MEM_DEFINED(&p, sizeof(T));
   69|       |#else
   70|  4.03k|   BOTAN_UNUSED(p);
  ------------------
  |  |  118|  4.03k|#define BOTAN_UNUSED Botan::ignore_params
  ------------------
   71|  4.03k|#endif
   72|  4.03k|}
_ZN5Botan2CT8unpoisonImEEvRT_:
   66|    673|inline void unpoison(T& p) {
   67|       |#if defined(BOTAN_HAS_VALGRIND)
   68|       |   VALGRIND_MAKE_MEM_DEFINED(&p, sizeof(T));
   69|       |#else
   70|    673|   BOTAN_UNUSED(p);
  ------------------
  |  |  118|    673|#define BOTAN_UNUSED Botan::ignore_params
  ------------------
   71|    673|#endif
   72|    673|}

_ZN5Botan3fmtIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EEES7_NS1_17basic_string_viewIcS4_EEDpRKT_:
   51|    943|std::string fmt(std::string_view format, const T&... args) {
   52|    943|   std::ostringstream oss;
   53|    943|   oss.imbue(std::locale::classic());
   54|    943|   fmt_detail::do_fmt(oss, format, args...);
   55|    943|   return oss.str();
   56|    943|}
_ZN5Botan10fmt_detail6do_fmtINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEJS8_EEEvRNS2_19basic_ostringstreamIcS5_S7_EENS2_17basic_string_viewIcS5_EERKT_DpRKT0_:
   23|    943|void do_fmt(std::ostringstream& oss, std::string_view format, const T& val, const Ts&... rest) {
   24|    943|   size_t i = 0;
   25|       |
   26|    943|   while(i < format.size()) {
  ------------------
  |  Branch (26:10): [True: 943, False: 0]
  ------------------
   27|    943|      if(format[i] == '{' && (format.size() > (i + 1)) && format.at(i + 1) == '}') {
  ------------------
  |  Branch (27:10): [True: 943, False: 0]
  |  Branch (27:30): [True: 943, False: 0]
  |  Branch (27:59): [True: 943, False: 0]
  ------------------
   28|    943|         oss << val;
   29|    943|         return do_fmt(oss, format.substr(i + 2), rest...);
   30|    943|      } else {
   31|      0|         oss << format[i];
   32|      0|      }
   33|       |
   34|      0|      i += 1;
   35|      0|   }
   36|    943|}
_ZN5Botan10fmt_detail6do_fmtINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEJEEEvRNS2_19basic_ostringstreamIcS5_S7_EENS2_17basic_string_viewIcS5_EERKT_DpRKT0_:
   23|    943|void do_fmt(std::ostringstream& oss, std::string_view format, const T& val, const Ts&... rest) {
   24|    943|   size_t i = 0;
   25|       |
   26|  2.82k|   while(i < format.size()) {
  ------------------
  |  Branch (26:10): [True: 2.82k, False: 0]
  ------------------
   27|  2.82k|      if(format[i] == '{' && (format.size() > (i + 1)) && format.at(i + 1) == '}') {
  ------------------
  |  Branch (27:10): [True: 943, False: 1.88k]
  |  Branch (27:30): [True: 943, False: 0]
  |  Branch (27:59): [True: 943, False: 0]
  ------------------
   28|    943|         oss << val;
   29|    943|         return do_fmt(oss, format.substr(i + 2), rest...);
   30|  1.88k|      } else {
   31|  1.88k|         oss << format[i];
   32|  1.88k|      }
   33|       |
   34|  1.88k|      i += 1;
   35|  1.88k|   }
   36|    943|}
_ZN5Botan10fmt_detail6do_fmtERNSt3__119basic_ostringstreamIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS1_17basic_string_viewIcS4_EE:
   20|  13.0k|inline void do_fmt(std::ostringstream& oss, std::string_view format) { oss << format; }
_ZN5Botan10fmt_detail6do_fmtIjJEEEvRNSt3__119basic_ostringstreamIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS2_17basic_string_viewIcS5_EERKT_DpRKT0_:
   23|  1.54k|void do_fmt(std::ostringstream& oss, std::string_view format, const T& val, const Ts&... rest) {
   24|  1.54k|   size_t i = 0;
   25|       |
   26|  4.63k|   while(i < format.size()) {
  ------------------
  |  Branch (26:10): [True: 4.63k, False: 0]
  ------------------
   27|  4.63k|      if(format[i] == '{' && (format.size() > (i + 1)) && format.at(i + 1) == '}') {
  ------------------
  |  Branch (27:10): [True: 1.54k, False: 3.08k]
  |  Branch (27:30): [True: 1.54k, False: 0]
  |  Branch (27:59): [True: 1.54k, False: 0]
  ------------------
   28|  1.54k|         oss << val;
   29|  1.54k|         return do_fmt(oss, format.substr(i + 2), rest...);
   30|  3.08k|      } else {
   31|  3.08k|         oss << format[i];
   32|  3.08k|      }
   33|       |
   34|  3.08k|      i += 1;
   35|  3.08k|   }
   36|  1.54k|}
_ZN5Botan3fmtIJNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEEEEENS1_12basic_stringIcS4_NS1_9allocatorIcEEEES5_DpRKT_:
   51|  9.55k|std::string fmt(std::string_view format, const T&... args) {
   52|  9.55k|   std::ostringstream oss;
   53|  9.55k|   oss.imbue(std::locale::classic());
   54|  9.55k|   fmt_detail::do_fmt(oss, format, args...);
   55|  9.55k|   return oss.str();
   56|  9.55k|}
_ZN5Botan10fmt_detail6do_fmtINSt3__117basic_string_viewIcNS2_11char_traitsIcEEEEJEEEvRNS2_19basic_ostringstreamIcS5_NS2_9allocatorIcEEEES6_RKT_DpRKT0_:
   23|  9.55k|void do_fmt(std::ostringstream& oss, std::string_view format, const T& val, const Ts&... rest) {
   24|  9.55k|   size_t i = 0;
   25|       |
   26|  88.2k|   while(i < format.size()) {
  ------------------
  |  Branch (26:10): [True: 88.2k, False: 0]
  ------------------
   27|  88.2k|      if(format[i] == '{' && (format.size() > (i + 1)) && format.at(i + 1) == '}') {
  ------------------
  |  Branch (27:10): [True: 9.55k, False: 78.6k]
  |  Branch (27:30): [True: 9.55k, False: 0]
  |  Branch (27:59): [True: 9.55k, False: 0]
  ------------------
   28|  9.55k|         oss << val;
   29|  9.55k|         return do_fmt(oss, format.substr(i + 2), rest...);
   30|  78.6k|      } else {
   31|  78.6k|         oss << format[i];
   32|  78.6k|      }
   33|       |
   34|  78.6k|      i += 1;
   35|  78.6k|   }
   36|  9.55k|}
_ZN5Botan3fmtIJPKcS2_S2_EEENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS3_17basic_string_viewIcS6_EEDpRKT_:
   51|    963|std::string fmt(std::string_view format, const T&... args) {
   52|    963|   std::ostringstream oss;
   53|    963|   oss.imbue(std::locale::classic());
   54|    963|   fmt_detail::do_fmt(oss, format, args...);
   55|    963|   return oss.str();
   56|    963|}
_ZN5Botan10fmt_detail6do_fmtIPKcJS3_S3_EEEvRNSt3__119basic_ostringstreamIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS4_17basic_string_viewIcS7_EERKT_DpRKT0_:
   23|    963|void do_fmt(std::ostringstream& oss, std::string_view format, const T& val, const Ts&... rest) {
   24|    963|   size_t i = 0;
   25|       |
   26|    963|   while(i < format.size()) {
  ------------------
  |  Branch (26:10): [True: 963, False: 0]
  ------------------
   27|    963|      if(format[i] == '{' && (format.size() > (i + 1)) && format.at(i + 1) == '}') {
  ------------------
  |  Branch (27:10): [True: 963, False: 0]
  |  Branch (27:30): [True: 963, False: 0]
  |  Branch (27:59): [True: 963, False: 0]
  ------------------
   28|    963|         oss << val;
   29|    963|         return do_fmt(oss, format.substr(i + 2), rest...);
   30|    963|      } else {
   31|      0|         oss << format[i];
   32|      0|      }
   33|       |
   34|      0|      i += 1;
   35|      0|   }
   36|    963|}
_ZN5Botan10fmt_detail6do_fmtIPKcJS3_EEEvRNSt3__119basic_ostringstreamIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS4_17basic_string_viewIcS7_EERKT_DpRKT0_:
   23|    963|void do_fmt(std::ostringstream& oss, std::string_view format, const T& val, const Ts&... rest) {
   24|    963|   size_t i = 0;
   25|       |
   26|  4.81k|   while(i < format.size()) {
  ------------------
  |  Branch (26:10): [True: 4.81k, False: 0]
  ------------------
   27|  4.81k|      if(format[i] == '{' && (format.size() > (i + 1)) && format.at(i + 1) == '}') {
  ------------------
  |  Branch (27:10): [True: 963, False: 3.85k]
  |  Branch (27:30): [True: 963, False: 0]
  |  Branch (27:59): [True: 963, False: 0]
  ------------------
   28|    963|         oss << val;
   29|    963|         return do_fmt(oss, format.substr(i + 2), rest...);
   30|  3.85k|      } else {
   31|  3.85k|         oss << format[i];
   32|  3.85k|      }
   33|       |
   34|  3.85k|      i += 1;
   35|  3.85k|   }
   36|    963|}
_ZN5Botan10fmt_detail6do_fmtIPKcJEEEvRNSt3__119basic_ostringstreamIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS4_17basic_string_viewIcS7_EERKT_DpRKT0_:
   23|    963|void do_fmt(std::ostringstream& oss, std::string_view format, const T& val, const Ts&... rest) {
   24|    963|   size_t i = 0;
   25|       |
   26|  1.92k|   while(i < format.size()) {
  ------------------
  |  Branch (26:10): [True: 1.92k, False: 0]
  ------------------
   27|  1.92k|      if(format[i] == '{' && (format.size() > (i + 1)) && format.at(i + 1) == '}') {
  ------------------
  |  Branch (27:10): [True: 963, False: 963]
  |  Branch (27:30): [True: 963, False: 0]
  |  Branch (27:59): [True: 963, False: 0]
  ------------------
   28|    963|         oss << val;
   29|    963|         return do_fmt(oss, format.substr(i + 2), rest...);
   30|    963|      } else {
   31|    963|         oss << format[i];
   32|    963|      }
   33|       |
   34|    963|      i += 1;
   35|    963|   }
   36|    963|}
_ZN5Botan3fmtIJNSt3__117basic_string_viewIcNS1_11char_traitsIcEEEEjEEENS1_12basic_stringIcS4_NS1_9allocatorIcEEEES5_DpRKT_:
   51|  1.54k|std::string fmt(std::string_view format, const T&... args) {
   52|  1.54k|   std::ostringstream oss;
   53|  1.54k|   oss.imbue(std::locale::classic());
   54|  1.54k|   fmt_detail::do_fmt(oss, format, args...);
   55|  1.54k|   return oss.str();
   56|  1.54k|}
_ZN5Botan10fmt_detail6do_fmtINSt3__117basic_string_viewIcNS2_11char_traitsIcEEEEJjEEEvRNS2_19basic_ostringstreamIcS5_NS2_9allocatorIcEEEES6_RKT_DpRKT0_:
   23|  1.54k|void do_fmt(std::ostringstream& oss, std::string_view format, const T& val, const Ts&... rest) {
   24|  1.54k|   size_t i = 0;
   25|       |
   26|  1.54k|   while(i < format.size()) {
  ------------------
  |  Branch (26:10): [True: 1.54k, False: 0]
  ------------------
   27|  1.54k|      if(format[i] == '{' && (format.size() > (i + 1)) && format.at(i + 1) == '}') {
  ------------------
  |  Branch (27:10): [True: 1.54k, False: 0]
  |  Branch (27:30): [True: 1.54k, False: 0]
  |  Branch (27:59): [True: 1.54k, False: 0]
  ------------------
   28|  1.54k|         oss << val;
   29|  1.54k|         return do_fmt(oss, format.substr(i + 2), rest...);
   30|  1.54k|      } else {
   31|      0|         oss << format[i];
   32|      0|      }
   33|       |
   34|      0|      i += 1;
   35|      0|   }
   36|  1.54k|}

_ZN5Botan8get_byteILm0EmEEhT0_:
   52|  3.85k|{
   53|  3.85k|   const size_t shift = ((~B) & (sizeof(T) - 1)) << 3;
   54|  3.85k|   return static_cast<uint8_t>((input >> shift) & 0xFF);
   55|  3.85k|}
_ZN5Botan7load_beItEET_PKhm:
  136|  7.87k|inline constexpr uint16_t load_be<uint16_t>(const uint8_t in[], size_t off) {
  137|  7.87k|   in += off * sizeof(uint16_t);
  138|       |
  139|  7.87k|#if defined(BOTAN_ENDIAN_N2B)
  140|  7.87k|   uint16_t x = 0;
  141|  7.87k|   typecast_copy(x, in);
  142|  7.87k|   return BOTAN_ENDIAN_N2B(x);
  ------------------
  |  |   26|  7.87k|   #define BOTAN_ENDIAN_N2B(x) reverse_bytes(x)
  ------------------
  143|       |#else
  144|       |   return make_uint16(in[0], in[1]);
  145|       |#endif
  146|  7.87k|}
_ZN5Botan7load_beIjEET_PKhm:
  174|  2.31k|inline constexpr uint32_t load_be<uint32_t>(const uint8_t in[], size_t off) {
  175|  2.31k|   in += off * sizeof(uint32_t);
  176|  2.31k|#if defined(BOTAN_ENDIAN_N2B)
  177|  2.31k|   uint32_t x = 0;
  178|  2.31k|   typecast_copy(x, in);
  179|  2.31k|   return BOTAN_ENDIAN_N2B(x);
  ------------------
  |  |   26|  2.31k|   #define BOTAN_ENDIAN_N2B(x) reverse_bytes(x)
  ------------------
  180|       |#else
  181|       |   return make_uint32(in[0], in[1], in[2], in[3]);
  182|       |#endif
  183|  2.31k|}
_ZN5Botan7load_beImEET_PKhm:
  210|  11.1k|inline constexpr uint64_t load_be<uint64_t>(const uint8_t in[], size_t off) {
  211|  11.1k|   in += off * sizeof(uint64_t);
  212|  11.1k|#if defined(BOTAN_ENDIAN_N2B)
  213|  11.1k|   uint64_t x = 0;
  214|  11.1k|   typecast_copy(x, in);
  215|  11.1k|   return BOTAN_ENDIAN_N2B(x);
  ------------------
  |  |   26|  11.1k|   #define BOTAN_ENDIAN_N2B(x) reverse_bytes(x)
  ------------------
  216|       |#else
  217|       |   return make_uint64(in[0], in[1], in[2], in[3], in[4], in[5], in[6], in[7]);
  218|       |#endif
  219|  11.1k|}
_ZN5Botan12get_byte_varImEEhmT_:
   40|  3.35k|inline constexpr uint8_t get_byte_var(size_t byte_num, T input) {
   41|  3.35k|   return static_cast<uint8_t>(input >> (((~byte_num) & (sizeof(T) - 1)) << 3));
   42|  3.35k|}

_ZN5Botan8round_upEmm:
   21|  1.22k|inline size_t round_up(size_t n, size_t align_to) {
   22|  1.22k|   BOTAN_ARG_CHECK(align_to != 0, "align_to must not be 0");
  ------------------
  |  |   30|  1.22k|   do {                                                          \
  |  |   31|  1.22k|      if(!(expr))                                                \
  |  |  ------------------
  |  |  |  Branch (31:10): [True: 0, False: 1.22k]
  |  |  ------------------
  |  |   32|  1.22k|         Botan::throw_invalid_argument(msg, __func__, __FILE__); \
  |  |   33|  1.22k|   } while(0)
  |  |  ------------------
  |  |  |  Branch (33:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
   23|       |
   24|  1.22k|   if(n % align_to)
  ------------------
  |  Branch (24:7): [True: 1.14k, False: 79]
  ------------------
   25|  1.14k|      n += align_to - (n % align_to);
   26|  1.22k|   return n;
   27|  1.22k|}

_ZN5Botan11checked_addEmmPKci:
   30|   911k|inline size_t checked_add(size_t x, size_t y, const char* file, int line) {
   31|   911k|#if BOTAN_COMPILER_HAS_BUILTIN(__builtin_add_overflow)
   32|   911k|   size_t z;
   33|   911k|   if(__builtin_add_overflow(x, y, &z)) [[unlikely]]
  ------------------
  |  Branch (33:7): [True: 0, False: 911k]
  ------------------
   34|       |#elif defined(_MSC_VER)
   35|       |   size_t z;
   36|       |   if(SizeTAdd(x, y, &z) != S_OK) [[unlikely]]
   37|       |#else
   38|       |   size_t z = x + y;
   39|       |   if(z < x) [[unlikely]]
   40|       |#endif
   41|      0|   {
   42|      0|      throw Integer_Overflow_Detected(file, line);
   43|      0|   }
   44|   911k|   return z;
   45|   911k|}
_ZN5Botan11checked_mulEmm:
   47|   319k|inline std::optional<size_t> checked_mul(size_t x, size_t y) {
   48|   319k|#if BOTAN_COMPILER_HAS_BUILTIN(__builtin_add_overflow)
   49|   319k|   size_t z;
   50|   319k|   if(__builtin_mul_overflow(x, y, &z)) [[unlikely]]
  ------------------
  |  Branch (50:7): [True: 0, False: 319k]
  ------------------
   51|       |#elif defined(_MSC_VER)
   52|       |   size_t z;
   53|       |   if(SizeTMult(x, y, &z) != S_OK) [[unlikely]]
   54|       |#else
   55|       |   size_t z = x * y;
   56|       |   if(y && z / y != x) [[unlikely]]
   57|       |#endif
   58|      0|   {
   59|      0|      return std::nullopt;
   60|      0|   }
   61|   319k|   return z;
   62|   319k|}

_ZN5Botan13typecast_copyImEEvPT_PKhm:
  140|  11.1k|{
  141|  11.1k|   std::memcpy(out, in, sizeof(T) * N);
  142|  11.1k|}
_ZN5Botan11clear_bytesEPvm:
   92|  1.66k|inline constexpr void clear_bytes(void* ptr, size_t bytes) {
   93|  1.66k|   if(bytes > 0) {
  ------------------
  |  Branch (93:7): [True: 0, False: 1.66k]
  ------------------
   94|      0|      std::memset(ptr, 0, bytes);
   95|      0|   }
   96|  1.66k|}
_ZN5Botan22cast_uint8_ptr_to_charEPKh:
  179|  5.94k|inline const char* cast_uint8_ptr_to_char(const uint8_t* b) { return reinterpret_cast<const char*>(b); }
_ZN5Botan22cast_uint8_ptr_to_charEPh:
  183|    475|inline char* cast_uint8_ptr_to_char(uint8_t* b) { return reinterpret_cast<char*>(b); }
_ZN5Botan8copy_memIhEEvPT_PKS1_m:
  122|  1.31M|{
  123|  1.31M|   BOTAN_ASSERT_IMPLICATION(n > 0, in != nullptr && out != nullptr, "If n > 0 then args are not null");
  ------------------
  |  |   78|  1.31M|   do {                                                                                          \
  |  |   79|  2.44M|      if((expr1) && !(expr2))                                                                    \
  |  |  ------------------
  |  |  |  Branch (79:10): [True: 1.22M, False: 97.2k]
  |  |  |  Branch (79:23): [True: 1.22M, False: 0]
  |  |  |  Branch (79:23): [True: 1.22M, False: 0]
  |  |  ------------------
  |  |   80|  1.31M|         Botan::assertion_failure(#expr1 " implies " #expr2, msg, __func__, __FILE__, __LINE__); \
  |  |   81|  1.31M|   } while(0)
  |  |  ------------------
  |  |  |  Branch (81:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  124|       |
  125|  1.31M|   if(in != nullptr && out != nullptr && n > 0) {
  ------------------
  |  Branch (125:7): [True: 1.31M, False: 3.59k]
  |  Branch (125:24): [True: 1.27M, False: 41.5k]
  |  Branch (125:42): [True: 1.22M, False: 52.0k]
  ------------------
  126|  1.22M|      std::memmove(out, in, sizeof(T) * n);
  127|  1.22M|   }
  128|  1.31M|}
_ZN5Botan9clear_memImEEvPT_m:
  109|  1.66k|inline constexpr void clear_mem(T* ptr, size_t n) {
  110|  1.66k|   clear_bytes(ptr, sizeof(T) * n);
  111|  1.66k|}
_ZN5Botan13typecast_copyItEEvPT_PKhm:
  140|  7.87k|{
  141|  7.87k|   std::memcpy(out, in, sizeof(T) * N);
  142|  7.87k|}
_ZN5Botan13typecast_copyItEEvRT_PKh:
  152|  7.87k|{
  153|  7.87k|   typecast_copy(&out, in, 1);
  154|  7.87k|}
_ZN5Botan13typecast_copyIjEEvPT_PKhm:
  140|  2.31k|{
  141|  2.31k|   std::memcpy(out, in, sizeof(T) * N);
  142|  2.31k|}
_ZN5Botan13typecast_copyIjEEvRT_PKh:
  152|  2.31k|{
  153|  2.31k|   typecast_copy(&out, in, 1);
  154|  2.31k|}
_ZN5Botan13typecast_copyImEEvRT_PKh:
  152|  11.1k|{
  153|  11.1k|   typecast_copy(&out, in, 1);
  154|  11.1k|}

_ZN5Botan16secure_allocatorIhE8allocateEm:
   45|   318k|      T* allocate(std::size_t n) { return static_cast<T*>(allocate_memory(n, sizeof(T))); }
_ZN5Botan16secure_allocatorIhE10deallocateEPhm:
   47|   318k|      void deallocate(T* p, std::size_t n) { deallocate_memory(p, n, sizeof(T)); }
_ZN5Botan16secure_allocatorImE10deallocateEPmm:
   47|  1.22k|      void deallocate(T* p, std::size_t n) { deallocate_memory(p, n, sizeof(T)); }
_ZN5BotanneIhhEEbRKNS_16secure_allocatorIT_EERKNS1_IT0_EE:
   56|  57.0k|inline bool operator!=(const secure_allocator<T>&, const secure_allocator<U>&) {
   57|  57.0k|   return false;
   58|  57.0k|}
_ZN5Botan16secure_allocatorImE8allocateEm:
   45|  1.22k|      T* allocate(std::size_t n) { return static_cast<T*>(allocate_memory(n, sizeof(T))); }
_ZN5BotanpLIhNS_16secure_allocatorIhEEmEERNSt3__16vectorIT_T0_EES8_RKNS3_4pairIPS5_T1_EE:
   98|  59.7k|std::vector<T, Alloc>& operator+=(std::vector<T, Alloc>& out, const std::pair<T*, L>& in) {
   99|  59.7k|   out.insert(out.end(), in.first, in.first + in.second);
  100|  59.7k|   return out;
  101|  59.7k|}

_Z4fuzzPKhm:
   28|  2.68k|void fuzz(const uint8_t in[], size_t len) {
   29|  2.68k|   try {
   30|       |      /*
   31|       |      * Here we use an uninitialized ofstream so the fuzzer doesn't spend time
   32|       |      * on actual output formatting, no memory is allocated, etc.
   33|       |      */
   34|  2.68k|      std::ofstream out;
   35|  2.68k|      ASN1_Parser printer;
   36|  2.68k|      printer.print_to_stream(out, in, len);
   37|  2.68k|   } catch(Botan::Exception& e) {}
   38|  2.68k|}
_ZN11ASN1_ParserC2Ev:
   14|  2.68k|      ASN1_Parser() : Botan::ASN1_Formatter(true, 64) {}
_ZNK11ASN1_Parser6formatEN5Botan9ASN1_TypeENS0_10ASN1_ClassEmmNSt3__117basic_string_viewIcNS3_11char_traitsIcEEEE:
   17|  31.4k|      std::string format(Botan::ASN1_Type, Botan::ASN1_Class, size_t, size_t, std::string_view) const override {
   18|  31.4k|         return "";
   19|  31.4k|      }
_ZNK11ASN1_Parser10format_binEN5Botan9ASN1_TypeENS0_10ASN1_ClassERKNSt3__16vectorIhNS3_9allocatorIhEEEE:
   21|  12.1k|      std::string format_bin(Botan::ASN1_Type, Botan::ASN1_Class, const std::vector<uint8_t>&) const override {
   22|  12.1k|         return "";
   23|  12.1k|      }
_ZNK11ASN1_Parser9format_bnERKN5Botan6BigIntE:
   25|  1.66k|      std::string format_bn(const Botan::BigInt&) const override { return ""; }

LLVMFuzzerInitialize:
   24|      2|extern "C" int LLVMFuzzerInitialize(int*, char***) {
   25|       |   /*
   26|       |   * This disables the mlock pool, as overwrites within the pool are
   27|       |   * opaque to ASan or other instrumentation.
   28|       |   */
   29|      2|   ::setenv("BOTAN_MLOCK_POOL_SIZE", "0", 1);
   30|      2|   return 0;
   31|      2|}
LLVMFuzzerTestOneInput:
   34|  2.69k|extern "C" int LLVMFuzzerTestOneInput(const uint8_t in[], size_t len) {
   35|  2.69k|   if(len <= max_fuzzer_input_size) {
  ------------------
  |  Branch (35:7): [True: 2.68k, False: 9]
  ------------------
   36|  2.68k|      fuzz(in, len);
   37|  2.68k|   }
   38|  2.69k|   return 0;
   39|  2.69k|}

_ZNK5Botan10BER_Object11assert_is_aENS_9ASN1_TypeENS_10ASN1_ClassENSt3__117basic_string_viewIcNS3_11char_traitsIcEEEE:
   28|  16.7k|void BER_Object::assert_is_a(ASN1_Type expected_type_tag, ASN1_Class expected_class_tag, std::string_view descr) const {
   29|  16.7k|   if(this->is_a(expected_type_tag, expected_class_tag) == false) {
  ------------------
  |  Branch (29:7): [True: 1.60k, False: 15.1k]
  ------------------
   30|  1.60k|      std::stringstream msg;
   31|       |
   32|  1.60k|      msg << "Tag mismatch when decoding " << descr << " got ";
   33|       |
   34|  1.60k|      if(m_class_tag == ASN1_Class::NoObject && m_type_tag == ASN1_Type::NoObject) {
  ------------------
  |  Branch (34:10): [True: 0, False: 1.60k]
  |  Branch (34:49): [True: 0, False: 0]
  ------------------
   35|      0|         msg << "EOF";
   36|  1.60k|      } else {
   37|  1.60k|         if(m_class_tag == ASN1_Class::Universal || m_class_tag == ASN1_Class::Constructed) {
  ------------------
  |  Branch (37:13): [True: 0, False: 1.60k]
  |  Branch (37:53): [True: 0, False: 1.60k]
  ------------------
   38|      0|            msg << asn1_tag_to_string(m_type_tag);
   39|  1.60k|         } else {
   40|  1.60k|            msg << std::to_string(static_cast<uint32_t>(m_type_tag));
   41|  1.60k|         }
   42|       |
   43|  1.60k|         msg << "/" << asn1_class_to_string(m_class_tag);
   44|  1.60k|      }
   45|       |
   46|  1.60k|      msg << " expected ";
   47|       |
   48|  1.60k|      if(expected_class_tag == ASN1_Class::Universal || expected_class_tag == ASN1_Class::Constructed) {
  ------------------
  |  Branch (48:10): [True: 1.60k, False: 0]
  |  Branch (48:57): [True: 0, False: 0]
  ------------------
   49|  1.60k|         msg << asn1_tag_to_string(expected_type_tag);
   50|  1.60k|      } else {
   51|      0|         msg << std::to_string(static_cast<uint32_t>(expected_type_tag));
   52|      0|      }
   53|       |
   54|  1.60k|      msg << "/" << asn1_class_to_string(expected_class_tag);
   55|       |
   56|  1.60k|      throw BER_Decoding_Error(msg.str());
   57|  1.60k|   }
   58|  16.7k|}
_ZNK5Botan10BER_Object4is_aENS_9ASN1_TypeENS_10ASN1_ClassE:
   60|  16.7k|bool BER_Object::is_a(ASN1_Type expected_type_tag, ASN1_Class expected_class_tag) const {
   61|  16.7k|   return (m_type_tag == expected_type_tag && m_class_tag == expected_class_tag);
  ------------------
  |  Branch (61:12): [True: 16.7k, False: 0]
  |  Branch (61:47): [True: 15.1k, False: 1.60k]
  ------------------
   62|  16.7k|}
_ZN5Botan10BER_Object11set_taggingENS_9ASN1_TypeENS_10ASN1_ClassE:
   68|   110k|void BER_Object::set_tagging(ASN1_Type type_tag, ASN1_Class class_tag) {
   69|   110k|   m_type_tag = type_tag;
   70|   110k|   m_class_tag = class_tag;
   71|   110k|}
_ZN5Botan20asn1_class_to_stringENS_10ASN1_ClassE:
   73|  3.20k|std::string asn1_class_to_string(ASN1_Class type) {
   74|  3.20k|   switch(type) {
   75|  1.60k|      case ASN1_Class::Universal:
  ------------------
  |  Branch (75:7): [True: 1.60k, False: 1.60k]
  ------------------
   76|  1.60k|         return "UNIVERSAL";
   77|      0|      case ASN1_Class::Constructed:
  ------------------
  |  Branch (77:7): [True: 0, False: 3.20k]
  ------------------
   78|      0|         return "CONSTRUCTED";
   79|    574|      case ASN1_Class::ContextSpecific:
  ------------------
  |  Branch (79:7): [True: 574, False: 2.63k]
  ------------------
   80|    574|         return "CONTEXT_SPECIFIC";
   81|    404|      case ASN1_Class::Application:
  ------------------
  |  Branch (81:7): [True: 404, False: 2.80k]
  ------------------
   82|    404|         return "APPLICATION";
   83|    624|      case ASN1_Class::Private:
  ------------------
  |  Branch (83:7): [True: 624, False: 2.58k]
  ------------------
   84|    624|         return "PRIVATE";
   85|      0|      case ASN1_Class::NoObject:
  ------------------
  |  Branch (85:7): [True: 0, False: 3.20k]
  ------------------
   86|      0|         return "NO_OBJECT";
   87|      0|      default:
  ------------------
  |  Branch (87:7): [True: 0, False: 3.20k]
  ------------------
   88|      0|         return "CLASS(" + std::to_string(static_cast<size_t>(type)) + ")";
   89|  3.20k|   }
   90|  3.20k|}
_ZN5Botan18asn1_tag_to_stringENS_9ASN1_TypeE:
   92|  1.60k|std::string asn1_tag_to_string(ASN1_Type type) {
   93|  1.60k|   switch(type) {
   94|      0|      case ASN1_Type::Sequence:
  ------------------
  |  Branch (94:7): [True: 0, False: 1.60k]
  ------------------
   95|      0|         return "SEQUENCE";
   96|       |
   97|      0|      case ASN1_Type::Set:
  ------------------
  |  Branch (97:7): [True: 0, False: 1.60k]
  ------------------
   98|      0|         return "SET";
   99|       |
  100|      0|      case ASN1_Type::PrintableString:
  ------------------
  |  Branch (100:7): [True: 0, False: 1.60k]
  ------------------
  101|      0|         return "PRINTABLE STRING";
  102|       |
  103|      0|      case ASN1_Type::NumericString:
  ------------------
  |  Branch (103:7): [True: 0, False: 1.60k]
  ------------------
  104|      0|         return "NUMERIC STRING";
  105|       |
  106|      0|      case ASN1_Type::Ia5String:
  ------------------
  |  Branch (106:7): [True: 0, False: 1.60k]
  ------------------
  107|      0|         return "IA5 STRING";
  108|       |
  109|      0|      case ASN1_Type::TeletexString:
  ------------------
  |  Branch (109:7): [True: 0, False: 1.60k]
  ------------------
  110|      0|         return "T61 STRING";
  111|       |
  112|      0|      case ASN1_Type::Utf8String:
  ------------------
  |  Branch (112:7): [True: 0, False: 1.60k]
  ------------------
  113|      0|         return "UTF8 STRING";
  114|       |
  115|      0|      case ASN1_Type::VisibleString:
  ------------------
  |  Branch (115:7): [True: 0, False: 1.60k]
  ------------------
  116|      0|         return "VISIBLE STRING";
  117|       |
  118|      0|      case ASN1_Type::BmpString:
  ------------------
  |  Branch (118:7): [True: 0, False: 1.60k]
  ------------------
  119|      0|         return "BMP STRING";
  120|       |
  121|      0|      case ASN1_Type::UniversalString:
  ------------------
  |  Branch (121:7): [True: 0, False: 1.60k]
  ------------------
  122|      0|         return "UNIVERSAL STRING";
  123|       |
  124|      0|      case ASN1_Type::UtcTime:
  ------------------
  |  Branch (124:7): [True: 0, False: 1.60k]
  ------------------
  125|      0|         return "UTC TIME";
  126|       |
  127|      0|      case ASN1_Type::GeneralizedTime:
  ------------------
  |  Branch (127:7): [True: 0, False: 1.60k]
  ------------------
  128|      0|         return "GENERALIZED TIME";
  129|       |
  130|    756|      case ASN1_Type::OctetString:
  ------------------
  |  Branch (130:7): [True: 756, False: 846]
  ------------------
  131|    756|         return "OCTET STRING";
  132|       |
  133|    846|      case ASN1_Type::BitString:
  ------------------
  |  Branch (133:7): [True: 846, False: 756]
  ------------------
  134|    846|         return "BIT STRING";
  135|       |
  136|      0|      case ASN1_Type::Enumerated:
  ------------------
  |  Branch (136:7): [True: 0, False: 1.60k]
  ------------------
  137|      0|         return "ENUMERATED";
  138|       |
  139|      0|      case ASN1_Type::Integer:
  ------------------
  |  Branch (139:7): [True: 0, False: 1.60k]
  ------------------
  140|      0|         return "INTEGER";
  141|       |
  142|      0|      case ASN1_Type::Null:
  ------------------
  |  Branch (142:7): [True: 0, False: 1.60k]
  ------------------
  143|      0|         return "NULL";
  144|       |
  145|      0|      case ASN1_Type::ObjectId:
  ------------------
  |  Branch (145:7): [True: 0, False: 1.60k]
  ------------------
  146|      0|         return "OBJECT";
  147|       |
  148|      0|      case ASN1_Type::Boolean:
  ------------------
  |  Branch (148:7): [True: 0, False: 1.60k]
  ------------------
  149|      0|         return "BOOLEAN";
  150|       |
  151|      0|      case ASN1_Type::NoObject:
  ------------------
  |  Branch (151:7): [True: 0, False: 1.60k]
  ------------------
  152|      0|         return "NO_OBJECT";
  153|       |
  154|      0|      default:
  ------------------
  |  Branch (154:7): [True: 0, False: 1.60k]
  ------------------
  155|      0|         return "TAG(" + std::to_string(static_cast<uint32_t>(type)) + ")";
  156|  1.60k|   }
  157|  1.60k|}
_ZN5Botan18BER_Decoding_ErrorC2ENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEE:
  162|  7.18k|BER_Decoding_Error::BER_Decoding_Error(std::string_view str) : Decoding_Error(fmt("BER: {}", str)) {}
_ZN5Botan11BER_Bad_TagC2ENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEEj:
  164|  1.54k|BER_Bad_Tag::BER_Bad_Tag(std::string_view str, uint32_t tagging) : BER_Decoding_Error(fmt("{}: {}", str, tagging)) {}
_ZN5Botan4ASN19to_stringERKNS_10BER_ObjectE:
  184|  5.94k|std::string to_string(const BER_Object& obj) { return std::string(cast_uint8_ptr_to_char(obj.bits()), obj.length()); }

_ZNK5Botan3OID9to_stringEv:
  106|  6.65k|std::string OID::to_string() const {
  107|  6.65k|   std::ostringstream out;
  108|  6.65k|   out << (*this);
  109|  6.65k|   return out.str();
  110|  6.65k|}
_ZNK5Botan3OID19human_name_or_emptyEv:
  120|  3.32k|std::string OID::human_name_or_empty() const { return OID_Map::global_registry().oid2str(*this); }
_ZN5BotanlsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_3OIDE:
  134|  6.65k|std::ostream& operator<<(std::ostream& out, const OID& oid) {
  135|  6.65k|   const auto& val = oid.get_components();
  136|       |
  137|   140k|   for(size_t i = 0; i != val.size(); ++i) {
  ------------------
  |  Branch (137:22): [True: 133k, False: 6.65k]
  ------------------
  138|       |      // avoid locale issues with integer formatting
  139|   133k|      out << std::to_string(val[i]);
  140|   133k|      if(i != val.size() - 1) {
  ------------------
  |  Branch (140:10): [True: 127k, False: 6.65k]
  ------------------
  141|   127k|         out << ".";
  142|   127k|      }
  143|   133k|   }
  144|       |
  145|  6.65k|   return out;
  146|  6.65k|}
_ZN5Botan3OID11decode_fromERNS_11BER_DecoderE:
  185|  3.94k|void OID::decode_from(BER_Decoder& decoder) {
  186|  3.94k|   BER_Object obj = decoder.get_next_object();
  187|  3.94k|   if(obj.tagging() != (ASN1_Class::Universal | ASN1_Type::ObjectId)) {
  ------------------
  |  Branch (187:7): [True: 0, False: 3.94k]
  ------------------
  188|      0|      throw BER_Bad_Tag("Error decoding OID, unknown tag", obj.tagging());
  189|      0|   }
  190|       |
  191|  3.94k|   const size_t length = obj.length();
  192|  3.94k|   const uint8_t* bits = obj.bits();
  193|       |
  194|  3.94k|   if(length < 2 && !(length == 1 && bits[0] == 0)) {
  ------------------
  |  Branch (194:7): [True: 853, False: 3.08k]
  |  Branch (194:23): [True: 651, False: 202]
  |  Branch (194:38): [True: 452, False: 199]
  ------------------
  195|    401|      throw BER_Decoding_Error("OID encoding is too short");
  196|    401|   }
  197|       |
  198|  3.54k|   m_id.clear();
  199|  3.54k|   m_id.push_back(bits[0] / 40);
  200|  3.54k|   m_id.push_back(bits[0] % 40);
  201|       |
  202|  3.54k|   size_t i = 0;
  203|  90.6k|   while(i != length - 1) {
  ------------------
  |  Branch (203:10): [True: 87.3k, False: 3.32k]
  ------------------
  204|  87.3k|      uint32_t component = 0;
  205|  91.1k|      while(i != length - 1) {
  ------------------
  |  Branch (205:13): [True: 90.2k, False: 932]
  ------------------
  206|  90.2k|         ++i;
  207|       |
  208|  90.2k|         if(component >> (32 - 7)) {
  ------------------
  |  Branch (208:13): [True: 212, False: 90.0k]
  ------------------
  209|    212|            throw Decoding_Error("OID component overflow");
  210|    212|         }
  211|       |
  212|  90.0k|         component = (component << 7) + (bits[i] & 0x7F);
  213|       |
  214|  90.0k|         if(!(bits[i] & 0x80)) {
  ------------------
  |  Branch (214:13): [True: 86.1k, False: 3.85k]
  ------------------
  215|  86.1k|            break;
  216|  86.1k|         }
  217|  90.0k|      }
  218|  87.0k|      m_id.push_back(component);
  219|  87.0k|   }
  220|  3.54k|}

_ZNK5Botan14ASN1_Formatter15print_to_streamERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKhm:
   67|  2.68k|void ASN1_Formatter::print_to_stream(std::ostream& output, const uint8_t in[], size_t len) const {
   68|  2.68k|   BER_Decoder dec(in, len);
   69|  2.68k|   decode(output, dec, 0);
   70|  2.68k|}
_ZNK5Botan14ASN1_Formatter6decodeERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERNS_11BER_DecoderEm:
   72|  20.4k|void ASN1_Formatter::decode(std::ostream& output, BER_Decoder& decoder, size_t level) const {
   73|  20.4k|   BER_Object obj = decoder.get_next_object();
   74|       |
   75|  20.4k|   const bool recurse_deeper = (m_max_depth == 0 || level < m_max_depth);
  ------------------
  |  Branch (75:33): [True: 2.08k, False: 18.3k]
  |  Branch (75:53): [True: 18.3k, False: 38]
  ------------------
   76|       |
   77|  85.7k|   while(obj.is_set()) {
  ------------------
  |  Branch (77:10): [True: 65.2k, False: 20.4k]
  ------------------
   78|  65.2k|      const ASN1_Type type_tag = obj.type();
   79|  65.2k|      const ASN1_Class class_tag = obj.get_class();
   80|  65.2k|      const size_t length = obj.length();
   81|       |
   82|       |      /* hack to insert the tag+length back in front of the stuff now
   83|       |         that we've gotten the type info */
   84|  65.2k|      std::vector<uint8_t> bits;
   85|  65.2k|      DER_Encoder(bits).add_object(type_tag, class_tag, obj.bits(), obj.length());
   86|       |
   87|  65.2k|      BER_Decoder data(bits);
   88|       |
   89|  65.2k|      if(intersects(class_tag, ASN1_Class::Constructed)) {
  ------------------
  |  Branch (89:10): [True: 5.87k, False: 59.4k]
  ------------------
   90|  5.87k|         BER_Decoder cons_info(obj.bits(), obj.length());
   91|       |
   92|  5.87k|         if(recurse_deeper) {
  ------------------
  |  Branch (92:13): [True: 5.67k, False: 201]
  ------------------
   93|  5.67k|            output << format(type_tag, class_tag, level, length, "");
   94|  5.67k|            decode(output, cons_info, level + 1);  // recurse
   95|  5.67k|         } else {
   96|    201|            output << format(type_tag, class_tag, level, length, format_bin(type_tag, class_tag, bits));
   97|    201|         }
   98|  59.4k|      } else if(intersects(class_tag, ASN1_Class::Application) || intersects(class_tag, ASN1_Class::ContextSpecific)) {
  ------------------
  |  Branch (98:17): [True: 1.78k, False: 57.6k]
  |  Branch (98:67): [True: 2.08k, False: 55.5k]
  ------------------
   99|  3.87k|         bool success_parsing_cs = false;
  100|       |
  101|  3.87k|         if(m_print_context_specific) {
  ------------------
  |  Branch (101:13): [True: 3.87k, False: 0]
  ------------------
  102|  3.87k|            try {
  103|  3.87k|               if(possibly_a_general_name(bits.data(), bits.size())) {
  ------------------
  |  Branch (103:19): [True: 475, False: 3.39k]
  ------------------
  104|    475|                  output << format(
  105|    475|                     type_tag, class_tag, level, level, std::string(cast_uint8_ptr_to_char(&bits[2]), bits.size() - 2));
  106|    475|                  success_parsing_cs = true;
  107|  3.39k|               } else if(recurse_deeper) {
  ------------------
  |  Branch (107:26): [True: 3.14k, False: 250]
  ------------------
  108|  3.14k|                  std::vector<uint8_t> inner_bits;
  109|  3.14k|                  data.decode(inner_bits, type_tag);
  110|       |
  111|  3.14k|                  BER_Decoder inner(inner_bits);
  112|  3.14k|                  std::ostringstream inner_data;
  113|  3.14k|                  decode(inner_data, inner, level + 1);  // recurse
  114|  3.14k|                  output << inner_data.str();
  115|  3.14k|                  success_parsing_cs = true;
  116|  3.14k|               }
  117|  3.87k|            } catch(...) {}
  118|  3.87k|         }
  119|       |
  120|  3.87k|         if(success_parsing_cs == false) {
  ------------------
  |  Branch (120:13): [True: 3.39k, False: 475]
  ------------------
  121|  3.39k|            output << format(type_tag, class_tag, level, length, format_bin(type_tag, class_tag, bits));
  122|  3.39k|         }
  123|  55.5k|      } else if(type_tag == ASN1_Type::ObjectId) {
  ------------------
  |  Branch (123:17): [True: 3.94k, False: 51.6k]
  ------------------
  124|  3.94k|         OID oid;
  125|  3.94k|         data.decode(oid);
  126|       |
  127|  3.94k|         const std::string name = oid.human_name_or_empty();
  128|  3.94k|         const std::string oid_str = oid.to_string();
  129|       |
  130|  3.94k|         if(name.empty()) {
  ------------------
  |  Branch (130:13): [True: 2.38k, False: 1.55k]
  ------------------
  131|  2.38k|            output << format(type_tag, class_tag, level, length, oid_str);
  132|  2.38k|         } else {
  133|  1.55k|            output << format(type_tag, class_tag, level, length, fmt("{} [{}]", name, oid_str));
  134|  1.55k|         }
  135|  51.6k|      } else if(type_tag == ASN1_Type::Integer || type_tag == ASN1_Type::Enumerated) {
  ------------------
  |  Branch (135:17): [True: 1.42k, False: 50.1k]
  |  Branch (135:51): [True: 235, False: 49.9k]
  ------------------
  136|  1.66k|         BigInt number;
  137|       |
  138|  1.66k|         if(type_tag == ASN1_Type::Integer) {
  ------------------
  |  Branch (138:13): [True: 1.42k, False: 235]
  ------------------
  139|  1.42k|            data.decode(number);
  140|  1.42k|         } else if(type_tag == ASN1_Type::Enumerated) {
  ------------------
  |  Branch (140:20): [True: 235, False: 0]
  ------------------
  141|    235|            data.decode(number, ASN1_Type::Enumerated, class_tag);
  142|    235|         }
  143|       |
  144|  1.66k|         output << format(type_tag, class_tag, level, length, format_bn(number));
  145|  49.9k|      } else if(type_tag == ASN1_Type::Boolean) {
  ------------------
  |  Branch (145:17): [True: 644, False: 49.3k]
  ------------------
  146|    644|         bool boolean;
  147|    644|         data.decode(boolean);
  148|    644|         output << format(type_tag, class_tag, level, length, (boolean ? "true" : "false"));
  ------------------
  |  Branch (148:64): [True: 391, False: 253]
  ------------------
  149|  49.3k|      } else if(type_tag == ASN1_Type::Null) {
  ------------------
  |  Branch (149:17): [True: 195, False: 49.1k]
  ------------------
  150|    195|         output << format(type_tag, class_tag, level, length, "");
  151|  49.1k|      } else if(type_tag == ASN1_Type::OctetString || type_tag == ASN1_Type::BitString) {
  ------------------
  |  Branch (151:17): [True: 10.6k, False: 38.4k]
  |  Branch (151:55): [True: 2.21k, False: 36.2k]
  ------------------
  152|  12.8k|         std::vector<uint8_t> decoded_bits;
  153|  12.8k|         data.decode(decoded_bits, type_tag);
  154|  12.8k|         bool printing_octet_string_worked = false;
  155|       |
  156|  12.8k|         if(recurse_deeper) {
  ------------------
  |  Branch (156:13): [True: 12.0k, False: 791]
  ------------------
  157|  12.0k|            try {
  158|  12.0k|               BER_Decoder inner(decoded_bits);
  159|       |
  160|  12.0k|               std::ostringstream inner_data;
  161|  12.0k|               decode(inner_data, inner, level + 1);  // recurse
  162|       |
  163|  12.0k|               output << format(type_tag, class_tag, level, length, "");
  164|  12.0k|               output << inner_data.str();
  165|  12.0k|               printing_octet_string_worked = true;
  166|  12.0k|            } catch(...) {}
  167|  12.0k|         }
  168|       |
  169|  12.8k|         if(!printing_octet_string_worked) {
  ------------------
  |  Branch (169:13): [True: 8.54k, False: 4.32k]
  ------------------
  170|  8.54k|            output << format(type_tag, class_tag, level, length, format_bin(type_tag, class_tag, decoded_bits));
  171|  8.54k|         }
  172|  36.2k|      } else if(ASN1_String::is_string_type(type_tag)) {
  ------------------
  |  Branch (172:17): [True: 4.03k, False: 32.1k]
  ------------------
  173|  4.03k|         ASN1_String str;
  174|  4.03k|         data.decode(str);
  175|  4.03k|         output << format(type_tag, class_tag, level, length, str.value());
  176|  32.1k|      } else if(type_tag == ASN1_Type::UtcTime || type_tag == ASN1_Type::GeneralizedTime) {
  ------------------
  |  Branch (176:17): [True: 3.76k, False: 28.4k]
  |  Branch (176:51): [True: 1.04k, False: 27.3k]
  ------------------
  177|  4.81k|         ASN1_Time time;
  178|  4.81k|         data.decode(time);
  179|  4.81k|         output << format(type_tag, class_tag, level, length, time.readable_string());
  180|  27.3k|      } else {
  181|  27.3k|         output << "Unknown ASN.1 tag class=" << static_cast<int>(class_tag) << " type=" << static_cast<int>(type_tag)
  182|  27.3k|                << "\n";
  183|  27.3k|      }
  184|       |
  185|  65.2k|      obj = decoder.get_next_object();
  186|  65.2k|   }
  187|  20.4k|}
asn1_print.cpp:_ZN5Botan12_GLOBAL__N_123possibly_a_general_nameEPKhm:
   39|  3.87k|bool possibly_a_general_name(const uint8_t bits[], size_t bits_len) {
   40|  3.87k|   if(bits_len <= 2) {
  ------------------
  |  Branch (40:7): [True: 2.05k, False: 1.81k]
  ------------------
   41|  2.05k|      return false;
   42|  2.05k|   }
   43|       |
   44|  1.81k|   if(bits[0] != 0x82 && bits[0] != 0x86) {
  ------------------
  |  Branch (44:7): [True: 1.30k, False: 514]
  |  Branch (44:26): [True: 827, False: 473]
  ------------------
   45|    827|      return false;
   46|    827|   }
   47|       |
   48|    987|   if(bits[1] != bits_len - 2) {
  ------------------
  |  Branch (48:7): [True: 95, False: 892]
  ------------------
   49|     95|      return false;
   50|     95|   }
   51|       |
   52|    892|   if(all_printable_chars(bits + 2, bits_len - 2) == false) {
  ------------------
  |  Branch (52:7): [True: 417, False: 475]
  ------------------
   53|    417|      return false;
   54|    417|   }
   55|       |
   56|    475|   return true;
   57|    892|}
asn1_print.cpp:_ZN5Botan12_GLOBAL__N_119all_printable_charsEPKhm:
   22|    892|bool all_printable_chars(const uint8_t bits[], size_t bits_len) {
   23|  7.82k|   for(size_t i = 0; i != bits_len; ++i) {
  ------------------
  |  Branch (23:22): [True: 7.34k, False: 475]
  ------------------
   24|  7.34k|      int c = bits[i];
   25|  7.34k|      if(c > 127) {
  ------------------
  |  Branch (25:10): [True: 197, False: 7.15k]
  ------------------
   26|    197|         return false;
   27|    197|      }
   28|       |
   29|  7.15k|      if((std::isalnum(c) || c == '.' || c == ':' || c == '/' || c == '-') == false) {
  ------------------
  |  Branch (29:10): [True: 220, False: 6.93k]
  |  Branch (29:11): [True: 1.43k, False: 5.71k]
  |  Branch (29:30): [True: 483, False: 5.23k]
  |  Branch (29:42): [True: 398, False: 4.83k]
  |  Branch (29:54): [True: 4.26k, False: 572]
  |  Branch (29:66): [True: 352, False: 220]
  ------------------
   30|    220|         return false;
   31|    220|      }
   32|  7.15k|   }
   33|    475|   return true;
   34|    892|}

_ZN5Botan11ASN1_String14is_string_typeENS_9ASN1_TypeE:
   60|  36.2k|bool ASN1_String::is_string_type(ASN1_Type tag) { return is_asn1_string_type(tag); }
_ZN5Botan11ASN1_StringC2ENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEENS_9ASN1_TypeE:
   62|  4.03k|ASN1_String::ASN1_String(std::string_view str, ASN1_Type t) : m_utf8_str(str), m_tag(t) {
   63|  4.03k|   if(!is_utf8_subset_string_type(m_tag)) {
  ------------------
  |  Branch (63:7): [True: 0, False: 4.03k]
  ------------------
   64|      0|      throw Invalid_Argument("ASN1_String only supports encoding to UTF-8 or a UTF-8 subset");
   65|      0|   }
   66|  4.03k|}
_ZN5Botan11ASN1_StringC2ENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEE:
   68|  4.03k|ASN1_String::ASN1_String(std::string_view str) : ASN1_String(str, choose_encoding(str)) {}
_ZN5Botan11ASN1_String11decode_fromERNS_11BER_DecoderE:
   86|  4.03k|void ASN1_String::decode_from(BER_Decoder& source) {
   87|  4.03k|   BER_Object obj = source.get_next_object();
   88|       |
   89|  4.03k|   if(!is_asn1_string_type(obj.type())) {
  ------------------
  |  Branch (89:7): [True: 0, False: 4.03k]
  ------------------
   90|      0|      auto typ = static_cast<uint32_t>(obj.type());
   91|      0|      throw Decoding_Error(fmt("ASN1_String: Unknown string type {}", typ));
   92|      0|   }
   93|       |
   94|  4.03k|   m_tag = obj.type();
   95|  4.03k|   m_data.assign(obj.bits(), obj.bits() + obj.length());
   96|       |
   97|  4.03k|   if(m_tag == ASN1_Type::BmpString) {
  ------------------
  |  Branch (97:7): [True: 1.08k, False: 2.94k]
  ------------------
   98|  1.08k|      m_utf8_str = ucs2_to_utf8(m_data.data(), m_data.size());
   99|  2.94k|   } else if(m_tag == ASN1_Type::UniversalString) {
  ------------------
  |  Branch (99:14): [True: 1.13k, False: 1.81k]
  ------------------
  100|  1.13k|      m_utf8_str = ucs4_to_utf8(m_data.data(), m_data.size());
  101|  1.81k|   } else if(m_tag == ASN1_Type::TeletexString) {
  ------------------
  |  Branch (101:14): [True: 685, False: 1.13k]
  ------------------
  102|       |      /*
  103|       |      TeletexString is nominally ITU T.61 not ISO-8859-1 but it seems
  104|       |      the majority of implementations actually used that charset here.
  105|       |      */
  106|    685|      m_utf8_str = latin1_to_utf8(m_data.data(), m_data.size());
  107|  1.13k|   } else {
  108|       |      // All other supported string types are UTF-8 or some subset thereof
  109|  1.13k|      m_utf8_str = ASN1::to_string(obj);
  110|  1.13k|   }
  111|  4.03k|}
asn1_str.cpp:_ZN5Botan12_GLOBAL__N_119is_asn1_string_typeENS_9ASN1_TypeE:
   52|  40.2k|bool is_asn1_string_type(ASN1_Type tag) {
   53|  40.2k|   return (is_utf8_subset_string_type(tag) || tag == ASN1_Type::TeletexString || tag == ASN1_Type::BmpString ||
  ------------------
  |  Branch (53:12): [True: 2.26k, False: 38.0k]
  |  Branch (53:47): [True: 1.37k, False: 36.6k]
  |  Branch (53:82): [True: 2.17k, False: 34.4k]
  ------------------
   54|  40.2k|           tag == ASN1_Type::UniversalString);
  ------------------
  |  Branch (54:12): [True: 2.26k, False: 32.1k]
  ------------------
   55|  40.2k|}
asn1_str.cpp:_ZN5Botan12_GLOBAL__N_126is_utf8_subset_string_typeENS_9ASN1_TypeE:
   47|  44.3k|bool is_utf8_subset_string_type(ASN1_Type tag) {
   48|  44.3k|   return (tag == ASN1_Type::NumericString || tag == ASN1_Type::PrintableString || tag == ASN1_Type::VisibleString ||
  ------------------
  |  Branch (48:12): [True: 566, False: 43.7k]
  |  Branch (48:47): [True: 4.61k, False: 39.1k]
  |  Branch (48:84): [True: 526, False: 38.6k]
  ------------------
   49|  44.3k|           tag == ASN1_Type::Ia5String || tag == ASN1_Type::Utf8String);
  ------------------
  |  Branch (49:12): [True: 572, False: 38.0k]
  |  Branch (49:43): [True: 18, False: 38.0k]
  ------------------
   50|  44.3k|}
asn1_str.cpp:_ZN5Botan12_GLOBAL__N_115choose_encodingENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEE:
   23|  4.03k|ASN1_Type choose_encoding(std::string_view str) {
   24|  4.03k|   auto all_printable = CT::Mask<uint8_t>::set();
   25|       |
   26|  4.03k|   for(size_t i = 0; i != str.size(); ++i) {
  ------------------
  |  Branch (26:22): [True: 0, False: 4.03k]
  ------------------
   27|      0|      const uint8_t c = static_cast<uint8_t>(str[i]);
   28|       |
   29|      0|      auto is_alpha_lower = CT::Mask<uint8_t>::is_within_range(c, 'a', 'z');
   30|      0|      auto is_alpha_upper = CT::Mask<uint8_t>::is_within_range(c, 'A', 'Z');
   31|      0|      auto is_decimal = CT::Mask<uint8_t>::is_within_range(c, '0', '9');
   32|       |
   33|      0|      auto is_print_punc = CT::Mask<uint8_t>::is_any_of(c, {' ', '(', ')', '+', ',', '-', '.', '/', ':', '=', '?'});
   34|       |
   35|      0|      auto is_printable = is_alpha_lower | is_alpha_upper | is_decimal | is_print_punc;
   36|       |
   37|      0|      all_printable &= is_printable;
   38|      0|   }
   39|       |
   40|  4.03k|   if(all_printable.is_set()) {
  ------------------
  |  Branch (40:7): [True: 4.03k, False: 0]
  ------------------
   41|  4.03k|      return ASN1_Type::PrintableString;
   42|  4.03k|   } else {
   43|      0|      return ASN1_Type::Utf8String;
   44|      0|   }
   45|  4.03k|}

_ZN5Botan9ASN1_Time11decode_fromERNS_11BER_DecoderE:
   51|  4.81k|void ASN1_Time::decode_from(BER_Decoder& source) {
   52|  4.81k|   BER_Object ber_time = source.get_next_object();
   53|       |
   54|  4.81k|   set_to(ASN1::to_string(ber_time), ber_time.type());
   55|  4.81k|}
_ZNK5Botan9ASN1_Time15readable_stringEv:
   90|  1.05k|std::string ASN1_Time::readable_string() const {
   91|  1.05k|   if(time_is_set() == false) {
  ------------------
  |  Branch (91:7): [True: 0, False: 1.05k]
  ------------------
   92|      0|      throw Invalid_State("ASN1_Time::readable_string: No time set");
   93|      0|   }
   94|       |
   95|       |   // desired format: "%04d/%02d/%02d %02d:%02d:%02d UTC"
   96|  1.05k|   std::stringstream output;
   97|  1.05k|   output << std::setfill('0') << std::setw(4) << m_year << "/" << std::setw(2) << m_month << "/" << std::setw(2)
   98|  1.05k|          << m_day << " " << std::setw(2) << m_hour << ":" << std::setw(2) << m_minute << ":" << std::setw(2)
   99|  1.05k|          << m_second << " UTC";
  100|       |
  101|  1.05k|   return output.str();
  102|  1.05k|}
_ZNK5Botan9ASN1_Time11time_is_setEv:
  104|  1.05k|bool ASN1_Time::time_is_set() const { return (m_year != 0); }
_ZN5Botan9ASN1_Time6set_toENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEENS_9ASN1_TypeE:
  153|  4.81k|void ASN1_Time::set_to(std::string_view t_spec, ASN1_Type spec_tag) {
  154|  4.81k|   BOTAN_ARG_CHECK(spec_tag == ASN1_Type::UtcTime || spec_tag == ASN1_Type::GeneralizedTime,
  ------------------
  |  |   30|  4.81k|   do {                                                          \
  |  |   31|  5.86k|      if(!(expr))                                                \
  |  |  ------------------
  |  |  |  Branch (31:12): [True: 3.76k, False: 1.04k]
  |  |  |  Branch (31:12): [True: 1.04k, False: 0]
  |  |  ------------------
  |  |   32|  4.81k|         Botan::throw_invalid_argument(msg, __func__, __FILE__); \
  |  |   33|  4.81k|   } while(0)
  |  |  ------------------
  |  |  |  Branch (33:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  155|  4.81k|                   "Invalid tag for ASN1_Time");
  156|       |
  157|  4.81k|   if(spec_tag == ASN1_Type::GeneralizedTime) {
  ------------------
  |  Branch (157:7): [True: 1.04k, False: 3.76k]
  ------------------
  158|  1.04k|      BOTAN_ARG_CHECK(t_spec.size() == 15, "Invalid GeneralizedTime input string");
  ------------------
  |  |   30|  1.04k|   do {                                                          \
  |  |   31|  1.04k|      if(!(expr))                                                \
  |  |  ------------------
  |  |  |  Branch (31:10): [True: 236, False: 811]
  |  |  ------------------
  |  |   32|  1.04k|         Botan::throw_invalid_argument(msg, __func__, __FILE__); \
  |  |   33|  1.04k|   } while(0)
  |  |  ------------------
  |  |  |  Branch (33:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  159|  3.76k|   } else if(spec_tag == ASN1_Type::UtcTime) {
  ------------------
  |  Branch (159:14): [True: 3.76k, False: 0]
  ------------------
  160|  3.76k|      BOTAN_ARG_CHECK(t_spec.size() == 13, "Invalid UTCTime input string");
  ------------------
  |  |   30|  3.76k|   do {                                                          \
  |  |   31|  3.76k|      if(!(expr))                                                \
  |  |  ------------------
  |  |  |  Branch (31:10): [True: 507, False: 3.26k]
  |  |  ------------------
  |  |   32|  3.76k|         Botan::throw_invalid_argument(msg, __func__, __FILE__); \
  |  |   33|  3.76k|   } while(0)
  |  |  ------------------
  |  |  |  Branch (33:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  161|  3.76k|   }
  162|       |
  163|  4.81k|   BOTAN_ARG_CHECK(t_spec.back() == 'Z', "Botan does not support ASN1 times with timezones other than Z");
  ------------------
  |  |   30|  4.81k|   do {                                                          \
  |  |   31|  4.81k|      if(!(expr))                                                \
  |  |  ------------------
  |  |  |  Branch (31:10): [True: 220, False: 4.59k]
  |  |  ------------------
  |  |   32|  4.81k|         Botan::throw_invalid_argument(msg, __func__, __FILE__); \
  |  |   33|  4.81k|   } while(0)
  |  |  ------------------
  |  |  |  Branch (33:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  164|       |
  165|  4.81k|   const size_t field_len = 2;
  166|       |
  167|  4.81k|   const size_t year_start = 0;
  168|  4.81k|   const size_t year_len = (spec_tag == ASN1_Type::UtcTime) ? 2 : 4;
  ------------------
  |  Branch (168:28): [True: 3.04k, False: 1.77k]
  ------------------
  169|  4.81k|   const size_t month_start = year_start + year_len;
  170|  4.81k|   const size_t day_start = month_start + field_len;
  171|  4.81k|   const size_t hour_start = day_start + field_len;
  172|  4.81k|   const size_t min_start = hour_start + field_len;
  173|  4.81k|   const size_t sec_start = min_start + field_len;
  174|       |
  175|  4.81k|   m_year = to_u32bit(t_spec.substr(year_start, year_len));
  176|  4.81k|   m_month = to_u32bit(t_spec.substr(month_start, field_len));
  177|  4.81k|   m_day = to_u32bit(t_spec.substr(day_start, field_len));
  178|  4.81k|   m_hour = to_u32bit(t_spec.substr(hour_start, field_len));
  179|  4.81k|   m_minute = to_u32bit(t_spec.substr(min_start, field_len));
  180|  4.81k|   m_second = to_u32bit(t_spec.substr(sec_start, field_len));
  181|  4.81k|   m_tag = spec_tag;
  182|       |
  183|  4.81k|   if(spec_tag == ASN1_Type::UtcTime) {
  ------------------
  |  Branch (183:7): [True: 2.62k, False: 2.18k]
  ------------------
  184|  2.62k|      if(m_year >= 50) {
  ------------------
  |  Branch (184:10): [True: 416, False: 2.21k]
  ------------------
  185|    416|         m_year += 1900;
  186|  2.21k|      } else {
  187|  2.21k|         m_year += 2000;
  188|  2.21k|      }
  189|  2.62k|   }
  190|       |
  191|  4.81k|   if(!passes_sanity_check()) {
  ------------------
  |  Branch (191:7): [True: 2.37k, False: 2.44k]
  ------------------
  192|  2.37k|      throw Invalid_Argument(fmt("ASN1_Time string '{}' does not seem to be valid", t_spec));
  193|  2.37k|   }
  194|  4.81k|}
_ZNK5Botan9ASN1_Time19passes_sanity_checkEv:
  199|  3.43k|bool ASN1_Time::passes_sanity_check() const {
  200|       |   // AppVeyor's trust store includes a cert with expiration date in 3016 ...
  201|  3.43k|   if(m_year < 1950 || m_year > 3100) {
  ------------------
  |  Branch (201:7): [True: 203, False: 3.22k]
  |  Branch (201:24): [True: 199, False: 3.02k]
  ------------------
  202|    402|      return false;
  203|    402|   }
  204|  3.02k|   if(m_month == 0 || m_month > 12) {
  ------------------
  |  Branch (204:7): [True: 195, False: 2.83k]
  |  Branch (204:23): [True: 209, False: 2.62k]
  ------------------
  205|    404|      return false;
  206|    404|   }
  207|       |
  208|  2.62k|   const uint32_t days_in_month[12] = {31, 28 + 1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  209|       |
  210|  2.62k|   if(m_day == 0 || m_day > days_in_month[m_month - 1]) {
  ------------------
  |  Branch (210:7): [True: 195, False: 2.43k]
  |  Branch (210:21): [True: 202, False: 2.22k]
  ------------------
  211|    397|      return false;
  212|    397|   }
  213|       |
  214|  2.22k|   if(m_month == 2 && m_day == 29) {
  ------------------
  |  Branch (214:7): [True: 1.29k, False: 931]
  |  Branch (214:23): [True: 1.01k, False: 282]
  ------------------
  215|  1.01k|      if(m_year % 4 != 0) {
  ------------------
  |  Branch (215:10): [True: 194, False: 821]
  ------------------
  216|    194|         return false;  // not a leap year
  217|    194|      }
  218|       |
  219|    821|      if(m_year % 100 == 0 && m_year % 400 != 0) {
  ------------------
  |  Branch (219:10): [True: 474, False: 347]
  |  Branch (219:31): [True: 195, False: 279]
  ------------------
  220|    195|         return false;
  221|    195|      }
  222|    821|   }
  223|       |
  224|  1.83k|   if(m_hour >= 24 || m_minute >= 60 || m_second > 60) {
  ------------------
  |  Branch (224:7): [True: 196, False: 1.64k]
  |  Branch (224:23): [True: 198, False: 1.44k]
  |  Branch (224:41): [True: 195, False: 1.25k]
  ------------------
  225|    589|      return false;
  226|    589|   }
  227|       |
  228|  1.25k|   if(m_tag == ASN1_Type::UtcTime) {
  ------------------
  |  Branch (228:7): [True: 1.05k, False: 200]
  ------------------
  229|       |      /*
  230|       |      UTCTime limits the value of components such that leap seconds
  231|       |      are not covered. See "UNIVERSAL 23" in "Information technology
  232|       |      Abstract Syntax Notation One (ASN.1): Specification of basic notation"
  233|       |
  234|       |      http://www.itu.int/ITU-T/studygroups/com17/languages/
  235|       |      */
  236|  1.05k|      if(m_second > 59) {
  ------------------
  |  Branch (236:10): [True: 195, False: 855]
  ------------------
  237|    195|         return false;
  238|    195|      }
  239|  1.05k|   }
  240|       |
  241|  1.05k|   return true;
  242|  1.25k|}

_ZN5Botan11BER_Decoder15get_next_objectEv:
  229|   107k|BER_Object BER_Decoder::get_next_object() {
  230|   107k|   BER_Object next;
  231|       |
  232|   107k|   if(m_pushed.is_set()) {
  ------------------
  |  Branch (232:7): [True: 0, False: 107k]
  ------------------
  233|      0|      std::swap(next, m_pushed);
  234|      0|      return next;
  235|      0|   }
  236|       |
  237|   110k|   for(;;) {
  238|   110k|      ASN1_Type type_tag;
  239|   110k|      ASN1_Class class_tag;
  240|   110k|      decode_tag(m_source, type_tag, class_tag);
  241|   110k|      next.set_tagging(type_tag, class_tag);
  242|   110k|      if(next.is_set() == false) {  // no more objects
  ------------------
  |  Branch (242:10): [True: 10.1k, False: 100k]
  ------------------
  243|  10.1k|         return next;
  244|  10.1k|      }
  245|       |
  246|   100k|      size_t field_size;
  247|   100k|      const size_t length = decode_length(m_source, field_size, ALLOWED_EOC_NESTINGS);
  248|   100k|      if(!m_source->check_available(length)) {
  ------------------
  |  Branch (248:10): [True: 438, False: 100k]
  ------------------
  249|    438|         throw BER_Decoding_Error("Value truncated");
  250|    438|      }
  251|       |
  252|   100k|      uint8_t* out = next.mutable_bits(length);
  253|   100k|      if(m_source->read(out, length) != length) {
  ------------------
  |  Branch (253:10): [True: 0, False: 100k]
  ------------------
  254|      0|         throw BER_Decoding_Error("Value truncated");
  255|      0|      }
  256|       |
  257|   100k|      if(next.tagging() == static_cast<uint32_t>(ASN1_Type::Eoc)) {
  ------------------
  |  Branch (257:10): [True: 2.83k, False: 97.2k]
  ------------------
  258|  2.83k|         continue;
  259|  97.2k|      } else {
  260|  97.2k|         break;
  261|  97.2k|      }
  262|   100k|   }
  263|       |
  264|  97.2k|   return next;
  265|   107k|}
_ZN5Botan11BER_DecoderC2EPKhm:
  317|  8.56k|BER_Decoder::BER_Decoder(const uint8_t data[], size_t length) {
  318|  8.56k|   m_data_src = std::make_unique<DataSource_Memory>(data, length);
  319|  8.56k|   m_source = m_data_src.get();
  320|  8.56k|}
_ZN5Botan11BER_DecoderC2ERKNSt3__16vectorIhNS1_9allocatorIhEEEE:
  333|  77.3k|BER_Decoder::BER_Decoder(const std::vector<uint8_t>& data) {
  334|  77.3k|   m_data_src = std::make_unique<DataSource_Memory>(data.data(), data.size());
  335|  77.3k|   m_source = m_data_src.get();
  336|  77.3k|}
_ZN5Botan11BER_Decoder6decodeERNS_11ASN1_ObjectENS_9ASN1_TypeENS_10ASN1_ClassE:
  352|  12.7k|BER_Decoder& BER_Decoder::decode(ASN1_Object& obj, ASN1_Type /*unused*/, ASN1_Class /*unused*/) {
  353|  12.7k|   obj.decode_from(*this);
  354|  12.7k|   return (*this);
  355|  12.7k|}
_ZN5Botan11BER_Decoder6decodeERbNS_9ASN1_TypeENS_10ASN1_ClassE:
  379|    644|BER_Decoder& BER_Decoder::decode(bool& out, ASN1_Type type_tag, ASN1_Class class_tag) {
  380|    644|   BER_Object obj = get_next_object();
  381|    644|   obj.assert_is_a(type_tag, class_tag);
  382|       |
  383|    644|   if(obj.length() != 1) {
  ------------------
  |  Branch (383:7): [True: 245, False: 399]
  ------------------
  384|    245|      throw BER_Decoding_Error("BER boolean value had invalid size");
  385|    245|   }
  386|       |
  387|    399|   out = (obj.bits()[0]) ? true : false;
  ------------------
  |  Branch (387:10): [True: 391, False: 8]
  ------------------
  388|    399|   return (*this);
  389|    644|}
_ZN5Botan11BER_Decoder6decodeERNS_6BigIntENS_9ASN1_TypeENS_10ASN1_ClassE:
  440|  1.66k|BER_Decoder& BER_Decoder::decode(BigInt& out, ASN1_Type type_tag, ASN1_Class class_tag) {
  441|  1.66k|   BER_Object obj = get_next_object();
  442|  1.66k|   obj.assert_is_a(type_tag, class_tag);
  443|       |
  444|  1.66k|   if(obj.length() == 0) {
  ------------------
  |  Branch (444:7): [True: 436, False: 1.22k]
  ------------------
  445|    436|      out.clear();
  446|  1.22k|   } else {
  447|  1.22k|      const bool negative = (obj.bits()[0] & 0x80) ? true : false;
  ------------------
  |  Branch (447:29): [True: 673, False: 555]
  ------------------
  448|       |
  449|  1.22k|      if(negative) {
  ------------------
  |  Branch (449:10): [True: 673, False: 555]
  ------------------
  450|    673|         secure_vector<uint8_t> vec(obj.bits(), obj.bits() + obj.length());
  451|  1.02k|         for(size_t i = obj.length(); i > 0; --i) {
  ------------------
  |  Branch (451:39): [True: 1.02k, False: 0]
  ------------------
  452|  1.02k|            if(vec[i - 1]--) {
  ------------------
  |  Branch (452:16): [True: 673, False: 355]
  ------------------
  453|    673|               break;
  454|    673|            }
  455|  1.02k|         }
  456|  74.8k|         for(size_t i = 0; i != obj.length(); ++i) {
  ------------------
  |  Branch (456:28): [True: 74.2k, False: 673]
  ------------------
  457|  74.2k|            vec[i] = ~vec[i];
  458|  74.2k|         }
  459|    673|         out = BigInt(vec.data(), vec.size());
  460|    673|         out.flip_sign();
  461|    673|      } else {
  462|    555|         out = BigInt(obj.bits(), obj.length());
  463|    555|      }
  464|  1.22k|   }
  465|       |
  466|  1.66k|   return (*this);
  467|  1.66k|}
_ZN5Botan11BER_Decoder6decodeERNSt3__16vectorIhNS1_9allocatorIhEEEENS_9ASN1_TypeES7_NS_10ASN1_ClassE:
  517|  16.0k|                                 ASN1_Class class_tag) {
  518|  16.0k|   if(real_type != ASN1_Type::OctetString && real_type != ASN1_Type::BitString) {
  ------------------
  |  Branch (518:7): [True: 4.60k, False: 11.4k]
  |  Branch (518:46): [True: 1.54k, False: 3.06k]
  ------------------
  519|  1.54k|      throw BER_Bad_Tag("Bad tag for {BIT,OCTET} STRING", static_cast<uint32_t>(real_type));
  520|  1.54k|   }
  521|       |
  522|  14.4k|   asn1_decode_binary_string(buffer, get_next_object(), real_type, type_tag, class_tag);
  523|  14.4k|   return (*this);
  524|  16.0k|}
ber_dec.cpp:_ZN5Botan12_GLOBAL__N_110decode_tagEPNS_10DataSourceERNS_9ASN1_TypeERNS_10ASN1_ClassE:
   29|   461k|size_t decode_tag(DataSource* ber, ASN1_Type& type_tag, ASN1_Class& class_tag) {
   30|   461k|   uint8_t b;
   31|   461k|   if(!ber->read_byte(b)) {
  ------------------
  |  Branch (31:7): [True: 53.0k, False: 408k]
  ------------------
   32|  53.0k|      type_tag = ASN1_Type::NoObject;
   33|  53.0k|      class_tag = ASN1_Class::NoObject;
   34|  53.0k|      return 0;
   35|  53.0k|   }
   36|       |
   37|   408k|   if((b & 0x1F) != 0x1F) {
  ------------------
  |  Branch (37:7): [True: 400k, False: 7.13k]
  ------------------
   38|   400k|      type_tag = ASN1_Type(b & 0x1F);
   39|   400k|      class_tag = ASN1_Class(b & 0xE0);
   40|   400k|      return 1;
   41|   400k|   }
   42|       |
   43|  7.13k|   size_t tag_bytes = 1;
   44|  7.13k|   class_tag = ASN1_Class(b & 0xE0);
   45|       |
   46|  7.13k|   size_t tag_buf = 0;
   47|  14.2k|   while(true) {
  ------------------
  |  Branch (47:10): [Folded - Ignored]
  ------------------
   48|  14.2k|      if(!ber->read_byte(b)) {
  ------------------
  |  Branch (48:10): [True: 470, False: 13.7k]
  ------------------
   49|    470|         throw BER_Decoding_Error("Long-form tag truncated");
   50|    470|      }
   51|  13.7k|      if(tag_buf & 0xFF000000) {
  ------------------
  |  Branch (51:10): [True: 204, False: 13.5k]
  ------------------
   52|    204|         throw BER_Decoding_Error("Long-form tag overflowed 32 bits");
   53|    204|      }
   54|  13.5k|      ++tag_bytes;
   55|  13.5k|      tag_buf = (tag_buf << 7) | (b & 0x7F);
   56|  13.5k|      if((b & 0x80) == 0) {
  ------------------
  |  Branch (56:10): [True: 6.45k, False: 7.10k]
  ------------------
   57|  6.45k|         break;
   58|  6.45k|      }
   59|  13.5k|   }
   60|  6.45k|   type_tag = ASN1_Type(tag_buf);
   61|  6.45k|   return tag_bytes;
   62|  7.13k|}
ber_dec.cpp:_ZN5Botan12_GLOBAL__N_113decode_lengthEPNS_10DataSourceERmm:
   72|   407k|size_t decode_length(DataSource* ber, size_t& field_size, size_t allow_indef) {
   73|   407k|   uint8_t b;
   74|   407k|   if(!ber->read_byte(b)) {
  ------------------
  |  Branch (74:7): [True: 1.04k, False: 406k]
  ------------------
   75|  1.04k|      throw BER_Decoding_Error("Length field not found");
   76|  1.04k|   }
   77|   406k|   field_size = 1;
   78|   406k|   if((b & 0x80) == 0) {
  ------------------
  |  Branch (78:7): [True: 343k, False: 63.3k]
  ------------------
   79|   343k|      return b;
   80|   343k|   }
   81|       |
   82|  63.3k|   field_size += (b & 0x7F);
   83|  63.3k|   if(field_size > 5) {
  ------------------
  |  Branch (83:7): [True: 221, False: 63.1k]
  ------------------
   84|    221|      throw BER_Decoding_Error("Length field is too large");
   85|    221|   }
   86|       |
   87|  63.1k|   if(field_size == 1) {
  ------------------
  |  Branch (87:7): [True: 60.4k, False: 2.65k]
  ------------------
   88|  60.4k|      if(allow_indef == 0) {
  ------------------
  |  Branch (88:10): [True: 204, False: 60.2k]
  ------------------
   89|    204|         throw BER_Decoding_Error("Nested EOC markers too deep, rejecting to avoid stack exhaustion");
   90|  60.2k|      } else {
   91|  60.2k|         return find_eoc(ber, allow_indef - 1);
   92|  60.2k|      }
   93|  60.4k|   }
   94|       |
   95|  2.65k|   size_t length = 0;
   96|       |
   97|  6.29k|   for(size_t i = 0; i != field_size - 1; ++i) {
  ------------------
  |  Branch (97:22): [True: 3.85k, False: 2.43k]
  ------------------
   98|  3.85k|      if(get_byte<0>(length) != 0) {
  ------------------
  |  Branch (98:10): [True: 0, False: 3.85k]
  ------------------
   99|      0|         throw BER_Decoding_Error("Field length overflow");
  100|      0|      }
  101|  3.85k|      if(!ber->read_byte(b)) {
  ------------------
  |  Branch (101:10): [True: 218, False: 3.63k]
  ------------------
  102|    218|         throw BER_Decoding_Error("Corrupted length field");
  103|    218|      }
  104|  3.63k|      length = (length << 8) | b;
  105|  3.63k|   }
  106|  2.43k|   return length;
  107|  2.65k|}
ber_dec.cpp:_ZN5Botan12_GLOBAL__N_18find_eocEPNS_10DataSourceEm:
  112|  60.2k|size_t find_eoc(DataSource* ber, size_t allow_indef) {
  113|  60.2k|   secure_vector<uint8_t> buffer(BOTAN_DEFAULT_BUFFER_SIZE), data;
  ------------------
  |  |  372|  60.2k|#define BOTAN_DEFAULT_BUFFER_SIZE 4096
  ------------------
  114|       |
  115|   120k|   while(true) {
  ------------------
  |  Branch (115:10): [Folded - Ignored]
  ------------------
  116|   120k|      const size_t got = ber->peek(buffer.data(), buffer.size(), data.size());
  117|   120k|      if(got == 0) {
  ------------------
  |  Branch (117:10): [True: 60.2k, False: 59.7k]
  ------------------
  118|  60.2k|         break;
  119|  60.2k|      }
  120|       |
  121|  59.7k|      data += std::make_pair(buffer.data(), got);
  122|  59.7k|   }
  123|       |
  124|  60.2k|   DataSource_Memory source(data);
  125|  60.2k|   data.clear();
  126|       |
  127|  60.2k|   size_t length = 0;
  128|   354k|   while(true) {
  ------------------
  |  Branch (128:10): [Folded - Ignored]
  ------------------
  129|   350k|      ASN1_Type type_tag;
  130|   350k|      ASN1_Class class_tag;
  131|   350k|      size_t tag_size = decode_tag(&source, type_tag, class_tag);
  132|   350k|      if(type_tag == ASN1_Type::NoObject) {
  ------------------
  |  Branch (132:10): [True: 42.9k, False: 307k]
  ------------------
  133|  42.9k|         break;
  134|  42.9k|      }
  135|       |
  136|   307k|      size_t length_size = 0;
  137|   307k|      size_t item_size = decode_length(&source, length_size, allow_indef);
  138|   307k|      source.discard_next(item_size);
  139|       |
  140|   307k|      length = BOTAN_CHECKED_ADD(length, item_size);
  ------------------
  |  |   72|   307k|#define BOTAN_CHECKED_ADD(x, y) checked_add(x, y, __FILE__, __LINE__)
  ------------------
  141|   307k|      length = BOTAN_CHECKED_ADD(length, tag_size);
  ------------------
  |  |   72|   307k|#define BOTAN_CHECKED_ADD(x, y) checked_add(x, y, __FILE__, __LINE__)
  ------------------
  142|   307k|      length = BOTAN_CHECKED_ADD(length, length_size);
  ------------------
  |  |   72|   307k|#define BOTAN_CHECKED_ADD(x, y) checked_add(x, y, __FILE__, __LINE__)
  ------------------
  143|       |
  144|   307k|      if(type_tag == ASN1_Type::Eoc && class_tag == ASN1_Class::Universal) {
  ------------------
  |  Branch (144:10): [True: 70.8k, False: 236k]
  |  Branch (144:40): [True: 13.6k, False: 57.1k]
  ------------------
  145|  13.6k|         break;
  146|  13.6k|      }
  147|   307k|   }
  148|  60.2k|   return length;
  149|  60.2k|}
ber_dec.cpp:_ZN5Botan12_GLOBAL__N_125asn1_decode_binary_stringINSt3__19allocatorIhEEEEvRNS2_6vectorIhT_EERKNS_10BER_ObjectENS_9ASN1_TypeESC_NS_10ASN1_ClassE:
  476|  14.4k|                               ASN1_Class class_tag) {
  477|  14.4k|   obj.assert_is_a(type_tag, class_tag);
  478|       |
  479|  14.4k|   if(real_type == ASN1_Type::OctetString) {
  ------------------
  |  Branch (479:7): [True: 10.6k, False: 3.81k]
  ------------------
  480|  10.6k|      buffer.assign(obj.bits(), obj.bits() + obj.length());
  481|  10.6k|   } else {
  482|  3.81k|      if(obj.length() == 0) {
  ------------------
  |  Branch (482:10): [True: 368, False: 3.45k]
  ------------------
  483|    368|         throw BER_Decoding_Error("Invalid BIT STRING");
  484|    368|      }
  485|  3.45k|      if(obj.bits()[0] >= 8) {
  ------------------
  |  Branch (485:10): [True: 221, False: 3.23k]
  ------------------
  486|    221|         throw BER_Decoding_Error("Bad number of unused bits in BIT STRING");
  487|    221|      }
  488|       |
  489|  3.23k|      buffer.resize(obj.length() - 1);
  490|       |
  491|  3.23k|      if(obj.length() > 1) {
  ------------------
  |  Branch (491:10): [True: 1.42k, False: 1.80k]
  ------------------
  492|  1.42k|         copy_mem(buffer.data(), obj.bits() + 1, obj.length() - 1);
  493|  1.42k|      }
  494|  3.23k|   }
  495|  14.4k|}

_ZN5Botan11DER_EncoderC2ERNSt3__16vectorIhNS1_9allocatorIhEEEE:
   71|  65.2k|DER_Encoder::DER_Encoder(std::vector<uint8_t>& vec) {
   72|  65.2k|   m_append_output = [&vec](const uint8_t b[], size_t l) { vec.insert(vec.end(), b, b + l); };
   73|  65.2k|}
_ZN5Botan11DER_Encoder10add_objectENS_9ASN1_TypeENS_10ASN1_ClassEPKhm:
  218|  65.2k|DER_Encoder& DER_Encoder::add_object(ASN1_Type type_tag, ASN1_Class class_tag, const uint8_t rep[], size_t length) {
  219|  65.2k|   std::vector<uint8_t> hdr;
  220|  65.2k|   encode_tag(hdr, type_tag, class_tag);
  221|  65.2k|   encode_length(hdr, length);
  222|       |
  223|  65.2k|   if(!m_subsequences.empty()) {
  ------------------
  |  Branch (223:7): [True: 0, False: 65.2k]
  ------------------
  224|      0|      m_subsequences[m_subsequences.size() - 1].add_bytes(hdr.data(), hdr.size(), rep, length);
  225|  65.2k|   } else if(m_append_output) {
  ------------------
  |  Branch (225:14): [True: 65.2k, False: 0]
  ------------------
  226|  65.2k|      m_append_output(hdr.data(), hdr.size());
  227|  65.2k|      m_append_output(rep, length);
  228|  65.2k|   } else {
  229|      0|      m_default_outbuf += hdr;
  230|      0|      m_default_outbuf += std::make_pair(rep, length);
  231|      0|   }
  232|       |
  233|  65.2k|   return (*this);
  234|  65.2k|}
der_enc.cpp:_ZN5Botan12_GLOBAL__N_110encode_tagERNSt3__16vectorIhNS1_9allocatorIhEEEENS_9ASN1_TypeENS_10ASN1_ClassE:
   24|  65.2k|void encode_tag(std::vector<uint8_t>& encoded_tag, ASN1_Type type_tag_e, ASN1_Class class_tag_e) {
   25|  65.2k|   const uint32_t type_tag = static_cast<uint32_t>(type_tag_e);
   26|  65.2k|   const uint32_t class_tag = static_cast<uint32_t>(class_tag_e);
   27|       |
   28|  65.2k|   if((class_tag | 0xE0) != 0xE0) {
  ------------------
  |  Branch (28:7): [True: 0, False: 65.2k]
  ------------------
   29|      0|      throw Encoding_Error(fmt("DER_Encoder: Invalid class tag {}", std::to_string(class_tag)));
   30|      0|   }
   31|       |
   32|  65.2k|   if(type_tag <= 30) {
  ------------------
  |  Branch (32:7): [True: 63.7k, False: 1.50k]
  ------------------
   33|  63.7k|      encoded_tag.push_back(static_cast<uint8_t>(type_tag | class_tag));
   34|  63.7k|   } else {
   35|  1.50k|      size_t blocks = high_bit(static_cast<uint32_t>(type_tag)) + 6;
   36|  1.50k|      blocks = (blocks - (blocks % 7)) / 7;
   37|       |
   38|  1.50k|      BOTAN_ASSERT_NOMSG(blocks > 0);
  ------------------
  |  |   60|  1.50k|   do {                                                                     \
  |  |   61|  1.50k|      if(!(expr))                                                           \
  |  |  ------------------
  |  |  |  Branch (61:10): [True: 0, False: 1.50k]
  |  |  ------------------
  |  |   62|  1.50k|         Botan::assertion_failure(#expr, "", __func__, __FILE__, __LINE__); \
  |  |   63|  1.50k|   } while(0)
  |  |  ------------------
  |  |  |  Branch (63:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
   39|       |
   40|  1.50k|      encoded_tag.push_back(static_cast<uint8_t>(class_tag | 0x1F));
   41|  3.98k|      for(size_t i = 0; i != blocks - 1; ++i) {
  ------------------
  |  Branch (41:25): [True: 2.47k, False: 1.50k]
  ------------------
   42|  2.47k|         encoded_tag.push_back(0x80 | ((type_tag >> 7 * (blocks - i - 1)) & 0x7F));
   43|  2.47k|      }
   44|  1.50k|      encoded_tag.push_back(type_tag & 0x7F);
   45|  1.50k|   }
   46|  65.2k|}
der_enc.cpp:_ZN5Botan12_GLOBAL__N_113encode_lengthERNSt3__16vectorIhNS1_9allocatorIhEEEEm:
   51|  65.2k|void encode_length(std::vector<uint8_t>& encoded_length, size_t length) {
   52|  65.2k|   if(length <= 127) {
  ------------------
  |  Branch (52:7): [True: 62.9k, False: 2.34k]
  ------------------
   53|  62.9k|      encoded_length.push_back(static_cast<uint8_t>(length));
   54|  62.9k|   } else {
   55|  2.34k|      const size_t bytes_needed = significant_bytes(length);
   56|       |
   57|  2.34k|      encoded_length.push_back(static_cast<uint8_t>(0x80 | bytes_needed));
   58|       |
   59|  5.69k|      for(size_t i = sizeof(length) - bytes_needed; i < sizeof(length); ++i) {
  ------------------
  |  Branch (59:53): [True: 3.35k, False: 2.34k]
  ------------------
   60|  3.35k|         encoded_length.push_back(get_byte_var(i, length));
   61|  3.35k|      }
   62|  2.34k|   }
   63|  65.2k|}
der_enc.cpp:_ZZN5Botan11DER_EncoderC1ERNSt3__16vectorIhNS1_9allocatorIhEEEEENK3$_1clEPKhm:
   72|   130k|   m_append_output = [&vec](const uint8_t b[], size_t l) { vec.insert(vec.end(), b, b + l); };

_ZN5Botan7OID_MapC2Ev:
   11|      1|OID_Map::OID_Map() {
   12|      1|   m_str2oid = OID_Map::load_str2oid_map();
   13|      1|   m_oid2str = OID_Map::load_oid2str_map();
   14|      1|}
_ZN5Botan7OID_Map15global_registryEv:
   16|  3.32k|OID_Map& OID_Map::global_registry() {
   17|  3.32k|   static OID_Map g_map;
   18|  3.32k|   return g_map;
   19|  3.32k|}
_ZN5Botan7OID_Map7oid2strERKNS_3OIDE:
   56|  3.32k|std::string OID_Map::oid2str(const OID& oid) {
   57|  3.32k|   const std::string oid_str = oid.to_string();
   58|       |
   59|  3.32k|   lock_guard_type<mutex_type> lock(m_mutex);
   60|       |
   61|  3.32k|   auto i = m_oid2str.find(oid_str);
   62|  3.32k|   if(i != m_oid2str.end()) {
  ------------------
  |  Branch (62:7): [True: 943, False: 2.38k]
  ------------------
   63|    943|      return i->second;
   64|    943|   }
   65|       |
   66|  2.38k|   return "";
   67|  3.32k|}

_ZN5Botan7OID_Map16load_oid2str_mapEv:
   17|      1|std::unordered_map<std::string, std::string> OID_Map::load_oid2str_map() {
   18|      1|   return std::unordered_map<std::string, std::string>{
   19|       |
   20|      1|      {"0.3.4401.5.3.1.9.26", "Camellia-192/GCM"},
   21|      1|      {"0.3.4401.5.3.1.9.46", "Camellia-256/GCM"},
   22|      1|      {"0.3.4401.5.3.1.9.6", "Camellia-128/GCM"},
   23|      1|      {"0.4.0.127.0.15.1.1.13.0", "XMSS"},
   24|      1|      {"1.0.14888.3.0.5", "ECKCDSA"},
   25|      1|      {"1.2.156.10197.1.104.100", "SM4/OCB"},
   26|      1|      {"1.2.156.10197.1.104.2", "SM4/CBC"},
   27|      1|      {"1.2.156.10197.1.104.8", "SM4/GCM"},
   28|      1|      {"1.2.156.10197.1.301", "sm2p256v1"},
   29|      1|      {"1.2.156.10197.1.301.1", "SM2"},
   30|      1|      {"1.2.156.10197.1.301.2", "SM2_Kex"},
   31|      1|      {"1.2.156.10197.1.301.3", "SM2_Enc"},
   32|      1|      {"1.2.156.10197.1.401", "SM3"},
   33|      1|      {"1.2.156.10197.1.501", "SM2_Sig/SM3"},
   34|      1|      {"1.2.156.10197.1.504", "RSA/EMSA3(SM3)"},
   35|      1|      {"1.2.250.1.223.101.256.1", "frp256v1"},
   36|      1|      {"1.2.392.200011.61.1.1.1.2", "Camellia-128/CBC"},
   37|      1|      {"1.2.392.200011.61.1.1.1.3", "Camellia-192/CBC"},
   38|      1|      {"1.2.392.200011.61.1.1.1.4", "Camellia-256/CBC"},
   39|      1|      {"1.2.410.200004.1.100.4.3", "ECKCDSA/SHA-1"},
   40|      1|      {"1.2.410.200004.1.100.4.4", "ECKCDSA/SHA-224"},
   41|      1|      {"1.2.410.200004.1.100.4.5", "ECKCDSA/SHA-256"},
   42|      1|      {"1.2.410.200004.1.4", "SEED/CBC"},
   43|      1|      {"1.2.643.100.1", "GOST.OGRN"},
   44|      1|      {"1.2.643.100.111", "GOST.SubjectSigningTool"},
   45|      1|      {"1.2.643.100.112", "GOST.IssuerSigningTool"},
   46|      1|      {"1.2.643.2.2.19", "GOST-34.10"},
   47|      1|      {"1.2.643.2.2.3", "GOST-34.10/GOST-R-34.11-94"},
   48|      1|      {"1.2.643.2.2.35.1", "gost_256A"},
   49|      1|      {"1.2.643.2.2.36.0", "gost_256A"},
   50|      1|      {"1.2.643.3.131.1.1", "GOST.INN"},
   51|      1|      {"1.2.643.7.1.1.1.1", "GOST-34.10-2012-256"},
   52|      1|      {"1.2.643.7.1.1.1.2", "GOST-34.10-2012-512"},
   53|      1|      {"1.2.643.7.1.1.2.2", "Streebog-256"},
   54|      1|      {"1.2.643.7.1.1.2.3", "Streebog-512"},
   55|      1|      {"1.2.643.7.1.1.3.2", "GOST-34.10-2012-256/Streebog-256"},
   56|      1|      {"1.2.643.7.1.1.3.3", "GOST-34.10-2012-512/Streebog-512"},
   57|      1|      {"1.2.643.7.1.2.1.1.1", "gost_256A"},
   58|      1|      {"1.2.643.7.1.2.1.1.2", "gost_256B"},
   59|      1|      {"1.2.643.7.1.2.1.2.1", "gost_512A"},
   60|      1|      {"1.2.643.7.1.2.1.2.2", "gost_512B"},
   61|      1|      {"1.2.840.10040.4.1", "DSA"},
   62|      1|      {"1.2.840.10040.4.3", "DSA/SHA-1"},
   63|      1|      {"1.2.840.10045.2.1", "ECDSA"},
   64|      1|      {"1.2.840.10045.3.1.1", "secp192r1"},
   65|      1|      {"1.2.840.10045.3.1.2", "x962_p192v2"},
   66|      1|      {"1.2.840.10045.3.1.3", "x962_p192v3"},
   67|      1|      {"1.2.840.10045.3.1.4", "x962_p239v1"},
   68|      1|      {"1.2.840.10045.3.1.5", "x962_p239v2"},
   69|      1|      {"1.2.840.10045.3.1.6", "x962_p239v3"},
   70|      1|      {"1.2.840.10045.3.1.7", "secp256r1"},
   71|      1|      {"1.2.840.10045.4.1", "ECDSA/SHA-1"},
   72|      1|      {"1.2.840.10045.4.3.1", "ECDSA/SHA-224"},
   73|      1|      {"1.2.840.10045.4.3.2", "ECDSA/SHA-256"},
   74|      1|      {"1.2.840.10045.4.3.3", "ECDSA/SHA-384"},
   75|      1|      {"1.2.840.10045.4.3.4", "ECDSA/SHA-512"},
   76|      1|      {"1.2.840.10046.2.1", "DH"},
   77|      1|      {"1.2.840.113533.7.66.10", "CAST-128/CBC"},
   78|      1|      {"1.2.840.113533.7.66.15", "KeyWrap.CAST-128"},
   79|      1|      {"1.2.840.113549.1.1.1", "RSA"},
   80|      1|      {"1.2.840.113549.1.1.10", "RSA/EMSA4"},
   81|      1|      {"1.2.840.113549.1.1.11", "RSA/EMSA3(SHA-256)"},
   82|      1|      {"1.2.840.113549.1.1.12", "RSA/EMSA3(SHA-384)"},
   83|      1|      {"1.2.840.113549.1.1.13", "RSA/EMSA3(SHA-512)"},
   84|      1|      {"1.2.840.113549.1.1.14", "RSA/EMSA3(SHA-224)"},
   85|      1|      {"1.2.840.113549.1.1.16", "RSA/EMSA3(SHA-512-256)"},
   86|      1|      {"1.2.840.113549.1.1.4", "RSA/EMSA3(MD5)"},
   87|      1|      {"1.2.840.113549.1.1.5", "RSA/EMSA3(SHA-1)"},
   88|      1|      {"1.2.840.113549.1.1.7", "RSA/OAEP"},
   89|      1|      {"1.2.840.113549.1.1.8", "MGF1"},
   90|      1|      {"1.2.840.113549.1.5.12", "PKCS5.PBKDF2"},
   91|      1|      {"1.2.840.113549.1.5.13", "PBE-PKCS5v20"},
   92|      1|      {"1.2.840.113549.1.9.1", "PKCS9.EmailAddress"},
   93|      1|      {"1.2.840.113549.1.9.14", "PKCS9.ExtensionRequest"},
   94|      1|      {"1.2.840.113549.1.9.16.3.18", "ChaCha20Poly1305"},
   95|      1|      {"1.2.840.113549.1.9.16.3.6", "KeyWrap.TripleDES"},
   96|      1|      {"1.2.840.113549.1.9.16.3.8", "Compression.Zlib"},
   97|      1|      {"1.2.840.113549.1.9.2", "PKCS9.UnstructuredName"},
   98|      1|      {"1.2.840.113549.1.9.3", "PKCS9.ContentType"},
   99|      1|      {"1.2.840.113549.1.9.4", "PKCS9.MessageDigest"},
  100|      1|      {"1.2.840.113549.1.9.7", "PKCS9.ChallengePassword"},
  101|      1|      {"1.2.840.113549.2.10", "HMAC(SHA-384)"},
  102|      1|      {"1.2.840.113549.2.11", "HMAC(SHA-512)"},
  103|      1|      {"1.2.840.113549.2.13", "HMAC(SHA-512-256)"},
  104|      1|      {"1.2.840.113549.2.5", "MD5"},
  105|      1|      {"1.2.840.113549.2.7", "HMAC(SHA-1)"},
  106|      1|      {"1.2.840.113549.2.8", "HMAC(SHA-224)"},
  107|      1|      {"1.2.840.113549.2.9", "HMAC(SHA-256)"},
  108|      1|      {"1.2.840.113549.3.7", "TripleDES/CBC"},
  109|      1|      {"1.3.101.110", "Curve25519"},
  110|      1|      {"1.3.101.112", "Ed25519"},
  111|      1|      {"1.3.132.0.10", "secp256k1"},
  112|      1|      {"1.3.132.0.30", "secp160r2"},
  113|      1|      {"1.3.132.0.31", "secp192k1"},
  114|      1|      {"1.3.132.0.32", "secp224k1"},
  115|      1|      {"1.3.132.0.33", "secp224r1"},
  116|      1|      {"1.3.132.0.34", "secp384r1"},
  117|      1|      {"1.3.132.0.35", "secp521r1"},
  118|      1|      {"1.3.132.0.8", "secp160r1"},
  119|      1|      {"1.3.132.0.9", "secp160k1"},
  120|      1|      {"1.3.132.1.12", "ECDH"},
  121|      1|      {"1.3.14.3.2.26", "SHA-1"},
  122|      1|      {"1.3.14.3.2.7", "DES/CBC"},
  123|      1|      {"1.3.36.3.2.1", "RIPEMD-160"},
  124|      1|      {"1.3.36.3.3.1.2", "RSA/EMSA3(RIPEMD-160)"},
  125|      1|      {"1.3.36.3.3.2.5.2.1", "ECGDSA"},
  126|      1|      {"1.3.36.3.3.2.5.4.1", "ECGDSA/RIPEMD-160"},
  127|      1|      {"1.3.36.3.3.2.5.4.2", "ECGDSA/SHA-1"},
  128|      1|      {"1.3.36.3.3.2.5.4.3", "ECGDSA/SHA-224"},
  129|      1|      {"1.3.36.3.3.2.5.4.4", "ECGDSA/SHA-256"},
  130|      1|      {"1.3.36.3.3.2.5.4.5", "ECGDSA/SHA-384"},
  131|      1|      {"1.3.36.3.3.2.5.4.6", "ECGDSA/SHA-512"},
  132|      1|      {"1.3.36.3.3.2.8.1.1.1", "brainpool160r1"},
  133|      1|      {"1.3.36.3.3.2.8.1.1.11", "brainpool384r1"},
  134|      1|      {"1.3.36.3.3.2.8.1.1.13", "brainpool512r1"},
  135|      1|      {"1.3.36.3.3.2.8.1.1.3", "brainpool192r1"},
  136|      1|      {"1.3.36.3.3.2.8.1.1.5", "brainpool224r1"},
  137|      1|      {"1.3.36.3.3.2.8.1.1.7", "brainpool256r1"},
  138|      1|      {"1.3.36.3.3.2.8.1.1.9", "brainpool320r1"},
  139|      1|      {"1.3.6.1.4.1.11591.15.1", "OpenPGP.Ed25519"},
  140|      1|      {"1.3.6.1.4.1.11591.4.11", "Scrypt"},
  141|      1|      {"1.3.6.1.4.1.25258.1.10.1", "Dilithium-4x4-AES-r3"},
  142|      1|      {"1.3.6.1.4.1.25258.1.10.2", "Dilithium-6x5-AES-r3"},
  143|      1|      {"1.3.6.1.4.1.25258.1.10.3", "Dilithium-8x7-AES-r3"},
  144|      1|      {"1.3.6.1.4.1.25258.1.11.1", "Kyber-512-90s-r3"},
  145|      1|      {"1.3.6.1.4.1.25258.1.11.2", "Kyber-768-90s-r3"},
  146|      1|      {"1.3.6.1.4.1.25258.1.11.3", "Kyber-1024-90s-r3"},
  147|      1|      {"1.3.6.1.4.1.25258.1.3", "McEliece"},
  148|      1|      {"1.3.6.1.4.1.25258.1.5", "XMSS-draft6"},
  149|      1|      {"1.3.6.1.4.1.25258.1.6.1", "GOST-34.10-2012-256/SHA-256"},
  150|      1|      {"1.3.6.1.4.1.25258.1.7.1", "Kyber-512-r3"},
  151|      1|      {"1.3.6.1.4.1.25258.1.7.2", "Kyber-768-r3"},
  152|      1|      {"1.3.6.1.4.1.25258.1.7.3", "Kyber-1024-r3"},
  153|      1|      {"1.3.6.1.4.1.25258.1.8", "XMSS-draft12"},
  154|      1|      {"1.3.6.1.4.1.25258.1.9.1", "Dilithium-4x4-r3"},
  155|      1|      {"1.3.6.1.4.1.25258.1.9.2", "Dilithium-6x5-r3"},
  156|      1|      {"1.3.6.1.4.1.25258.1.9.3", "Dilithium-8x7-r3"},
  157|      1|      {"1.3.6.1.4.1.25258.3.1", "Serpent/CBC"},
  158|      1|      {"1.3.6.1.4.1.25258.3.101", "Serpent/GCM"},
  159|      1|      {"1.3.6.1.4.1.25258.3.102", "Twofish/GCM"},
  160|      1|      {"1.3.6.1.4.1.25258.3.2", "Threefish-512/CBC"},
  161|      1|      {"1.3.6.1.4.1.25258.3.2.1", "AES-128/OCB"},
  162|      1|      {"1.3.6.1.4.1.25258.3.2.2", "AES-192/OCB"},
  163|      1|      {"1.3.6.1.4.1.25258.3.2.3", "AES-256/OCB"},
  164|      1|      {"1.3.6.1.4.1.25258.3.2.4", "Serpent/OCB"},
  165|      1|      {"1.3.6.1.4.1.25258.3.2.5", "Twofish/OCB"},
  166|      1|      {"1.3.6.1.4.1.25258.3.2.6", "Camellia-128/OCB"},
  167|      1|      {"1.3.6.1.4.1.25258.3.2.7", "Camellia-192/OCB"},
  168|      1|      {"1.3.6.1.4.1.25258.3.2.8", "Camellia-256/OCB"},
  169|      1|      {"1.3.6.1.4.1.25258.3.3", "Twofish/CBC"},
  170|      1|      {"1.3.6.1.4.1.25258.3.4.1", "AES-128/SIV"},
  171|      1|      {"1.3.6.1.4.1.25258.3.4.2", "AES-192/SIV"},
  172|      1|      {"1.3.6.1.4.1.25258.3.4.3", "AES-256/SIV"},
  173|      1|      {"1.3.6.1.4.1.25258.3.4.4", "Serpent/SIV"},
  174|      1|      {"1.3.6.1.4.1.25258.3.4.5", "Twofish/SIV"},
  175|      1|      {"1.3.6.1.4.1.25258.3.4.6", "Camellia-128/SIV"},
  176|      1|      {"1.3.6.1.4.1.25258.3.4.7", "Camellia-192/SIV"},
  177|      1|      {"1.3.6.1.4.1.25258.3.4.8", "Camellia-256/SIV"},
  178|      1|      {"1.3.6.1.4.1.25258.3.4.9", "SM4/SIV"},
  179|      1|      {"1.3.6.1.4.1.3029.1.2.1", "ElGamal"},
  180|      1|      {"1.3.6.1.4.1.3029.1.5.1", "OpenPGP.Curve25519"},
  181|      1|      {"1.3.6.1.4.1.311.20.2.2", "Microsoft SmartcardLogon"},
  182|      1|      {"1.3.6.1.4.1.311.20.2.3", "Microsoft UPN"},
  183|      1|      {"1.3.6.1.4.1.8301.3.1.2.9.0.38", "secp521r1"},
  184|      1|      {"1.3.6.1.5.5.7.1.1", "PKIX.AuthorityInformationAccess"},
  185|      1|      {"1.3.6.1.5.5.7.3.1", "PKIX.ServerAuth"},
  186|      1|      {"1.3.6.1.5.5.7.3.2", "PKIX.ClientAuth"},
  187|      1|      {"1.3.6.1.5.5.7.3.3", "PKIX.CodeSigning"},
  188|      1|      {"1.3.6.1.5.5.7.3.4", "PKIX.EmailProtection"},
  189|      1|      {"1.3.6.1.5.5.7.3.5", "PKIX.IPsecEndSystem"},
  190|      1|      {"1.3.6.1.5.5.7.3.6", "PKIX.IPsecTunnel"},
  191|      1|      {"1.3.6.1.5.5.7.3.7", "PKIX.IPsecUser"},
  192|      1|      {"1.3.6.1.5.5.7.3.8", "PKIX.TimeStamping"},
  193|      1|      {"1.3.6.1.5.5.7.3.9", "PKIX.OCSPSigning"},
  194|      1|      {"1.3.6.1.5.5.7.48.1", "PKIX.OCSP"},
  195|      1|      {"1.3.6.1.5.5.7.48.1.1", "PKIX.OCSP.BasicResponse"},
  196|      1|      {"1.3.6.1.5.5.7.48.1.5", "PKIX.OCSP.NoCheck"},
  197|      1|      {"1.3.6.1.5.5.7.48.2", "PKIX.CertificateAuthorityIssuers"},
  198|      1|      {"1.3.6.1.5.5.7.8.5", "PKIX.XMPPAddr"},
  199|      1|      {"2.16.840.1.101.3.4.1.2", "AES-128/CBC"},
  200|      1|      {"2.16.840.1.101.3.4.1.22", "AES-192/CBC"},
  201|      1|      {"2.16.840.1.101.3.4.1.25", "KeyWrap.AES-192"},
  202|      1|      {"2.16.840.1.101.3.4.1.26", "AES-192/GCM"},
  203|      1|      {"2.16.840.1.101.3.4.1.27", "AES-192/CCM"},
  204|      1|      {"2.16.840.1.101.3.4.1.42", "AES-256/CBC"},
  205|      1|      {"2.16.840.1.101.3.4.1.45", "KeyWrap.AES-256"},
  206|      1|      {"2.16.840.1.101.3.4.1.46", "AES-256/GCM"},
  207|      1|      {"2.16.840.1.101.3.4.1.47", "AES-256/CCM"},
  208|      1|      {"2.16.840.1.101.3.4.1.5", "KeyWrap.AES-128"},
  209|      1|      {"2.16.840.1.101.3.4.1.6", "AES-128/GCM"},
  210|      1|      {"2.16.840.1.101.3.4.1.7", "AES-128/CCM"},
  211|      1|      {"2.16.840.1.101.3.4.2.1", "SHA-256"},
  212|      1|      {"2.16.840.1.101.3.4.2.10", "SHA-3(512)"},
  213|      1|      {"2.16.840.1.101.3.4.2.11", "SHAKE-128"},
  214|      1|      {"2.16.840.1.101.3.4.2.12", "SHAKE-256"},
  215|      1|      {"2.16.840.1.101.3.4.2.2", "SHA-384"},
  216|      1|      {"2.16.840.1.101.3.4.2.3", "SHA-512"},
  217|      1|      {"2.16.840.1.101.3.4.2.4", "SHA-224"},
  218|      1|      {"2.16.840.1.101.3.4.2.6", "SHA-512-256"},
  219|      1|      {"2.16.840.1.101.3.4.2.7", "SHA-3(224)"},
  220|      1|      {"2.16.840.1.101.3.4.2.8", "SHA-3(256)"},
  221|      1|      {"2.16.840.1.101.3.4.2.9", "SHA-3(384)"},
  222|      1|      {"2.16.840.1.101.3.4.3.1", "DSA/SHA-224"},
  223|      1|      {"2.16.840.1.101.3.4.3.10", "ECDSA/SHA-3(256)"},
  224|      1|      {"2.16.840.1.101.3.4.3.11", "ECDSA/SHA-3(384)"},
  225|      1|      {"2.16.840.1.101.3.4.3.12", "ECDSA/SHA-3(512)"},
  226|      1|      {"2.16.840.1.101.3.4.3.13", "RSA/EMSA3(SHA-3(224))"},
  227|      1|      {"2.16.840.1.101.3.4.3.14", "RSA/EMSA3(SHA-3(256))"},
  228|      1|      {"2.16.840.1.101.3.4.3.15", "RSA/EMSA3(SHA-3(384))"},
  229|      1|      {"2.16.840.1.101.3.4.3.16", "RSA/EMSA3(SHA-3(512))"},
  230|      1|      {"2.16.840.1.101.3.4.3.2", "DSA/SHA-256"},
  231|      1|      {"2.16.840.1.101.3.4.3.3", "DSA/SHA-384"},
  232|      1|      {"2.16.840.1.101.3.4.3.4", "DSA/SHA-512"},
  233|      1|      {"2.16.840.1.101.3.4.3.5", "DSA/SHA-3(224)"},
  234|      1|      {"2.16.840.1.101.3.4.3.6", "DSA/SHA-3(256)"},
  235|      1|      {"2.16.840.1.101.3.4.3.7", "DSA/SHA-3(384)"},
  236|      1|      {"2.16.840.1.101.3.4.3.8", "DSA/SHA-3(512)"},
  237|      1|      {"2.16.840.1.101.3.4.3.9", "ECDSA/SHA-3(224)"},
  238|      1|      {"2.16.840.1.113730.1.13", "Certificate Comment"},
  239|      1|      {"2.5.29.14", "X509v3.SubjectKeyIdentifier"},
  240|      1|      {"2.5.29.15", "X509v3.KeyUsage"},
  241|      1|      {"2.5.29.16", "X509v3.PrivateKeyUsagePeriod"},
  242|      1|      {"2.5.29.17", "X509v3.SubjectAlternativeName"},
  243|      1|      {"2.5.29.18", "X509v3.IssuerAlternativeName"},
  244|      1|      {"2.5.29.19", "X509v3.BasicConstraints"},
  245|      1|      {"2.5.29.20", "X509v3.CRLNumber"},
  246|      1|      {"2.5.29.21", "X509v3.ReasonCode"},
  247|      1|      {"2.5.29.23", "X509v3.HoldInstructionCode"},
  248|      1|      {"2.5.29.24", "X509v3.InvalidityDate"},
  249|      1|      {"2.5.29.28", "X509v3.CRLIssuingDistributionPoint"},
  250|      1|      {"2.5.29.30", "X509v3.NameConstraints"},
  251|      1|      {"2.5.29.31", "X509v3.CRLDistributionPoints"},
  252|      1|      {"2.5.29.32", "X509v3.CertificatePolicies"},
  253|      1|      {"2.5.29.32.0", "X509v3.AnyPolicy"},
  254|      1|      {"2.5.29.35", "X509v3.AuthorityKeyIdentifier"},
  255|      1|      {"2.5.29.36", "X509v3.PolicyConstraints"},
  256|      1|      {"2.5.29.37", "X509v3.ExtendedKeyUsage"},
  257|      1|      {"2.5.4.10", "X520.Organization"},
  258|      1|      {"2.5.4.11", "X520.OrganizationalUnit"},
  259|      1|      {"2.5.4.12", "X520.Title"},
  260|      1|      {"2.5.4.3", "X520.CommonName"},
  261|      1|      {"2.5.4.4", "X520.Surname"},
  262|      1|      {"2.5.4.42", "X520.GivenName"},
  263|      1|      {"2.5.4.43", "X520.Initials"},
  264|      1|      {"2.5.4.44", "X520.GenerationalQualifier"},
  265|      1|      {"2.5.4.46", "X520.DNQualifier"},
  266|      1|      {"2.5.4.5", "X520.SerialNumber"},
  267|      1|      {"2.5.4.6", "X520.Country"},
  268|      1|      {"2.5.4.65", "X520.Pseudonym"},
  269|      1|      {"2.5.4.7", "X520.Locality"},
  270|      1|      {"2.5.4.8", "X520.State"},
  271|      1|      {"2.5.4.9", "X520.StreetAddress"},
  272|      1|      {"2.5.8.1.1", "RSA"}};
  273|      1|}
_ZN5Botan7OID_Map16load_str2oid_mapEv:
  275|      1|std::unordered_map<std::string, OID> OID_Map::load_str2oid_map() {
  276|      1|   return std::unordered_map<std::string, OID>{
  277|       |
  278|      1|      {"AES-128/CBC", OID({2, 16, 840, 1, 101, 3, 4, 1, 2})},
  279|      1|      {"AES-128/CCM", OID({2, 16, 840, 1, 101, 3, 4, 1, 7})},
  280|      1|      {"AES-128/GCM", OID({2, 16, 840, 1, 101, 3, 4, 1, 6})},
  281|      1|      {"AES-128/OCB", OID({1, 3, 6, 1, 4, 1, 25258, 3, 2, 1})},
  282|      1|      {"AES-128/SIV", OID({1, 3, 6, 1, 4, 1, 25258, 3, 4, 1})},
  283|      1|      {"AES-192/CBC", OID({2, 16, 840, 1, 101, 3, 4, 1, 22})},
  284|      1|      {"AES-192/CCM", OID({2, 16, 840, 1, 101, 3, 4, 1, 27})},
  285|      1|      {"AES-192/GCM", OID({2, 16, 840, 1, 101, 3, 4, 1, 26})},
  286|      1|      {"AES-192/OCB", OID({1, 3, 6, 1, 4, 1, 25258, 3, 2, 2})},
  287|      1|      {"AES-192/SIV", OID({1, 3, 6, 1, 4, 1, 25258, 3, 4, 2})},
  288|      1|      {"AES-256/CBC", OID({2, 16, 840, 1, 101, 3, 4, 1, 42})},
  289|      1|      {"AES-256/CCM", OID({2, 16, 840, 1, 101, 3, 4, 1, 47})},
  290|      1|      {"AES-256/GCM", OID({2, 16, 840, 1, 101, 3, 4, 1, 46})},
  291|      1|      {"AES-256/OCB", OID({1, 3, 6, 1, 4, 1, 25258, 3, 2, 3})},
  292|      1|      {"AES-256/SIV", OID({1, 3, 6, 1, 4, 1, 25258, 3, 4, 3})},
  293|      1|      {"CAST-128/CBC", OID({1, 2, 840, 113533, 7, 66, 10})},
  294|      1|      {"Camellia-128/CBC", OID({1, 2, 392, 200011, 61, 1, 1, 1, 2})},
  295|      1|      {"Camellia-128/GCM", OID({0, 3, 4401, 5, 3, 1, 9, 6})},
  296|      1|      {"Camellia-128/OCB", OID({1, 3, 6, 1, 4, 1, 25258, 3, 2, 6})},
  297|      1|      {"Camellia-128/SIV", OID({1, 3, 6, 1, 4, 1, 25258, 3, 4, 6})},
  298|      1|      {"Camellia-192/CBC", OID({1, 2, 392, 200011, 61, 1, 1, 1, 3})},
  299|      1|      {"Camellia-192/GCM", OID({0, 3, 4401, 5, 3, 1, 9, 26})},
  300|      1|      {"Camellia-192/OCB", OID({1, 3, 6, 1, 4, 1, 25258, 3, 2, 7})},
  301|      1|      {"Camellia-192/SIV", OID({1, 3, 6, 1, 4, 1, 25258, 3, 4, 7})},
  302|      1|      {"Camellia-256/CBC", OID({1, 2, 392, 200011, 61, 1, 1, 1, 4})},
  303|      1|      {"Camellia-256/GCM", OID({0, 3, 4401, 5, 3, 1, 9, 46})},
  304|      1|      {"Camellia-256/OCB", OID({1, 3, 6, 1, 4, 1, 25258, 3, 2, 8})},
  305|      1|      {"Camellia-256/SIV", OID({1, 3, 6, 1, 4, 1, 25258, 3, 4, 8})},
  306|      1|      {"Certificate Comment", OID({2, 16, 840, 1, 113730, 1, 13})},
  307|      1|      {"ChaCha20Poly1305", OID({1, 2, 840, 113549, 1, 9, 16, 3, 18})},
  308|      1|      {"Compression.Zlib", OID({1, 2, 840, 113549, 1, 9, 16, 3, 8})},
  309|      1|      {"Curve25519", OID({1, 3, 101, 110})},
  310|      1|      {"DES/CBC", OID({1, 3, 14, 3, 2, 7})},
  311|      1|      {"DH", OID({1, 2, 840, 10046, 2, 1})},
  312|      1|      {"DSA", OID({1, 2, 840, 10040, 4, 1})},
  313|      1|      {"DSA/SHA-1", OID({1, 2, 840, 10040, 4, 3})},
  314|      1|      {"DSA/SHA-224", OID({2, 16, 840, 1, 101, 3, 4, 3, 1})},
  315|      1|      {"DSA/SHA-256", OID({2, 16, 840, 1, 101, 3, 4, 3, 2})},
  316|      1|      {"DSA/SHA-3(224)", OID({2, 16, 840, 1, 101, 3, 4, 3, 5})},
  317|      1|      {"DSA/SHA-3(256)", OID({2, 16, 840, 1, 101, 3, 4, 3, 6})},
  318|      1|      {"DSA/SHA-3(384)", OID({2, 16, 840, 1, 101, 3, 4, 3, 7})},
  319|      1|      {"DSA/SHA-3(512)", OID({2, 16, 840, 1, 101, 3, 4, 3, 8})},
  320|      1|      {"DSA/SHA-384", OID({2, 16, 840, 1, 101, 3, 4, 3, 3})},
  321|      1|      {"DSA/SHA-512", OID({2, 16, 840, 1, 101, 3, 4, 3, 4})},
  322|      1|      {"Dilithium-4x4-AES-r3", OID({1, 3, 6, 1, 4, 1, 25258, 1, 10, 1})},
  323|      1|      {"Dilithium-4x4-r3", OID({1, 3, 6, 1, 4, 1, 25258, 1, 9, 1})},
  324|      1|      {"Dilithium-6x5-AES-r3", OID({1, 3, 6, 1, 4, 1, 25258, 1, 10, 2})},
  325|      1|      {"Dilithium-6x5-r3", OID({1, 3, 6, 1, 4, 1, 25258, 1, 9, 2})},
  326|      1|      {"Dilithium-8x7-AES-r3", OID({1, 3, 6, 1, 4, 1, 25258, 1, 10, 3})},
  327|      1|      {"Dilithium-8x7-r3", OID({1, 3, 6, 1, 4, 1, 25258, 1, 9, 3})},
  328|      1|      {"ECDH", OID({1, 3, 132, 1, 12})},
  329|      1|      {"ECDSA", OID({1, 2, 840, 10045, 2, 1})},
  330|      1|      {"ECDSA/SHA-1", OID({1, 2, 840, 10045, 4, 1})},
  331|      1|      {"ECDSA/SHA-224", OID({1, 2, 840, 10045, 4, 3, 1})},
  332|      1|      {"ECDSA/SHA-256", OID({1, 2, 840, 10045, 4, 3, 2})},
  333|      1|      {"ECDSA/SHA-3(224)", OID({2, 16, 840, 1, 101, 3, 4, 3, 9})},
  334|      1|      {"ECDSA/SHA-3(256)", OID({2, 16, 840, 1, 101, 3, 4, 3, 10})},
  335|      1|      {"ECDSA/SHA-3(384)", OID({2, 16, 840, 1, 101, 3, 4, 3, 11})},
  336|      1|      {"ECDSA/SHA-3(512)", OID({2, 16, 840, 1, 101, 3, 4, 3, 12})},
  337|      1|      {"ECDSA/SHA-384", OID({1, 2, 840, 10045, 4, 3, 3})},
  338|      1|      {"ECDSA/SHA-512", OID({1, 2, 840, 10045, 4, 3, 4})},
  339|      1|      {"ECGDSA", OID({1, 3, 36, 3, 3, 2, 5, 2, 1})},
  340|      1|      {"ECGDSA/RIPEMD-160", OID({1, 3, 36, 3, 3, 2, 5, 4, 1})},
  341|      1|      {"ECGDSA/SHA-1", OID({1, 3, 36, 3, 3, 2, 5, 4, 2})},
  342|      1|      {"ECGDSA/SHA-224", OID({1, 3, 36, 3, 3, 2, 5, 4, 3})},
  343|      1|      {"ECGDSA/SHA-256", OID({1, 3, 36, 3, 3, 2, 5, 4, 4})},
  344|      1|      {"ECGDSA/SHA-384", OID({1, 3, 36, 3, 3, 2, 5, 4, 5})},
  345|      1|      {"ECGDSA/SHA-512", OID({1, 3, 36, 3, 3, 2, 5, 4, 6})},
  346|      1|      {"ECKCDSA", OID({1, 0, 14888, 3, 0, 5})},
  347|      1|      {"ECKCDSA/SHA-1", OID({1, 2, 410, 200004, 1, 100, 4, 3})},
  348|      1|      {"ECKCDSA/SHA-224", OID({1, 2, 410, 200004, 1, 100, 4, 4})},
  349|      1|      {"ECKCDSA/SHA-256", OID({1, 2, 410, 200004, 1, 100, 4, 5})},
  350|      1|      {"Ed25519", OID({1, 3, 101, 112})},
  351|      1|      {"ElGamal", OID({1, 3, 6, 1, 4, 1, 3029, 1, 2, 1})},
  352|      1|      {"GOST-34.10", OID({1, 2, 643, 2, 2, 19})},
  353|      1|      {"GOST-34.10-2012-256", OID({1, 2, 643, 7, 1, 1, 1, 1})},
  354|      1|      {"GOST-34.10-2012-256/SHA-256", OID({1, 3, 6, 1, 4, 1, 25258, 1, 6, 1})},
  355|      1|      {"GOST-34.10-2012-256/Streebog-256", OID({1, 2, 643, 7, 1, 1, 3, 2})},
  356|      1|      {"GOST-34.10-2012-512", OID({1, 2, 643, 7, 1, 1, 1, 2})},
  357|      1|      {"GOST-34.10-2012-512/Streebog-512", OID({1, 2, 643, 7, 1, 1, 3, 3})},
  358|      1|      {"GOST-34.10/GOST-R-34.11-94", OID({1, 2, 643, 2, 2, 3})},
  359|      1|      {"GOST.INN", OID({1, 2, 643, 3, 131, 1, 1})},
  360|      1|      {"GOST.IssuerSigningTool", OID({1, 2, 643, 100, 112})},
  361|      1|      {"GOST.OGRN", OID({1, 2, 643, 100, 1})},
  362|      1|      {"GOST.SubjectSigningTool", OID({1, 2, 643, 100, 111})},
  363|      1|      {"HMAC(SHA-1)", OID({1, 2, 840, 113549, 2, 7})},
  364|      1|      {"HMAC(SHA-224)", OID({1, 2, 840, 113549, 2, 8})},
  365|      1|      {"HMAC(SHA-256)", OID({1, 2, 840, 113549, 2, 9})},
  366|      1|      {"HMAC(SHA-384)", OID({1, 2, 840, 113549, 2, 10})},
  367|      1|      {"HMAC(SHA-512)", OID({1, 2, 840, 113549, 2, 11})},
  368|      1|      {"HMAC(SHA-512-256)", OID({1, 2, 840, 113549, 2, 13})},
  369|      1|      {"KeyWrap.AES-128", OID({2, 16, 840, 1, 101, 3, 4, 1, 5})},
  370|      1|      {"KeyWrap.AES-192", OID({2, 16, 840, 1, 101, 3, 4, 1, 25})},
  371|      1|      {"KeyWrap.AES-256", OID({2, 16, 840, 1, 101, 3, 4, 1, 45})},
  372|      1|      {"KeyWrap.CAST-128", OID({1, 2, 840, 113533, 7, 66, 15})},
  373|      1|      {"KeyWrap.TripleDES", OID({1, 2, 840, 113549, 1, 9, 16, 3, 6})},
  374|      1|      {"Kyber-1024-90s-r3", OID({1, 3, 6, 1, 4, 1, 25258, 1, 11, 3})},
  375|      1|      {"Kyber-1024-r3", OID({1, 3, 6, 1, 4, 1, 25258, 1, 7, 3})},
  376|      1|      {"Kyber-512-90s-r3", OID({1, 3, 6, 1, 4, 1, 25258, 1, 11, 1})},
  377|      1|      {"Kyber-512-r3", OID({1, 3, 6, 1, 4, 1, 25258, 1, 7, 1})},
  378|      1|      {"Kyber-768-90s-r3", OID({1, 3, 6, 1, 4, 1, 25258, 1, 11, 2})},
  379|      1|      {"Kyber-768-r3", OID({1, 3, 6, 1, 4, 1, 25258, 1, 7, 2})},
  380|      1|      {"MD5", OID({1, 2, 840, 113549, 2, 5})},
  381|      1|      {"MGF1", OID({1, 2, 840, 113549, 1, 1, 8})},
  382|      1|      {"McEliece", OID({1, 3, 6, 1, 4, 1, 25258, 1, 3})},
  383|      1|      {"Microsoft SmartcardLogon", OID({1, 3, 6, 1, 4, 1, 311, 20, 2, 2})},
  384|      1|      {"Microsoft UPN", OID({1, 3, 6, 1, 4, 1, 311, 20, 2, 3})},
  385|      1|      {"OpenPGP.Curve25519", OID({1, 3, 6, 1, 4, 1, 3029, 1, 5, 1})},
  386|      1|      {"OpenPGP.Ed25519", OID({1, 3, 6, 1, 4, 1, 11591, 15, 1})},
  387|      1|      {"PBE-PKCS5v20", OID({1, 2, 840, 113549, 1, 5, 13})},
  388|      1|      {"PBES2", OID({1, 2, 840, 113549, 1, 5, 13})},
  389|      1|      {"PKCS5.PBKDF2", OID({1, 2, 840, 113549, 1, 5, 12})},
  390|      1|      {"PKCS9.ChallengePassword", OID({1, 2, 840, 113549, 1, 9, 7})},
  391|      1|      {"PKCS9.ContentType", OID({1, 2, 840, 113549, 1, 9, 3})},
  392|      1|      {"PKCS9.EmailAddress", OID({1, 2, 840, 113549, 1, 9, 1})},
  393|      1|      {"PKCS9.ExtensionRequest", OID({1, 2, 840, 113549, 1, 9, 14})},
  394|      1|      {"PKCS9.MessageDigest", OID({1, 2, 840, 113549, 1, 9, 4})},
  395|      1|      {"PKCS9.UnstructuredName", OID({1, 2, 840, 113549, 1, 9, 2})},
  396|      1|      {"PKIX.AuthorityInformationAccess", OID({1, 3, 6, 1, 5, 5, 7, 1, 1})},
  397|      1|      {"PKIX.CertificateAuthorityIssuers", OID({1, 3, 6, 1, 5, 5, 7, 48, 2})},
  398|      1|      {"PKIX.ClientAuth", OID({1, 3, 6, 1, 5, 5, 7, 3, 2})},
  399|      1|      {"PKIX.CodeSigning", OID({1, 3, 6, 1, 5, 5, 7, 3, 3})},
  400|      1|      {"PKIX.EmailProtection", OID({1, 3, 6, 1, 5, 5, 7, 3, 4})},
  401|      1|      {"PKIX.IPsecEndSystem", OID({1, 3, 6, 1, 5, 5, 7, 3, 5})},
  402|      1|      {"PKIX.IPsecTunnel", OID({1, 3, 6, 1, 5, 5, 7, 3, 6})},
  403|      1|      {"PKIX.IPsecUser", OID({1, 3, 6, 1, 5, 5, 7, 3, 7})},
  404|      1|      {"PKIX.OCSP", OID({1, 3, 6, 1, 5, 5, 7, 48, 1})},
  405|      1|      {"PKIX.OCSP.BasicResponse", OID({1, 3, 6, 1, 5, 5, 7, 48, 1, 1})},
  406|      1|      {"PKIX.OCSP.NoCheck", OID({1, 3, 6, 1, 5, 5, 7, 48, 1, 5})},
  407|      1|      {"PKIX.OCSPSigning", OID({1, 3, 6, 1, 5, 5, 7, 3, 9})},
  408|      1|      {"PKIX.ServerAuth", OID({1, 3, 6, 1, 5, 5, 7, 3, 1})},
  409|      1|      {"PKIX.TimeStamping", OID({1, 3, 6, 1, 5, 5, 7, 3, 8})},
  410|      1|      {"PKIX.XMPPAddr", OID({1, 3, 6, 1, 5, 5, 7, 8, 5})},
  411|      1|      {"RIPEMD-160", OID({1, 3, 36, 3, 2, 1})},
  412|      1|      {"RSA", OID({1, 2, 840, 113549, 1, 1, 1})},
  413|      1|      {"RSA/EMSA3(MD5)", OID({1, 2, 840, 113549, 1, 1, 4})},
  414|      1|      {"RSA/EMSA3(RIPEMD-160)", OID({1, 3, 36, 3, 3, 1, 2})},
  415|      1|      {"RSA/EMSA3(SHA-1)", OID({1, 2, 840, 113549, 1, 1, 5})},
  416|      1|      {"RSA/EMSA3(SHA-224)", OID({1, 2, 840, 113549, 1, 1, 14})},
  417|      1|      {"RSA/EMSA3(SHA-256)", OID({1, 2, 840, 113549, 1, 1, 11})},
  418|      1|      {"RSA/EMSA3(SHA-3(224))", OID({2, 16, 840, 1, 101, 3, 4, 3, 13})},
  419|      1|      {"RSA/EMSA3(SHA-3(256))", OID({2, 16, 840, 1, 101, 3, 4, 3, 14})},
  420|      1|      {"RSA/EMSA3(SHA-3(384))", OID({2, 16, 840, 1, 101, 3, 4, 3, 15})},
  421|      1|      {"RSA/EMSA3(SHA-3(512))", OID({2, 16, 840, 1, 101, 3, 4, 3, 16})},
  422|      1|      {"RSA/EMSA3(SHA-384)", OID({1, 2, 840, 113549, 1, 1, 12})},
  423|      1|      {"RSA/EMSA3(SHA-512)", OID({1, 2, 840, 113549, 1, 1, 13})},
  424|      1|      {"RSA/EMSA3(SHA-512-256)", OID({1, 2, 840, 113549, 1, 1, 16})},
  425|      1|      {"RSA/EMSA3(SM3)", OID({1, 2, 156, 10197, 1, 504})},
  426|      1|      {"RSA/EMSA4", OID({1, 2, 840, 113549, 1, 1, 10})},
  427|      1|      {"RSA/OAEP", OID({1, 2, 840, 113549, 1, 1, 7})},
  428|      1|      {"SEED/CBC", OID({1, 2, 410, 200004, 1, 4})},
  429|      1|      {"SHA-1", OID({1, 3, 14, 3, 2, 26})},
  430|      1|      {"SHA-224", OID({2, 16, 840, 1, 101, 3, 4, 2, 4})},
  431|      1|      {"SHA-256", OID({2, 16, 840, 1, 101, 3, 4, 2, 1})},
  432|      1|      {"SHA-3(224)", OID({2, 16, 840, 1, 101, 3, 4, 2, 7})},
  433|      1|      {"SHA-3(256)", OID({2, 16, 840, 1, 101, 3, 4, 2, 8})},
  434|      1|      {"SHA-3(384)", OID({2, 16, 840, 1, 101, 3, 4, 2, 9})},
  435|      1|      {"SHA-3(512)", OID({2, 16, 840, 1, 101, 3, 4, 2, 10})},
  436|      1|      {"SHA-384", OID({2, 16, 840, 1, 101, 3, 4, 2, 2})},
  437|      1|      {"SHA-512", OID({2, 16, 840, 1, 101, 3, 4, 2, 3})},
  438|      1|      {"SHA-512-256", OID({2, 16, 840, 1, 101, 3, 4, 2, 6})},
  439|      1|      {"SHAKE-128", OID({2, 16, 840, 1, 101, 3, 4, 2, 11})},
  440|      1|      {"SHAKE-256", OID({2, 16, 840, 1, 101, 3, 4, 2, 12})},
  441|      1|      {"SM2", OID({1, 2, 156, 10197, 1, 301, 1})},
  442|      1|      {"SM2_Enc", OID({1, 2, 156, 10197, 1, 301, 3})},
  443|      1|      {"SM2_Kex", OID({1, 2, 156, 10197, 1, 301, 2})},
  444|      1|      {"SM2_Sig", OID({1, 2, 156, 10197, 1, 301, 1})},
  445|      1|      {"SM2_Sig/SM3", OID({1, 2, 156, 10197, 1, 501})},
  446|      1|      {"SM3", OID({1, 2, 156, 10197, 1, 401})},
  447|      1|      {"SM4/CBC", OID({1, 2, 156, 10197, 1, 104, 2})},
  448|      1|      {"SM4/GCM", OID({1, 2, 156, 10197, 1, 104, 8})},
  449|      1|      {"SM4/OCB", OID({1, 2, 156, 10197, 1, 104, 100})},
  450|      1|      {"SM4/SIV", OID({1, 3, 6, 1, 4, 1, 25258, 3, 4, 9})},
  451|      1|      {"Scrypt", OID({1, 3, 6, 1, 4, 1, 11591, 4, 11})},
  452|      1|      {"Serpent/CBC", OID({1, 3, 6, 1, 4, 1, 25258, 3, 1})},
  453|      1|      {"Serpent/GCM", OID({1, 3, 6, 1, 4, 1, 25258, 3, 101})},
  454|      1|      {"Serpent/OCB", OID({1, 3, 6, 1, 4, 1, 25258, 3, 2, 4})},
  455|      1|      {"Serpent/SIV", OID({1, 3, 6, 1, 4, 1, 25258, 3, 4, 4})},
  456|      1|      {"Streebog-256", OID({1, 2, 643, 7, 1, 1, 2, 2})},
  457|      1|      {"Streebog-512", OID({1, 2, 643, 7, 1, 1, 2, 3})},
  458|      1|      {"Threefish-512/CBC", OID({1, 3, 6, 1, 4, 1, 25258, 3, 2})},
  459|      1|      {"TripleDES/CBC", OID({1, 2, 840, 113549, 3, 7})},
  460|      1|      {"Twofish/CBC", OID({1, 3, 6, 1, 4, 1, 25258, 3, 3})},
  461|      1|      {"Twofish/GCM", OID({1, 3, 6, 1, 4, 1, 25258, 3, 102})},
  462|      1|      {"Twofish/OCB", OID({1, 3, 6, 1, 4, 1, 25258, 3, 2, 5})},
  463|      1|      {"Twofish/SIV", OID({1, 3, 6, 1, 4, 1, 25258, 3, 4, 5})},
  464|      1|      {"X509v3.AnyPolicy", OID({2, 5, 29, 32, 0})},
  465|      1|      {"X509v3.AuthorityKeyIdentifier", OID({2, 5, 29, 35})},
  466|      1|      {"X509v3.BasicConstraints", OID({2, 5, 29, 19})},
  467|      1|      {"X509v3.CRLDistributionPoints", OID({2, 5, 29, 31})},
  468|      1|      {"X509v3.CRLIssuingDistributionPoint", OID({2, 5, 29, 28})},
  469|      1|      {"X509v3.CRLNumber", OID({2, 5, 29, 20})},
  470|      1|      {"X509v3.CertificatePolicies", OID({2, 5, 29, 32})},
  471|      1|      {"X509v3.ExtendedKeyUsage", OID({2, 5, 29, 37})},
  472|      1|      {"X509v3.HoldInstructionCode", OID({2, 5, 29, 23})},
  473|      1|      {"X509v3.InvalidityDate", OID({2, 5, 29, 24})},
  474|      1|      {"X509v3.IssuerAlternativeName", OID({2, 5, 29, 18})},
  475|      1|      {"X509v3.KeyUsage", OID({2, 5, 29, 15})},
  476|      1|      {"X509v3.NameConstraints", OID({2, 5, 29, 30})},
  477|      1|      {"X509v3.PolicyConstraints", OID({2, 5, 29, 36})},
  478|      1|      {"X509v3.PrivateKeyUsagePeriod", OID({2, 5, 29, 16})},
  479|      1|      {"X509v3.ReasonCode", OID({2, 5, 29, 21})},
  480|      1|      {"X509v3.SubjectAlternativeName", OID({2, 5, 29, 17})},
  481|      1|      {"X509v3.SubjectKeyIdentifier", OID({2, 5, 29, 14})},
  482|      1|      {"X520.CommonName", OID({2, 5, 4, 3})},
  483|      1|      {"X520.Country", OID({2, 5, 4, 6})},
  484|      1|      {"X520.DNQualifier", OID({2, 5, 4, 46})},
  485|      1|      {"X520.GenerationalQualifier", OID({2, 5, 4, 44})},
  486|      1|      {"X520.GivenName", OID({2, 5, 4, 42})},
  487|      1|      {"X520.Initials", OID({2, 5, 4, 43})},
  488|      1|      {"X520.Locality", OID({2, 5, 4, 7})},
  489|      1|      {"X520.Organization", OID({2, 5, 4, 10})},
  490|      1|      {"X520.OrganizationalUnit", OID({2, 5, 4, 11})},
  491|      1|      {"X520.Pseudonym", OID({2, 5, 4, 65})},
  492|      1|      {"X520.SerialNumber", OID({2, 5, 4, 5})},
  493|      1|      {"X520.State", OID({2, 5, 4, 8})},
  494|      1|      {"X520.StreetAddress", OID({2, 5, 4, 9})},
  495|      1|      {"X520.Surname", OID({2, 5, 4, 4})},
  496|      1|      {"X520.Title", OID({2, 5, 4, 12})},
  497|      1|      {"XMSS", OID({0, 4, 0, 127, 0, 15, 1, 1, 13, 0})},
  498|      1|      {"XMSS-draft12", OID({1, 3, 6, 1, 4, 1, 25258, 1, 8})},
  499|      1|      {"XMSS-draft6", OID({1, 3, 6, 1, 4, 1, 25258, 1, 5})},
  500|      1|      {"brainpool160r1", OID({1, 3, 36, 3, 3, 2, 8, 1, 1, 1})},
  501|      1|      {"brainpool192r1", OID({1, 3, 36, 3, 3, 2, 8, 1, 1, 3})},
  502|      1|      {"brainpool224r1", OID({1, 3, 36, 3, 3, 2, 8, 1, 1, 5})},
  503|      1|      {"brainpool256r1", OID({1, 3, 36, 3, 3, 2, 8, 1, 1, 7})},
  504|      1|      {"brainpool320r1", OID({1, 3, 36, 3, 3, 2, 8, 1, 1, 9})},
  505|      1|      {"brainpool384r1", OID({1, 3, 36, 3, 3, 2, 8, 1, 1, 11})},
  506|      1|      {"brainpool512r1", OID({1, 3, 36, 3, 3, 2, 8, 1, 1, 13})},
  507|      1|      {"frp256v1", OID({1, 2, 250, 1, 223, 101, 256, 1})},
  508|      1|      {"gost_256A", OID({1, 2, 643, 7, 1, 2, 1, 1, 1})},
  509|      1|      {"gost_256B", OID({1, 2, 643, 7, 1, 2, 1, 1, 2})},
  510|      1|      {"gost_512A", OID({1, 2, 643, 7, 1, 2, 1, 2, 1})},
  511|      1|      {"gost_512B", OID({1, 2, 643, 7, 1, 2, 1, 2, 2})},
  512|      1|      {"secp160k1", OID({1, 3, 132, 0, 9})},
  513|      1|      {"secp160r1", OID({1, 3, 132, 0, 8})},
  514|      1|      {"secp160r2", OID({1, 3, 132, 0, 30})},
  515|      1|      {"secp192k1", OID({1, 3, 132, 0, 31})},
  516|      1|      {"secp192r1", OID({1, 2, 840, 10045, 3, 1, 1})},
  517|      1|      {"secp224k1", OID({1, 3, 132, 0, 32})},
  518|      1|      {"secp224r1", OID({1, 3, 132, 0, 33})},
  519|      1|      {"secp256k1", OID({1, 3, 132, 0, 10})},
  520|      1|      {"secp256r1", OID({1, 2, 840, 10045, 3, 1, 7})},
  521|      1|      {"secp384r1", OID({1, 3, 132, 0, 34})},
  522|      1|      {"secp521r1", OID({1, 3, 132, 0, 35})},
  523|      1|      {"sm2p256v1", OID({1, 2, 156, 10197, 1, 301})},
  524|      1|      {"x962_p192v2", OID({1, 2, 840, 10045, 3, 1, 2})},
  525|      1|      {"x962_p192v3", OID({1, 2, 840, 10045, 3, 1, 3})},
  526|      1|      {"x962_p239v1", OID({1, 2, 840, 10045, 3, 1, 4})},
  527|      1|      {"x962_p239v2", OID({1, 2, 840, 10045, 3, 1, 5})},
  528|      1|      {"x962_p239v3", OID({1, 2, 840, 10045, 3, 1, 6})}};
  529|      1|}

_ZN5Botan6BigIntC2EPKhm:
   91|  1.22k|BigInt::BigInt(const uint8_t input[], size_t length) { binary_decode(input, length); }
_ZNK5Botan6BigInt4Data14calc_sig_wordsEv:
  192|    673|size_t BigInt::Data::calc_sig_words() const {
  193|    673|   const size_t sz = m_reg.size();
  194|    673|   size_t sig = sz;
  195|       |
  196|    673|   word sub = 1;
  197|       |
  198|  14.8k|   for(size_t i = 0; i != sz; ++i) {
  ------------------
  |  Branch (198:22): [True: 14.2k, False: 673]
  ------------------
  199|  14.2k|      const word w = m_reg[sz - i - 1];
  200|  14.2k|      sub &= ct_is_zero(w);
  201|  14.2k|      sig -= sub;
  202|  14.2k|   }
  203|       |
  204|       |   /*
  205|       |   * This depends on the data so is poisoned, but unpoison it here as
  206|       |   * later conditionals are made on the size.
  207|       |   */
  208|    673|   CT::unpoison(sig);
  209|       |
  210|    673|   return sig;
  211|    673|}
_ZN5Botan6BigInt13binary_decodeEPKhm:
  393|  1.22k|void BigInt::binary_decode(const uint8_t buf[], size_t length) {
  394|  1.22k|   clear();
  395|       |
  396|  1.22k|   const size_t full_words = length / sizeof(word);
  397|  1.22k|   const size_t extra_bytes = length % sizeof(word);
  398|       |
  399|  1.22k|   secure_vector<word> reg((round_up(full_words + (extra_bytes > 0 ? 1 : 0), 8)));
  ------------------
  |  Branch (399:52): [True: 1.01k, False: 215]
  ------------------
  400|       |
  401|  12.3k|   for(size_t i = 0; i != full_words; ++i) {
  ------------------
  |  Branch (401:22): [True: 11.1k, False: 1.22k]
  ------------------
  402|  11.1k|      reg[i] = load_be<word>(buf + length - sizeof(word) * (i + 1), 0);
  403|  11.1k|   }
  404|       |
  405|  1.22k|   if(extra_bytes > 0) {
  ------------------
  |  Branch (405:7): [True: 1.01k, False: 215]
  ------------------
  406|  2.70k|      for(size_t i = 0; i != extra_bytes; ++i) {
  ------------------
  |  Branch (406:25): [True: 1.68k, False: 1.01k]
  ------------------
  407|  1.68k|         reg[full_words] = (reg[full_words] << 8) | buf[i];
  408|  1.68k|      }
  409|  1.01k|   }
  410|       |
  411|  1.22k|   m_data.swap(reg);
  412|  1.22k|}

_ZN5Botan22throw_invalid_argumentEPKcS1_S1_:
   21|    963|void throw_invalid_argument(const char* message, const char* func, const char* file) {
   22|    963|   throw Invalid_Argument(fmt("{} in {}:{}", message, func, file));
   23|    963|}

_ZN5Botan12ucs2_to_utf8EPKhm:
   54|  1.08k|std::string ucs2_to_utf8(const uint8_t ucs2[], size_t len) {
   55|  1.08k|   if(len % 2 != 0) {
  ------------------
  |  Branch (55:7): [True: 196, False: 893]
  ------------------
   56|    196|      throw Decoding_Error("Invalid length for UCS-2 string");
   57|    196|   }
   58|       |
   59|    893|   const size_t chars = len / 2;
   60|       |
   61|    893|   std::string s;
   62|  8.77k|   for(size_t i = 0; i != chars; ++i) {
  ------------------
  |  Branch (62:22): [True: 7.87k, False: 893]
  ------------------
   63|  7.87k|      const uint32_t c = load_be<uint16_t>(ucs2, i);
   64|  7.87k|      append_utf8_for(s, c);
   65|  7.87k|   }
   66|       |
   67|    893|   return s;
   68|  1.08k|}
_ZN5Botan12ucs4_to_utf8EPKhm:
   70|  1.13k|std::string ucs4_to_utf8(const uint8_t ucs4[], size_t len) {
   71|  1.13k|   if(len % 4 != 0) {
  ------------------
  |  Branch (71:7): [True: 200, False: 932]
  ------------------
   72|    200|      throw Decoding_Error("Invalid length for UCS-4 string");
   73|    200|   }
   74|       |
   75|    932|   const size_t chars = len / 4;
   76|       |
   77|    932|   std::string s;
   78|  3.24k|   for(size_t i = 0; i != chars; ++i) {
  ------------------
  |  Branch (78:22): [True: 2.31k, False: 932]
  ------------------
   79|  2.31k|      const uint32_t c = load_be<uint32_t>(ucs4, i);
   80|  2.31k|      append_utf8_for(s, c);
   81|  2.31k|   }
   82|       |
   83|    932|   return s;
   84|  1.13k|}
_ZN5Botan14latin1_to_utf8EPKhm:
   89|    685|std::string latin1_to_utf8(const uint8_t chars[], size_t len) {
   90|    685|   std::string s;
   91|  23.0k|   for(size_t i = 0; i != len; ++i) {
  ------------------
  |  Branch (91:22): [True: 22.3k, False: 685]
  ------------------
   92|  22.3k|      const uint32_t c = static_cast<uint8_t>(chars[i]);
   93|  22.3k|      append_utf8_for(s, c);
   94|  22.3k|   }
   95|    685|   return s;
   96|    685|}
charset.cpp:_ZN5Botan12_GLOBAL__N_115append_utf8_forERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEj:
   18|  32.5k|void append_utf8_for(std::string& s, uint32_t c) {
   19|  32.5k|   if(c >= 0xD800 && c < 0xE000) {
  ------------------
  |  Branch (19:7): [True: 2.95k, False: 29.6k]
  |  Branch (19:22): [True: 402, False: 2.55k]
  ------------------
   20|    402|      throw Decoding_Error("Invalid Unicode character");
   21|    402|   }
   22|       |
   23|  32.1k|   if(c <= 0x7F) {
  ------------------
  |  Branch (23:7): [True: 17.8k, False: 14.2k]
  ------------------
   24|  17.8k|      const uint8_t b0 = static_cast<uint8_t>(c);
   25|  17.8k|      s.push_back(static_cast<char>(b0));
   26|  17.8k|   } else if(c <= 0x7FF) {
  ------------------
  |  Branch (26:14): [True: 6.15k, False: 8.13k]
  ------------------
   27|  6.15k|      const uint8_t b0 = 0xC0 | static_cast<uint8_t>(c >> 6);
   28|  6.15k|      const uint8_t b1 = 0x80 | static_cast<uint8_t>(c & 0x3F);
   29|  6.15k|      s.push_back(static_cast<char>(b0));
   30|  6.15k|      s.push_back(static_cast<char>(b1));
   31|  8.13k|   } else if(c <= 0xFFFF) {
  ------------------
  |  Branch (31:14): [True: 6.17k, False: 1.95k]
  ------------------
   32|  6.17k|      const uint8_t b0 = 0xE0 | static_cast<uint8_t>(c >> 12);
   33|  6.17k|      const uint8_t b1 = 0x80 | static_cast<uint8_t>((c >> 6) & 0x3F);
   34|  6.17k|      const uint8_t b2 = 0x80 | static_cast<uint8_t>(c & 0x3F);
   35|  6.17k|      s.push_back(static_cast<char>(b0));
   36|  6.17k|      s.push_back(static_cast<char>(b1));
   37|  6.17k|      s.push_back(static_cast<char>(b2));
   38|  6.17k|   } else if(c <= 0x10FFFF) {
  ------------------
  |  Branch (38:14): [True: 1.50k, False: 456]
  ------------------
   39|  1.50k|      const uint8_t b0 = 0xF0 | static_cast<uint8_t>(c >> 18);
   40|  1.50k|      const uint8_t b1 = 0x80 | static_cast<uint8_t>((c >> 12) & 0x3F);
   41|  1.50k|      const uint8_t b2 = 0x80 | static_cast<uint8_t>((c >> 6) & 0x3F);
   42|  1.50k|      const uint8_t b3 = 0x80 | static_cast<uint8_t>(c & 0x3F);
   43|  1.50k|      s.push_back(static_cast<char>(b0));
   44|  1.50k|      s.push_back(static_cast<char>(b1));
   45|  1.50k|      s.push_back(static_cast<char>(b2));
   46|  1.50k|      s.push_back(static_cast<char>(b3));
   47|  1.50k|   } else {
   48|    456|      throw Decoding_Error("Invalid Unicode character");
   49|    456|   }
   50|  32.1k|}

_ZN5Botan10DataSource9read_byteERh:
   25|   886k|size_t DataSource::read_byte(uint8_t& out) { return read(&out, 1); }
_ZN5Botan10DataSource12discard_nextEm:
   35|   303k|size_t DataSource::discard_next(size_t n) {
   36|   303k|   uint8_t buf[64] = {0};
   37|   303k|   size_t discarded = 0;
   38|       |
   39|   576k|   while(n) {
  ------------------
  |  Branch (39:10): [True: 272k, False: 303k]
  ------------------
   40|   272k|      const size_t got = this->read(buf, std::min(n, sizeof(buf)));
   41|   272k|      discarded += got;
   42|   272k|      n -= got;
   43|       |
   44|   272k|      if(got == 0) {
  ------------------
  |  Branch (44:10): [True: 390, False: 272k]
  ------------------
   45|    390|         break;
   46|    390|      }
   47|   272k|   }
   48|       |
   49|   303k|   return discarded;
   50|   303k|}
_ZN5Botan17DataSource_Memory4readEPhm:
   55|  1.25M|size_t DataSource_Memory::read(uint8_t out[], size_t length) {
   56|  1.25M|   const size_t got = std::min<size_t>(m_source.size() - m_offset, length);
   57|  1.25M|   copy_mem(out, m_source.data() + m_offset, got);
   58|  1.25M|   m_offset += got;
   59|  1.25M|   return got;
   60|  1.25M|}
_ZN5Botan17DataSource_Memory15check_availableEm:
   62|  98.1k|bool DataSource_Memory::check_available(size_t n) { return (n <= (m_source.size() - m_offset)); }
_ZNK5Botan17DataSource_Memory4peekEPhmm:
   67|   120k|size_t DataSource_Memory::peek(uint8_t out[], size_t length, size_t peek_offset) const {
   68|   120k|   const size_t bytes_left = m_source.size() - m_offset;
   69|   120k|   if(peek_offset >= bytes_left) {
  ------------------
  |  Branch (69:7): [True: 60.2k, False: 59.7k]
  ------------------
   70|  60.2k|      return 0;
   71|  60.2k|   }
   72|       |
   73|  59.7k|   const size_t got = std::min(bytes_left - peek_offset, length);
   74|  59.7k|   copy_mem(out, &m_source[m_offset + peek_offset], got);
   75|  59.7k|   return got;
   76|   120k|}

_ZN5Botan9ExceptionC2ENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEE:
   71|  12.4k|Exception::Exception(std::string_view msg) : m_msg(msg) {}
_ZN5Botan16Invalid_ArgumentC2ENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEE:
   77|  3.76k|Invalid_Argument::Invalid_Argument(std::string_view msg) : Exception(msg) {}
_ZN5Botan14Decoding_ErrorC2ENSt3__117basic_string_viewIcNS1_11char_traitsIcEEEE:
  125|  8.64k|Decoding_Error::Decoding_Error(std::string_view name) : Exception(name) {}

_ZN5Botan15allocate_memoryEmm:
   20|   319k|BOTAN_MALLOC_FN void* allocate_memory(size_t elems, size_t elem_size) {
   21|   319k|   if(elems == 0 || elem_size == 0) {
  ------------------
  |  Branch (21:7): [True: 0, False: 319k]
  |  Branch (21:21): [True: 0, False: 319k]
  ------------------
   22|      0|      return nullptr;
   23|      0|   }
   24|       |
   25|       |   // Some calloc implementations do not check for overflow (?!?)
   26|       |
   27|   319k|   if(!BOTAN_CHECKED_MUL(elems, elem_size).has_value()) {
  ------------------
  |  |   73|   319k|#define BOTAN_CHECKED_MUL(x, y) checked_mul(x, y)
  ------------------
  |  Branch (27:7): [True: 0, False: 319k]
  ------------------
   28|      0|      throw std::bad_alloc();
   29|      0|   }
   30|       |
   31|       |#if defined(BOTAN_HAS_LOCKING_ALLOCATOR)
   32|       |   if(void* p = mlock_allocator::instance().allocate(elems, elem_size)) {
   33|       |      return p;
   34|       |   }
   35|       |#endif
   36|       |
   37|       |#if defined(BOTAN_TARGET_OS_HAS_ALLOC_CONCEAL)
   38|       |   void* ptr = ::calloc_conceal(elems, elem_size);
   39|       |#else
   40|   319k|   void* ptr = std::calloc(elems, elem_size);  // NOLINT(*-no-malloc)
   41|   319k|#endif
   42|   319k|   if(!ptr) {
  ------------------
  |  Branch (42:7): [True: 0, False: 319k]
  ------------------
   43|      0|      [[unlikely]] throw std::bad_alloc();
   44|      0|   }
   45|   319k|   return ptr;
   46|   319k|}
_ZN5Botan17deallocate_memoryEPvmm:
   48|   319k|void deallocate_memory(void* p, size_t elems, size_t elem_size) {
   49|   319k|   if(p == nullptr) {
  ------------------
  |  Branch (49:7): [True: 0, False: 319k]
  ------------------
   50|      0|      [[unlikely]] return;
   51|      0|   }
   52|       |
   53|   319k|   secure_scrub_memory(p, elems * elem_size);
   54|       |
   55|       |#if defined(BOTAN_HAS_LOCKING_ALLOCATOR)
   56|       |   if(mlock_allocator::instance().deallocate(p, elems, elem_size)) {
   57|       |      return;
   58|       |   }
   59|       |#endif
   60|       |
   61|   319k|   std::free(p);  // NOLINT(*-no-malloc)
   62|   319k|}

_ZN5Botan19secure_scrub_memoryEPvm:
   78|   319k|void secure_scrub_memory(void* ptr, size_t n) {
   79|       |#if defined(BOTAN_TARGET_OS_HAS_RTLSECUREZEROMEMORY)
   80|       |   ::RtlSecureZeroMemory(ptr, n);
   81|       |
   82|       |#elif defined(BOTAN_TARGET_OS_HAS_EXPLICIT_BZERO)
   83|   319k|   ::explicit_bzero(ptr, n);
   84|       |
   85|       |#elif defined(BOTAN_TARGET_OS_HAS_EXPLICIT_MEMSET)
   86|       |   (void)::explicit_memset(ptr, 0, n);
   87|       |
   88|       |#elif defined(BOTAN_USE_VOLATILE_MEMSET_FOR_ZERO) && (BOTAN_USE_VOLATILE_MEMSET_FOR_ZERO == 1)
   89|       |   /*
   90|       |   Call memset through a static volatile pointer, which the compiler
   91|       |   should not elide. This construct should be safe in conforming
   92|       |   compilers, but who knows. I did confirm that on x86-64 GCC 6.1 and
   93|       |   Clang 3.8 both create code that saves the memset address in the
   94|       |   data segment and unconditionally loads and jumps to that address.
   95|       |   */
   96|       |   static void* (*const volatile memset_ptr)(void*, int, size_t) = std::memset;
   97|       |   (memset_ptr)(ptr, 0, n);
   98|       |#else
   99|       |
  100|       |   volatile uint8_t* p = reinterpret_cast<volatile uint8_t*>(ptr);
  101|       |
  102|       |   for(size_t i = 0; i != n; ++i)
  103|       |      p[i] = 0;
  104|       |#endif
  105|   319k|}

_ZN5Botan9to_u32bitENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEE:
   32|  21.5k|uint32_t to_u32bit(std::string_view str_view) {
   33|  21.5k|   const std::string str(str_view);
   34|       |
   35|       |   // std::stoul is not strict enough. Ensure that str is digit only [0-9]*
   36|  44.3k|   for(const char chr : str) {
  ------------------
  |  Branch (36:23): [True: 44.3k, False: 21.0k]
  ------------------
   37|  44.3k|      if(chr < '0' || chr > '9') {
  ------------------
  |  Branch (37:10): [True: 211, False: 44.1k]
  |  Branch (37:23): [True: 211, False: 43.9k]
  ------------------
   38|    422|         throw Invalid_Argument("to_u32bit invalid decimal string '" + str + "'");
   39|    422|      }
   40|  44.3k|   }
   41|       |
   42|  21.0k|   const unsigned long int x = std::stoul(str);
   43|       |
   44|  21.0k|   if constexpr(sizeof(unsigned long int) > 4) {
  ------------------
  |  Branch (44:17): [Folded - Ignored]
  ------------------
   45|       |      // x might be uint64
   46|  21.0k|      if(x > std::numeric_limits<uint32_t>::max()) {
  ------------------
  |  Branch (46:10): [True: 0, False: 21.0k]
  ------------------
   47|      0|         throw Invalid_Argument("Integer value of " + str + " exceeds 32 bit range");
   48|      0|      }
   49|  21.0k|   }
   50|       |
   51|  21.0k|   return static_cast<uint32_t>(x);
   52|  21.0k|}

