PEM.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. * Copyright (c) 2021, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Base64.h>
  7. #include <AK/GenericLexer.h>
  8. #include <LibCrypto/ASN1/PEM.h>
  9. namespace Crypto {
  10. ByteBuffer decode_pem(ReadonlyBytes data)
  11. {
  12. GenericLexer lexer { data };
  13. ByteBuffer decoded;
  14. // FIXME: Parse multiple.
  15. enum {
  16. PreStartData,
  17. Started,
  18. Ended,
  19. } state { PreStartData };
  20. while (!lexer.is_eof()) {
  21. switch (state) {
  22. case PreStartData:
  23. if (lexer.consume_specific("-----BEGIN"))
  24. state = Started;
  25. lexer.consume_line();
  26. break;
  27. case Started: {
  28. if (lexer.consume_specific("-----END")) {
  29. state = Ended;
  30. lexer.consume_line();
  31. break;
  32. }
  33. auto b64decoded = decode_base64(lexer.consume_line().trim_whitespace(TrimMode::Right));
  34. decoded.append(b64decoded.data(), b64decoded.size());
  35. break;
  36. }
  37. case Ended:
  38. lexer.consume_all();
  39. break;
  40. default:
  41. VERIFY_NOT_REACHED();
  42. }
  43. }
  44. return decoded;
  45. }
  46. }