50 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| (function () {
 | |
|   'use strict';
 | |
| 
 | |
|   // getProofOfSecret(salt, secret, iter)
 | |
|   function getProofOfSecret(nodeObj) {
 | |
|     // TODO test correctness
 | |
|     console.info('TODO test correctness of getProofOfSecret');
 | |
|     var d = $q.defer();
 | |
|     var kdf = {
 | |
|       node: nodeObj.node
 | |
|     , type: nodeObj.type
 | |
|     , kdf: 'PBKDF2'
 | |
|     , algo: 'SHA-256'
 | |
|     };
 | |
| 
 | |
|     // generate a password-based 16-byte key
 | |
|     // note an optional message digest can be passed as the final parameter
 | |
|     if (nodeObj.salt) {
 | |
|       kdf.salt = Unibabel.bufferToBinaryString(Unibabel.hexToBuffer(nodeObj.salt));
 | |
|     } else {
 | |
|       // uses binary string
 | |
|       kdf.salt = forge.random.getBytesSync(32);
 | |
|     }
 | |
|     kdf.iter = nodeObj.iter || Math.floor(Math.random() * 1000) + 1000;
 | |
|     kdf.byteLen = nodeObj.byteLen || 16;
 | |
| 
 | |
|     console.log('kdf.salt', kdf.salt);
 | |
| 
 | |
|     // kdf.proof = forge.pkcs5.pbkdf2(nodeObj.secret, kdf.salt, kdf.iter, kdf.byteLen);
 | |
| 
 | |
|     // generate key asynchronously
 | |
|     // note an optional message digest can be passed before the callback
 | |
|     forge.pkcs5.pbkdf2(nodeObj.secret, kdf.salt, kdf.iter, kdf.byteLen, 'sha256', function(err, derivedKey) {
 | |
|       // do something w/derivedKey
 | |
|       if (err) {
 | |
|         d.reject(err);
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       kdf.salt = Unibabel.bufferToHex(Unibabel.binaryStringToBuffer(kdf.salt));
 | |
|       kdf.proof = Unibabel.bufferToHex(Unibabel.binaryStringToBuffer(derivedKey));
 | |
|       console.log('kdf', kdf);
 | |
|       d.resolve(kdf);
 | |
|     });
 | |
| 
 | |
|     return d.promise;
 | |
|   }
 | |
| 
 | |
| }());
 |