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;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}());
							 |