1 | define([ |
---|
2 | "dojo/_base/kernel", |
---|
3 | "dojo/_base/declare", |
---|
4 | "../../math/BigInteger", |
---|
5 | "../../math/random/Simple" |
---|
6 | ], function(kernel, declare, BigInteger, Simple) { |
---|
7 | |
---|
8 | kernel.experimental("dojox.encoding.crypto.RSAKey"); |
---|
9 | |
---|
10 | // Copyright (c) 2005 Tom Wu |
---|
11 | // All Rights Reserved. |
---|
12 | // See "LICENSE-BigInteger" in dojox.math for details. |
---|
13 | |
---|
14 | var defaultRngf = function(){ return new Simple(); }; |
---|
15 | |
---|
16 | // PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint |
---|
17 | function pkcs1pad2(s, n, rngf) { |
---|
18 | if(n < s.length + 11) { |
---|
19 | throw new Error("Message too long for RSA"); |
---|
20 | } |
---|
21 | var ba = new Array(n); |
---|
22 | var i = s.length; |
---|
23 | while(i && n) ba[--n] = s.charCodeAt(--i); |
---|
24 | ba[--n] = 0; |
---|
25 | var rng = rngf(); |
---|
26 | var x = [0]; |
---|
27 | while(n > 2) { // random non-zero pad |
---|
28 | x[0] = 0; |
---|
29 | while(x[0] == 0) rng.nextBytes(x); |
---|
30 | ba[--n] = x[0]; |
---|
31 | } |
---|
32 | ba[--n] = 2; |
---|
33 | ba[--n] = 0; |
---|
34 | rng.destroy(); |
---|
35 | return new BigInteger(ba); |
---|
36 | } |
---|
37 | |
---|
38 | return declare("dojox.encoding.crypto.RSAKey", null, { |
---|
39 | constructor: function(rngf){ |
---|
40 | // summary: |
---|
41 | // "empty" RSA key constructor |
---|
42 | // rndf: Function?: |
---|
43 | // function that returns an instance of a random number generator |
---|
44 | // (see dojox.math.random for details) |
---|
45 | this.rngf = rngf || defaultRngf; |
---|
46 | this.e = 0; |
---|
47 | this.n = this.d = this.p = this.q = this.dmp1 = this.dmq1 = this.coeff = null; |
---|
48 | }, |
---|
49 | |
---|
50 | setPublic: function(N, E){ |
---|
51 | // summary: |
---|
52 | // Set the public key fields N and e from hex strings |
---|
53 | if(N && E && N.length && E.length) { |
---|
54 | this.n = new BigInteger(N, 16); |
---|
55 | this.e = parseInt(E, 16); |
---|
56 | }else{ |
---|
57 | throw new Error("Invalid RSA public key"); |
---|
58 | } |
---|
59 | }, |
---|
60 | |
---|
61 | encrypt: function(text){ |
---|
62 | var m = pkcs1pad2(text, (this.n.bitLength() + 7) >> 3, this.rngf); |
---|
63 | if(!m){ |
---|
64 | return null; |
---|
65 | } |
---|
66 | var c = m.modPowInt(this.e, this.n); |
---|
67 | if(!c){ |
---|
68 | return null; |
---|
69 | } |
---|
70 | var h = c.toString(16); |
---|
71 | return h.length % 2 ? "0" + h : h; |
---|
72 | } |
---|
73 | }); |
---|
74 | }); |
---|