summaryrefslogtreecommitdiff
path: root/ext/node/polyfills/_crypto/crypto_browserify/asn1.js/decoders/pem.js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/node/polyfills/_crypto/crypto_browserify/asn1.js/decoders/pem.js')
-rw-r--r--ext/node/polyfills/_crypto/crypto_browserify/asn1.js/decoders/pem.js63
1 files changed, 63 insertions, 0 deletions
diff --git a/ext/node/polyfills/_crypto/crypto_browserify/asn1.js/decoders/pem.js b/ext/node/polyfills/_crypto/crypto_browserify/asn1.js/decoders/pem.js
new file mode 100644
index 000000000..3dedfb293
--- /dev/null
+++ b/ext/node/polyfills/_crypto/crypto_browserify/asn1.js/decoders/pem.js
@@ -0,0 +1,63 @@
+// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
+// Copyright 2017 Fedor Indutny. All rights reserved. MIT license.
+
+import { Buffer } from "internal:deno_node/polyfills/buffer.ts";
+
+import { DERDecoder } from "internal:deno_node/polyfills/_crypto/crypto_browserify/asn1.js/decoders/der.js";
+
+export function PEMDecoder(entity) {
+ DERDecoder.call(this, entity);
+ this.enc = "pem";
+}
+// inherits(PEMDecoder, DERDecoder);
+PEMDecoder.prototype = Object.create(DERDecoder.prototype, {
+ constructor: {
+ value: PEMDecoder,
+ enumerable: false,
+ writable: true,
+ configurable: true,
+ },
+});
+
+PEMDecoder.prototype.decode = function decode(data, options) {
+ const lines = data.toString().split(/[\r\n]+/g);
+
+ const label = options.label.toUpperCase();
+
+ const re = /^-----(BEGIN|END) ([^-]+)-----$/;
+ let start = -1;
+ let end = -1;
+ for (let i = 0; i < lines.length; i++) {
+ const match = lines[i].match(re);
+ if (match === null) {
+ continue;
+ }
+
+ if (match[2] !== label) {
+ continue;
+ }
+
+ if (start === -1) {
+ if (match[1] !== "BEGIN") {
+ break;
+ }
+ start = i;
+ } else {
+ if (match[1] !== "END") {
+ break;
+ }
+ end = i;
+ break;
+ }
+ }
+ if (start === -1 || end === -1) {
+ throw new Error("PEM section not found for: " + label);
+ }
+
+ const base64 = lines.slice(start + 1, end).join("");
+ // Remove excessive symbols
+ base64.replace(/[^a-z0-9+/=]+/gi, "");
+
+ const input = Buffer.from(base64, "base64");
+ return DERDecoder.prototype.decode.call(this, input, options);
+};