DER.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. /*
  2. * Copyright (c) 2021, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Utf8View.h>
  7. #include <LibCrypto/ASN1/DER.h>
  8. namespace Crypto::ASN1 {
  9. Result<Tag, DecodeError> Decoder::read_tag()
  10. {
  11. auto byte_or_error = read_byte();
  12. if (byte_or_error.is_error())
  13. return byte_or_error.error();
  14. auto byte = byte_or_error.value();
  15. u8 class_ = byte & 0xc0;
  16. u8 type = byte & 0x20;
  17. u8 kind = byte & 0x1f;
  18. if (kind == 0x1f) {
  19. kind = 0;
  20. while (byte & 0x80) {
  21. auto byte_or_error = read_byte();
  22. if (byte_or_error.is_error())
  23. return byte_or_error.error();
  24. byte = byte_or_error.value();
  25. kind = (kind << 7) | (byte & 0x7f);
  26. }
  27. }
  28. return Tag { (Kind)kind, (Class)class_, (Type)type };
  29. }
  30. Result<size_t, DecodeError> Decoder::read_length()
  31. {
  32. auto byte_or_error = read_byte();
  33. if (byte_or_error.is_error())
  34. return byte_or_error.error();
  35. auto byte = byte_or_error.value();
  36. size_t length = byte;
  37. if (byte & 0x80) {
  38. auto count = byte & 0x7f;
  39. if (count == 0x7f)
  40. return DecodeError::InvalidInputFormat;
  41. auto data_or_error = read_bytes(count);
  42. if (data_or_error.is_error())
  43. return data_or_error.error();
  44. auto data = data_or_error.value();
  45. length = 0;
  46. if (data.size() > sizeof(size_t))
  47. return DecodeError::Overflow;
  48. for (auto&& byte : data)
  49. length = (length << 8) | (size_t)byte;
  50. }
  51. return length;
  52. }
  53. Result<u8, DecodeError> Decoder::read_byte()
  54. {
  55. if (m_stack.is_empty())
  56. return DecodeError::NoInput;
  57. auto& entry = m_stack.last();
  58. if (entry.is_empty())
  59. return DecodeError::NotEnoughData;
  60. auto byte = entry[0];
  61. entry = entry.slice(1);
  62. return byte;
  63. }
  64. Result<ReadonlyBytes, DecodeError> Decoder::read_bytes(size_t length)
  65. {
  66. if (m_stack.is_empty())
  67. return DecodeError::NoInput;
  68. auto& entry = m_stack.last();
  69. if (entry.size() < length)
  70. return DecodeError::NotEnoughData;
  71. auto bytes = entry.slice(0, length);
  72. entry = entry.slice(length);
  73. return bytes;
  74. }
  75. Result<bool, DecodeError> Decoder::decode_boolean(ReadonlyBytes data)
  76. {
  77. if (data.size() != 1)
  78. return DecodeError::InvalidInputFormat;
  79. return data[0] == 0;
  80. }
  81. Result<UnsignedBigInteger, DecodeError> Decoder::decode_arbitrary_sized_integer(ReadonlyBytes data)
  82. {
  83. if (data.size() < 1)
  84. return DecodeError::NotEnoughData;
  85. if (data.size() > 1
  86. && ((data[0] == 0xff && data[1] & 0x80)
  87. || (data[0] == 0x00 && !(data[1] & 0x80)))) {
  88. return DecodeError::InvalidInputFormat;
  89. }
  90. bool is_negative = data[0] & 0x80;
  91. if (is_negative)
  92. return DecodeError::UnsupportedFormat;
  93. return UnsignedBigInteger::import_data(data.data(), data.size());
  94. }
  95. Result<StringView, DecodeError> Decoder::decode_octet_string(ReadonlyBytes bytes)
  96. {
  97. return StringView { bytes.data(), bytes.size() };
  98. }
  99. Result<std::nullptr_t, DecodeError> Decoder::decode_null(ReadonlyBytes data)
  100. {
  101. if (data.size() != 0)
  102. return DecodeError::InvalidInputFormat;
  103. return nullptr;
  104. }
  105. Result<Vector<int>, DecodeError> Decoder::decode_object_identifier(ReadonlyBytes data)
  106. {
  107. Vector<int> result;
  108. result.append(0); // Reserved space.
  109. u32 value = 0;
  110. for (auto&& byte : data) {
  111. if (value == 0 && byte == 0x80)
  112. return DecodeError::InvalidInputFormat;
  113. value = (value << 7) | (byte & 0x7f);
  114. if (!(byte & 0x80)) {
  115. result.append(value);
  116. value = 0;
  117. }
  118. }
  119. if (result.size() == 1 || result[1] >= 1600)
  120. return DecodeError::InvalidInputFormat;
  121. result[0] = result[1] / 40;
  122. result[1] = result[1] % 40;
  123. return result;
  124. }
  125. Result<StringView, DecodeError> Decoder::decode_printable_string(ReadonlyBytes data)
  126. {
  127. Utf8View view { data };
  128. if (!view.validate())
  129. return DecodeError::InvalidInputFormat;
  130. return StringView { data };
  131. }
  132. Result<const BitmapView, DecodeError> Decoder::decode_bit_string(ReadonlyBytes data)
  133. {
  134. if (data.size() < 1)
  135. return DecodeError::InvalidInputFormat;
  136. auto unused_bits = data[0];
  137. auto total_size_in_bits = (data.size() - 1) * 8;
  138. if (unused_bits > total_size_in_bits)
  139. return DecodeError::Overflow;
  140. return BitmapView { const_cast<u8*>(data.offset_pointer(1)), total_size_in_bits - unused_bits };
  141. }
  142. Result<Tag, DecodeError> Decoder::peek()
  143. {
  144. if (m_stack.is_empty())
  145. return DecodeError::NoInput;
  146. if (eof())
  147. return DecodeError::EndOfStream;
  148. if (m_current_tag.has_value())
  149. return m_current_tag.value();
  150. auto tag_or_error = read_tag();
  151. if (tag_or_error.is_error())
  152. return tag_or_error.error();
  153. m_current_tag = tag_or_error.value();
  154. return m_current_tag.value();
  155. }
  156. bool Decoder::eof() const
  157. {
  158. return m_stack.is_empty() || m_stack.last().is_empty();
  159. }
  160. Optional<DecodeError> Decoder::enter()
  161. {
  162. if (m_stack.is_empty())
  163. return DecodeError::NoInput;
  164. auto tag_or_error = peek();
  165. if (tag_or_error.is_error())
  166. return tag_or_error.error();
  167. auto tag = tag_or_error.value();
  168. if (tag.type != Type::Constructed)
  169. return DecodeError::EnteringNonConstructedTag;
  170. auto length_or_error = read_length();
  171. if (length_or_error.is_error())
  172. return length_or_error.error();
  173. auto length = length_or_error.value();
  174. auto data_or_error = read_bytes(length);
  175. if (data_or_error.is_error())
  176. return data_or_error.error();
  177. m_current_tag.clear();
  178. auto data = data_or_error.value();
  179. m_stack.append(data);
  180. return {};
  181. }
  182. Optional<DecodeError> Decoder::leave()
  183. {
  184. if (m_stack.is_empty())
  185. return DecodeError::NoInput;
  186. if (m_stack.size() == 1)
  187. return DecodeError::LeavingMainContext;
  188. m_stack.take_last();
  189. m_current_tag.clear();
  190. return {};
  191. }
  192. void pretty_print(Decoder& decoder, OutputStream& stream, int indent)
  193. {
  194. while (!decoder.eof()) {
  195. auto tag = decoder.peek();
  196. if (tag.is_error()) {
  197. dbgln("PrettyPrint error: {}", tag.error());
  198. return;
  199. }
  200. StringBuilder builder;
  201. for (int i = 0; i < indent; ++i)
  202. builder.append(' ');
  203. builder.appendff("<{}> ", class_name(tag.value().class_));
  204. if (tag.value().type == Type::Constructed) {
  205. builder.appendff("[{}] {} ({})", type_name(tag.value().type), static_cast<u8>(tag.value().kind), kind_name(tag.value().kind));
  206. if (auto error = decoder.enter(); error.has_value()) {
  207. dbgln("Constructed PrettyPrint error: {}", error.value());
  208. return;
  209. }
  210. builder.append('\n');
  211. stream.write(builder.string_view().bytes());
  212. pretty_print(decoder, stream, indent + 2);
  213. if (auto error = decoder.leave(); error.has_value()) {
  214. dbgln("Constructed PrettyPrint error: {}", error.value());
  215. return;
  216. }
  217. continue;
  218. } else {
  219. if (tag.value().class_ != Class::Universal)
  220. builder.appendff("[{}] {} {}", type_name(tag.value().type), static_cast<u8>(tag.value().kind), kind_name(tag.value().kind));
  221. else
  222. builder.appendff("[{}] {}", type_name(tag.value().type), kind_name(tag.value().kind));
  223. switch (tag.value().kind) {
  224. case Kind::Eol: {
  225. auto value = decoder.read<ReadonlyBytes>();
  226. if (value.is_error()) {
  227. dbgln("EOL PrettyPrint error: {}", value.error());
  228. return;
  229. }
  230. break;
  231. }
  232. case Kind::Boolean: {
  233. auto value = decoder.read<bool>();
  234. if (value.is_error()) {
  235. dbgln("Bool PrettyPrint error: {}", value.error());
  236. return;
  237. }
  238. builder.appendff(" {}", value.value());
  239. break;
  240. }
  241. case Kind::Integer: {
  242. auto value = decoder.read<ReadonlyBytes>();
  243. if (value.is_error()) {
  244. dbgln("Integer PrettyPrint error: {}", value.error());
  245. return;
  246. }
  247. builder.append(" 0x");
  248. for (auto ch : value.value())
  249. builder.appendff("{:0>2x}", ch);
  250. break;
  251. }
  252. case Kind::BitString: {
  253. auto value = decoder.read<const BitmapView>();
  254. if (value.is_error()) {
  255. dbgln("BitString PrettyPrint error: {}", value.error());
  256. return;
  257. }
  258. builder.append(" 0b");
  259. for (size_t i = 0; i < value.value().size(); ++i)
  260. builder.append(value.value().get(i) ? '1' : '0');
  261. break;
  262. }
  263. case Kind::OctetString: {
  264. auto value = decoder.read<StringView>();
  265. if (value.is_error()) {
  266. dbgln("OctetString PrettyPrint error: {}", value.error());
  267. return;
  268. }
  269. builder.append(" 0x");
  270. for (auto ch : value.value())
  271. builder.appendff("{:0>2x}", ch);
  272. break;
  273. }
  274. case Kind::Null: {
  275. auto value = decoder.read<decltype(nullptr)>();
  276. if (value.is_error()) {
  277. dbgln("Bool PrettyPrint error: {}", value.error());
  278. return;
  279. }
  280. break;
  281. }
  282. case Kind::ObjectIdentifier: {
  283. auto value = decoder.read<Vector<int>>();
  284. if (value.is_error()) {
  285. dbgln("Identifier PrettyPrint error: {}", value.error());
  286. return;
  287. }
  288. for (auto& id : value.value())
  289. builder.appendff(" {}", id);
  290. break;
  291. }
  292. case Kind::UTCTime:
  293. case Kind::GeneralizedTime:
  294. case Kind::IA5String:
  295. case Kind::PrintableString: {
  296. auto value = decoder.read<StringView>();
  297. if (value.is_error()) {
  298. dbgln("String PrettyPrint error: {}", value.error());
  299. return;
  300. }
  301. builder.append(' ');
  302. builder.append(value.value());
  303. break;
  304. }
  305. case Kind::Utf8String: {
  306. auto value = decoder.read<Utf8View>();
  307. if (value.is_error()) {
  308. dbgln("UTF8 PrettyPrint error: {}", value.error());
  309. return;
  310. }
  311. builder.append(' ');
  312. for (auto cp : value.value())
  313. builder.append_code_point(cp);
  314. break;
  315. }
  316. case Kind::Sequence:
  317. case Kind::Set:
  318. dbgln("Seq/Sequence PrettyPrint error: Unexpected Primtive");
  319. return;
  320. }
  321. }
  322. builder.append('\n');
  323. stream.write(builder.string_view().bytes());
  324. }
  325. }
  326. }
  327. void AK::Formatter<Crypto::ASN1::DecodeError>::format(FormatBuilder& fmtbuilder, Crypto::ASN1::DecodeError error)
  328. {
  329. using Crypto::ASN1::DecodeError;
  330. switch (error) {
  331. case DecodeError::NoInput:
  332. return Formatter<StringView>::format(fmtbuilder, "DecodeError(No input provided)");
  333. case DecodeError::NonConformingType:
  334. return Formatter<StringView>::format(fmtbuilder, "DecodeError(Tried to read with a non-conforming type)");
  335. case DecodeError::EndOfStream:
  336. return Formatter<StringView>::format(fmtbuilder, "DecodeError(End of stream)");
  337. case DecodeError::NotEnoughData:
  338. return Formatter<StringView>::format(fmtbuilder, "DecodeError(Not enough data)");
  339. case DecodeError::EnteringNonConstructedTag:
  340. return Formatter<StringView>::format(fmtbuilder, "DecodeError(Tried to enter a primitive tag)");
  341. case DecodeError::LeavingMainContext:
  342. return Formatter<StringView>::format(fmtbuilder, "DecodeError(Tried to leave the main context)");
  343. case DecodeError::InvalidInputFormat:
  344. return Formatter<StringView>::format(fmtbuilder, "DecodeError(Input data contained invalid syntax/data)");
  345. case DecodeError::Overflow:
  346. return Formatter<StringView>::format(fmtbuilder, "DecodeError(Construction would overflow)");
  347. case DecodeError::UnsupportedFormat:
  348. return Formatter<StringView>::format(fmtbuilder, "DecodeError(Input data format not supported by this parser)");
  349. default:
  350. return Formatter<StringView>::format(fmtbuilder, "DecodeError(Unknown)");
  351. }
  352. }