mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 06:27:45 +00:00
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:
parent
700ad6bf35
commit
06340ca674
2 changed files with 38 additions and 0 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -13,5 +13,6 @@
|
|||
namespace Crypto {
|
||||
|
||||
ByteBuffer decode_pem(ReadonlyBytes);
|
||||
ErrorOr<Vector<ByteBuffer>> decode_pems(ReadonlyBytes);
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue