12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- // Copyright 2016 Joyent, Inc.
-
- var x509 = require('./x509');
-
- module.exports = {
- read: read,
- verify: x509.verify,
- sign: x509.sign,
- write: write
- };
-
- var assert = require('assert-plus');
- var asn1 = require('asn1');
- var Buffer = require('safer-buffer').Buffer;
- var algs = require('../algs');
- var utils = require('../utils');
- var Key = require('../key');
- var PrivateKey = require('../private-key');
- var pem = require('./pem');
- var Identity = require('../identity');
- var Signature = require('../signature');
- var Certificate = require('../certificate');
-
- function read(buf, options) {
- if (typeof (buf) !== 'string') {
- assert.buffer(buf, 'buf');
- buf = buf.toString('ascii');
- }
-
- var lines = buf.trim().split(/[\r\n]+/g);
-
- var m;
- var si = -1;
- while (!m && si < lines.length) {
- m = lines[++si].match(/*JSSTYLED*/
- /[-]+[ ]*BEGIN CERTIFICATE[ ]*[-]+/);
- }
- assert.ok(m, 'invalid PEM header');
-
- var m2;
- var ei = lines.length;
- while (!m2 && ei > 0) {
- m2 = lines[--ei].match(/*JSSTYLED*/
- /[-]+[ ]*END CERTIFICATE[ ]*[-]+/);
- }
- assert.ok(m2, 'invalid PEM footer');
-
- lines = lines.slice(si, ei + 1);
-
- var headers = {};
- while (true) {
- lines = lines.slice(1);
- m = lines[0].match(/*JSSTYLED*/
- /^([A-Za-z0-9-]+): (.+)$/);
- if (!m)
- break;
- headers[m[1].toLowerCase()] = m[2];
- }
-
- /* Chop off the first and last lines */
- lines = lines.slice(0, -1).join('');
- buf = Buffer.from(lines, 'base64');
-
- return (x509.read(buf, options));
- }
-
- function write(cert, options) {
- var dbuf = x509.write(cert, options);
-
- var header = 'CERTIFICATE';
- var tmp = dbuf.toString('base64');
- var len = tmp.length + (tmp.length / 64) +
- 18 + 16 + header.length*2 + 10;
- var buf = Buffer.alloc(len);
- var o = 0;
- o += buf.write('-----BEGIN ' + header + '-----\n', o);
- for (var i = 0; i < tmp.length; ) {
- var limit = i + 64;
- if (limit > tmp.length)
- limit = tmp.length;
- o += buf.write(tmp.slice(i, limit), o);
- buf[o++] = 10;
- i = limit;
- }
- o += buf.write('-----END ' + header + '-----\n', o);
-
- return (buf.slice(0, o));
- }
|