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.
74 lines
1.8 KiB
74 lines
1.8 KiB
define([ |
|
"dojo/_base/kernel", |
|
"dojo/_base/declare", |
|
"../../math/BigInteger", |
|
"../../math/random/Simple" |
|
], function(kernel, declare, BigInteger, Simple) { |
|
|
|
kernel.experimental("dojox.encoding.crypto.RSAKey"); |
|
|
|
// Copyright (c) 2005 Tom Wu |
|
// All Rights Reserved. |
|
// See "LICENSE-BigInteger" in dojox.math for details. |
|
|
|
var defaultRngf = function(){ return new Simple(); }; |
|
|
|
// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint |
|
function pkcs1pad2(s, n, rngf) { |
|
if(n < s.length + 11) { |
|
throw new Error("Message too long for RSA"); |
|
} |
|
var ba = new Array(n); |
|
var i = s.length; |
|
while(i && n) ba[--n] = s.charCodeAt(--i); |
|
ba[--n] = 0; |
|
var rng = rngf(); |
|
var x = [0]; |
|
while(n > 2) { // random non-zero pad |
|
x[0] = 0; |
|
while(x[0] == 0) rng.nextBytes(x); |
|
ba[--n] = x[0]; |
|
} |
|
ba[--n] = 2; |
|
ba[--n] = 0; |
|
rng.destroy(); |
|
return new BigInteger(ba); |
|
} |
|
|
|
return declare("dojox.encoding.crypto.RSAKey", null, { |
|
constructor: function(rngf){ |
|
// summary: |
|
// "empty" RSA key constructor |
|
// rndf: Function? |
|
// function that returns an instance of a random number generator |
|
// (see dojox.math.random for details) |
|
this.rngf = rngf || defaultRngf; |
|
this.e = 0; |
|
this.n = this.d = this.p = this.q = this.dmp1 = this.dmq1 = this.coeff = null; |
|
}, |
|
|
|
setPublic: function(N, E){ |
|
// summary: |
|
// Set the public key fields N and e from hex strings |
|
if(N && E && N.length && E.length) { |
|
this.n = new BigInteger(N, 16); |
|
this.e = parseInt(E, 16); |
|
}else{ |
|
throw new Error("Invalid RSA public key"); |
|
} |
|
}, |
|
|
|
encrypt: function(text){ |
|
var m = pkcs1pad2(text, (this.n.bitLength() + 7) >> 3, this.rngf); |
|
if(!m){ |
|
return null; |
|
} |
|
var c = m.modPowInt(this.e, this.n); |
|
if(!c){ |
|
return null; |
|
} |
|
var h = c.toString(16); |
|
return h.length % 2 ? "0" + h : h; |
|
} |
|
}); |
|
});
|
|
|