mirror of
				https://github.com/therootcompany/acme.js.git
				synced 2024-11-16 17:29:00 +00:00 
			
		
		
		
	
		
			
	
	
		
			75 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			75 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | var native = require('../lib/native.js'); | ||
|  | var crypto = require('crypto'); | ||
|  | 
 | ||
|  | native | ||
|  | 	._hashcash({ | ||
|  | 		alg: 'SHA-256', | ||
|  | 		nonce: '00', | ||
|  | 		needle: '0000', | ||
|  | 		start: 0, | ||
|  | 		end: 2 | ||
|  | 	}) | ||
|  | 	.then(function(hashcash) { | ||
|  | 		if ('00:76de' !== hashcash) { | ||
|  | 			throw new Error('hashcash algorthim changed'); | ||
|  | 		} | ||
|  | 		console.info('PASS: known hash solves correctly'); | ||
|  | 
 | ||
|  | 		return native | ||
|  | 			._hashcash({ | ||
|  | 				alg: 'SHA-256', | ||
|  | 				nonce: '10', | ||
|  | 				needle: '', | ||
|  | 				start: 0, | ||
|  | 				end: 2 | ||
|  | 			}) | ||
|  | 			.then(function(hashcash) { | ||
|  | 				if ('10:00' !== hashcash) { | ||
|  | 					throw new Error('hashcash algorthim changed'); | ||
|  | 				} | ||
|  | 				console.info('PASS: empty hash solves correctly'); | ||
|  | 
 | ||
|  | 				var now = Date.now(); | ||
|  | 				var nonce = '20'; | ||
|  | 				var needle = crypto | ||
|  | 					.randomBytes(3) | ||
|  | 					.toString('hex') | ||
|  | 					.slice(0, 5); | ||
|  | 				native | ||
|  | 					._hashcash({ | ||
|  | 						alg: 'SHA-256', | ||
|  | 						nonce: nonce, | ||
|  | 						needle: needle, | ||
|  | 						start: 0, | ||
|  | 						end: Math.ceil(needle.length / 2) | ||
|  | 					}) | ||
|  | 					.then(function(hashcash) { | ||
|  | 						var later = Date.now(); | ||
|  | 						var parts = hashcash.split(':'); | ||
|  | 						var answer = parts[1]; | ||
|  | 						if (parts[0] !== nonce) { | ||
|  | 							throw new Error('incorrect nonce'); | ||
|  | 						} | ||
|  | 						var haystack = crypto | ||
|  | 							.createHash('sha256') | ||
|  | 							.update(Buffer.from(nonce + answer, 'hex')) | ||
|  | 							.digest() | ||
|  | 							.slice(0, Math.ceil(needle.length / 2)); | ||
|  | 						if ( | ||
|  | 							-1 === haystack.indexOf(Buffer.from(needle, 'hex')) | ||
|  | 						) { | ||
|  | 							throw new Error('incorrect solution'); | ||
|  | 						} | ||
|  | 						if (later - now > 2000) { | ||
|  | 							throw new Error('took too long to solve'); | ||
|  | 						} | ||
|  | 						console.info( | ||
|  | 							'PASS: rando hash solves correctly (and in good time - %dms)', | ||
|  | 							later - now | ||
|  | 						); | ||
|  | 					}); | ||
|  | 			}); | ||
|  | 	}); |