瀏覽代碼

LibCrypto: Add PEM encoder

This commit adds a new method to create a PEM encoded ASN1 from
its DER variant.
Fabian Dellwing 2 年之前
父節點
當前提交
8b881eaf02
共有 2 個文件被更改,包括 42 次插入0 次删除
  1. 36 0
      Userland/Libraries/LibCrypto/ASN1/PEM.cpp
  2. 6 0
      Userland/Libraries/LibCrypto/ASN1/PEM.h

+ 36 - 0
Userland/Libraries/LibCrypto/ASN1/PEM.cpp

@@ -93,4 +93,40 @@ ErrorOr<Vector<ByteBuffer>> decode_pems(ReadonlyBytes data)
     return pems;
     return pems;
 }
 }
 
 
+ErrorOr<ByteBuffer> encode_pem(ReadonlyBytes data, PEMType type)
+{
+    ByteBuffer encoded;
+    StringView block_start;
+    StringView block_end;
+
+    switch (type) {
+    case Certificate:
+        block_start = "-----BEGIN CERTIFICATE-----\n"sv;
+        block_end = "-----END CERTIFICATE-----\n"sv;
+        break;
+    case PrivateKey:
+        block_start = "-----BEGIN PRIVATE KEY-----\n"sv;
+        block_end = "-----END PRIVATE KEY-----\n"sv;
+        break;
+    default:
+        VERIFY_NOT_REACHED();
+    }
+
+    auto b64encoded = TRY(encode_base64(data));
+
+    TRY(encoded.try_append(block_start.bytes()));
+
+    size_t to_read = 64;
+    for (size_t i = 0; i < b64encoded.bytes().size(); i += to_read) {
+        if (i + to_read > b64encoded.bytes().size())
+            to_read = b64encoded.bytes().size() - i;
+        TRY(encoded.try_append(b64encoded.bytes().slice(i, to_read)));
+        TRY(encoded.try_append("\n"sv.bytes()));
+    }
+
+    TRY(encoded.try_append(block_end.bytes()));
+
+    return encoded;
+}
+
 }
 }

+ 6 - 0
Userland/Libraries/LibCrypto/ASN1/PEM.h

@@ -12,7 +12,13 @@
 
 
 namespace Crypto {
 namespace Crypto {
 
 
+enum PEMType {
+    Certificate,
+    PrivateKey,
+};
+
 ByteBuffer decode_pem(ReadonlyBytes);
 ByteBuffer decode_pem(ReadonlyBytes);
 ErrorOr<Vector<ByteBuffer>> decode_pems(ReadonlyBytes);
 ErrorOr<Vector<ByteBuffer>> decode_pems(ReadonlyBytes);
+ErrorOr<ByteBuffer> encode_pem(ReadonlyBytes, PEMType = PEMType::Certificate);
 
 
 }
 }