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.
		
		
		
		
			
				
					66 lines
				
				1.5 KiB
			
		
		
			
		
	
	
					66 lines
				
				1.5 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								var r;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = function rand(len) {
							 | 
						||
| 
								 | 
							
								  if (!r)
							 | 
						||
| 
								 | 
							
								    r = new Rand(null);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return r.generate(len);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function Rand(rand) {
							 | 
						||
| 
								 | 
							
								  this.rand = rand;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								module.exports.Rand = Rand;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Rand.prototype.generate = function generate(len) {
							 | 
						||
| 
								 | 
							
								  return this._rand(len);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Emulate crypto API using randy
							 | 
						||
| 
								 | 
							
								Rand.prototype._rand = function _rand(n) {
							 | 
						||
| 
								 | 
							
								  if (this.rand.getBytes)
							 | 
						||
| 
								 | 
							
								    return this.rand.getBytes(n);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var res = new Uint8Array(n);
							 | 
						||
| 
								 | 
							
								  for (var i = 0; i < res.length; i++)
							 | 
						||
| 
								 | 
							
								    res[i] = this.rand.getByte();
							 | 
						||
| 
								 | 
							
								  return res;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if (typeof self === 'object') {
							 | 
						||
| 
								 | 
							
								  if (self.crypto && self.crypto.getRandomValues) {
							 | 
						||
| 
								 | 
							
								    // Modern browsers
							 | 
						||
| 
								 | 
							
								    Rand.prototype._rand = function _rand(n) {
							 | 
						||
| 
								 | 
							
								      var arr = new Uint8Array(n);
							 | 
						||
| 
								 | 
							
								      self.crypto.getRandomValues(arr);
							 | 
						||
| 
								 | 
							
								      return arr;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  } else if (self.msCrypto && self.msCrypto.getRandomValues) {
							 | 
						||
| 
								 | 
							
								    // IE
							 | 
						||
| 
								 | 
							
								    Rand.prototype._rand = function _rand(n) {
							 | 
						||
| 
								 | 
							
								      var arr = new Uint8Array(n);
							 | 
						||
| 
								 | 
							
								      self.msCrypto.getRandomValues(arr);
							 | 
						||
| 
								 | 
							
								      return arr;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Safari's WebWorkers do not have `crypto`
							 | 
						||
| 
								 | 
							
								  } else if (typeof window === 'object') {
							 | 
						||
| 
								 | 
							
								    // Old junk
							 | 
						||
| 
								 | 
							
								    Rand.prototype._rand = function() {
							 | 
						||
| 
								 | 
							
								      throw new Error('Not implemented yet');
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								} else {
							 | 
						||
| 
								 | 
							
								  // Node.js or Web worker with no crypto support
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    var crypto = require('crypto');
							 | 
						||
| 
								 | 
							
								    if (typeof crypto.randomBytes !== 'function')
							 | 
						||
| 
								 | 
							
								      throw new Error('Not supported');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Rand.prototype._rand = function _rand(n) {
							 | 
						||
| 
								 | 
							
								      return crypto.randomBytes(n);
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  } catch (e) {
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |