LibCrypto: Add multiple PEM parser

This adds a function to parse multiple PEMs out of a single input.
This allows us to load certificates from a cacert.pem file without
need for preprocessing.
This commit is contained in:
Fabian Dellwing 2023-03-13 12:18:14 +01:00 committed by Ali Mohammad Pur
parent 700ad6bf35
commit 06340ca674
Notes: sideshowbarker 2024-07-18 22:57:59 +09:00
2 changed files with 38 additions and 0 deletions

View File

@ -56,4 +56,41 @@ ByteBuffer decode_pem(ReadonlyBytes data)
return decoded;
}
ErrorOr<Vector<ByteBuffer>> decode_pems(ReadonlyBytes data)
{
GenericLexer lexer { data };
ByteBuffer decoded;
Vector<ByteBuffer> pems;
enum {
Junk,
Parsing,
} state { Junk };
while (!lexer.is_eof()) {
switch (state) {
case Junk:
if (lexer.consume_specific("-----BEGIN"))
state = Parsing;
lexer.consume_line();
break;
case Parsing: {
if (lexer.consume_specific("-----END")) {
state = Junk;
lexer.consume_line();
TRY(pems.try_append(decoded));
decoded.clear();
break;
}
auto b64decoded = TRY(decode_base64(lexer.consume_line().trim_whitespace(TrimMode::Right)));
TRY(decoded.try_append(b64decoded.data(), b64decoded.size()));
break;
}
default:
VERIFY_NOT_REACHED();
}
}
return pems;
}
}

View File

@ -13,5 +13,6 @@
namespace Crypto {
ByteBuffer decode_pem(ReadonlyBytes);
ErrorOr<Vector<ByteBuffer>> decode_pems(ReadonlyBytes);
}