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.
		
		
		
		
		
			
		
			
				
					52 lines
				
				1.2 KiB
			
		
		
			
		
	
	
					52 lines
				
				1.2 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | const inherits = require('inherits'); | ||
|  | const Buffer = require('safer-buffer').Buffer; | ||
|  | 
 | ||
|  | const DERDecoder = require('./der'); | ||
|  | 
 | ||
|  | function PEMDecoder(entity) { | ||
|  |   DERDecoder.call(this, entity); | ||
|  |   this.enc = 'pem'; | ||
|  | } | ||
|  | inherits(PEMDecoder, DERDecoder); | ||
|  | module.exports = PEMDecoder; | ||
|  | 
 | ||
|  | PEMDecoder.prototype.decode = function decode(data, options) { | ||
|  |   const lines = data.toString().split(/[\r\n]+/g); | ||
|  | 
 | ||
|  |   const label = options.label.toUpperCase(); | ||
|  | 
 | ||
|  |   const re = /^-----(BEGIN|END) ([^-]+)-----$/; | ||
|  |   let start = -1; | ||
|  |   let end = -1; | ||
|  |   for (let i = 0; i < lines.length; i++) { | ||
|  |     const match = lines[i].match(re); | ||
|  |     if (match === null) | ||
|  |       continue; | ||
|  | 
 | ||
|  |     if (match[2] !== label) | ||
|  |       continue; | ||
|  | 
 | ||
|  |     if (start === -1) { | ||
|  |       if (match[1] !== 'BEGIN') | ||
|  |         break; | ||
|  |       start = i; | ||
|  |     } else { | ||
|  |       if (match[1] !== 'END') | ||
|  |         break; | ||
|  |       end = i; | ||
|  |       break; | ||
|  |     } | ||
|  |   } | ||
|  |   if (start === -1 || end === -1) | ||
|  |     throw new Error('PEM section not found for: ' + label); | ||
|  | 
 | ||
|  |   const base64 = lines.slice(start + 1, end).join(''); | ||
|  |   // Remove excessive symbols
 | ||
|  |   base64.replace(/[^a-z0-9+/=]+/gi, ''); | ||
|  | 
 | ||
|  |   const input = Buffer.from(base64, 'base64'); | ||
|  |   return DERDecoder.prototype.decode.call(this, input, options); | ||
|  | }; |