diff --git a/etc/certs.json b/etc/certs.json new file mode 100644 index 00000000..c9734c2a --- /dev/null +++ b/etc/certs.json @@ -0,0 +1,152 @@ +[ + "ebd41040e4bb3ec742c9e381d31ef2a41a48b6685c96e7cef3c1df6cd4331c99", + "ca42dd41745fd0b81eb902362cf9d8bf719da1bd1b1efc946f5b4c99f42c1b9e", + "eb04cf5eb1f39afa762f2bb120f296cba520c1b97db1589565b81cb9a17b7244", + "6dc47172e01cbcb0bf62580d895fe2b8ac9ad4f873801e0c10b9c837d21eb177", + "16af57a9f676b0ab126095aa5ebadef22ab31119d644ac95cd4b93dbf3f26aeb", + "8c7209279ac04e275e16d07fd3b775e80154b5968046e31f52dd25766324e9a7", + "687fa451382278fff0c8b11f8d43d576671c6eb2bceab413fb83d965d06d2ff2", + "0791ca0749b20782aad3c7d7bd0cdfc9485835843eb2d7996009ce43ab6c6927", + "8095210805db4bbc355e4428d8fd6ec2cde3ab5fb97a9942988eb8f4dcd06016", + "73c176434f1bc6d5adf45b0e76e727287c8de57616c1e6e6141a2b2cbc7d8e4c", + "af8b6762a1e528228161a95d5c559ee266278f75d79e830189a503506abd6b4c", + "ff856a2d251dcd88d36656f450126798cfabaade40799c722de4d2b5db36a73a", + "ca2d82a08677072f8ab6764ff035676cfe3e5e325e012172df3f92096db79b85", + "a0459b9f63b22559f5fa5d4c6db3f9f72ff19342033578f073bf1d1b46cbb912", + "a0234f3bc8527ca5628eec81ad5d69895da5680dc91d1cb8477f33f878b95b0b", + "69fac9bd55fb0ac78d53bbee5cf1d597989fd0aaab20a25151bdf1733ee7d122", + "d8e0febc1db2e38d00940f37d27d41344d993e734b99d5656d9778d4d8143624", + "d7a7a0fb5d7e2731d771e9484ebcdef71d5f0c3e0a2948782bc83ee0ea699ef4", + "bd81ce3b4f6591d11a67b5fc7a47fdef25521bf9aa4e18b9e3df2e34a7803be8", + "3f06e55681d496f5be169eb5389f9f2b8ff61e1708df6881724849cd5d27cb69", + "a45ede3bbbf09c8ae15c72efc07268d693a21c996fd51e67ca079460fd6d8873", + "85a0dd7dd720adb7ff05f83d542b209dc7ff4528f7d677b18389fea5e5c49e86", + "18f1fc7f205df8adddeb7fe007dd57e3af375a9c4d8d73546bf4f1fed1e18d35", + "e75e72ed9f560eec6eb4800073a43fc3ad19195a392282017895974a99026b6c", + "7908b40314c138100b518d0735807ffbfcf8518a0095337105ba386b153dd927", + "6ea54741d004667eed1b4816634aa3a79e6e4b96950f8279dafc8d9bd8812137", + "0c258a12a5674aef25f28ba7dcfaeceea348e541e6f5cc4ee63b71b361606ac3", + "ef3cb417fc8ebf6f97876c9e4ece39de1ea5fe649141d1028b7d11c0b2298ced", + "cecddc905099d8dadfc5b1d209b737cbe2c18cfb2c10c0ff0bcf0d3286fc1aa2", + "c3846bf24b9e93ca64274c0ec67c1ecc5e024ffcacd2d74019350e81fe546ae4", + "1465fa205397b876faa6f0a9958e5590e40fcc7faa4fb7c2c8677521fb5fb658", + "c766a9bef2d4071c863a31aa4920e813b2d198608cb7b7cfe21143b836df09ea", + "7600295eefe85b9e1fd624db76062aaaae59818a54d2774cd4c0b2c01131e1b3", + "21db20123660bb2ed418205da11ee7a85a65e2bc6e55b5af7e7899c8a266d92e", + "3e9099b5015e8f486c00bcea9d111ee721faba355a89bcf1df69561e3dc6325c", + "4348a0e9444c78cb265e058d5e8944b4d84f9662bd26db257f8934a443c70161", + "7431e5f4c3c1ce4690774f0b61e05440883ba9a01ed00ba6abd7806ed3b118cf", + "0f993c8aef97baaf5687140ed59ad1821bb4afacf0aa9a58b5d57a338a3afbcb", + "0687260331a72403d909f105e69bcf0d32e1bd2493ffc6d9206d11bcd6770739", + "767c955a76412c89af688e90a1c70f556cfd6b6025dbea10416d7eb6831f8c40", + "62dd0be9b9f50a163ea0f8e75c053b1eca57ea55c8688f647c6881f2c8357b95", + "be6c4da2bbb9ba59b6f3939768374246c3c005993fa98f020d1dedbed48a81d5", + "37d51006c512eaab626421f1ec8c92013fc5f82ae98ee533eb4619b8deb4d06c", + "8d722f81a9c113c0791df136a2966db26c950a971db46b4199f4ea54b78bfb9f", + "9acfab7e43c8d880d06b262a94deeee4b4659989c3d0caf19baf6405e41ab7df", + "f1c1b50ae5a20dd8030ec9f6bc24823dd367b5255759b4e71b61fce9f7375d73", + "4200f5043ac8590ebb527d209ed1503029fbcbd41ca1b506ec27f15ade7dac69", + "0c2cd63df7806fa399ede809116b575bf87989f06518f9808c860503178baf66", + "15f0ba00a3ac7af3ac884c072b1011a077bd77c097f40164b2f8598abd83860c", + "a71272aeaaa3cfe8727f7fb39f0fb3d1e5426e9060b06ee6f13e9a3c5833cd43", + "1793927a0614549789adce2f8f34f7f0b66d0f3ae3a3b84d21ec15dbba4fadc7", + "b9bea7860a962ea3611dab97ab6da3e21c1068b97d55575ed0e11279c11c8932", + "a22dba681e97376e2d397d728aae3a9b6296b9fdba60bc2e11f647f2c675fb37", + "41c923866ab4cad6b7ad578081582e020797a6cbdf4fff78ce8396b38937d7f5", + "327a3d761abadea034eb998406275cb1a4776efdae2fdf6d0168ea1c4f5567d0", + "e3b6a2db2ed7ce48842f7ac53241c7b71d54144bfb40c11f3f1d0b42f5eea12d", + "b6191a50d0c3977f7da99bcdaac86a227daeb9679ec70ba3b0c9d92271c170d3", + "960adf0063e96356750c2965dd0a0867da0b9cbd6e77714aeafb2349ab393da3", + "c0a6f4dc63a24bfdcf54ef2a6a082a0a72de35803e2ff5ff527ae5d87206dfd5", + "e4c73430d7a5b50925df43370a0d216e9a79b9d6db8373a0c69eb1cc31c7c52a", + "0f4e9cdd264b025550d170806340214fe94434c9b02f697ec710fc5feafb5e38", + "35ae5bddd8f7ae635cffba5682a8f00b95f48462c7108ee9a0e5292b074aafb2", + "eaa962c4fa4a6bafebe415196d351ccd888d4f53f3fa8ae6d7c466a94e6042bb", + "e28393773da845a679f2080cc7fb44a3b7a1c3792cb7eb7729fdcb6a8d99aea7", + "2d47437de17951215a12f3c58e51c729a58026ef1fcc0a5fb3d9dc012f600d19", + "b478b812250df878635c2aa7ec7d155eaa625ee82916e2cd294361886cd1fbd4", + "a4310d50af18a6447190372a86afaf8b951ffb431d837f1e5688b45971ed1557", + "4b03f45807ad70f21bfc2cae71c9fde4604c064cf5ffb686bae5dbaad7fdd34c", + "5edb7ac43b82a06a8761e8d7be4979ebf2611f7dd79bf91c1c6b566a219ed766", + "2399561127a57125de8cefea610ddf2fa078b5c8067f4e828290bfb860e84b3c", + "69ddd7ea90bb57c93e135dc85ea6fcd5480b603239bdc454fc758b2a26cf7f79", + "6c61dac3a2def031506be036d2a6fe401994fbd13df9c8d466599274c446ec98", + "668c83947da63b724bece1743c31a0e6aed0db8ec5b31be377bb784f91b6716f", + "ecc3e9c3407503bee091aa952f41348ff88baa863b2264befac807901574e939", + "f9e67d336c51002ac054c632022d66dda2e7e3fff10ad061ed31d8bbb410cfb2", + "bf0feefb9e3a581ad5f9e9db7589985743d261085c4d314f6f5d7259aa421612", + "03950fb49a531f3e1991942398dfa9e0ea32d7ba1cdd9bc85db57ed9400b434a", + "3c5f81fea5fab82c64bfa2eaecafcde8e077fc8620a7cae537163df36edbf378", + "cbb522d7b7f127ad6a0113865bdf1cd4102e7d0759af635a7cf4720dc963c53b", + "04048028bf1f2864d48f9ad4d83294366a828856553f3b14303f90147f5d40ef", + "2530cc8e98321502bad96f9b1fba1b099e2d299e0f4548bb914f363bc0d4531f", + "063e4afac491dfd332f3089b8542e94617d893d7fe944e10a7937ee29d9693c0", + "136335439334a7698016a0d324de72284e079d7b5220bb8fbd747816eebebaca", + "45140b3247eb9cc8c5b4f0d7b53091f73292089e6e5a63e2749dd3aca9198eda", + "2ce1cb0bf9d2f9e102993fbe215152c3b2dd0cabde1c68e5319b839154dbb7f5", + "568d6905a2c88708a4b3025190edcfedb1974a606a13c6e5290fcb2ae63edab5", + "0376ab1d54c5f9803ce4b2e201a0ee7eef7b57b636e8a93c9b8d4860c96f5fa7", + "0a81ec5a929777f145904af38d5d509f66b5e2c58fcdb531058b0e17f3f0b41b", + "70a73f7f376b60074248904534b11482d5bf0e698ecc498df52577ebf2e93b9a", + "bd71fdf6da97e4cf62d1647add2581b07d79adf8397eb4ecba9c5e8488821423", + "5c58468d55f58e497e743982d2b50010b6d165374acf83a7d4a32db768c4408e", + "fcbfe2886206f72b27593c8b070297e12d769ed10ed7930705a8098effc14d17", + "8c4edfd04348f322969e7e29a4cd4dca004655061c16e1b076422ef342ad630e", + "bfd88fe1101c41ae3e801bf8be56350ee9bad1a6b9bd515edc5c6d5b8711ac44", + "513b2cecb810d4cde5dd85391adfc6c2dd60d87bb736d2b521484aa47a0ebef6", + "88497f01602f3154246ae28c4d5aef10f1d87ebb76626f4ae0b7f95ba7968799", + "bc104f15a48be709dca542a7e1d4b9df6f054527e802eaa92d595444258afe71", + "55926084ec963a64b96e2abe01ce0ba86a64fbfebcc7aab5afc155b37fd76066", + "c1b48299aba5208fe9630ace55ca68a03eda5a519c8802a0d3a673be8f8e557d", + "e17890ee09a3fbf4f48b9c414a17d637b7a50647e9bc752322727fcc1742a911", + "c7ba6567de93a798ae1faa791e712d378fae1f93c4397fea441bb7cbe6fd5995", + "9a114025197c5bb95d94e63d55cd43790847b646b23cdf11ada4a00eff15fb48", + "edf7ebbca27a2a384d387b7d4010c666e2edb4843e4c29b4ae1d5b9332e6b24d", + "fd73dad31c644ff1b43bef0ccdda96710b9cd9875eca7e31707af3e96d522bbd", + "3e84ba4342908516e77573c0992f0979ca084e4685681ff195ccba8a229b8a76", + "978cd966f2faa07ba7aa9500d9c02e9d77f2cdada6ad6ba74af4b91c66593c50", + "49e7a442acf0ea6287050054b52564b650e4f49e42e348d6aa38e039e957b1c1", + "eec5496b988ce98625b934092eec2908bed0b0f316c2d4730c84eaf1f3d34881", + "3cfc3c14d1f684ff17e38c43ca440c00b967ec933e8bfe064ca1d72c90f2adb0", + "1c01c6f4dbb2fefc22558b2bca32563f49844acfc32b7be4b0ff599f9e8c7af7", + "f09b122c7114f4a09bd4ea4f4a99d558b46e4c25cd81140d29c05613914c3841", + "d95fea3ca4eedce74cd76e75fc6d1ff62c441f0fa8bc77f034b19e5db258015d", + "f96f23f4c3e79c077a46988d5af5900676a0f039cb645dd17549b216c82440ce", + "e23d4a036d7b70e9f595b1422079d2b91edfbb1fb651a0633eaa8a9dc5f80703", + "9a6ec012e1a7da9dbe34194d478ad7c0db1822fb071df12981496ed104384113", + "59769007f7685d0fcd50872f9f95d5755a5b2b457d81f3692b610a98672f0e1b", + "dd6936fe21f8f077c123a1a521c12224f72255b73e03a7260693e8a24b0fa389", + "b0bfd52bb0d7d9bd92bf5d4dc13da255c02c542f378365ea893911f55e55f23c", + "91e2f5788d5810eba7ba58737de1548a8ecacd014598bc0b143e041b17052552", + "f356bea244b7a91eb35d53ca9ad7864ace018e2d35d5f8f96ddf68a6f41aa474", + "8a866fd1b276b57e578e921c65828a2bed58e9f2f288054134b7f1f4bfc9cc74", + "8fe4fb0af93a4d0d67db0bebb23e37c71bf325dcbcdd240ea04daf58b47e1840", + "88ef81de202eb018452e43f864725cea5fbd1fc2d9d205730709c5d8b8690f46", + "7d05ebb682339f8c9451ee094eebfefa7953a114edb2f44949452fab7d2fc185", + "7e37cb8b4c47090cab36551ba6f45db840680fba166a952db100717f43053fc2", + "cb3ccbb76031e5e0138f8dd39a23f9de47ffc35e43c1144cea27d46a5ab1cb5f", + "31ad6648f8104138c738f39ea4320133393e3a18cc02296ef97c2ac9ef6731d0", + "552f7bdcf1a7af9e6ce672017f4f12abf77240c78e761ac203d1d9d20ac89988", + "4b22d5a6aec99f3cdb79aa5ec06838479cd5ecba7164f7f22dc1d65f63d85708", + "d6f034bd94aa233f0297eca4245b283973e447aa590f310c77f48fdf83112254", + "52f0e1c4e58ec629291b60317f074671b85d7ea80d5b07273463534b32b40234", + "e793c9b02fd8aa13e21c31228accb08119643b749c898964b1746d46c3d4cbd2", + "4ff460d54b9c86dabfbcfc5712e0400d2bed3fbc4d4fbdaa86e06adcd2a9ad7a", + "bec94911c2955676db6c0a550986d76e3ba005667c442c9762b4fbb773de228c", + "179fbc148a3dd00fd24ea13458cc43bfa7f59c8182d783a513f6ebec100c8924", + "3c4fb0b95ab8b30032f432b86f535fe172c185d0fd39865837cf36187fa6f428", + "4d2491414cfe956746ec4cefa6cf6f72e28a1329432f9d8a907ac4cb5dadc15a", + "5d56499be4d2e08bcfcad08a3e38723d50503bde706948e42f55603019e528ae", + "30d0895a9a448a262091635522d1f52010b5867acae12c78ef958fd4f4389f2f", + "43df5774b03e7fef5fe40d931a7bedf1bb2e6b42738c4e6d3841103d3aa7f339", + "02ed0eb28c14da45165c566791700d6451d7fb56f0b2ab1d3b8eb070e56edff5", + "5cc3d78e4e1d5e45547a04e6873e64f90cf9536d1ccc2ef800f355c4c5fd70fd", + "49351b903444c185ccdc5c693d24d8555cb208d6a8141307699f4af063199d78", + "8de78655e1be7f7847800b93f694d21d368cc06e033e7fab04bb5eb99da6b700", + "2a99f5bc1174b73cbb1d620884e01c34e51ccb3978da125f0e33268883bf4158", + "6b9c08e86eb0f767cfad65cd98b62149e5494a67f5845e7bd1ed019f27b86bd6", + "d487a56f83b07482e85e963394c1ecc2c9e51d0903ee946b02c301581ed99e16", + "8b45da1c06f791eb0cabf26be588f5fb23165c2e614bf885562d0dce50b29b02", + "a1339d33281a0b56e557d3d32b1ce7f9367eb094bd5fa72a7e5004c8ded7cafe", + "b676f2eddae8775cd36cb0f63cd1d4603961f49e6265ba013a2f0307b6d0b804" +] diff --git a/lib/bcoin/bip70/index.js b/lib/bcoin/bip70/index.js index 555cc449..06b7d895 100644 --- a/lib/bcoin/bip70/index.js +++ b/lib/bcoin/bip70/index.js @@ -247,7 +247,7 @@ PaymentRequest.prototype.getCA = function getCA() { return; return { - name: ca.name, + name: x509.getCAName(root), fingerprint: ca.fingerprint, cert: root }; @@ -305,10 +305,8 @@ PaymentDetails.prototype.fromOptions = function fromOptions(options) { this.paymentUrl = options.paymentUrl; } - if (options.merchantData) { - assert(Buffer.isBuffer(options.merchantData)); - this.merchantData = options.merchantData; - } + if (options.merchantData) + this.setData(options.merchantData); return this; }; @@ -317,18 +315,24 @@ PaymentDetails.fromOptions = function fromOptions(options) { return new PaymentDetails().fromOptions(options); }; +PaymentDetails.prototype.isExpired = function isExpired() { + if (this.expires === -1) + return false; + return utils.now() > this.expires; +}; + PaymentDetails.prototype.setData = function setData(data, enc) { if (data == null || Buffer.isBuffer(data)) { this.merchantData = data; return; } - if (enc === 'json') { + if (typeof data !== 'string') { + assert(!enc || enc === 'json'); this.merchantData = new Buffer(JSON.stringify(data), 'utf8'); return; } - assert(typeof data === 'string'); this.merchantData = new Buffer(data, enc); }; @@ -434,10 +438,8 @@ function Payment(options) { Payment.prototype.fromOptions = function fromOptions(options) { var i, tx, output; - if (options.merchantData) { - assert(Buffer.isBuffer(options.merchantData)); - this.merchantData = options.merchantData; - } + if (options.merchantData) + this.setData(options.merchantData); if (options.transactions) { assert(Array.isArray(options.transactions)); diff --git a/lib/bcoin/bip70/x509.js b/lib/bcoin/bip70/x509.js index ba30babc..fae2ce75 100644 --- a/lib/bcoin/bip70/x509.js +++ b/lib/bcoin/bip70/x509.js @@ -57,6 +57,27 @@ x509.setTrust = function setTrust(certs) { for (i = 0; i < certs.length; i++) { cert = certs[i]; + if (isHash(cert)) { + if (!Buffer.isBuffer(cert)) + cert = new Buffer(cert, 'hex'); + + fingerprint = cert; + hash = fingerprint.toString('hex'); + + if (x509.trusted[hash]) + continue; + + trust = { + name: 'Unknown', + fingerprint: fingerprint + }; + + x509.certs.push(trust); + x509.trusted[hash] = trust; + + continue; + } + if (typeof cert === 'string') { pem = asn1.fromPEM(cert); assert(pem.type === 'certificate', 'Must add certificates to trust.'); @@ -303,3 +324,13 @@ x509.sign = function sign(alg, hash, msg, key) { }; x509.asn1 = asn1; + +function isHash(data) { + if (typeof data === 'string') + return utils.isHex(data) && data.length === 64; + + if (Buffer.isBuffer(data)) + return data.length === 32; + + return false; +} diff --git a/scripts/certs.sh b/scripts/certs.sh new file mode 100755 index 00000000..83279a18 --- /dev/null +++ b/scripts/certs.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +dir=$(dirname "$(which "$0")") +url='https://raw.githubusercontent.com/nodejs/node/master/src/node_root_certs.h' +json=$(curl -s "$url") + +sha256() { + cat | openssl dgst -sha256 -hex | sed 's/^(stdin)= //' +} + +getcerts() { + local buf='' + echo "$json" | sed 's/\\/\\\\/g' | while read line; do + if echo "$line" | grep "BEGIN CERT" > /dev/null; then + buf="$line" + continue + fi + if echo "$line" | grep "END CERT" > /dev/null; then + buf="$buf$line" + buf=$(echo "$buf" | sed 's/"//g' | sed 's/,//g') + echo ' "'"${buf}"'",' + continue + fi + buf="$buf$line" + done +} + +gethashes() { + local buf='' + echo "$json" | sed 's/\\n/:/g' | while read line; do + if echo "$line" | grep "BEGIN CERT" > /dev/null; then + buf="$line" + continue + fi + if echo "$line" | grep "END CERT" > /dev/null; then + buf="$buf$line" + buf=$(echo "$buf" | sed 's/"//g' | sed 's/,//g' | tr ':' '\n') + buf=$(echo "$buf" | openssl x509 -outform DER | sha256) + echo ' "'"${buf}"'",' + continue + fi + buf="$buf$line" + done +} + +format() { + local data=$(cat) + local body=$(echo "$data" | head -n -1) + local last=$(echo "$data" | tail -n 1) + echo '[' + echo "$body" + echo "$last" | rev | cut -c 2- | rev + echo ']' +} + +# getcerts | format > "${dir}/../certs.json" +gethashes | format > "${dir}/../etc/certs.json" diff --git a/test/bip70-test.js b/test/bip70-test.js new file mode 100644 index 00000000..d7f37744 --- /dev/null +++ b/test/bip70-test.js @@ -0,0 +1,201 @@ +'use strict'; + +var bn = require('bn.js'); +var bcoin = require('../').set('main'); +var utils = bcoin.utils; +var constants = bcoin.protocol.constants; +var network = bcoin.protocol.network; +var assert = require('assert'); +var tests = require('./data/bip70.json'); +var bip70 = require('../lib/bcoin/bip70'); +var x509 = require('../lib/bcoin/bip70/x509'); + +tests.valid = new Buffer(tests.valid, 'hex'); +tests.invalid = new Buffer(tests.invalid, 'hex'); +tests.untrusted = new Buffer(tests.untrusted, 'hex'); +tests.ack = new Buffer(tests.ack, 'hex'); +tests.ca = { + crt: new Buffer(tests.ca.crt, 'hex'), + priv: new Buffer(tests.ca.priv, 'hex'), + pub: new Buffer(tests.ca.pub, 'hex') +}; + +describe('BIP70', function() { + function testRequest(data) { + var request = bip70.PaymentRequest.fromRaw(data); + assert.equal(request.pkiType, 'x509+sha256'); + assert(request.pkiData); + assert(request.getChain()); + assert(request.paymentDetails); + assert(request.paymentDetails.memo.length !== 0); + assert(request.paymentDetails.paymentUrl.length !== 0); + var ser = request.toRaw(); + assert.equal(ser.toString('hex'), data.toString('hex')); + assert(request.verify()); + } + + x509.verifyTime = function() { return true; }; + + it('should parse and verify a payment request', function() { + testRequest(tests.valid); + testRequest(tests.invalid); + testRequest(tests.untrusted); + }); + + it('should verify cert chain', function() { + var request = bip70.PaymentRequest.fromRaw(tests.valid); + + assert.equal(request.version, 1); + assert.equal(request.getChain().length, 4); + assert.equal(request.paymentDetails.paymentUrl, + 'https://test.bitpay.com/i/CMWpuFsjgmQ2ZLiyGfcF1W'); + assert.equal(request.paymentDetails.network, 'test'); + assert.equal(request.paymentDetails.time, 1408645830); + assert.equal(request.paymentDetails.expires, 1408646730); + assert.equal(request.paymentDetails.outputs.length, 1); + assert(!request.paymentDetails.merchantData); + assert(request.paymentDetails.isExpired()); + + assert(request.verifyChain()); + + var request = bip70.PaymentRequest.fromRaw(tests.invalid); + + assert.equal(request.version, 1); + assert.equal(request.getChain().length, 3); + assert.equal(request.paymentDetails.paymentUrl, + 'https://bitpay.com/i/PAQtNxX7KL8BtJBnfXyTaH'); + assert.equal(request.paymentDetails.network, 'main'); + assert.equal(request.paymentDetails.time, 1442409238); + assert.equal(request.paymentDetails.expires, 1442410138); + assert.equal(request.paymentDetails.outputs.length, 1); + assert.equal(request.paymentDetails.merchantData.length, 76); + assert(request.paymentDetails.getData('json')); + assert(request.paymentDetails.isExpired()); + + assert(request.verifyChain()); + + request.paymentDetails.setData({foo:1}, 'json'); + assert.equal(request.paymentDetails.merchantData.length, 9); + assert.deepStrictEqual(request.paymentDetails.getData('json'), {foo:1}); + assert(!request.verify()); + + var request = bip70.PaymentRequest.fromRaw(tests.untrusted); + + assert.equal(request.version, -1); + assert.equal(request.getChain().length, 2); + assert.equal(request.paymentDetails.paymentUrl, + 'https://www.coinbase.com/rp/55f9ca703d5d80008c0001f4'); + assert.equal(request.paymentDetails.network, null); + assert.equal(request.paymentDetails.time, 1442433682); + assert.equal(request.paymentDetails.expires, 1442434548); + assert.equal(request.paymentDetails.outputs.length, 1); + assert.equal(request.paymentDetails.merchantData.length, 32); + assert.equal(request.paymentDetails.getData('utf8'), + 'bb79b6f2310e321bd3b1d929edbeb358'); + assert(request.paymentDetails.isExpired()); + + assert(request.verifyChain()); + }); + + it('should fail to verify cert signatures when enforcing trust', function() { + x509.certs.push({}); + var request = bip70.PaymentRequest.fromRaw(tests.valid); + assert(!request.verifyChain()); + var request = bip70.PaymentRequest.fromRaw(tests.invalid); + assert(!request.verifyChain()); + var request = bip70.PaymentRequest.fromRaw(tests.untrusted); + assert(!request.verifyChain()); + }); + + it('should verify cert signatures once root cert is added', function() { + var request = bip70.PaymentRequest.fromRaw(tests.valid); + x509.setTrust([request.getChain().pop()]); + assert(request.verifyChain()); + var request = bip70.PaymentRequest.fromRaw(tests.untrusted); + assert(!request.verifyChain()); + }); + + it('should still fail to verify cert signatures for invalid', function() { + var request = bip70.PaymentRequest.fromRaw(tests.invalid); + assert(!request.verifyChain()); + }); + + it('should get chain and ca for request', function() { + var request = bip70.PaymentRequest.fromRaw(tests.valid); + assert.equal(request.getChain().length, 4); + assert.equal(request.getCA().name, + 'Go Daddy Class 2 Certification Authority'); + }); + + it('should validate untrusted once again', function() { + var request = bip70.PaymentRequest.fromRaw(tests.untrusted); + x509.setTrust([request.getChain().pop()]); + var request = bip70.PaymentRequest.fromRaw(tests.untrusted); + assert(request.verifyChain()); + assert.equal(request.getCA().name, + 'DigiCert SHA2 Extended Validation Server CA'); + }); + + it('should parse a payment ack', function() { + var ack = bip70.PaymentACK.fromRaw(tests.ack); + assert.equal(ack.memo.length, 95); + assert.equal(ack.memo, 'Transaction received by BitPay.' + + ' Invoice will be marked as paid if the transaction is confirmed.'); + assert.equal(ack.toRaw().toString('hex'), tests.ack.toString('hex')); + }); + + it('should create a payment request, sign, and verify', function() { + var request = new bip70.PaymentRequest({ + version: 25, + paymentDetails: { + network: 'testnet', + paymentUrl: 'http://bcoin.io/payme', + memo: 'foobar', + time: utils.now(), + expires: utils.now() + 3600, + outputs: [ + { value: 10000, address: bcoin.address() }, + { value: 50000, address: bcoin.address() } + ], + merchantData: { foo: 'bar' } + } + }); + + assert.equal(request.pkiType, null); + assert(!request.pkiData); + assert.equal(request.getChain().length, 0); + assert(request.paymentDetails); + assert(request.paymentDetails.memo.length !== 0); + assert(request.paymentDetails.paymentUrl.length !== 0); + assert.deepStrictEqual(request.paymentDetails.getData('json'), {foo:'bar'}); + + assert.equal(request.version, 25); + assert.equal(request.paymentDetails.paymentUrl, 'http://bcoin.io/payme'); + assert.equal(request.paymentDetails.network, 'testnet'); + assert(request.paymentDetails.time <= utils.now()); + assert.equal(request.paymentDetails.expires, + request.paymentDetails.time + 3600); + assert.equal(request.paymentDetails.outputs.length, 2); + assert(request.paymentDetails.merchantData); + assert(!request.paymentDetails.isExpired()); + + assert(!request.pkiData); + request.sign(tests.ca.priv, tests.ca.crt); + + assert(request.pkiData); + assert.equal(request.pkiType, 'x509+sha256'); + assert.equal(request.getChain().length, 1); + + assert(request.verify()); + assert(!request.verifyChain()); + + testRequest(request.toRaw()); + + x509.setTrust(tests.ca.crt); + assert(request.verifyChain()); + assert.equal(request.getCA().name, 'JJs CA'); + + request.version = 24; + assert(!request.verify()); + }); +}); diff --git a/test/data/bip70.json b/test/data/bip70.json new file mode 100644 index 00000000..b989691f --- /dev/null +++ b/test/data/bip70.json @@ -0,0 +1,11 @@ +{ + "valid": "0801120b783530392b7368613235361a89250aa40a3082052030820408a003020102020727a49d05046d62300d06092a864886f70d01010b05003081b4310b30090603550406130255533110300e060355040813074172697a6f6e61311330110603550407130a53636f74747364616c65311a3018060355040a1311476f44616464792e636f6d2c20496e632e312d302b060355040b1324687474703a2f2f63657274732e676f64616464792e636f6d2f7265706f7369746f72792f313330310603550403132a476f2044616464792053656375726520436572746966696361746520417574686f72697479202d204732301e170d3134303432363132333532365a170d3136303432363132333532365a303a3121301f060355040b1318446f6d61696e20436f6e74726f6c2056616c6964617465643115301306035504030c0c2a2e6269747061792e636f6d30820122300d06092a864886f70d01010105000382010f003082010a0282010100e2a5dd4aea959c1d0fb016e6e05bb7011e741cdc61918c61f9625a2f682f485f0e862ea63db61cc9161753127504de800604df36b10f46cb17ab6cb99dba8aa45a36adfb901a2fc380c89e234bce18de6639b883e9339801673efaee1f2df77eeb82f7c39c96a2f8ef4572b634c203d9be8fd1e0036d32fb38b6b9b5ecd5a0684345c7e9ffc5d26bc6fd69aa6619f77badaa4bfb989478fb2f41aa92782e40b34ba9ac4549a4e6fda76b5fc4a581853bd0de5fb5a2c6dfdc12cdfadb54e9636a6d1223705924b8be566b81ac7921078cf590a146ae397a84908ef4fc83ff5715a44ab59e9258674d90113bb607b8d81eb268e4c6ce849497c76521795b0873950203010001a38201ae308201aa300f0603551d130101ff04053003010100301d0603551d250416301406082b0601050507030106082b06010505070302300e0603551d0f0101ff0404030205a030360603551d1f042f302d302ba029a0278625687474703a2f2f63726c2e676f64616464792e636f6d2f676469673273312d34392e63726c30530603551d20044c304a3048060b6086480186fd6d010717013039303706082b06010505070201162b687474703a2f2f6365727469666963617465732e676f64616464792e636f6d2f7265706f7369746f72792f307606082b06010505070101046a3068302406082b060105050730018618687474703a2f2f6f6373702e676f64616464792e636f6d2f304006082b060105050730028634687474703a2f2f6365727469666963617465732e676f64616464792e636f6d2f7265706f7369746f72792f67646967322e637274301f0603551d2304183016801440c2bd278ecc348330a233d7fb6cb3f0b42c80ce30230603551d11041c301a820c2a2e6269747061792e636f6d820a6269747061792e636f6d301d0603551d0e0416041485454e3b4072e2f58e377438988b5229387e967a300d06092a864886f70d01010b050003820101002d0a7ef97f988905ebbbad4e9ffb690352535211d6792516119838b55f24ff9fa4e93b6187b8517cbb0477457d3378078ef66057abe41bcafeb142ec52443a94b88114fa069f725c6198581d97af16352727f4f35e7f2110faa41a0511bcfdf8e3f4a3a310278c150b10f32a962c81e8f3d5374d9cb56d893027ff4fa4e3c3e6384c1f1557ceea6fca9cbc0c110748c08b82d8f0ed9a579637ee43a2d8fec3b5b04d1f3c8f1a3e2088da2274b6bc60948bbe744a7f8b942b41f0ae9b4afaeefbb7e0f04a0587b52efb6ebfa2d970b9de56a068575e4bf0cf824618dc17bbeaa2cdd25d65970a9f1a06fc9fffb466a10c9568cd651795bc2c7996975027bdbaba0ad409308204d0308203b8a003020102020107300d06092a864886f70d01010b0500308183310b30090603550406130255533110300e060355040813074172697a6f6e61311330110603550407130a53636f74747364616c65311a3018060355040a1311476f44616464792e636f6d2c20496e632e3131302f06035504031328476f20446164647920526f6f7420436572746966696361746520417574686f72697479202d204732301e170d3131303530333037303030305a170d3331303530333037303030305a3081b4310b30090603550406130255533110300e060355040813074172697a6f6e61311330110603550407130a53636f74747364616c65311a3018060355040a1311476f44616464792e636f6d2c20496e632e312d302b060355040b1324687474703a2f2f63657274732e676f64616464792e636f6d2f7265706f7369746f72792f313330310603550403132a476f2044616464792053656375726520436572746966696361746520417574686f72697479202d20473230820122300d06092a864886f70d01010105000382010f003082010a0282010100b9e0cb10d4af76bdd49362eb3064b881086cc304d962178e2fff3e65cf8fce62e63c521cda16454b55ab786b63836290ce0f696c99c81a148b4ccc4533ea88dc9ea3af2bfe80619d7957c4cf2ef43f303c5d47fc9a16bcc3379641518e114b54f828bed08cbef030381ef3b026f86647636dde7126478f384753d1461db4e3dc00ea45acbdbc71d9aa6f00dbdbcd303a794f5f4c47f81def5bc2c49d603bb1b24391d8a4334eeab3d6274fad258aa5c6f4d5d0a6ae7405645788b54455d42d2a3a3ef8b8bde9320a029464c4163a50f14aaee77933af0c20077fe8df0439c269026c6352fa77c11bc87487c8b993185054354b694ebc3bd3492e1fdcc1d252fb0203010001a382011a30820116300f0603551d130101ff040530030101ff300e0603551d0f0101ff040403020106301d0603551d0e0416041440c2bd278ecc348330a233d7fb6cb3f0b42c80ce301f0603551d230418301680143a9a8507106728b6eff6bd05416e20c194da0fde303406082b0601050507010104283026302406082b060105050730018618687474703a2f2f6f6373702e676f64616464792e636f6d2f30350603551d1f042e302c302aa028a0268624687474703a2f2f63726c2e676f64616464792e636f6d2f6764726f6f742d67322e63726c30460603551d20043f303d303b0604551d20003033303106082b06010505070201162568747470733a2f2f63657274732e676f64616464792e636f6d2f7265706f7369746f72792f300d06092a864886f70d01010b05000382010100087e6c9310c838b896a9904bffa15f4f04ef6c3e9c8806c9508fa673f757311bbebce42fdbf8bad35be0b4e7e679620e0ca2d76a637331b5f5a848a43b082da25d90d7b47c254f115630c4b6449d7b2c9de55ee6ef0c61aabfe42a1bee849eb8837dc143ce44a713700d911ff4c813ad8360d9d872a873241eb5ac220eca17896258441bab892501000fcdc41b62db51b4d30f512a9bf4bc73fc76ce36a4cdd9d82ceaae9bf52ab290d14d75188a3f8a4190237d5b4bfea403589b46b2c3606083f87d5041cec2a190c3bbef022fd21554ee4415d90aaea78a33edb12d763626dc04eb9ff7611f15dc876fee469628ada1267d0a09a72e04a38dbcf8bc0430010a81093082047d30820365a00302010202031be715300d06092a864886f70d01010b05003063310b30090603550406130255533121301f060355040a131854686520476f2044616464792047726f75702c20496e632e3131302f060355040b1328476f20446164647920436c61737320322043657274696669636174696f6e20417574686f72697479301e170d3134303130313037303030305a170d3331303533303037303030305a308183310b30090603550406130255533110300e060355040813074172697a6f6e61311330110603550407130a53636f74747364616c65311a3018060355040a1311476f44616464792e636f6d2c20496e632e3131302f06035504031328476f20446164647920526f6f7420436572746966696361746520417574686f72697479202d20473230820122300d06092a864886f70d01010105000382010f003082010a0282010100bf716208f1fa5934f71bc918a3f7804958e9228313a6c52043013b84f1e685499f27eaf6841b4ea0b4db7098c73201b1053e074eeef4fa4f2f593022e7ab19566be28007fcf316758039517be5f935b6744ea98d8213e4b63fa90383faa2be8a156a7fde0bc3b6191405caeac3a804943b467c320df3006622c88d696d368c1118b7d3b21c60b438fa028cced3dd4607de0a3eeb5d7cc87cfbb02b53a4926269512505611a44818c2ca9439623dfac3a819a0e29c51ca9e95d1eb69e9e300a39cef18880fb4b5dcc32ec85624325340256270191b43b702a3f6eb1e89c88017d9fd4f9db536d609dbf2ce758abb85f46fccec41b033c09eb49315c6946b3e0470203010001a382011730820113300f0603551d130101ff040530030101ff300e0603551d0f0101ff040403020106301d0603551d0e041604143a9a8507106728b6eff6bd05416e20c194da0fde301f0603551d23041830168014d2c4b0d291d44c1171b361cb3da1fedda86ad4e3303406082b0601050507010104283026302406082b060105050730018618687474703a2f2f6f6373702e676f64616464792e636f6d2f30320603551d1f042b30293027a025a0238621687474703a2f2f63726c2e676f64616464792e636f6d2f6764726f6f742e63726c30460603551d20043f303d303b0604551d20003033303106082b06010505070201162568747470733a2f2f63657274732e676f64616464792e636f6d2f7265706f7369746f72792f300d06092a864886f70d01010b05000382010100590b53bd928611a7247bed5b31cf1d1f6c70c5b86ebe4ebbf6be9750e1307fba285c6294c2e37e33f7fb427685db951c8c225875090c886567390a1609c5a03897a4c523933fb418a601064491e3a76927b45a257f3ab732cddd84ff2a382933a4dd67b285fea188201c5089c8dc2af64203374ce688dfd5af24f2b1c3dfccb5ece0995eb74954203c94180cc71c521849a46de1b3580bc9d8ecd9ae1c328e28700de2fea6179e840fbd5770b35ae91fa08653bbef7cff690be048c3b7930bc80a54c4ac5d1467376ccaa52f310837aa6e6f8cbc9be2575d2481af97979c84ad6cac374c66f361911120e4be309f7aa42909b0e1345f6477184051df8c30a6af0a840830820400308202e8a003020102020100300d06092a864886f70d01010505003063310b30090603550406130255533121301f060355040a131854686520476f2044616464792047726f75702c20496e632e3131302f060355040b1328476f20446164647920436c61737320322043657274696669636174696f6e20417574686f72697479301e170d3034303632393137303632305a170d3334303632393137303632305a3063310b30090603550406130255533121301f060355040a131854686520476f2044616464792047726f75702c20496e632e3131302f060355040b1328476f20446164647920436c61737320322043657274696669636174696f6e20417574686f7269747930820120300d06092a864886f70d01010105000382010d00308201080282010100de9dd7ea571849a15bebd75f4886eabeddffe4ef671cf46568b35771a05e77bbed9b49e970803d561863086fdaf2ccd03f7f0254225410d8b281d4c0753d4b7fc777c33e78ab1a03b5206b2f6a2bb1c5887ec4bb1eb0c1d845276faa3758f78726d7d82df6a917b71f72364ea6173f659892db2a6e5da2fe88e00bde7fe58d15e1ebcb3ad5e212a2132dd88eaf5f123da0080508b65ca565380445991ea3606074c541a572621b62c51f6f5f1a42be025165a8ae23186afc7803a94d7f80c3faab5afca140a4ca1916feb2c8ef5e730dee77bd9af67998bcb10767a2150ddda058c6447b0a3e62285fba41075358cf117e3874c5f8ffb569908f8474ea971baf020103a381c03081bd301d0603551d0e04160414d2c4b0d291d44c1171b361cb3da1fedda86ad4e330818d0603551d230481853081828014d2c4b0d291d44c1171b361cb3da1fedda86ad4e3a167a4653063310b30090603550406130255533121301f060355040a131854686520476f2044616464792047726f75702c20496e632e3131302f060355040b1328476f20446164647920436c61737320322043657274696669636174696f6e20417574686f72697479820100300c0603551d13040530030101ff300d06092a864886f70d01010505000382010100324bf3b2ca3e91fc12c6a1078c8e77a03306145c901e18f708a63d0a19f98780116e69e4961730ff3491637238eecc1c01a31d9428a431f67ac454d7f6e5315803a2ccce62db944573b5bf45c924b5d58202ad2379698db8b64dcecf4cca3323e81c88aa9d8b416e16c920e5899ecd3bda70f77e992620145425ab6e7385e69b219d0a6c820ea8f8c20cfa101e6c96ef870dc40f618badee832b95f88e92847239eb20ea83ed83cd976e08bceb4e26b6732be4d3f64cfe2671e26111744aff571a870f75482ecf516917a002126195d5d140b2104ceec4ac1043a6a59e0ad595629a0dcf8882c5320ce42b9f45e60d9f289cb1b92a5a57ad370faf1d7fdbbd9f22a1010a0474657374122008c0c9e714121976a914176d7c5d60da6f8c82de86671a1fb776028538ca88ac18c6f5d89f0520cafcd89f052a395061796d656e74207265717565737420666f722042697450617920696e766f69636520434d57707546736a676d51325a4c6979476663463157323068747470733a2f2f746573742e6269747061792e636f6d2f692f434d57707546736a676d51325a4c69794766634631572a80021566366ab78842a514c056ca7ecb76481262cac74cc4c4ccdc82c4980bc3300de67836d61d3e06dc8c90798a7774c21c7ad4fe634b85faa8719d6402411bb720396ae03cbb4e14f06f7894a66b208b99f727fab35d32f4f2148294d24bea1b3f240c159d0fd3ee4a32e5f926bf7c05eb7a3f75e01d9af81254cfbb61606467750ea7e0a1536728358e0898d06f57235e4096d2caf647ae58dff645be80c9b3555fa96c81efa07d421977d26214ad4f1ff642a93d0925656aeab454fa0b60fcbb6c1bc570eb6e43e7613392f37900748635ae381534bfaa558792bc46028b9efce391423a9c1201f76292614b30a14272e837f3813045b035f3d42f4f76f48acd", + "invalid": "0801120b783530392b7368613235361a88210aaa0e308207263082060ea003020102020900ba55847ce9a10f59300d06092a864886f70d01010b05003081b4310b30090603550406130255533110300e060355040813074172697a6f6e61311330110603550407130a53636f74747364616c65311a3018060355040a1311476f44616464792e636f6d2c20496e632e312d302b060355040b1324687474703a2f2f63657274732e676f64616464792e636f6d2f7265706f7369746f72792f313330310603550403132a476f2044616464792053656375726520436572746966696361746520417574686f72697479202d204732301e170d3135303432303231323134365a170d3137303432353139313130305a3081be31133011060b2b0601040182373c0201031302555331193017060b2b0601040182373c020102130844656c6177617265311d301b060355040f131450726976617465204f7267616e697a6174696f6e3110300e0603550405130735313633393636310b30090603550406130255533110300e0603550408130747656f726769613110300e0603550407130741746c616e746131153013060355040a130c4269745061792c20496e632e311330110603550403130a6269747061792e636f6d30820122300d06092a864886f70d01010105000382010f003082010a0282010100e42025369a803c1b44234a279d123b610ec1178452fc7c57f2576492e1123166bed5eec11d12a8b824904f77aa6166ce6e111538204121069b5ecff81fd1ab27b1b9475c49d7680ef5f406f57a1871b77392a7b5c4370f504ba175617f78fe24c9ed76154b46aa677cf6463a202909711b34ceecbe0ee7b9766cfd7018886b67e518f1ac39a3715152d62e59547f34d440ed3dfa01a92a42ed0b221c093144ed63f86c2300b8cf192b75929732af63c41526e4fd69735f0062c61c2dbcb56f6439ff9bbe62507da52752c1d99f24afbb3a6b5c98989d2196fb6bd9cc83a5ab21f060e955e7f45a01c9efe782f15cd48ab824d6272db2b71c8988d02071e805df0203010001a382032d30820329300c0603551d130101ff04023000301d0603551d250416301406082b0601050507030106082b06010505070302300e0603551d0f0101ff0404030205a030350603551d1f042e302c302aa028a0268624687474703a2f2f63726c2e676f64616464792e636f6d2f676469673273332d312e63726c30530603551d20044c304a3048060b6086480186fd6d010717033039303706082b06010505070201162b687474703a2f2f6365727469666963617465732e676f64616464792e636f6d2f7265706f7369746f72792f307606082b06010505070101046a3068302406082b060105050730018618687474703a2f2f6f6373702e676f64616464792e636f6d2f304006082b060105050730028634687474703a2f2f6365727469666963617465732e676f64616464792e636f6d2f7265706f7369746f72792f67646967322e637274301f0603551d2304183016801440c2bd278ecc348330a233d7fb6cb3f0b42c80ce30250603551d11041e301c820a6269747061792e636f6d820e7777772e6269747061792e636f6d301d0603551d0e04160414a5698a70daa1405dbcdd1a02e95db8a51aaadd7f3082017d060a2b06010401d6790204020482016d0482016901670076005614069a2fd7c2ecd3f5e1bd44b23ec74676b9bc99115cc0ef949855d689d0dd0000014cd8b6d73a000004030047304502210095e5768670ea27ed35075e484b7c42cd20176c7263b4e879deb418639144079d02204911ae1cf0fcda5a2b6b3cec528ccd689e7371a34c99460c2ca063b44ba6fbca00750068f698f81f6482be3a8ceeb9281d4cfc71515d6793d444d10a67acbb4f4ffbc40000014cd8b6d93e0000040300463044022030c89215d7081b372a1b033eb77ff5abbe9c6822b38c9a0f5e4b166c7532fabf02200a481b330414d0076aa0d925dc84096b8cb7585fc0b1ff28c744cfa85e17ab8e007600a4b90990b418581487bb13a2cc67700a3c359804f91bdfb8e377cd0ec80ddc100000014cd8b6dc34000004030047304502201f085d25b292b34185a182e314a3c64c9b5162526c90cfc3ff7136b137bc98ee022100b28a7fbaa53c2fff07bdf23300551e0b52ff1d823bb89df9eeb9079327adfe2c300d06092a864886f70d01010b0500038201010013eeaf33325800bb0f252a091b1a9cdf2e10de3abfb9f566b94a60e63401598f68c4086cf170881f1b856e51dc45edce992f589a7c4acbfb7c28a10c28c1ce4d1425c5b795b764367f0446dde5bb5710e5a1994a02f0b02334458e4950a876e48363aee4a32d1904d6d9c6af2906f4e4e03122e35bf943cf17b0e05a8ebaa5154a86f40676e779bb1dcd2672d75887e1bcb51186596d749bc6c1ecfedcf60b24eb503ac9460dc3682fe74e7acf16e9ab0014f6719322de534e14e90e7638e854546087c6a33d7743f58ee3b589dbd8fa5800af9b0ecdef0c041a2bf2126b908e3bf84881c1a323929bca34f0830373a8b28f62b2133880ff6f20ffb19c38a7280ad409308204d0308203b8a003020102020107300d06092a864886f70d01010b0500308183310b30090603550406130255533110300e060355040813074172697a6f6e61311330110603550407130a53636f74747364616c65311a3018060355040a1311476f44616464792e636f6d2c20496e632e3131302f06035504031328476f20446164647920526f6f7420436572746966696361746520417574686f72697479202d204732301e170d3131303530333037303030305a170d3331303530333037303030305a3081b4310b30090603550406130255533110300e060355040813074172697a6f6e61311330110603550407130a53636f74747364616c65311a3018060355040a1311476f44616464792e636f6d2c20496e632e312d302b060355040b1324687474703a2f2f63657274732e676f64616464792e636f6d2f7265706f7369746f72792f313330310603550403132a476f2044616464792053656375726520436572746966696361746520417574686f72697479202d20473230820122300d06092a864886f70d01010105000382010f003082010a0282010100b9e0cb10d4af76bdd49362eb3064b881086cc304d962178e2fff3e65cf8fce62e63c521cda16454b55ab786b63836290ce0f696c99c81a148b4ccc4533ea88dc9ea3af2bfe80619d7957c4cf2ef43f303c5d47fc9a16bcc3379641518e114b54f828bed08cbef030381ef3b026f86647636dde7126478f384753d1461db4e3dc00ea45acbdbc71d9aa6f00dbdbcd303a794f5f4c47f81def5bc2c49d603bb1b24391d8a4334eeab3d6274fad258aa5c6f4d5d0a6ae7405645788b54455d42d2a3a3ef8b8bde9320a029464c4163a50f14aaee77933af0c20077fe8df0439c269026c6352fa77c11bc87487c8b993185054354b694ebc3bd3492e1fdcc1d252fb0203010001a382011a30820116300f0603551d130101ff040530030101ff300e0603551d0f0101ff040403020106301d0603551d0e0416041440c2bd278ecc348330a233d7fb6cb3f0b42c80ce301f0603551d230418301680143a9a8507106728b6eff6bd05416e20c194da0fde303406082b0601050507010104283026302406082b060105050730018618687474703a2f2f6f6373702e676f64616464792e636f6d2f30350603551d1f042e302c302aa028a0268624687474703a2f2f63726c2e676f64616464792e636f6d2f6764726f6f742d67322e63726c30460603551d20043f303d303b0604551d20003033303106082b06010505070201162568747470733a2f2f63657274732e676f64616464792e636f6d2f7265706f7369746f72792f300d06092a864886f70d01010b05000382010100087e6c9310c838b896a9904bffa15f4f04ef6c3e9c8806c9508fa673f757311bbebce42fdbf8bad35be0b4e7e679620e0ca2d76a637331b5f5a848a43b082da25d90d7b47c254f115630c4b6449d7b2c9de55ee6ef0c61aabfe42a1bee849eb8837dc143ce44a713700d911ff4c813ad8360d9d872a873241eb5ac220eca17896258441bab892501000fcdc41b62db51b4d30f512a9bf4bc73fc76ce36a4cdd9d82ceaae9bf52ab290d14d75188a3f8a4190237d5b4bfea403589b46b2c3606083f87d5041cec2a190c3bbef022fd21554ee4415d90aaea78a33edb12d763626dc04eb9ff7611f15dc876fee469628ada1267d0a09a72e04a38dbcf8bc0430010a81093082047d30820365a00302010202031be715300d06092a864886f70d01010b05003063310b30090603550406130255533121301f060355040a131854686520476f2044616464792047726f75702c20496e632e3131302f060355040b1328476f20446164647920436c61737320322043657274696669636174696f6e20417574686f72697479301e170d3134303130313037303030305a170d3331303533303037303030305a308183310b30090603550406130255533110300e060355040813074172697a6f6e61311330110603550407130a53636f74747364616c65311a3018060355040a1311476f44616464792e636f6d2c20496e632e3131302f06035504031328476f20446164647920526f6f7420436572746966696361746520417574686f72697479202d20473230820122300d06092a864886f70d01010105000382010f003082010a0282010100bf716208f1fa5934f71bc918a3f7804958e9228313a6c52043013b84f1e685499f27eaf6841b4ea0b4db7098c73201b1053e074eeef4fa4f2f593022e7ab19566be28007fcf316758039517be5f935b6744ea98d8213e4b63fa90383faa2be8a156a7fde0bc3b6191405caeac3a804943b467c320df3006622c88d696d368c1118b7d3b21c60b438fa028cced3dd4607de0a3eeb5d7cc87cfbb02b53a4926269512505611a44818c2ca9439623dfac3a819a0e29c51ca9e95d1eb69e9e300a39cef18880fb4b5dcc32ec85624325340256270191b43b702a3f6eb1e89c88017d9fd4f9db536d609dbf2ce758abb85f46fccec41b033c09eb49315c6946b3e0470203010001a382011730820113300f0603551d130101ff040530030101ff300e0603551d0f0101ff040403020106301d0603551d0e041604143a9a8507106728b6eff6bd05416e20c194da0fde301f0603551d23041830168014d2c4b0d291d44c1171b361cb3da1fedda86ad4e3303406082b0601050507010104283026302406082b060105050730018618687474703a2f2f6f6373702e676f64616464792e636f6d2f30320603551d1f042b30293027a025a0238621687474703a2f2f63726c2e676f64616464792e636f6d2f6764726f6f742e63726c30460603551d20043f303d303b0604551d20003033303106082b06010505070201162568747470733a2f2f63657274732e676f64616464792e636f6d2f7265706f7369746f72792f300d06092a864886f70d01010b05000382010100590b53bd928611a7247bed5b31cf1d1f6c70c5b86ebe4ebbf6be9750e1307fba285c6294c2e37e33f7fb427685db951c8c225875090c886567390a1609c5a03897a4c523933fb418a601064491e3a76927b45a257f3ab732cddd84ff2a382933a4dd67b285fea188201c5089c8dc2af64203374ce688dfd5af24f2b1c3dfccb5ece0995eb74954203c94180cc71c521849a46de1b3580bc9d8ecd9ae1c328e28700de2fea6179e840fbd5770b35ae91fa08653bbef7cff690be048c3b7930bc80a54c4ac5d1467376ccaa52f310837aa6e6f8cbc9be2575d2481af97979c84ad6cac374c66f361911120e4be309f7aa42909b0e1345f6477184051df8c30a6af2289020a046d61696e121f08c0843d121976a914e4ea045fc0f08208d452187ad401ab2a874d0b6d88ac1896d6e5af05209adde5af052a595061796d656e74207265717565737420666f722042697450617920696e766f69636520504151744e7858374b4c3842744a426e66587954614820666f72206d65726368616e74204269744769766520466f756e646174696f6e322b68747470733a2f2f6269747061792e636f6d2f692f504151744e7858374b4c3842744a426e6658795461483a4c7b22696e766f6963654964223a22504151744e7858374b4c3842744a426e665879546148222c226d65726368616e744964223a2254785a35527943686d5a773269734b6a4a5747684263227d2a8002dca72518e1951edeb832ad680b5b99f29e0d5d9b9bf4c6d3a6e327436a8c9e44328b9c4738703b3407033f13cfc90ac7201dbbb612ee00f81a94169b4f4994b310c177948877e440d1347a64aa55c351fd08a3ce9af7598b8d103b24a0928a23cba0067d35aa86de6fc664c017233cd22db0ec204cacb00c87dd58abfdeae7c2fc61e5666a41c1be2f633d925f97a088b1fabc0b6634fff7f0034437a8d4cf52d94d739dc67327a1b3757358f2799bda1e0af4e897a8fae0ec77f2baa8fb6a9b315bf1a19e09dc806d3269e5544c98da2a3bfd1fcc70389539b1c9ad0c16cd34f62cd1533e3b491115814746c47914bd2c45cf947ac239b1e1251907cfd99036", + "untrusted": "120b783530392b7368613235361abe150afe0b308205fa308204e2a0030201020210090b35ca5c5bf1b98b3d8f9f4a7755d6300d06092a864886f70d01010b05003075310b300906035504061302555331153013060355040a130c446967694365727420496e6331193017060355040b13107777772e64696769636572742e636f6d313430320603550403132b4469676943657274205348413220457874656e6465642056616c69646174696f6e20536572766572204341301e170d3134303530393030303030305a170d3136303531333132303030305a30820105311d301b060355040f0c1450726976617465204f7267616e697a6174696f6e31133011060b2b0601040182373c0201031302555331193017060b2b0601040182373c020102130844656c61776172653110300e0603550405130735313534333137310f300d06035504090c06233233303038311730150603550409130e353438204d61726b65742053742e310e300c060355041113053934313034310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d53616e204672616e636973636f31173015060355040a130e436f696e626173652c20496e632e311530130603550403130c636f696e626173652e636f6d30820122300d06092a864886f70d01010105000382010f003082010a0282010100b45e3ff380667aa14d5a12fc2fc983fc6618b55499933c3bde15c01d838846b4caf9848e7c40e5fa7c67ef9b5b1efe26ee5571c5fa2eff759052454701ad8931557d697b139e5d19abb3e439675f31db7f2ef1a5d97db07c1f6966266380eb4fcfa8e1471a6ecc2fbebf3e67b3eaa84d0fbe063e60380dcdb7a20203d29a94059ef7f20d472cc25783ab2a1db6a394ecc07b4024974100bcfd470f59ef3b572365213209609fad229994b4923c1df3a18c41e3e7bc1f192ba6e7e5c32ae155107e21903eff7bce9fc594b49d9f6ae7901fa191fcbae8a2cf09c3bfc24377d717b6010080c5681a7dbc6e1d52987b7ebbe95e7af4202da436e67a88472aacedc90203010001a38201f2308201ee301f0603551d230418301680143dd350a5d6a0adeef34a600a65d321d4f8f8d60f301d0603551d0e041604146d33b9743a61b7499423d1a89d085d0148680bba30290603551d1104223020820c636f696e626173652e636f6d82107777772e636f696e626173652e636f6d300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030106082b0601050507030230750603551d1f046e306c3034a032a030862e687474703a2f2f63726c332e64696769636572742e636f6d2f736861322d65762d7365727665722d67312e63726c3034a032a030862e687474703a2f2f63726c342e64696769636572742e636f6d2f736861322d65762d7365727665722d67312e63726c30420603551d20043b3039303706096086480186fd6c0201302a302806082b06010505070201161c68747470733a2f2f7777772e64696769636572742e636f6d2f43505330818806082b06010505070101047c307a302406082b060105050730018618687474703a2f2f6f6373702e64696769636572742e636f6d305206082b060105050730028646687474703a2f2f636163657274732e64696769636572742e636f6d2f446967694365727453484132457874656e64656456616c69646174696f6e53657276657243412e637274300c0603551d130101ff04023000300d06092a864886f70d01010b05000382010100aadfcf94050ed938e3114a640af3d9b04276da00f5215d7148f9f16d4cac0c77bd5349ec2f47299d03c900f70146752da72829290ac50a77992f01537ab2689392ce0bfeb7efa49f4c4fe4e1e43ca1fcfb1626ce554da4f6e7fa34a597e401f215c43afd0ba777ad587eb0afacd71f7a6af7752814f7ab4c202ed76d33defd1289d541803fed01ac80a3cacfdaae29279e5de14d460475f4baf27eab693379d39120e7477bf3ec719664c7b6cb5e557556e5bbddd9c9d1ebc9f835e9da5b3dbb72fe8d94ac05eab3c479987520ade3a1d275e1e2fe725698d2f7cb1390a9d40ea6cbf21a73bddccd1ad61aa249ce8e2885a3730b7d53bd075f55099d2960f3cc0aba09308204b63082039ea00302010202100c79a944b08c11952092615fe26b1d83300d06092a864886f70d01010b0500306c310b300906035504061302555331153013060355040a130c446967694365727420496e6331193017060355040b13107777772e64696769636572742e636f6d312b30290603550403132244696769436572742048696768204173737572616e636520455620526f6f74204341301e170d3133313032323132303030305a170d3238313032323132303030305a3075310b300906035504061302555331153013060355040a130c446967694365727420496e6331193017060355040b13107777772e64696769636572742e636f6d313430320603550403132b4469676943657274205348413220457874656e6465642056616c69646174696f6e2053657276657220434130820122300d06092a864886f70d01010105000382010f003082010a0282010100d753a40451f899a616484b6727aa9349d039ed0cb0b00087f1672886858c8e63dabcb14038e2d3f5eca50518b83d3ec5991732ec188cfaf10ca6642185cb071034b052882b1f689bd2b18f12b0b3d2e7881f1fef387754535f80793f2e1aaaa81e4b2b0dabb763b935b77d14bc594bdf514ad2a1e20ce29082876aaeead764d69855e8fdaf1a506c54bc11f2fd4af29dbb7f0ef4d5be8e16891255d8c07134eef6dc2decc48725868dd821e4b04d0c89dc392617ddf6d79485d80421709d6f6fff5cba19e145cb5657287e1c0d4157aab7b827bbb1e4fa2aef2123751aad2d9b86358c9c77b573add8942de4f30c9deec14e627e17c0719e2cdef1f9102819330203010001a38201493082014530120603551d130101ff040830060101ff020100300e0603551d0f0101ff040403020186301d0603551d250416301406082b0601050507030106082b06010505070302303406082b0601050507010104283026302406082b060105050730018618687474703a2f2f6f6373702e64696769636572742e636f6d304b0603551d1f044430423040a03ea03c863a687474703a2f2f63726c342e64696769636572742e636f6d2f4469676943657274486967684173737572616e63654556526f6f7443412e63726c303d0603551d200436303430320604551d2000302a302806082b06010505070201161c68747470733a2f2f7777772e64696769636572742e636f6d2f435053301d0603551d0e041604143dd350a5d6a0adeef34a600a65d321d4f8f8d60f301f0603551d23041830168014b13ec36903f8bf4701d498261a0802ef63642bc3300d06092a864886f70d01010b050003820101009db6d09086e18602edc5a0f0341c74c18d76cc860aa8f04a8a42d63fc8a94dad7c08ade6b650b8a21a4d8807b12921dce7dac63c21e0e3114970ac7a1d01a4ca113a57ab7d572a4074fdd31d851850df574775a17d55202e473750728c7f821bd2628f2d035adac3c8a1ce2c52a20063eb73ba71c84927239764859e380ead63683cba52815879a32c0cdfde6deb31f2baa07c6cf12cd4e1bd77843703ce32b5c89a811a4a924e3b469a85fe83a2f99e8ca3cc0d5eb33dcf04788f14147b329cc700a65cc4b5a1558d5a5668a42270aa3c8171d99da8453bf4e5f6a251ddc77b62e86f0c74ebb8daf8bf870d795091909b183b915927f1352813ab267ed5f77a22b801121f08d8e51a121976a914f5fa7bb3c2245e6469254c074c062af292ce008c88ac189295e7af0520f49be7af052a315061796d656e74207265717565737420666f7220436f696e62617365206f7264657220636f64653a205738375858335753323468747470733a2f2f7777772e636f696e626173652e636f6d2f72702f3535663963613730336435643830303038633030303166343a2062623739623666323331306533323162643362316439323965646265623335382a8002b45d9b5d48d566d577ec4973b4b57a4930f173be6545d9fc367f9b55f90a669504085db971107a09c25d1e30dcaf54ce86f177685751feebd5c66c40d7d9daad08129fe10450518d48e49ae4e03a8c4939010f9f222de60b9e5df210e066115cbc2ad92f51fcdc35eaa3ee2430687ff46053e460b6f93deede2ee09a8841eec11b6f5d1bbcf26708e5c12d427959569d9af629f8940736ac3941f78eafb2c2e400dfcc76e729d13c4a9d0ec834515cf7287188589e5e0e505a7a7daab1fa8ac4f6745a0eae2daa61d73a7e3fc56ca94457e2aa164a959b05bb91b797828cb7c4d8b05395840a40ef51a0a0f93d13dce15e5f5f9ede08b3510701a1cac6a99c06", + "ack": "0a00125f5472616e73616374696f6e207265636569766564206279204269745061792e20496e766f6963652077696c6c206265206d61726b6564206173207061696420696620746865207472616e73616374696f6e20697320636f6e6669726d65642e", + "ca": { + "crt": "308201ef30820158020900f951e277bfb8b405300d06092a864886f70d01010b0500303c310b3009060355040613025553310b300906035504080c024341310f300d060355040a0c064a4a73204341310f300d06035504030c064a4a73204341301e170d3136303732333132333035365a170d3137303732333132333035365a303c310b3009060355040613025553310b300906035504080c024341310f300d060355040a0c064a4a73204341310f300d06035504030c064a4a7320434130819f300d06092a864886f70d010101050003818d0030818902818100dfa1f53be0a5473f33a69f69290bdb78786980a70d0d68f098eac64b227b268174f798a7a89baca0ee71e8577c91c79025db5888be26a05377e63665a99e10cda0fdba4f8214d5f57807fb482a7c29d90a36f0d37bbe80d0a878922efd9723b511aeaa258cac18213ff966a9e4fac97bbefb4feb0b2a7f02a95aa3b3ac3fbac30203010001300d06092a864886f70d01010b05000381810066f891a7ac6ef88e7ae4ca11b6a4a573397bb5309844136eaea578e843eacb4af3ccae12e9158e7db906b9b386bc118254e696e21fde537dc2a547dc8cdaa98af0e44025fb2fe6b23676455f577b054b284c0d04df9a7bc49214f385b655e31c0b9a47012780e6cca26b6e20e00a485213d4a7aa65b99d011f232f0da6227f95", + "priv": "3082025e02010002818100dfa1f53be0a5473f33a69f69290bdb78786980a70d0d68f098eac64b227b268174f798a7a89baca0ee71e8577c91c79025db5888be26a05377e63665a99e10cda0fdba4f8214d5f57807fb482a7c29d90a36f0d37bbe80d0a878922efd9723b511aeaa258cac18213ff966a9e4fac97bbefb4feb0b2a7f02a95aa3b3ac3fbac3020301000102818100ab2cd8fd8032829a89fa9c426e3cb93d394de83ff5e9b1cd97fefcd13e0f6da5e1d6336f01cc4712d7f1309ae6aadf4a22f00690849c24543f8e634ce5cc2ba70af366c6fb2c8820c977aa5843d380a9b63bfe29fb26177b5c53012bd68fdcdd69609f54cc0a0fe37bae1acf29382950fcba134a77416ad684423345df4feca1024100fec773455b21efe7ef0cfac567723c21080cd1d463233a4679303093ba6c6b3681f053418f33b575f151f7146a1a306e7854299ad03869f2d806ffcae6c18d5f024100e0b44c7f89a0c296b3ddb0981519b49393a8f738c6d4de23dae74f42d59c9131591126ca4b1623475dff1e1be655c6b5c13cf0c468874fb574286da16f61a91d024100a7303ee65e5d30cf244182361422146f209739028463d393f766b619db15d66d186b9a56c5200b8defe3f79d7fdadbb9426108443d2b27eb61f385dba1fd954502410092b3c3d9e45dcb8d1e63171f436f63e0919fd7bffeb80d4bb5681cec5290048f064a575bed47c7c29950ad34a3ddce7ced6b3ef9cc10c36e8126bfe48cd662d502404cceb50ffca2ed6ead5557e76c4cc5b57a3dad3c14038f11eec2dae285c722a28008ea312dcf5552fbf9090e95b1570cea569aed0f3ce3ab55378ec9300a2ee5", + "pub": "30818902818100dfa1f53be0a5473f33a69f69290bdb78786980a70d0d68f098eac64b227b268174f798a7a89baca0ee71e8577c91c79025db5888be26a05377e63665a99e10cda0fdba4f8214d5f57807fb482a7c29d90a36f0d37bbe80d0a878922efd9723b511aeaa258cac18213ff966a9e4fac97bbefb4feb0b2a7f02a95aa3b3ac3fbac30203010001" + } +} \ No newline at end of file