mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 07:37:46 +00:00
LibCrypto: Make a better ASN.1 parser
And use it to parse RSA keys. As a bonus, this one shouldn't be reading out of bounds or messing with the stack (as much) anymore.
This commit is contained in:
parent
4d40864b9d
commit
3fe7ac0924
13 changed files with 893 additions and 624 deletions
|
@ -32,44 +32,6 @@
|
|||
|
||||
namespace Crypto {
|
||||
|
||||
static inline ByteBuffer decode_pem(ReadonlyBytes data_in, size_t cert_index = 0)
|
||||
{
|
||||
size_t i { 0 };
|
||||
size_t start_at { 0 };
|
||||
size_t idx { 0 };
|
||||
size_t input_length = data_in.size();
|
||||
auto alloc_len = input_length / 4 * 3;
|
||||
auto output = ByteBuffer::create_uninitialized(alloc_len);
|
||||
|
||||
for (i = 0; i < input_length; i++) {
|
||||
if ((data_in[i] == '\n') || (data_in[i] == '\r'))
|
||||
continue;
|
||||
|
||||
if (data_in[i] != '-') {
|
||||
// Read entire line.
|
||||
while ((i < input_length) && (data_in[i] != '\n'))
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (data_in[i] == '-') {
|
||||
auto end_idx = i;
|
||||
// Read until end of line.
|
||||
while ((i < input_length) && (data_in[i] != '\n'))
|
||||
i++;
|
||||
if (start_at) {
|
||||
if (cert_index > 0) {
|
||||
cert_index--;
|
||||
start_at = 0;
|
||||
} else {
|
||||
idx = decode_b64(data_in.offset(start_at), end_idx - start_at, output);
|
||||
break;
|
||||
}
|
||||
} else
|
||||
start_at = i + 1;
|
||||
}
|
||||
}
|
||||
return output.slice(0, idx);
|
||||
}
|
||||
ByteBuffer decode_pem(ReadonlyBytes);
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue