You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					89 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					89 lines
				
				2.0 KiB
			| 
											3 years ago
										 | // 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)); | ||
|  | } |