ic 卡
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
ASN.1 JavaScript decoder Copyright (c) 2008-2020 Lapo Luchini <lapo@lapo.it>
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
asn1js
|
||||
======
|
||||
|
||||
asn1js is a JavaScript generic ASN.1 parser/decoder that can decode any valid ASN.1 DER or BER structures.
|
||||
|
||||
An example page that can decode Base64-encoded (raw base64, PEM armoring and `begin-base64` are recognized) or Hex-encoded (or local files with some browsers) is included and can be used both [online on the official website](https://lapo.it/asn1js/) or [offline (ZIP file)](https://lapo.it/asn1js/asn1js.zip).
|
||||
|
||||
Usage with `npm` / `yarn`
|
||||
-------------------------
|
||||
|
||||
This package can be installed with either npm or yarn via the following commands:
|
||||
|
||||
```sh
|
||||
npm install @lapo/asn1js
|
||||
# or with yarn
|
||||
yarn add @lapo/asn1js
|
||||
```
|
||||
|
||||
Assuming a standard javascript bundler is setup you can import it like so:
|
||||
|
||||
```js
|
||||
const ASN1 = require('@lapo/asn1js');
|
||||
// or with ES modules
|
||||
import ASN1 from '@lapo/asn1js';
|
||||
```
|
||||
|
||||
A submodule of this package can also be imported:
|
||||
|
||||
```js
|
||||
const Hex = require('@lapo/asn1js/hex');
|
||||
// or with ES modules
|
||||
import Hex from '@lapo/asn1js/hex';
|
||||
```
|
||||
|
||||
Usage with RequireJS
|
||||
--------------------
|
||||
|
||||
Can be [tested on JSFiddle](https://jsfiddle.net/lapo/tmdq35ug/).
|
||||
|
||||
```html
|
||||
<script type="text/javascript" src="https://unpkg.com/requirejs/require.js"></script>
|
||||
<script>
|
||||
require([
|
||||
'https://unpkg.com/@lapo/asn1js/asn1.js',
|
||||
'https://unpkg.com/@lapo/asn1js/hex.js'
|
||||
], function(ASN1, Hex) {
|
||||
document.body.innerText = ASN1.decode(Hex.decode('06032B6570')).content();
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
ISC license
|
||||
-----------
|
||||
|
||||
ASN.1 JavaScript decoder Copyright (c) 2008-2020 Lapo Luchini <lapo@lapo.it>
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
credits
|
||||
-------
|
||||
|
||||
- OBJECT IDENTIFIER values are recognized using data taken from Peter Gutmann's [dumpasn1](https://www.cs.auckland.ac.nz/~pgut001/#standards) program.
|
||||
- BMPString support added by [Felipe Gasper](https://github.com/FGasper)
|
||||
- extended tag support added by [Péter Budai](https://www.peterbudai.eu/)
|
||||
- patches by [Gergely Nagy](https://github.com/ngg)
|
||||
|
||||
links
|
||||
-----
|
||||
|
||||
- [official website](https://lapo.it/asn1js/)
|
||||
- [InDefero tracker](http://idf.lapo.it/p/asn1js/)
|
||||
- [GitHub mirror](https://github.com/lapo-luchini/asn1js)
|
||||
- [Ohloh code stats](https://www.openhub.net/p/asn1js)
|
||||
@@ -0,0 +1,550 @@
|
||||
// ASN.1 JavaScript decoder
|
||||
// Copyright (c) 2008-2020 Lapo Luchini <lapo@lapo.it>
|
||||
|
||||
// Permission to use, copy, modify, and/or distribute this software for any
|
||||
// purpose with or without fee is hereby granted, provided that the above
|
||||
// copyright notice and this permission notice appear in all copies.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
(typeof define != 'undefined' ? define : function (factory) { 'use strict';
|
||||
if (typeof module == 'object') module.exports = factory(function (name) { return require(name); });
|
||||
else window.asn1 = factory(function (name) { return window[name.substring(2)]; });
|
||||
})(function (require) {
|
||||
"use strict";
|
||||
|
||||
var Int10 = require('./int10'),
|
||||
oids = require('./oids'),
|
||||
ellipsis = "\u2026",
|
||||
reTimeS = /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/,
|
||||
reTimeL = /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
|
||||
|
||||
function stringCut(str, len) {
|
||||
if (str.length > len)
|
||||
str = str.substring(0, len) + ellipsis;
|
||||
return str;
|
||||
}
|
||||
|
||||
function Stream(enc, pos) {
|
||||
if (enc instanceof Stream) {
|
||||
this.enc = enc.enc;
|
||||
this.pos = enc.pos;
|
||||
} else {
|
||||
// enc should be an array or a binary string
|
||||
this.enc = enc;
|
||||
this.pos = pos;
|
||||
}
|
||||
}
|
||||
Stream.prototype.get = function (pos) {
|
||||
if (pos === undefined)
|
||||
pos = this.pos++;
|
||||
if (pos >= this.enc.length)
|
||||
throw 'Requesting byte offset ' + pos + ' on a stream of length ' + this.enc.length;
|
||||
return (typeof this.enc == "string") ? this.enc.charCodeAt(pos) : this.enc[pos];
|
||||
};
|
||||
Stream.prototype.hexDigits = "0123456789ABCDEF";
|
||||
Stream.prototype.hexByte = function (b) {
|
||||
return this.hexDigits.charAt((b >> 4) & 0xF) + this.hexDigits.charAt(b & 0xF);
|
||||
};
|
||||
Stream.prototype.hexDump = function (start, end, raw) {
|
||||
var s = "";
|
||||
for (var i = start; i < end; ++i) {
|
||||
s += this.hexByte(this.get(i));
|
||||
if (raw !== true)
|
||||
switch (i & 0xF) {
|
||||
case 0x7: s += " "; break;
|
||||
case 0xF: s += "\n"; break;
|
||||
default: s += " ";
|
||||
}
|
||||
}
|
||||
return s;
|
||||
};
|
||||
var b64Safe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
||||
Stream.prototype.b64Dump = function (start, end) {
|
||||
var extra = (end - start) % 3,
|
||||
s = '',
|
||||
i, c;
|
||||
for (i = start; i + 2 < end; i += 3) {
|
||||
c = this.get(i) << 16 | this.get(i + 1) << 8 | this.get(i + 2);
|
||||
s += b64Safe.charAt(c >> 18 & 0x3F);
|
||||
s += b64Safe.charAt(c >> 12 & 0x3F);
|
||||
s += b64Safe.charAt(c >> 6 & 0x3F);
|
||||
s += b64Safe.charAt(c & 0x3F);
|
||||
}
|
||||
if (extra > 0) {
|
||||
c = this.get(i) << 16;
|
||||
if (extra > 1) c |= this.get(i + 1) << 8;
|
||||
s += b64Safe.charAt(c >> 18 & 0x3F);
|
||||
s += b64Safe.charAt(c >> 12 & 0x3F);
|
||||
if (extra == 2) s += b64Safe.charAt(c >> 6 & 0x3F);
|
||||
}
|
||||
return s;
|
||||
};
|
||||
Stream.prototype.isASCII = function (start, end) {
|
||||
for (var i = start; i < end; ++i) {
|
||||
var c = this.get(i);
|
||||
if (c < 32 || c > 176)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
Stream.prototype.parseStringISO = function (start, end) {
|
||||
var s = "";
|
||||
for (var i = start; i < end; ++i)
|
||||
s += String.fromCharCode(this.get(i));
|
||||
return s;
|
||||
};
|
||||
Stream.prototype.parseStringUTF = function (start, end) {
|
||||
function ex(c) { // must be 10xxxxxx
|
||||
if ((c < 0x80) || (c >= 0xC0))
|
||||
throw new Error('Invalid UTF-8 continuation byte: ' + c);
|
||||
return (c & 0x3F);
|
||||
}
|
||||
function surrogate(cp) {
|
||||
if (cp < 0x10000)
|
||||
throw new Error('UTF-8 overlong encoding, codepoint encoded in 4 bytes: ' + cp);
|
||||
// we could use String.fromCodePoint(cp) but let's be nice to older browsers and use surrogate pairs
|
||||
cp -= 0x10000;
|
||||
return String.fromCharCode((cp >> 10) + 0xD800, (cp & 0x3FF) + 0xDC00);
|
||||
}
|
||||
var s = "";
|
||||
for (var i = start; i < end; ) {
|
||||
var c = this.get(i++);
|
||||
if (c < 0x80) // 0xxxxxxx (7 bit)
|
||||
s += String.fromCharCode(c);
|
||||
else if (c < 0xC0)
|
||||
throw new Error('Invalid UTF-8 starting byte: ' + c);
|
||||
else if (c < 0xE0) // 110xxxxx 10xxxxxx (11 bit)
|
||||
s += String.fromCharCode(((c & 0x1F) << 6) | ex(this.get(i++)));
|
||||
else if (c < 0xF0) // 1110xxxx 10xxxxxx 10xxxxxx (16 bit)
|
||||
s += String.fromCharCode(((c & 0x0F) << 12) | (ex(this.get(i++)) << 6) | ex(this.get(i++)));
|
||||
else if (c < 0xF8) // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (21 bit)
|
||||
s += surrogate(((c & 0x07) << 18) | (ex(this.get(i++)) << 12) | (ex(this.get(i++)) << 6) | ex(this.get(i++)));
|
||||
else
|
||||
throw new Error('Invalid UTF-8 starting byte (since 2003 it is restricted to 4 bytes): ' + c);
|
||||
}
|
||||
return s;
|
||||
};
|
||||
Stream.prototype.parseStringBMP = function (start, end) {
|
||||
var str = "", hi, lo;
|
||||
for (var i = start; i < end; ) {
|
||||
hi = this.get(i++);
|
||||
lo = this.get(i++);
|
||||
str += String.fromCharCode((hi << 8) | lo);
|
||||
}
|
||||
return str;
|
||||
};
|
||||
Stream.prototype.parseTime = function (start, end, shortYear) {
|
||||
var s = this.parseStringISO(start, end),
|
||||
m = (shortYear ? reTimeS : reTimeL).exec(s);
|
||||
if (!m)
|
||||
return "Unrecognized time: " + s;
|
||||
if (shortYear) {
|
||||
// to avoid querying the timer, use the fixed range [1970, 2069]
|
||||
// it will conform with ITU X.400 [-10, +40] sliding window until 2030
|
||||
m[1] = +m[1];
|
||||
m[1] += (m[1] < 70) ? 2000 : 1900;
|
||||
}
|
||||
s = m[1] + "-" + m[2] + "-" + m[3] + " " + m[4];
|
||||
if (m[5]) {
|
||||
s += ":" + m[5];
|
||||
if (m[6]) {
|
||||
s += ":" + m[6];
|
||||
if (m[7])
|
||||
s += "." + m[7];
|
||||
}
|
||||
}
|
||||
if (m[8]) {
|
||||
s += " UTC";
|
||||
if (m[8] != 'Z') {
|
||||
s += m[8];
|
||||
if (m[9])
|
||||
s += ":" + m[9];
|
||||
}
|
||||
}
|
||||
return s;
|
||||
};
|
||||
Stream.prototype.parseInteger = function (start, end) {
|
||||
var v = this.get(start),
|
||||
neg = (v > 127),
|
||||
pad = neg ? 255 : 0,
|
||||
len,
|
||||
s = '';
|
||||
// skip unuseful bits (not allowed in DER)
|
||||
while (v == pad && ++start < end)
|
||||
v = this.get(start);
|
||||
len = end - start;
|
||||
if (len === 0)
|
||||
return neg ? '-1' : '0';
|
||||
// show bit length of huge integers
|
||||
if (len > 4) {
|
||||
s = v;
|
||||
len <<= 3;
|
||||
while (((s ^ pad) & 0x80) == 0) {
|
||||
s <<= 1;
|
||||
--len;
|
||||
}
|
||||
s = "(" + len + " bit)\n";
|
||||
}
|
||||
// decode the integer
|
||||
if (neg) v = v - 256;
|
||||
var n = new Int10(v);
|
||||
for (var i = start + 1; i < end; ++i)
|
||||
n.mulAdd(256, this.get(i));
|
||||
return s + n.toString();
|
||||
};
|
||||
Stream.prototype.parseBitString = function (start, end, maxLength) {
|
||||
var unusedBits = this.get(start);
|
||||
if (unusedBits > 7)
|
||||
throw 'Invalid BitString with unusedBits=' + unusedBits;
|
||||
var lenBit = ((end - start - 1) << 3) - unusedBits,
|
||||
s = "";
|
||||
for (var i = start + 1; i < end; ++i) {
|
||||
var b = this.get(i),
|
||||
skip = (i == end - 1) ? unusedBits : 0;
|
||||
for (var j = 7; j >= skip; --j)
|
||||
s += (b >> j) & 1 ? "1" : "0";
|
||||
if (s.length > maxLength)
|
||||
s = stringCut(s, maxLength);
|
||||
}
|
||||
return { size: lenBit, str: s };
|
||||
};
|
||||
Stream.prototype.parseOctetString = function (start, end, maxLength) {
|
||||
var len = end - start,
|
||||
s;
|
||||
try {
|
||||
s = this.parseStringUTF(start, end);
|
||||
var v;
|
||||
for (i = 0; i < s.length; ++i) {
|
||||
v = s.charCodeAt(i);
|
||||
if (v < 32 && v != 9 && v != 10 && v != 13) // [\t\r\n] are (kinda) printable
|
||||
throw new Error('Unprintable character at index ' + i + ' (code ' + s.charCodeAt(i) + ")");
|
||||
}
|
||||
return { size: len, str: s };
|
||||
} catch (e) {
|
||||
// ignore
|
||||
}
|
||||
maxLength /= 2; // we work in bytes
|
||||
if (len > maxLength)
|
||||
end = start + maxLength;
|
||||
s = '';
|
||||
for (var i = start; i < end; ++i)
|
||||
s += this.hexByte(this.get(i));
|
||||
if (len > maxLength)
|
||||
s += ellipsis;
|
||||
return { size: len, str: s };
|
||||
};
|
||||
Stream.prototype.parseOID = function (start, end, maxLength) {
|
||||
var s = '',
|
||||
n = new Int10(),
|
||||
bits = 0;
|
||||
for (var i = start; i < end; ++i) {
|
||||
var v = this.get(i);
|
||||
n.mulAdd(128, v & 0x7F);
|
||||
bits += 7;
|
||||
if (!(v & 0x80)) { // finished
|
||||
if (s === '') {
|
||||
n = n.simplify();
|
||||
if (n instanceof Int10) {
|
||||
n.sub(80);
|
||||
s = "2." + n.toString();
|
||||
} else {
|
||||
var m = n < 80 ? n < 40 ? 0 : 1 : 2;
|
||||
s = m + "." + (n - m * 40);
|
||||
}
|
||||
} else
|
||||
s += "." + n.toString();
|
||||
if (s.length > maxLength)
|
||||
return stringCut(s, maxLength);
|
||||
n = new Int10();
|
||||
bits = 0;
|
||||
}
|
||||
}
|
||||
if (bits > 0)
|
||||
s += ".incomplete";
|
||||
if (typeof oids === 'object') {
|
||||
var oid = oids[s];
|
||||
if (oid) {
|
||||
if (oid.d) s += "\n" + oid.d;
|
||||
if (oid.c) s += "\n" + oid.c;
|
||||
if (oid.w) s += "\n(warning!)";
|
||||
}
|
||||
}
|
||||
return s;
|
||||
};
|
||||
|
||||
function ASN1(stream, header, length, tag, tagLen, sub) {
|
||||
if (!(tag instanceof ASN1Tag)) throw 'Invalid tag value.';
|
||||
this.stream = stream;
|
||||
this.header = header;
|
||||
this.length = length;
|
||||
this.tag = tag;
|
||||
this.tagLen = tagLen;
|
||||
this.sub = sub;
|
||||
}
|
||||
ASN1.prototype.typeName = function () {
|
||||
switch (this.tag.tagClass) {
|
||||
case 0: // universal
|
||||
switch (this.tag.tagNumber) {
|
||||
case 0x00: return "EOC";
|
||||
case 0x01: return "BOOLEAN";
|
||||
case 0x02: return "INTEGER";
|
||||
case 0x03: return "BIT_STRING";
|
||||
case 0x04: return "OCTET_STRING";
|
||||
case 0x05: return "NULL";
|
||||
case 0x06: return "OBJECT_IDENTIFIER";
|
||||
case 0x07: return "ObjectDescriptor";
|
||||
case 0x08: return "EXTERNAL";
|
||||
case 0x09: return "REAL";
|
||||
case 0x0A: return "ENUMERATED";
|
||||
case 0x0B: return "EMBEDDED_PDV";
|
||||
case 0x0C: return "UTF8String";
|
||||
case 0x10: return "SEQUENCE";
|
||||
case 0x11: return "SET";
|
||||
case 0x12: return "NumericString";
|
||||
case 0x13: return "PrintableString"; // ASCII subset
|
||||
case 0x14: return "TeletexString"; // aka T61String
|
||||
case 0x15: return "VideotexString";
|
||||
case 0x16: return "IA5String"; // ASCII
|
||||
case 0x17: return "UTCTime";
|
||||
case 0x18: return "GeneralizedTime";
|
||||
case 0x19: return "GraphicString";
|
||||
case 0x1A: return "VisibleString"; // ASCII subset
|
||||
case 0x1B: return "GeneralString";
|
||||
case 0x1C: return "UniversalString";
|
||||
case 0x1E: return "BMPString";
|
||||
}
|
||||
return "Universal_" + this.tag.tagNumber.toString();
|
||||
case 1: return "Application_" + this.tag.tagNumber.toString();
|
||||
case 2: return "[" + this.tag.tagNumber.toString() + "]"; // Context
|
||||
case 3: return "Private_" + this.tag.tagNumber.toString();
|
||||
}
|
||||
};
|
||||
function recurse(el, parser, maxLength) {
|
||||
var avoidRecurse = true;
|
||||
if (el.tag.tagConstructed && el.sub) {
|
||||
avoidRecurse = false;
|
||||
el.sub.forEach(function (e1) {
|
||||
if (e1.tag.tagClass != el.tag.tagClass || e1.tag.tagNumber != el.tag.tagNumber)
|
||||
avoidRecurse = true;
|
||||
});
|
||||
}
|
||||
if (avoidRecurse)
|
||||
return el.stream[parser](el.posContent(), el.posContent() + Math.abs(el.length), maxLength);
|
||||
var d = { size: 0, str: '' };
|
||||
el.sub.forEach(function (el) {
|
||||
var d1 = recurse(el, parser, maxLength - d.str.length);
|
||||
d.size += d1.size;
|
||||
d.str += d1.str;
|
||||
});
|
||||
return d;
|
||||
}
|
||||
/** A string preview of the content (intended for humans). */
|
||||
ASN1.prototype.content = function (maxLength) {
|
||||
if (this.tag === undefined)
|
||||
return null;
|
||||
if (maxLength === undefined)
|
||||
maxLength = Infinity;
|
||||
var content = this.posContent(),
|
||||
len = Math.abs(this.length);
|
||||
if (!this.tag.isUniversal()) {
|
||||
if (this.sub !== null)
|
||||
return "(" + this.sub.length + " elem)";
|
||||
var d1 = this.stream.parseOctetString(content, content + len, maxLength);
|
||||
return "(" + d1.size + " byte)\n" + d1.str;
|
||||
}
|
||||
switch (this.tag.tagNumber) {
|
||||
case 0x01: // BOOLEAN
|
||||
return (this.stream.get(content) === 0) ? "false" : "true";
|
||||
case 0x02: // INTEGER
|
||||
return this.stream.parseInteger(content, content + len);
|
||||
case 0x03: // BIT_STRING
|
||||
var d = recurse(this, 'parseBitString', maxLength);
|
||||
return "(" + d.size + " bit)\n" + d.str;
|
||||
case 0x04: // OCTET_STRING
|
||||
d = recurse(this, 'parseOctetString', maxLength);
|
||||
return "(" + d.size + " byte)\n" + d.str;
|
||||
//case 0x05: // NULL
|
||||
case 0x06: // OBJECT_IDENTIFIER
|
||||
return this.stream.parseOID(content, content + len, maxLength);
|
||||
//case 0x07: // ObjectDescriptor
|
||||
//case 0x08: // EXTERNAL
|
||||
//case 0x09: // REAL
|
||||
case 0x0A: // ENUMERATED
|
||||
return this.stream.parseInteger(content, content + len);
|
||||
//case 0x0B: // EMBEDDED_PDV
|
||||
case 0x10: // SEQUENCE
|
||||
case 0x11: // SET
|
||||
if (this.sub !== null)
|
||||
return "(" + this.sub.length + " elem)";
|
||||
else
|
||||
return "(no elem)";
|
||||
case 0x0C: // UTF8String
|
||||
return stringCut(this.stream.parseStringUTF(content, content + len), maxLength);
|
||||
case 0x12: // NumericString
|
||||
case 0x13: // PrintableString
|
||||
case 0x14: // TeletexString
|
||||
case 0x15: // VideotexString
|
||||
case 0x16: // IA5String
|
||||
case 0x1A: // VisibleString
|
||||
case 0x1B: // GeneralString
|
||||
//case 0x19: // GraphicString
|
||||
//case 0x1C: // UniversalString
|
||||
return stringCut(this.stream.parseStringISO(content, content + len), maxLength);
|
||||
case 0x1E: // BMPString
|
||||
return stringCut(this.stream.parseStringBMP(content, content + len), maxLength);
|
||||
case 0x17: // UTCTime
|
||||
case 0x18: // GeneralizedTime
|
||||
return this.stream.parseTime(content, content + len, (this.tag.tagNumber == 0x17));
|
||||
}
|
||||
return null;
|
||||
};
|
||||
ASN1.prototype.toString = function () {
|
||||
return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length + ",sub:" + ((this.sub === null) ? 'null' : this.sub.length) + "]";
|
||||
};
|
||||
ASN1.prototype.toPrettyString = function (indent) {
|
||||
if (indent === undefined) indent = '';
|
||||
var s = indent + this.typeName() + " @" + this.stream.pos;
|
||||
if (this.length >= 0)
|
||||
s += "+";
|
||||
s += this.length;
|
||||
if (this.tag.tagConstructed)
|
||||
s += " (constructed)";
|
||||
else if ((this.tag.isUniversal() && ((this.tag.tagNumber == 0x03) || (this.tag.tagNumber == 0x04))) && (this.sub !== null))
|
||||
s += " (encapsulates)";
|
||||
var content = this.content();
|
||||
if (content)
|
||||
s += ": " + content.replace(/\n/g, '|');
|
||||
s += "\n";
|
||||
if (this.sub !== null) {
|
||||
indent += ' ';
|
||||
for (var i = 0, max = this.sub.length; i < max; ++i)
|
||||
s += this.sub[i].toPrettyString(indent);
|
||||
}
|
||||
return s;
|
||||
};
|
||||
ASN1.prototype.posStart = function () {
|
||||
return this.stream.pos;
|
||||
};
|
||||
ASN1.prototype.posContent = function () {
|
||||
return this.stream.pos + this.header;
|
||||
};
|
||||
ASN1.prototype.posEnd = function () {
|
||||
return this.stream.pos + this.header + Math.abs(this.length);
|
||||
};
|
||||
/** Position of the length. */
|
||||
ASN1.prototype.posLen = function() {
|
||||
return this.stream.pos + this.tagLen;
|
||||
};
|
||||
ASN1.prototype.toHexString = function () {
|
||||
return this.stream.hexDump(this.posStart(), this.posEnd(), true);
|
||||
};
|
||||
ASN1.prototype.toB64String = function () {
|
||||
return this.stream.b64Dump(this.posStart(), this.posEnd());
|
||||
};
|
||||
ASN1.decodeLength = function (stream) {
|
||||
var buf = stream.get(),
|
||||
len = buf & 0x7F;
|
||||
if (len == buf) // first bit was 0, short form
|
||||
return len;
|
||||
if (len === 0) // long form with length 0 is a special case
|
||||
return null; // undefined length
|
||||
if (len > 6) // no reason to use Int10, as it would be a huge buffer anyways
|
||||
throw "Length over 48 bits not supported at position " + (stream.pos - 1);
|
||||
buf = 0;
|
||||
for (var i = 0; i < len; ++i)
|
||||
buf = (buf * 256) + stream.get();
|
||||
return buf;
|
||||
};
|
||||
function ASN1Tag(stream) {
|
||||
var buf = stream.get();
|
||||
this.tagClass = buf >> 6;
|
||||
this.tagConstructed = ((buf & 0x20) !== 0);
|
||||
this.tagNumber = buf & 0x1F;
|
||||
if (this.tagNumber == 0x1F) { // long tag
|
||||
var n = new Int10();
|
||||
do {
|
||||
buf = stream.get();
|
||||
n.mulAdd(128, buf & 0x7F);
|
||||
} while (buf & 0x80);
|
||||
this.tagNumber = n.simplify();
|
||||
}
|
||||
}
|
||||
ASN1Tag.prototype.isUniversal = function () {
|
||||
return this.tagClass === 0x00;
|
||||
};
|
||||
ASN1Tag.prototype.isEOC = function () {
|
||||
return this.tagClass === 0x00 && this.tagNumber === 0x00;
|
||||
};
|
||||
ASN1.decode = function (stream, offset) {
|
||||
if (!(stream instanceof Stream))
|
||||
stream = new Stream(stream, offset || 0);
|
||||
var streamStart = new Stream(stream),
|
||||
tag = new ASN1Tag(stream),
|
||||
tagLen = stream.pos - streamStart.pos,
|
||||
len = ASN1.decodeLength(stream),
|
||||
start = stream.pos,
|
||||
header = start - streamStart.pos,
|
||||
sub = null,
|
||||
getSub = function () {
|
||||
sub = [];
|
||||
if (len !== null) {
|
||||
// definite length
|
||||
var end = start + len;
|
||||
if (end > stream.enc.length)
|
||||
throw 'Container at offset ' + start + ' has a length of ' + len + ', which is past the end of the stream';
|
||||
while (stream.pos < end)
|
||||
sub[sub.length] = ASN1.decode(stream);
|
||||
if (stream.pos != end)
|
||||
throw 'Content size is not correct for container at offset ' + start;
|
||||
} else {
|
||||
// undefined length
|
||||
try {
|
||||
for (;;) {
|
||||
var s = ASN1.decode(stream);
|
||||
if (s.tag.isEOC())
|
||||
break;
|
||||
sub[sub.length] = s;
|
||||
}
|
||||
len = start - stream.pos; // undefined lengths are represented as negative values
|
||||
} catch (e) {
|
||||
throw 'Exception while decoding undefined length content at offset ' + start + ': ' + e;
|
||||
}
|
||||
}
|
||||
};
|
||||
if (tag.tagConstructed) {
|
||||
// must have valid content
|
||||
getSub();
|
||||
} else if (tag.isUniversal() && ((tag.tagNumber == 0x03) || (tag.tagNumber == 0x04))) {
|
||||
// sometimes BitString and OctetString are used to encapsulate ASN.1
|
||||
try {
|
||||
if (tag.tagNumber == 0x03)
|
||||
if (stream.get() != 0)
|
||||
throw "BIT STRINGs with unused bits cannot encapsulate.";
|
||||
getSub();
|
||||
for (var i = 0; i < sub.length; ++i)
|
||||
if (sub[i].tag.isEOC())
|
||||
throw 'EOC is not supposed to be actual content.';
|
||||
} catch (e) {
|
||||
// but silently ignore when they don't
|
||||
sub = null;
|
||||
//DEBUG console.log('Could not decode structure at ' + start + ':', e);
|
||||
}
|
||||
}
|
||||
if (sub === null) {
|
||||
if (len === null)
|
||||
throw "We can't skip over an invalid tag with undefined length at offset " + start;
|
||||
stream.pos = start + Math.abs(len);
|
||||
}
|
||||
return new ASN1(streamStart, header, len, tag, tagLen, sub);
|
||||
};
|
||||
|
||||
return ASN1;
|
||||
|
||||
});
|
||||
@@ -0,0 +1,105 @@
|
||||
// Base64 JavaScript decoder
|
||||
// Copyright (c) 2008-2020 Lapo Luchini <lapo@lapo.it>
|
||||
|
||||
// Permission to use, copy, modify, and/or distribute this software for any
|
||||
// purpose with or without fee is hereby granted, provided that the above
|
||||
// copyright notice and this permission notice appear in all copies.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
(typeof define != 'undefined' ? define : function (factory) { 'use strict';
|
||||
if (typeof module == 'object') module.exports = factory();
|
||||
else window.base64 = factory();
|
||||
})(function () {
|
||||
"use strict";
|
||||
|
||||
var Base64 = {},
|
||||
decoder, // populated on first usage
|
||||
haveU8 = (typeof Uint8Array == 'function');
|
||||
|
||||
Base64.decode = function (a) {
|
||||
var isString = (typeof a == 'string');
|
||||
var i;
|
||||
if (decoder === undefined) {
|
||||
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
|
||||
ignore = "= \f\n\r\t\u00A0\u2028\u2029";
|
||||
decoder = [];
|
||||
for (i = 0; i < 64; ++i)
|
||||
decoder[b64.charCodeAt(i)] = i;
|
||||
for (i = 0; i < ignore.length; ++i)
|
||||
decoder[ignore.charCodeAt(i)] = -1;
|
||||
// RFC 3548 URL & file safe encoding
|
||||
decoder['-'.charCodeAt(0)] = decoder['+'.charCodeAt(0)];
|
||||
decoder['_'.charCodeAt(0)] = decoder['/'.charCodeAt(0)];
|
||||
}
|
||||
var out = haveU8 ? new Uint8Array(a.length * 3 >> 2) : [];
|
||||
var bits = 0, char_count = 0, len = 0;
|
||||
for (i = 0; i < a.length; ++i) {
|
||||
var c = isString ? a.charCodeAt(i) : a[i];
|
||||
if (c == 61) // '='.charCodeAt(0)
|
||||
break;
|
||||
c = decoder[c];
|
||||
if (c == -1)
|
||||
continue;
|
||||
if (c === undefined)
|
||||
throw 'Illegal character at offset ' + i;
|
||||
bits |= c;
|
||||
if (++char_count >= 4) {
|
||||
out[len++] = (bits >> 16);
|
||||
out[len++] = (bits >> 8) & 0xFF;
|
||||
out[len++] = bits & 0xFF;
|
||||
bits = 0;
|
||||
char_count = 0;
|
||||
} else {
|
||||
bits <<= 6;
|
||||
}
|
||||
}
|
||||
switch (char_count) {
|
||||
case 1:
|
||||
throw "Base64 encoding incomplete: at least 2 bits missing";
|
||||
case 2:
|
||||
out[len++] = (bits >> 10);
|
||||
break;
|
||||
case 3:
|
||||
out[len++] = (bits >> 16);
|
||||
out[len++] = (bits >> 8) & 0xFF;
|
||||
break;
|
||||
}
|
||||
if (haveU8 && out.length > len) // in case it was originally longer because of ignored characters
|
||||
out = out.subarray(0, len);
|
||||
return out;
|
||||
};
|
||||
|
||||
Base64.pretty = function (str) {
|
||||
// fix padding
|
||||
if (str.length % 4 > 0)
|
||||
str = (str + '===').slice(0, str.length + str.length % 4);
|
||||
// convert RFC 3548 to standard Base64
|
||||
str = str.replace(/-/g, '+').replace(/_/g, '/');
|
||||
// 80 column width
|
||||
return str.replace(/(.{80})/g, '$1\n');
|
||||
};
|
||||
|
||||
Base64.re = /-----BEGIN [^-]+-----([A-Za-z0-9+/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+/=\s]+)====/;
|
||||
Base64.unarmor = function (a) {
|
||||
var m = Base64.re.exec(a);
|
||||
if (m) {
|
||||
if (m[1])
|
||||
a = m[1];
|
||||
else if (m[2])
|
||||
a = m[2];
|
||||
else
|
||||
throw "RegExp out of sync";
|
||||
}
|
||||
return Base64.decode(a);
|
||||
};
|
||||
|
||||
return Base64;
|
||||
|
||||
});
|
||||
@@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
type gsha256sum >/dev/null && SHA256=gsha256sum || SHA256=sha256sum
|
||||
gpg --verify -o - sha256sums.asc | $SHA256 -c --quiet
|
||||
+220
@@ -0,0 +1,220 @@
|
||||
// ASN.1 JavaScript decoder
|
||||
// Copyright (c) 2008-2020 Lapo Luchini <lapo@lapo.it>
|
||||
|
||||
// Permission to use, copy, modify, and/or distribute this software for any
|
||||
// purpose with or without fee is hereby granted, provided that the above
|
||||
// copyright notice and this permission notice appear in all copies.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
(typeof define != 'undefined' ? define : function (factory) { 'use strict';
|
||||
if (typeof module == 'object') factory(function (name) { return require(name); });
|
||||
else factory(function (name) { return window[name.substring(2)]; });
|
||||
})(function (require) {
|
||||
"use strict";
|
||||
|
||||
var ASN1 = require('./asn1'),
|
||||
oids = require('./oids'),
|
||||
lineLength = 80,
|
||||
contentLength = 8 * lineLength,
|
||||
DOM = {
|
||||
ellipsis: "...",
|
||||
tag: function (tagName, className) {
|
||||
var t = document.createElement(tagName);
|
||||
t.className = className;
|
||||
return t;
|
||||
},
|
||||
text: function (str) {
|
||||
return document.createTextNode(str);
|
||||
},
|
||||
space: function () {
|
||||
var t = document.createElement('span');
|
||||
t.className = 'spaces';
|
||||
t.innerHTML = ' ';
|
||||
return t;
|
||||
},
|
||||
breakLines: function (str, length) {
|
||||
var lines = str.split(/\r?\n/),
|
||||
o = '';
|
||||
for (var i = 0; i < lines.length; ++i) {
|
||||
var line = lines[i];
|
||||
if (i > 0) o += "\n";
|
||||
while (line.length > length) {
|
||||
o += line.substring(0, length);
|
||||
o += "\n";
|
||||
line = line.substring(length);
|
||||
}
|
||||
o += line;
|
||||
}
|
||||
return o;
|
||||
}
|
||||
};
|
||||
|
||||
ASN1.prototype.toDOM = function (spaces) {
|
||||
spaces = spaces || '';
|
||||
var isOID = (typeof oids === 'object') && (this.tag.isUniversal() && (this.tag.tagNumber == 0x06));
|
||||
var node = DOM.tag("div", "node");
|
||||
node.asn1 = this;
|
||||
var head = DOM.tag("div", "head");
|
||||
head.innerHTML = "<span class='spaces'>" + spaces + "</span>" + this.typeName().replace(/_/g, " ");
|
||||
var content = this.content(contentLength);
|
||||
if (content !== null) {
|
||||
var preview = DOM.tag("span", "preview"),
|
||||
shortContent;
|
||||
if (isOID)
|
||||
content = content.split('\n', 1)[0];
|
||||
shortContent = (content.length > lineLength) ? content.substring(0, lineLength) + DOM.ellipsis : content;
|
||||
preview.appendChild(DOM.space());
|
||||
preview.appendChild(DOM.text(shortContent));
|
||||
if (isOID) {
|
||||
var oid = oids[content];
|
||||
if (oid) {
|
||||
if (oid.d) {
|
||||
preview.appendChild(DOM.space());
|
||||
var oidd = DOM.tag("span", "oid description");
|
||||
oidd.appendChild(DOM.text(oid.d));
|
||||
preview.appendChild(oidd);
|
||||
}
|
||||
if (oid.c) {
|
||||
preview.appendChild(DOM.space());
|
||||
var oidc = DOM.tag("span", "oid comment");
|
||||
oidc.appendChild(DOM.text("(" + oid.c + ")"));
|
||||
preview.appendChild(oidc);
|
||||
}
|
||||
}
|
||||
}
|
||||
head.appendChild(preview);
|
||||
content = DOM.breakLines(content, lineLength);
|
||||
content = content.replace(/</g, "<");
|
||||
content = content.replace(/\n/g, "<br>");
|
||||
}
|
||||
node.appendChild(head);
|
||||
this.node = node;
|
||||
this.head = head;
|
||||
var value = DOM.tag("div", "value");
|
||||
var s = "Offset: " + this.stream.pos + "<br>";
|
||||
s += "Length: " + this.header + "+";
|
||||
if (this.length >= 0)
|
||||
s += this.length;
|
||||
else
|
||||
s += (-this.length) + " (undefined)";
|
||||
if (this.tag.tagConstructed)
|
||||
s += "<br>(constructed)";
|
||||
else if ((this.tag.isUniversal() && ((this.tag.tagNumber == 0x03) || (this.tag.tagNumber == 0x04))) && (this.sub !== null))
|
||||
s += "<br>(encapsulates)";
|
||||
//TODO if (this.tag.isUniversal() && this.tag.tagNumber == 0x03) s += "Unused bits: "
|
||||
if (content !== null) {
|
||||
s += "<br>Value:<br><b>" + content + "</b>";
|
||||
if (isOID && oid) {
|
||||
if (oid.d) s += "<br>" + oid.d;
|
||||
if (oid.c) s += "<br>" + oid.c;
|
||||
if (oid.w) s += "<br>(warning!)";
|
||||
}
|
||||
}
|
||||
value.innerHTML = s;
|
||||
node.appendChild(value);
|
||||
var sub = DOM.tag("div", "sub");
|
||||
if (this.sub !== null) {
|
||||
spaces += '\xA0 ';
|
||||
for (var i = 0, max = this.sub.length; i < max; ++i)
|
||||
sub.appendChild(this.sub[i].toDOM(spaces));
|
||||
}
|
||||
node.appendChild(sub);
|
||||
head.onclick = function () {
|
||||
node.className = (node.className == "node collapsed") ? "node" : "node collapsed";
|
||||
};
|
||||
return node;
|
||||
};
|
||||
ASN1.prototype.fakeHover = function (current) {
|
||||
this.node.className += " hover";
|
||||
if (current)
|
||||
this.head.className += " hover";
|
||||
};
|
||||
ASN1.prototype.fakeOut = function (current) {
|
||||
var re = / ?hover/;
|
||||
this.node.className = this.node.className.replace(re, "");
|
||||
if (current)
|
||||
this.head.className = this.head.className.replace(re, "");
|
||||
};
|
||||
ASN1.prototype.toHexDOM_sub = function (node, className, stream, start, end) {
|
||||
if (start >= end)
|
||||
return;
|
||||
var sub = DOM.tag("span", className);
|
||||
sub.appendChild(DOM.text(
|
||||
stream.hexDump(start, end)));
|
||||
node.appendChild(sub);
|
||||
};
|
||||
ASN1.prototype.toHexDOM = function (root) {
|
||||
var node = DOM.tag("span", "hex");
|
||||
if (root === undefined) root = node;
|
||||
this.head.hexNode = node;
|
||||
this.head.onmouseover = function () { this.hexNode.className = "hexCurrent"; };
|
||||
this.head.onmouseout = function () { this.hexNode.className = "hex"; };
|
||||
node.asn1 = this;
|
||||
node.onmouseover = function () {
|
||||
var current = !root.selected;
|
||||
if (current) {
|
||||
root.selected = this.asn1;
|
||||
this.className = "hexCurrent";
|
||||
}
|
||||
this.asn1.fakeHover(current);
|
||||
};
|
||||
node.onmouseout = function () {
|
||||
var current = (root.selected == this.asn1);
|
||||
this.asn1.fakeOut(current);
|
||||
if (current) {
|
||||
root.selected = null;
|
||||
this.className = "hex";
|
||||
}
|
||||
};
|
||||
if (root == node) {
|
||||
var lineStart = this.posStart() & 0xF;
|
||||
if (lineStart != 0) {
|
||||
var skip = DOM.tag("span", "skip");
|
||||
var skipStr = '';
|
||||
for (var j = lineStart; j > 0; --j)
|
||||
skipStr += ' ';
|
||||
if (lineStart >= 8)
|
||||
skipStr += ' ';
|
||||
skip.innerText = skipStr;
|
||||
node.appendChild(skip);
|
||||
}
|
||||
}
|
||||
this.toHexDOM_sub(node, "tag", this.stream, this.posStart(), this.posLen());
|
||||
this.toHexDOM_sub(node, (this.length >= 0) ? "dlen" : "ulen", this.stream, this.posLen(), this.posContent());
|
||||
if (this.sub === null) {
|
||||
var start = this.posContent();
|
||||
var end = this.posEnd();
|
||||
if (end - start < 10 * 16)
|
||||
node.appendChild(DOM.text(
|
||||
this.stream.hexDump(start, end)));
|
||||
else {
|
||||
var end1 = start + 5 * 16 - (start & 0xF);
|
||||
var start2 = end - 16 - (end & 0xF);
|
||||
node.appendChild(DOM.text(
|
||||
this.stream.hexDump(start, end1)));
|
||||
var sub = DOM.tag("span", "skip");
|
||||
sub.appendChild(DOM.text("\u2026 skipping " + (start2 - end1) + " bytes \u2026\n"));
|
||||
node.appendChild(sub);
|
||||
node.appendChild(DOM.text(
|
||||
this.stream.hexDump(start2, end)));
|
||||
}
|
||||
} else if (this.sub.length > 0) {
|
||||
var first = this.sub[0];
|
||||
var last = this.sub[this.sub.length - 1];
|
||||
this.toHexDOM_sub(node, "intro", this.stream, this.posContent(), first.posStart());
|
||||
for (var i = 0, max = this.sub.length; i < max; ++i)
|
||||
node.appendChild(this.sub[i].toHexDOM(root));
|
||||
this.toHexDOM_sub(node, "outro", this.stream, last.posEnd(), this.posEnd());
|
||||
} else
|
||||
this.toHexDOM_sub(node, "outro", this.stream, this.posContent(), this.posEnd());
|
||||
return node;
|
||||
};
|
||||
|
||||
});
|
||||
@@ -0,0 +1,13 @@
|
||||
X.509 certificate based on Daniel J. Bernstein’s Curve25519 (as per RFC 8410).
|
||||
$ openssl req -x509 -newkey ed25519 -keyout test.key -out test.cer -days 3652 -subj '/C=IT/L=Milano/CN=Test ed25519'
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIBfzCCATGgAwIBAgIUfI5kSdcO2S0+LkpdL3b2VUJG10YwBQYDK2VwMDUxCzAJ
|
||||
BgNVBAYTAklUMQ8wDQYDVQQHDAZNaWxhbm8xFTATBgNVBAMMDFRlc3QgZWQyNTUx
|
||||
OTAeFw0yMDA5MDIxMzI1MjZaFw0zMDA5MDIxMzI1MjZaMDUxCzAJBgNVBAYTAklU
|
||||
MQ8wDQYDVQQHDAZNaWxhbm8xFTATBgNVBAMMDFRlc3QgZWQyNTUxOTAqMAUGAytl
|
||||
cAMhADupL/3LF2beQKKS95PeMPgKI6gxIV3QB9hjJC7/aCGFo1MwUTAdBgNVHQ4E
|
||||
FgQUa6W9z536I1l4EmQXrh5y2JqASugwHwYDVR0jBBgwFoAUa6W9z536I1l4EmQX
|
||||
rh5y2JqASugwDwYDVR0TAQH/BAUwAwEB/zAFBgMrZXADQQBvc3e+KJZaMzbX5TT9
|
||||
kPP9QH8fAvkAV/IWDxZrBL9lhLaY0tDSv0zWbw624uidBKPgmVD5wm3ec60dNVeF
|
||||
ZYYG
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,5 @@
|
||||
-----BEGIN ENCRYPTED PRIVATE KEY-----
|
||||
MIGKME4GCSqGSIb3DQEFDTBBMCkGCSqGSIb3DQEFDDAcBAgJNWVeJ7I5bAICCAAw
|
||||
DAYIKoZIhvcNAgkFADAUBggqhkiG9w0DBwQIgQdqdEdiw2sEOKkWbTSCypOwJ6K1
|
||||
TMVh+O2YVE8bIKb7CdLVtNbwDW2UuMVlx5DwK5HdCcVYy3OWfW+SWjBTPU0f
|
||||
-----END ENCRYPTED PRIVATE KEY-----
|
||||
@@ -0,0 +1,29 @@
|
||||
This is a real-world X.509 certificate, specifically a root CA.
|
||||
https://letsencrypt.org/certificates/
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
|
||||
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
|
||||
DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow
|
||||
SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT
|
||||
GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
||||
AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF
|
||||
q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8
|
||||
SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0
|
||||
Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA
|
||||
a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj
|
||||
/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T
|
||||
AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG
|
||||
CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv
|
||||
bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k
|
||||
c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw
|
||||
VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC
|
||||
ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz
|
||||
MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu
|
||||
Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF
|
||||
AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo
|
||||
uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/
|
||||
wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu
|
||||
X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG
|
||||
PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
|
||||
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,233 @@
|
||||
This is a PKCS#7/CMS attached digital signature.
|
||||
It is signed using ecdsaWithSHA256 over NIST curve P-256.
|
||||
It contains 10034 bytes of data in a constructed BER OCTET STRING, in 1000 byte chunks.
|
||||
-----BEGIN PKCS7-----
|
||||
MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0B
|
||||
BwGggCSABIID6EluaXppbyBjb250ZW51dG8uCkFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUEEggPoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQSC
|
||||
A+hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBBIID6EFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEEggPoQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQSCA+hBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBBIID6EFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEEggPoQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQQSCA+hBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBBIID6EFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUEEIkFBQUFBQUFBQUFBQUFBQUFBQQpGaW5lIGNvbnRlbnV0
|
||||
by4AAAAAAACggDCCAW4wggEUoAMCAQICEHOxx/3deIyIkyCp0XuJoeAwCgYIKoZI
|
||||
zj0EAwIwDzENMAsGA1UEAwwEVGVzdDAeFw0xODA3MTYxNTE3MDBaFw0xOTA3MTYx
|
||||
NTE3MDBaMA8xDTALBgNVBAMMBFRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC
|
||||
AATrbIaVzrUdDj6payN4bRMzfGAeUx2vbtdADsmVqB5UpZcE9+lk6mFONMMV8Mfd
|
||||
HMIrtU+kIeN3TKwYbvkKqFKFo1IwUDAOBgNVHQ8BAf8EBAMCBPAwHQYDVR0OBBYE
|
||||
FGYNLdBLRe0zyKL5cUmFcsIIV7W+MB8GA1UdIwQYMBaAFGYNLdBLRe0zyKL5cUmF
|
||||
csIIV7W+MAoGCCqGSM49BAMCA0gAMEUCIQCtFrZzgrRCt4a+2k1d6koKNkBVMHNP
|
||||
QUvcH+W3VyGdJwIgI9eyft3ADE5ZUOYb1kCY76qlMy2dexTDe1ECpHf66X4AADGC
|
||||
AYowggGGAgEBMCMwDzENMAsGA1UEAwwEVGVzdAIQc7HH/d14jIiTIKnRe4mh4DAN
|
||||
BglghkgBZQMEAgEFAKCB9zAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqG
|
||||
SIb3DQEJBTEPFw0xODA3MTYxNTE3MDFaMCoGCSqGSIb3DQEJNDEdMBswDQYJYIZI
|
||||
AWUDBAIBBQChCgYIKoZIzj0EAwIwLwYJKoZIhvcNAQkEMSIEIHJMUbvnbaBa+yDL
|
||||
6OsDfNrhr9cTEl0twT1VLan0QtJNMGAGCyqGSIb3DQEJEAIvMVEwTzBNMEsEIF5A
|
||||
LYEW0KWtjD68a+15KzrU4fL/PAv0FDQzhfnLy7yzMCcwE6QRMA8xDTALBgNVBAMM
|
||||
BFRlc3QCEHOxx/3deIyIkyCp0XuJoeAwCgYIKoZIzj0EAwIERzBFAiBU+itM+1PZ
|
||||
77m5G8pCq4R7zQKe7OK/1vVjoTpf1mhg1wIhANyu8NdrnbnEID1copBIRB8tOm6H
|
||||
5tIcUY4bEZXEeK9cAAAAAAAA
|
||||
-----END PKCS7-----
|
||||
@@ -0,0 +1,232 @@
|
||||
This is a PKCS#7/CMS attached digital signature.
|
||||
It is signed using ecdsaWithSHA256 over NIST curve P-256.
|
||||
It contains 10034 bytes of data in a single DER OCTET STRING.
|
||||
-----BEGIN PKCS7-----
|
||||
MIIqdAYJKoZIhvcNAQcCoIIqZTCCKmECAQExDzANBglghkgBZQMEAgEFADCCJ0UG
|
||||
CSqGSIb3DQEHAaCCJzYEgicySW5pemlvIGNvbnRlbnV0by4KQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
|
||||
QUFBQQpGaW5lIGNvbnRlbnV0by6gggFyMIIBbjCCARSgAwIBAgIQYFzS1SZ1s5Kl
|
||||
qpsCsmpVZjAKBggqhkjOPQQDAjAPMQ0wCwYDVQQDDARUZXN0MB4XDTE4MDcxNjE0
|
||||
NTYzNVoXDTE5MDcxNjE0NTYzNVowDzENMAsGA1UEAwwEVGVzdDBZMBMGByqGSM49
|
||||
AgEGCCqGSM49AwEHA0IABCRMtswcaSH/Sdi+Jj4LfNBaKGVahGyCXsrm7OaaaiHE
|
||||
5PIgJMDp9OR0nJihrfJfkN5u+UgrZxiDpw60t6ufBkOjUjBQMA4GA1UdDwEB/wQE
|
||||
AwIE8DAdBgNVHQ4EFgQUw8CE33sEDbA4r1GM45f27CDWJuYwHwYDVR0jBBgwFoAU
|
||||
w8CE33sEDbA4r1GM45f27CDWJuYwCgYIKoZIzj0EAwIDSAAwRQIhAN5gHlc9r7Wb
|
||||
xVHVjj57ntoGEt0BEoBaIhe3NHWbiEQXAiBnw/3mB4DUHB16O5ApHz05xNwvIG3M
|
||||
ui+YLAa2fAmyMjGCAYowggGGAgEBMCMwDzENMAsGA1UEAwwEVGVzdAIQYFzS1SZ1
|
||||
s5KlqpsCsmpVZjANBglghkgBZQMEAgEFAKCB9zAYBgkqhkiG9w0BCQMxCwYJKoZI
|
||||
hvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xODA3MTYxNDU2MzVaMCoGCSqGSIb3DQEJ
|
||||
NDEdMBswDQYJYIZIAWUDBAIBBQChCgYIKoZIzj0EAwIwLwYJKoZIhvcNAQkEMSIE
|
||||
IHJMUbvnbaBa+yDL6OsDfNrhr9cTEl0twT1VLan0QtJNMGAGCyqGSIb3DQEJEAIv
|
||||
MVEwTzBNMEsEILq8CENMWCZzAeAGhh0n7KElZw55J5ckjnalcXpb+ZPCMCcwE6QR
|
||||
MA8xDTALBgNVBAMMBFRlc3QCEGBc0tUmdbOSpaqbArJqVWYwCgYIKoZIzj0EAwIE
|
||||
RzBFAiEA8QQwLqu0KOzI5xzi449svthIqOmitdXaGZM+SFyDzHECIAy7QKC3ubLg
|
||||
SJIGIvsob9FGlfJM9lC9qkC4hfhMNLu5
|
||||
-----END PKCS7-----
|
||||
@@ -0,0 +1,22 @@
|
||||
This is a PKCS#7/CMS detached digital signature.
|
||||
It is an old example generated in 2008 and as such uses obsolete cryptography: RSA1024 with SHA1.
|
||||
-----BEGIN PKCS7-----
|
||||
MIIDUAYJKoZIhvcNAQcCoIIDQTCCAz0CAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3
|
||||
DQEHAaCCAfMwggHvMIIBWKADAgECAhAvoXazbunwSfREtACZZhlFMA0GCSqGSIb3
|
||||
DQEBBQUAMAwxCjAIBgNVBAMMAWEwHhcNMDgxMDE1MTUwMzQxWhcNMDkxMDE1MTUw
|
||||
MzQxWjAMMQowCAYDVQQDDAFhMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJ
|
||||
Uwlwhu5hR8X01f+vG0mKPRHsVRjpZNxSEmsmFPdDiD9kylE3ertTDf0gRkpIvWfN
|
||||
J+eymuxoXF0Qgl5gXAVuSrjupGD6J+VapixJiwLXJHokmDihLs3zfGARz08O3qnO
|
||||
5ofBy0pRxq5isu/bAAcjoByZ1sI/g0iAuotC1UFObwIDAQABo1IwUDAOBgNVHQ8B
|
||||
Af8EBAMCBPAwHQYDVR0OBBYEFEIGXQB4h+04Z3y/n7Nv94+CqPitMB8GA1UdIwQY
|
||||
MBaAFEIGXQB4h+04Z3y/n7Nv94+CqPitMA0GCSqGSIb3DQEBBQUAA4GBAE0G7tAi
|
||||
aacJxvP3fhEj+yP9VDxL0omrRRAEaMXwWaBf/Ggk1T/u+8/CDAdjuGNCiF6ctooK
|
||||
c8u8KpnZJsGqnpGQ4n6L2KjTtRUDh+hija0eJRBFdirPQe2HAebQGFnmOk6Mn7Ki
|
||||
QfBIsOzXim/bFqaBSbf06bLTQNwFouSO+jwOMYIBJTCCASECAQEwIDAMMQowCAYD
|
||||
VQQDDAFhAhAvoXazbunwSfREtACZZhlFMAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0B
|
||||
CQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0wODEwMTUxNTAzNDNaMCMG
|
||||
CSqGSIb3DQEJBDEWBBQAAAAAAAAAAAAAAAAAAAAAAAAAADANBgkqhkiG9w0BAQEF
|
||||
AASBgHQe0ocjBn+ZVXWbb8CpZ2CxzFKiVrgZxZO2kMBwJoNyZx+jnICHdhfsX4Or
|
||||
cF5vIYVAZIRz5RxqFmuZELTfZ/K89zaK873DP9V7/ftBGpezWEp9h29AtAzI9lzS
|
||||
GB9gugiyB5JstXoM1L87KJmT05MeZxg1pvvFhwo1m/QOpcqz
|
||||
-----END PKCS7-----
|
||||
@@ -0,0 +1,74 @@
|
||||
// Hex JavaScript decoder
|
||||
// Copyright (c) 2008-2020 Lapo Luchini <lapo@lapo.it>
|
||||
|
||||
// Permission to use, copy, modify, and/or distribute this software for any
|
||||
// purpose with or without fee is hereby granted, provided that the above
|
||||
// copyright notice and this permission notice appear in all copies.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
(typeof define != 'undefined' ? define : function (factory) { 'use strict';
|
||||
if (typeof module == 'object') module.exports = factory();
|
||||
else window.hex = factory();
|
||||
})(function () {
|
||||
"use strict";
|
||||
|
||||
var Hex = {},
|
||||
decoder, // populated on first usage
|
||||
haveU8 = (typeof Uint8Array == 'function');
|
||||
|
||||
/**
|
||||
* Decodes an hexadecimal value.
|
||||
* @param {string|Array|Uint8Array} a - a string representing hexadecimal data, or an array representation of its charcodes
|
||||
*/
|
||||
Hex.decode = function(a) {
|
||||
var isString = (typeof a == 'string');
|
||||
var i;
|
||||
if (decoder === undefined) {
|
||||
var hex = "0123456789ABCDEF",
|
||||
ignore = " \f\n\r\t\u00A0\u2028\u2029";
|
||||
decoder = [];
|
||||
for (i = 0; i < 16; ++i)
|
||||
decoder[hex.charCodeAt(i)] = i;
|
||||
hex = hex.toLowerCase();
|
||||
for (i = 10; i < 16; ++i)
|
||||
decoder[hex.charCodeAt(i)] = i;
|
||||
for (i = 0; i < ignore.length; ++i)
|
||||
decoder[ignore.charCodeAt(i)] = -1;
|
||||
}
|
||||
var out = haveU8 ? new Uint8Array(a.length >> 1) : [],
|
||||
bits = 0,
|
||||
char_count = 0,
|
||||
len = 0;
|
||||
for (i = 0; i < a.length; ++i) {
|
||||
var c = isString ? a.charCodeAt(i) : a[i];
|
||||
c = decoder[c];
|
||||
if (c == -1)
|
||||
continue;
|
||||
if (c === undefined)
|
||||
throw 'Illegal character at offset ' + i;
|
||||
bits |= c;
|
||||
if (++char_count >= 2) {
|
||||
out[len++] = bits;
|
||||
bits = 0;
|
||||
char_count = 0;
|
||||
} else {
|
||||
bits <<= 4;
|
||||
}
|
||||
}
|
||||
if (char_count)
|
||||
throw "Hex encoding incomplete: 4 bits missing";
|
||||
if (haveU8 && out.length > len) // in case it was originally longer because of ignored characters
|
||||
out = out.subarray(0, len);
|
||||
return out;
|
||||
};
|
||||
|
||||
return Hex;
|
||||
|
||||
});
|
||||
@@ -0,0 +1,102 @@
|
||||
html, body {
|
||||
background-color: #C0C0C0;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
text-align: justify;
|
||||
}
|
||||
.tt {
|
||||
font-family: monospace;
|
||||
}
|
||||
.license .ref {
|
||||
position: relative;
|
||||
}
|
||||
.license .hidden {
|
||||
visibility: hidden;
|
||||
position: absolute;
|
||||
bottom: 0em;
|
||||
/*white-space: pre;*/
|
||||
background-color: #D0D0D0;
|
||||
border: solid 1px white;
|
||||
padding: 2px;
|
||||
margin-left: 15%;
|
||||
margin-right: 15%;
|
||||
}
|
||||
.license:hover .hidden {
|
||||
/*display: block;*/
|
||||
visibility: visible;
|
||||
}
|
||||
.node {
|
||||
position: relative;
|
||||
}
|
||||
.sub {
|
||||
padding-left: 1.5em;
|
||||
border-left: solid 1px #E0E0E0;
|
||||
}
|
||||
.head {
|
||||
height: 1em;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.node:hover > .head, .node.hover > .head {
|
||||
color: darkblue;
|
||||
font-weight: bold;
|
||||
}
|
||||
.node:hover > .head:hover, .node.hover > .head.hover {
|
||||
color: blue;
|
||||
}
|
||||
.node.collapsed {
|
||||
font-style: italic;
|
||||
}
|
||||
.node.collapsed > .sub {
|
||||
display: none;
|
||||
}
|
||||
.node.collapsed.hover > .sub {
|
||||
display: block;
|
||||
}
|
||||
.value {
|
||||
display: none;
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
top: 1.2em;
|
||||
left: 0;
|
||||
background-color: #D0D0D0;
|
||||
border: solid 1px white;
|
||||
padding: 2px;
|
||||
}
|
||||
.head:hover + .value, .head.hover + .value {
|
||||
display: block;
|
||||
}
|
||||
.preview {
|
||||
margin-left: 1em;
|
||||
color: #505050;
|
||||
font-weight: normal;
|
||||
}
|
||||
.preview > .oid {
|
||||
margin-left: 1em;
|
||||
color: #808080;
|
||||
font-weight: normal;
|
||||
}
|
||||
.spaces {
|
||||
font-size: 0px;
|
||||
}
|
||||
#tree {
|
||||
font-family: monospace;
|
||||
}
|
||||
#tree > p {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
#dump {
|
||||
z-index: 1;
|
||||
background-color: #C0C0C0;
|
||||
border: solid 1px #E0E0E0;
|
||||
font-family: monospace;
|
||||
white-space: pre;
|
||||
padding: 2px;
|
||||
}
|
||||
#dump .tag { color: blue; }
|
||||
#dump .dlen { color: darkcyan; }
|
||||
#dump .ulen { color: darkgreen; }
|
||||
#dump .intro { color: blue; }
|
||||
#dump .outro { color: darkgreen; }
|
||||
#dump .skip { color: #666666; background-color: #C0C0C0; }
|
||||
#dump .hexCurrent { background-color: #808080; }
|
||||
#dump .hexCurrent .hex { background-color: #A0A0A0; }
|
||||
#file { display: none; }
|
||||
@@ -0,0 +1,43 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="US-ASCII">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<title>ASN.1 JavaScript decoder</title>
|
||||
<link rel="stylesheet" href="index.css" type="text/css">
|
||||
</head>
|
||||
<body style="padding: 3rem">
|
||||
<h1>ASN.1 JavaScript decoder</h1>
|
||||
<div style="position: relative; padding-bottom: 1em;">
|
||||
<div id="dump" style="position: absolute; right: 0px;"></div>
|
||||
<div id="tree"></div>
|
||||
</div>
|
||||
<form>
|
||||
<textarea id="area" style="width: 100%;" rows="8"></textarea>
|
||||
<br>
|
||||
<label title="can be slow with big files"><input type="checkbox" id="wantHex" checked="checked"> with hex dump</label>
|
||||
<input id="butDecode" type="button" value="decode">
|
||||
<input id="butClear" type="button" value="clear">
|
||||
<input type="file" id="file">
|
||||
<div>
|
||||
Examples:
|
||||
<select id="examples">
|
||||
<option value="sig-p256-der.p7m">PKCS#7/CMS attached signature (DER)</option>
|
||||
<option value="sig-p256-ber.p7m">PKCS#7/CMS attached signature (BER)</option>
|
||||
<option value="sig-rsa1024-sha1.p7s">PKCS#7/CMS detached signature (old)</option>
|
||||
<option value="letsencrypt-x3.cer">X.509 certificate: Let's Encrypt X3</option>
|
||||
<option value="ed25519.cer">X.509 certificate: ed25519 (RFC 8410)</option>
|
||||
</select>
|
||||
<input id="butExample" type="button" value="load example">
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<script type="text/javascript" src="hex.js"></script>
|
||||
<script type="text/javascript" src="base64.js"></script>
|
||||
<script type="text/javascript" src="oids.js"></script>
|
||||
<script type="text/javascript" src="int10.js"></script>
|
||||
<script type="text/javascript" src="asn1.js"></script>
|
||||
<script type="text/javascript" src="dom.js"></script>
|
||||
<script type="text/javascript" src="index.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,164 @@
|
||||
(typeof define != 'undefined' ? define : function (factory) { 'use strict';
|
||||
if (typeof module == 'object') factory(function (name) { return require(name); });
|
||||
else factory(function (name) { return window[name.substring(2)]; });
|
||||
})(function (require) {
|
||||
"use strict";
|
||||
|
||||
var ASN1 = require('./asn1'),
|
||||
Base64 = require('./base64'),
|
||||
Hex = require('./hex'),
|
||||
maxLength = 10240,
|
||||
reHex = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/,
|
||||
tree = id('tree'),
|
||||
dump = id('dump'),
|
||||
wantHex = id('wantHex'),
|
||||
area = id('area'),
|
||||
file = id('file'),
|
||||
examples = id('examples'),
|
||||
hash = null;
|
||||
|
||||
require('./dom'); // side effect: augment ASN1
|
||||
if (!window.console || !window.console.log) // IE8 with closed developer tools
|
||||
window.console = { log: function () {} };
|
||||
function id(elem) {
|
||||
return document.getElementById(elem);
|
||||
}
|
||||
function text(el, string) {
|
||||
if ('textContent' in el)
|
||||
el.textContent = string;
|
||||
else
|
||||
el.innerText = string;
|
||||
}
|
||||
function decode(der, offset) {
|
||||
offset = offset || 0;
|
||||
tree.innerHTML = '';
|
||||
dump.innerHTML = '';
|
||||
try {
|
||||
var asn1 = ASN1.decode(der, offset);
|
||||
tree.appendChild(asn1.toDOM());
|
||||
if (wantHex.checked)
|
||||
dump.appendChild(asn1.toHexDOM());
|
||||
var b64 = (der.length < maxLength) ? asn1.toB64String() : '';
|
||||
if (area.value === '')
|
||||
area.value = Base64.pretty(b64);
|
||||
try {
|
||||
window.location.hash = hash = '#' + b64;
|
||||
} catch (e) { // fails with "Access Denied" on IE with URLs longer than ~2048 chars
|
||||
window.location.hash = hash = '#';
|
||||
}
|
||||
var endOffset = asn1.posEnd();
|
||||
if (endOffset < der.length) {
|
||||
var p = document.createElement('p');
|
||||
p.innerText = 'Input contains ' + (der.length - endOffset) + ' more bytes to decode.';
|
||||
var button = document.createElement('button');
|
||||
button.innerText = 'try to decode';
|
||||
button.onclick = function () {
|
||||
decode(der, endOffset);
|
||||
};
|
||||
p.appendChild(button);
|
||||
tree.insertBefore(p, tree.firstChild);
|
||||
}
|
||||
} catch (e) {
|
||||
text(tree, e);
|
||||
}
|
||||
}
|
||||
function decodeText(val) {
|
||||
try {
|
||||
var der = reHex.test(val) ? Hex.decode(val) : Base64.unarmor(val);
|
||||
decode(der);
|
||||
} catch (e) {
|
||||
text(tree, e);
|
||||
dump.innerHTML = '';
|
||||
}
|
||||
}
|
||||
function decodeBinaryString(str) {
|
||||
var der;
|
||||
try {
|
||||
if (reHex.test(str))
|
||||
der = Hex.decode(str);
|
||||
else if (Base64.re.test(str))
|
||||
der = Base64.unarmor(str);
|
||||
else
|
||||
der = str;
|
||||
decode(der);
|
||||
} catch (e) {
|
||||
text(tree, 'Cannot decode file.');
|
||||
dump.innerHTML = '';
|
||||
}
|
||||
}
|
||||
// set up buttons
|
||||
id('butDecode').onclick = function () { decodeText(area.value); };
|
||||
id('butClear').onclick = function () {
|
||||
area.value = '';
|
||||
file.value = '';
|
||||
tree.innerHTML = '';
|
||||
dump.innerHTML = '';
|
||||
hash = window.location.hash = '';
|
||||
};
|
||||
id('butExample').onclick = function () {
|
||||
console.log('Loading example:', examples.value);
|
||||
var request = new XMLHttpRequest();
|
||||
request.open('GET', 'examples/' + examples.value, true);
|
||||
request.onreadystatechange = function() {
|
||||
if (this.readyState !== 4)
|
||||
return;
|
||||
if (this.status >= 200 && this.status < 400) {
|
||||
area.value = this.responseText;
|
||||
decodeText(this.responseText);
|
||||
} else {
|
||||
console.log('Error loading example.');
|
||||
}
|
||||
};
|
||||
request.send();
|
||||
};
|
||||
// this is only used if window.FileReader
|
||||
function read(f) {
|
||||
area.value = ''; // clear text area, will get b64 content
|
||||
var r = new FileReader();
|
||||
r.onloadend = function () {
|
||||
if (r.error)
|
||||
alert("Your browser couldn't read the specified file (error code " + r.error.code + ").");
|
||||
else
|
||||
decodeBinaryString(r.result);
|
||||
};
|
||||
r.readAsBinaryString(f);
|
||||
}
|
||||
function load() {
|
||||
if (file.files.length === 0)
|
||||
alert("Select a file to load first.");
|
||||
else
|
||||
read(file.files[0]);
|
||||
}
|
||||
function loadFromHash() {
|
||||
if (window.location.hash && window.location.hash != hash) {
|
||||
hash = window.location.hash;
|
||||
// Firefox is not consistent with other browsers and returns an
|
||||
// already-decoded hash string so we risk double-decoding here,
|
||||
// but since % is not allowed in base64 nor hexadecimal, it's ok
|
||||
var val = decodeURIComponent(hash.substr(1));
|
||||
if (val.length)
|
||||
decodeText(val);
|
||||
}
|
||||
}
|
||||
function stop(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
}
|
||||
function dragAccept(e) {
|
||||
stop(e);
|
||||
if (e.dataTransfer.files.length > 0)
|
||||
read(e.dataTransfer.files[0]);
|
||||
}
|
||||
// main
|
||||
if ('onhashchange' in window)
|
||||
window.onhashchange = loadFromHash;
|
||||
loadFromHash();
|
||||
document.ondragover = stop;
|
||||
document.ondragleave = stop;
|
||||
if ('FileReader' in window && 'readAsBinaryString' in (new FileReader())) {
|
||||
file.style.display = 'block';
|
||||
file.onchange = load;
|
||||
document.ondrop = dragAccept;
|
||||
}
|
||||
|
||||
});
|
||||
@@ -0,0 +1,113 @@
|
||||
// Big integer base-10 printing library
|
||||
// Copyright (c) 2008-2020 Lapo Luchini <lapo@lapo.it>
|
||||
|
||||
// Permission to use, copy, modify, and/or distribute this software for any
|
||||
// purpose with or without fee is hereby granted, provided that the above
|
||||
// copyright notice and this permission notice appear in all copies.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
(typeof define != 'undefined' ? define : function (factory) { 'use strict';
|
||||
if (typeof module == 'object') module.exports = factory();
|
||||
else window.int10 = factory();
|
||||
})(function () {
|
||||
"use strict";
|
||||
|
||||
var max = 10000000000000; // biggest 10^n integer that can still fit 2^53 when multiplied by 256
|
||||
|
||||
/**
|
||||
* Arbitrary length base-10 value.
|
||||
* @param {number} value - Optional initial value (will be 0 otherwise).
|
||||
*/
|
||||
function Int10(value) {
|
||||
this.buf = [+value || 0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Multiply value by m and add c.
|
||||
* @param {number} m - multiplier, must be < =256
|
||||
* @param {number} c - value to add
|
||||
*/
|
||||
Int10.prototype.mulAdd = function (m, c) {
|
||||
// assert(m <= 256)
|
||||
var b = this.buf,
|
||||
l = b.length,
|
||||
i, t;
|
||||
for (i = 0; i < l; ++i) {
|
||||
t = b[i] * m + c;
|
||||
if (t < max)
|
||||
c = 0;
|
||||
else {
|
||||
c = 0|(t / max);
|
||||
t -= c * max;
|
||||
}
|
||||
b[i] = t;
|
||||
}
|
||||
if (c > 0)
|
||||
b[i] = c;
|
||||
};
|
||||
|
||||
/**
|
||||
* Subtract value.
|
||||
* @param {number} c - value to subtract
|
||||
*/
|
||||
Int10.prototype.sub = function (c) {
|
||||
var b = this.buf,
|
||||
l = b.length,
|
||||
i, t;
|
||||
for (i = 0; i < l; ++i) {
|
||||
t = b[i] - c;
|
||||
if (t < 0) {
|
||||
t += max;
|
||||
c = 1;
|
||||
} else
|
||||
c = 0;
|
||||
b[i] = t;
|
||||
}
|
||||
while (b[b.length - 1] === 0)
|
||||
b.pop();
|
||||
};
|
||||
|
||||
/**
|
||||
* Convert to decimal string representation.
|
||||
* @param {*} base - optional value, only value accepted is 10
|
||||
*/
|
||||
Int10.prototype.toString = function (base) {
|
||||
if ((base || 10) != 10)
|
||||
throw 'only base 10 is supported';
|
||||
var b = this.buf,
|
||||
s = b[b.length - 1].toString();
|
||||
for (var i = b.length - 2; i >= 0; --i)
|
||||
s += (max + b[i]).toString().substring(1);
|
||||
return s;
|
||||
};
|
||||
|
||||
/**
|
||||
* Convert to Number value representation.
|
||||
* Will probably overflow 2^53 and thus become approximate.
|
||||
*/
|
||||
Int10.prototype.valueOf = function () {
|
||||
var b = this.buf,
|
||||
v = 0;
|
||||
for (var i = b.length - 1; i >= 0; --i)
|
||||
v = v * max + b[i];
|
||||
return v;
|
||||
};
|
||||
|
||||
/**
|
||||
* Return value as a simple Number (if it is <= 10000000000000), or return this.
|
||||
*/
|
||||
Int10.prototype.simplify = function () {
|
||||
var b = this.buf;
|
||||
return (b.length == 1) ? b[0] : this;
|
||||
};
|
||||
|
||||
return Int10;
|
||||
|
||||
});
|
||||
+2552
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,23 @@
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA256
|
||||
|
||||
e150b18e296f1a09bd4e6837d1bc4197c8a0f5b130c4f21bbeb3b00c04575201 asn1.js
|
||||
340a46c0ac99d41fc780da48c15470073657aaf2530bd5b82e3589ce6b85ca41 oids.js
|
||||
beda29c0d41c756f06ad67d3b963ab10b06837d44f94f81eafd5d4d5a22c68a1 base64.js
|
||||
f82e6b96bbb1d3a693b8e124479996d4a06eba10104ad62b73cba5e2d10465ae hex.js
|
||||
e9ca034ce83e36a869fba33cfc26f6413f8383dbcfbf16c551e1c5bbf5835c5e int10.js
|
||||
e0ca0e8baa9f0ee823d606f25a5dd56400c9bbb8948df88768fd14e022aa2e1e dom.js
|
||||
a30ebd4fbb4fef0355d4c0ee78d3ca0092c6300b5b51c265392ac393d288ef50 test.js
|
||||
5095d30e2560fcead83071b856f94dbf05b9c59da38a5b18ab53a6491a75b4dd index.css
|
||||
ccc2330473b54c431010e41cdf219d18e96559452f2ab6f1fa7deb6df0aa5d34 index.js
|
||||
402c64f4f261b884337017834cf27f3c7590a9a6c36f1dd3d1b427ff284d1c4f index.html
|
||||
147802bfcd6aa22710fcba401cbe0fc9f458361a33c9d360862440aaf5b4ad4d README.md
|
||||
f4d552669aba9c9959a6fbfdbc66eb20f857e6efd4a42b19cb82131ea5899eb3 LICENSE
|
||||
66a053f6feb4b04d9127e1574793d812f715c1868cc31f228e5aff06946cc247 update.sh
|
||||
2b5f37ffafc4fe09331ed1f980afb46bcd515de536e0c5e4e0e8c0f5b5a626a1 check.sh
|
||||
-----BEGIN PGP SIGNATURE-----
|
||||
|
||||
iF0EAREIAB0WIQTUpSPQe+p0u9IYREdomIIsyPJS+wUCYXFUsQAKCRBomIIsyPJS
|
||||
+20kAJ0UcI5XFZAvQdCBdeq2BB0b0ITDwgCgs+Sfe13q/wUqqfCQoMQi/38QOQI=
|
||||
=+MOY
|
||||
-----END PGP SIGNATURE-----
|
||||
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env node
|
||||
'use strict';
|
||||
|
||||
var Hex = require('./hex.js'),
|
||||
ASN1 = require('./asn1.js'),
|
||||
tests;
|
||||
|
||||
tests = [
|
||||
// http://luca.ntop.org/Teaching/Appunti/asn1.html
|
||||
['0304066E5DC0', '(18 bit)\n011011100101110111', 'Bit string: DER encoding'],
|
||||
['0304066E5DE0', '(18 bit)\n011011100101110111', 'Bit string: padded with "100000"'],
|
||||
['038104066E5DC0', '(18 bit)\n011011100101110111', 'Bit string: long form of length octets'],
|
||||
['0304086E5DC0', 'Exception:\nInvalid BitString with unusedBits=8', 'Bit string: invalid unusedBits'],
|
||||
['23090303006E5D030206C0', '(18 bit)\n011011100101110111', 'Bit string (constructed encoding): "0110111001011101" + "11"'],
|
||||
['04080123456789ABCDEF', '(8 byte)\n0123456789ABCDEF', 'Octet string: DER encoding'],
|
||||
['0481080123456789ABCDEF', '(8 byte)\n0123456789ABCDEF', 'Octet string: long form of length octets'],
|
||||
['240C040401234567040489ABCDEF', '(8 byte)\n0123456789ABCDEF', 'Octet string (constructed encoding): 01…67 + 89…ef'],
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa379076(v=vs.85).aspx
|
||||
['30820319308202820201003023310F300D0603550403130654657374434E3110300E060355040A1307546573744F726730819F300D06092A864886F70D010101050003818D00308189028181008FE2412A08E851A88CB3E853E7D54950B3278A2BCBEAB54273EA0257CC6533EE882061A11756C12418E3A808D3BED931F3370B94B8CC43080B7024F79CB18D5DD66D82D0540984F89F970175059C89D4D5C91EC913D72A6B309119D6D442E0C49D7C9271E1B22F5C8DEEF0F1171ED25F315BB19CBC2055BF3A37424575DC90650203010001A08201B4301A060A2B0601040182370D0203310C160A362E302E353336312E323042060A2B0601040182370D0201313430321E260043006500720074006900660069006300610074006500540065006D0070006C0061007400651E080055007300650072305706092B0601040182371514314A30480201090C237669636833642E6A646F6D6373632E6E74746573742E6D6963726F736F66742E636F6D0C154A444F4D4353435C61646D696E6973747261746F720C07636572747265713074060A2B0601040182370D0202316630640201011E5C004D006900630072006F0073006F0066007400200045006E00680061006E006300650064002000430072007900700074006F0067007200610070006800690063002000500072006F00760069006400650072002000760031002E003003010030818206092A864886F70D01090E31753073301706092B0601040182371402040A1E08005500730065007230290603551D2504223020060A2B0601040182370A030406082B0601050507030406082B06010505070302300E0603551D0F0101FF0404030205A0301D0603551D0E041604143C0F73DAF8EF41D83AEABE922A5D2C966A7B9454300D06092A864886F70D01010505000381810047EB995ADF9E700DFBA73132C15F5C24C2E0BFC624AF15660EB86A2EAB2BC4971FE3CBDC63A525ECC7B428616636A1311BBFDDD0FCBF1794901DE55EC7115EC9559FEBA33E14C799A6CBBAA1460F39D444C4C84B760E205D6DA9349ED4D58742EB2426511490B40F065E5288327A9520A0FDF7E57D60DD72689BF57B058F6D1E',
|
||||
'(3 elem)', 'PKCS#10 request'],
|
||||
// Int10
|
||||
['02102FA176B36EE9F049F444B40099661945', '(126 bit)\n63312083136615639753586560173617846597', 'Big integer (126 bit)'],
|
||||
['028181008953097086EE6147C5F4D5FFAF1B498A3D11EC5518E964DC52126B2614F743883F64CA51377ABB530DFD20464A48BD67CD27E7B29AEC685C5D10825E605C056E4AB8EEA460FA27E55AA62C498B02D7247A249838A12ECDF37C6011CF4F0EDEA9CEE687C1CB4A51C6AE62B2EFDB000723A01C99D6C23F834880BA8B42D5414E6F',
|
||||
'(1024 bit)\n96432446964907009840023644401994013457468837455140331578268642517697945390319089463541388080569398374873228752921897678940332050406994011437231634303608704223145390228074087922901239478374991949372306413157758278029522534299413919735715864599284769202556071242381348472464716517735026291259010477833523908207',
|
||||
'Big integer (1024 bit)'],
|
||||
['02820201009BA9ABBF614A97AF2F97669A745FD0D996FDCFE2E466EF1F1F4733C244A3DF9ADE1FB554DD157C6935116FBBC80C8E6A181ED88FD916BC1048365CF063B3905A5C2437D7A3D6CB0971B9F1017284B07DDB4D80CDFCD36FC9F8DAB60E82D24585A81B68A83DE8F4446CBDA1C2CB03BE8C3E130084DF4A48C0E3220AE8E937A7184CB1090D23567F044DD9178418A5C8DA409473EBCE0E573C03813A9D0AA1574369AC576D799078E5B5B43BD8BC4C8D28A1A7A3A7BA024E25D12AAEEDAE0322B86B200F302854957FE0EECE0A669DD1402D6E22AF9D1AC10519D26FC0F29FF87BB30242FB50A91D2D930F23ABC6C10F92FFD0A215F55309711CFF451384E6265EF8E0881C0AFC16B6A87306B8F0638402A0C65AECE774DF70AEA38325EAD6C7978793A7C68A8A33976037103E973E6E2915D6A10FD1882C129F6FAAA4C642EB41A2E39543D301856D8EBB3BF32336C7FE3BE0A1250748ABC98974FF088F80BFC09665F3EEEC4B68BD9D88C331B340F1E8CFF638BB9CE4D17FD4E5589B7CFAD4F30E9B7591E4BA522E197ED1F5CD5A19FCBA06F6FB52A84B9904DDF8F9B48B50A34E6289F08724FA8342C187FAD52D292A5A717A646AD72760630DDBCE49F58D1F90893217F87343B8D25A938661D6E1750AEA796676884F71EB0425D60A5A7A93E5B94B17400FB1B6B9F5DE4FDCE0B3AC3B117060844A436E9920C029710AC065',
|
||||
'(4096 bit)\n635048724432704421127930570668665246853305382538324205739741643121831497295424070220821366244137115920753022123888627038218427491681054376713237422498116573180444839575827154645186734602336866679804832661256616738257119870932328599495025506292424741581222812593482590762754785441060866630543522468678295806775919446210955958208696766307578451905771148370694894591388931494246786732600822191966681852303750991082312180670980233382216493445574638820565887523903118457551295241540793541306271618874366356869335229283992012581380459991160410157116077111142487644315609688092841697874946124416376553323373756926990721842430477982958383467149331238064901788481621489266725616974850293388387825359434286033332681714766010619113405542747712973535303497912234899589502990216128180823653963322406352206636893824027962569732222882297210841939793442415179615290739900774082858983244011679281115202763730964934473392333219986431517733237277686866318351054204026883453068392486990840498271719737813876367239342153571643327128417739316281558041652406500713712661305061745568036561978158652008943224271511931676512028205883718704503533046383542018858616087454820845906934069146870330990447993387221061968484774662499598623702280426558025111180066917',
|
||||
'Big integer (4096 bit)'],
|
||||
['0202007F', '127', 'Padded 127'],
|
||||
['0202FF7F', '-129', 'Negative 129'],
|
||||
['0202FC18', '-1000', 'Negative 1000 (2)'],
|
||||
['0204FFFFFC18', '-1000', 'Negative 1000 (4)'],
|
||||
['0208FFFFFFFFFFFFFC18', '-1000', 'Negative 1000 (8)'],
|
||||
['0210FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC18', '-1000', 'Negative 1000 (16)'],
|
||||
['0203800001', '-8388607', 'Negative 8388607'],
|
||||
['02020000', '0', 'Zero (2)'],
|
||||
['0204FFFFFFFF', '-1', 'Negative 1 (4)'],
|
||||
// OID
|
||||
['060C69C7C79AB78084C289F9870D', '2.25.84478768945400492475277', 'Big OID arc'],
|
||||
['06146982968D8D889BCCA8C7B3BDD4C080AAAED78A1B', '2.25.184830721219540099336690027854602552603', 'Bigger OID arc'],
|
||||
['060488378952', '2.999.1234', 'OID arc > 2.47'],
|
||||
['060782A384F3CAC00A', '2.9999999999930', 'OID with Int10 corner case (1)'],
|
||||
['060881E3AFEAA69A800A', '2.999999999999930', 'OID with Int10 corner case (2)'],
|
||||
['06092A864886F70D010105', '1.2.840.113549.1.1.5\nsha1WithRSAEncryption\nPKCS #1', 'known OID from Peter Gutmann list'],
|
||||
// OID corner case from https://misc.daniel-marschall.de/asn.1/oid-sizecheck/oid_size_test.txt
|
||||
['060A81FFFFFFFFFFFFFFFF7F', '2.18446744073709551535', 'OID root 64 bit - 1'],
|
||||
['060A82808080808080808000', '2.18446744073709551536', 'OID root 64 bit'],
|
||||
['060A82808080808080808001', '2.18446744073709551537', 'OID root 64 bit + 1'],
|
||||
['0620FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F', '2.26959946667150639794667015087019630673637144422540572481103610249135', 'OID derLen20c'],
|
||||
['0621818080808080808080808080808080808080808080808080808080808080808000', '2.26959946667150639794667015087019630673637144422540572481103610249136', 'OID derLen21c'],
|
||||
// UTF-8
|
||||
['0C0E4C61706FE280997320F09F9A972E', 'Lapo’s 🚗.', 'UTF-8 4-byte sequence'],
|
||||
// T-REC-X.690-201508
|
||||
['0307040A3B5F291CD0', '(44 bit)\n00001010001110110101111100101001000111001101', 'Example 8.6.4.2: bit string (primitive encoding)'],
|
||||
['23800303000A3B0305045F291CD00000', '(44 bit)\n00001010001110110101111100101001000111001101', 'Example 8.6.4.2: bit string (constructed encoding)'],
|
||||
// avoid past bugs
|
||||
['23800303000A3B230A0302005F030404291CD00000', '(44 bit)\n00001010001110110101111100101001000111001101', 'Bit string (recursive constructed)'],
|
||||
['0348003045022100DE601E573DAFB59BC551D58E3E7B9EDA0612DD0112805A2217B734759B884417022067C3FDE60780D41C1D7A3B90291F3D39C4DC2F206DCCBA2F982C06B67C09B232', '(568 bit)\n0011000001000101000000100010000100000000110111100110000000011110010101110011110110101111101101011001101111000101010100011101010110001110001111100111101110011110110110100000011000010010110111010000000100010010100000000101101000100010000101111011011100110100011101011001101110001000010001000001011100000010001000000110011111000011111111011110011000000111100000001101010000011100000111010111101000111011100100000010100100011111001111010011100111000100110111000010111100100000011011011100110010111010001011111001100000101100000001101011011001111100000010011011001000110010', 'not constructed, but contains structures'],
|
||||
['040731323334353637', '(7 byte)\n1234567', 'Octet string with ASCII content'],
|
||||
['0407312E3233E282AC', '(7 byte)\n1.23€', 'Octet string with UTF-8 content'],
|
||||
['0420041EE4E3B7ED350CC24D034E436D9A1CB15BB1E328D37062FB82E84618AB0A3C', '(32 byte)\n041EE4E3B7ED350CC24D034E436D9A1CB15BB1E328D37062FB82E84618AB0A3C', 'Do not mix encapsulated and structured octet strings'], // GitHub issue #47
|
||||
];
|
||||
|
||||
var run = 0,
|
||||
error = 0;
|
||||
tests.forEach(function (t) {
|
||||
var input = t[0],
|
||||
expected = t[1],
|
||||
comment = t[2],
|
||||
result = null;
|
||||
try {
|
||||
result = ASN1.decode(Hex.decode(input)).content();
|
||||
//TODO: check structure, not only first level content
|
||||
} catch (e) {
|
||||
result = 'Exception:\n' + e;
|
||||
}
|
||||
++run;
|
||||
if (result == expected)
|
||||
console.log('\x1B[1m\x1B[32mOK \x1B[39m\x1B[22m ' + comment);
|
||||
else {
|
||||
++error;
|
||||
console.log('\x1B[1m\x1B[31mERR\x1B[39m\x1B[22m ' + comment + '\n' + result);
|
||||
}
|
||||
});
|
||||
console.log('Errors: ' + error + '/' + run + '.');
|
||||
process.exit(error ? 1 : 0);
|
||||
@@ -0,0 +1,56 @@
|
||||
#/bin/sh
|
||||
URL='https://www.cs.auckland.ac.nz/~pgut001/dumpasn1.cfg'
|
||||
if [ -x /usr/bin/fetch ]; then
|
||||
/usr/bin/fetch -m --no-verify-peer $URL
|
||||
elif [ -x /usr/bin/wget ]; then
|
||||
/usr/bin/wget -N --no-check-certificate $URL
|
||||
elif [ ! -r dumpasn1.cfg ]; then
|
||||
echo Please download $URL in this directory.
|
||||
exit 1
|
||||
fi
|
||||
cat dumpasn1.cfg | \
|
||||
tr -d '\r' | \
|
||||
awk -v url="$URL" '
|
||||
function clean() {
|
||||
oid = "";
|
||||
comment = "";
|
||||
description = "";
|
||||
warning = "";
|
||||
}
|
||||
BEGIN {
|
||||
FS = "= *";
|
||||
apos = sprintf("%c", 39);
|
||||
clean();
|
||||
print "// Converted from: " url;
|
||||
print "// which is made by Peter Gutmann and whose license states:";
|
||||
print "// You can use this code in whatever way you want,";
|
||||
print "// as long as you don" apos "t try to claim you wrote it.";
|
||||
print "(typeof define != " apos "undefined" apos " ? define : function (factory) { " apos "use strict" apos ";";
|
||||
print " if (typeof module == " apos "object" apos ") module.exports = factory();";
|
||||
print " else window.oids = factory();";
|
||||
print "})(function () {";
|
||||
print apos "use strict" apos ";";
|
||||
print "return {";
|
||||
}
|
||||
/^OID/ { oid = $2; }
|
||||
/^Comment/ { comment = $2; }
|
||||
/^Description/ { description = $2; }
|
||||
/^Warning/ { warning = ", \"w\": true"; }
|
||||
/^$/ {
|
||||
if (length(oid) > 0) {
|
||||
gsub(" ", ".", oid);
|
||||
gsub("\"", "\\\"", description);
|
||||
gsub("\"", "\\\"", comment);
|
||||
if (++seen[oid] > 1)
|
||||
print "Duplicate OID in line " NR ": " oid > "/dev/stderr";
|
||||
else
|
||||
printf "\"%s\": { \"d\": \"%s\", \"c\": \"%s\"%s },\n", oid, description, comment, warning;
|
||||
clean();
|
||||
}
|
||||
}
|
||||
END {
|
||||
print "\"END\": \"\""
|
||||
print "};});"
|
||||
}
|
||||
' >oids.js
|
||||
echo Conversion completed.
|
||||
Reference in New Issue
Block a user