mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 12:07: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;
|
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 {
|
namespace Crypto {
|
||||||
|
|
||||||
ByteBuffer decode_pem(ReadonlyBytes);
|
ByteBuffer decode_pem(ReadonlyBytes);
|
||||||
|
ErrorOr<Vector<ByteBuffer>> decode_pems(ReadonlyBytes);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue