Skip to content

Commit 273957f

Browse files
committed
wip
start signing implementation start tests refactoring
1 parent f166ae2 commit 273957f

File tree

4 files changed

+149
-72
lines changed

4 files changed

+149
-72
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ key.loadFromPEM(pem_string);
5858

5959
### Export keys
6060
```js
61-
key.toPrivatePEM();
62-
key.toPublicPEM();
61+
key.getPrivatePEM();
62+
key.getPublicPEM();
6363
```
6464

6565
### Test key

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "node-rsa",
3-
"version": "0.1.32",
3+
"version": "0.1.33",
44
"description": "Node.js RSA library",
55
"main": "src/NodeRSA.js",
66
"scripts": {

src/NodeRSA.js

Lines changed: 115 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
*/
99

1010
var rsa = require('./libs/rsa.js');
11+
var crypt = require('crypto');
1112
var ber = require('asn1').Ber;
1213
var _ = require('lodash');
1314
var utils = require('./utils');
@@ -21,6 +22,7 @@ module.exports = (function() {
2122
*/
2223
function NodeRSA(arg) {
2324
this.keyPair = new rsa.Key();
25+
this.$cache = {}
2426

2527
if (_.isObject(arg)) {
2628
this.generateKeyPair(arg.b, arg.e);
@@ -41,6 +43,7 @@ module.exports = (function() {
4143
exp = 65537;
4244

4345
this.keyPair.generate(bits, exp.toString(16));
46+
this.$recalculateCache();
4447
return this;
4548
};
4649

@@ -55,6 +58,8 @@ module.exports = (function() {
5558
this.loadFromPublicPEM(pem, 'base64');
5659
} else
5760
throw Error('Invalid PEM format');
61+
62+
this.$recalculateCache();
5863
};
5964

6065
/**
@@ -105,69 +110,6 @@ module.exports = (function() {
105110
);
106111
};
107112

108-
/**
109-
* @returns {string} private PEM string
110-
*/
111-
NodeRSA.prototype.toPrivatePEM = function() {
112-
var n = this.keyPair.n.toBuffer();
113-
var d = this.keyPair.d.toBuffer();
114-
var p = this.keyPair.p.toBuffer();
115-
var q = this.keyPair.q.toBuffer();
116-
var dmp1 = this.keyPair.dmp1.toBuffer();
117-
var dmq1 = this.keyPair.dmq1.toBuffer();
118-
var coeff = this.keyPair.coeff.toBuffer();
119-
120-
var length = n.length + d.length + p.length + q.length + dmp1.length + dmq1.length + coeff.length + 512; // magic
121-
var writer = new ber.Writer({size: length});
122-
123-
writer.startSequence();
124-
writer.writeInt(0);
125-
writer.writeBuffer(n, 2);
126-
writer.writeInt(this.keyPair.e);
127-
writer.writeBuffer(d, 2);
128-
writer.writeBuffer(p, 2);
129-
writer.writeBuffer(q, 2);
130-
writer.writeBuffer(dmp1, 2);
131-
writer.writeBuffer(dmq1, 2);
132-
writer.writeBuffer(coeff, 2);
133-
writer.endSequence();
134-
135-
return '-----BEGIN RSA PRIVATE KEY-----\n' +
136-
utils.linebrk(writer.buffer.toString('base64'), 64) +
137-
'\n-----END RSA PRIVATE KEY-----';
138-
};
139-
140-
/**
141-
* @returns {string} public PEM string
142-
*/
143-
NodeRSA.prototype.toPublicPEM = function() {
144-
var n = this.keyPair.n.toBuffer();
145-
var length = n.length + 512; // magic
146-
147-
var bodyWriter = new ber.Writer({size: length});
148-
bodyWriter.writeByte(0);
149-
bodyWriter.startSequence();
150-
bodyWriter.writeBuffer(n, 2);
151-
bodyWriter.writeInt(this.keyPair.e);
152-
bodyWriter.endSequence();
153-
var body = bodyWriter.buffer;
154-
155-
var writer = new ber.Writer({size: length});
156-
writer.startSequence();
157-
writer.startSequence();
158-
writer.writeOID(PUBLIC_RSA_OID);
159-
writer.writeNull();
160-
writer.endSequence();
161-
writer.writeBuffer(body, 3);
162-
writer.endSequence();
163-
164-
n = writer.buffer.toString('hex');
165-
166-
return '-----BEGIN PUBLIC KEY-----\n' +
167-
utils.linebrk(writer.buffer.toString('base64'), 64) +
168-
'\n-----END PUBLIC KEY-----';
169-
};
170-
171113
/**
172114
* Check if keypair contains private key
173115
*/
@@ -231,5 +173,114 @@ module.exports = (function() {
231173
}
232174
};
233175

234-
return NodeRSA;
176+
/**
177+
* Signing data
178+
*
179+
* @param buffer - data for signing
180+
* @param encoding - output encoding. May be 'buffer', 'binary', 'hex' or 'base64'. Default 'buffer'.
181+
* @returns {*}
182+
*/
183+
NodeRSA.prototype.sign = function(buffer, encoding) {
184+
encoding = (!encoding || encoding == 'buffer' ? null : encoding)
185+
var signer = crypt.createSign('RSA-SHA256');
186+
signer.update(buffer);
187+
return signer.sign(this.getPrivatePEM(), encoding);
188+
}
189+
190+
/**
191+
* Verifying signed data
192+
*
193+
* @param buffer - signed data
194+
* @param signature
195+
* @param signature_encoding - encoding of given signature. May be 'buffer', 'binary', 'hex' or 'base64'. Default 'buffer'.
196+
* @returns {*}
197+
*/
198+
NodeRSA.prototype.verify = function(buffer, signature, signature_encoding) {
199+
signature_encoding = (!signature_encoding || signature_encoding == 'buffer' ? null : signature_encoding)
200+
var verifier = crypt.createVerify('RSA-SHA256');
201+
verifier.update(buffer);
202+
return verifier.verify(this.getPublicPEM(), signature, signature_encoding);
203+
}
204+
205+
NodeRSA.prototype.getPrivatePEM = function () {
206+
return this.$cache.privatePEM
207+
}
208+
209+
NodeRSA.prototype.getPublicPEM = function () {
210+
return this.$cache.publicPEM
211+
}
212+
213+
/**
214+
* private
215+
* Recalculating properties
216+
*/
217+
NodeRSA.prototype.$recalculateCache = function() {
218+
this.$cache.privatePEM = this.$makePrivatePEM()
219+
this.$cache.publicPEM = this.$makePublicPEM()
220+
}
221+
222+
/**
223+
* private
224+
* @returns {string} private PEM string
225+
*/
226+
NodeRSA.prototype.$makePrivatePEM = function() {
227+
var n = this.keyPair.n.toBuffer();
228+
var d = this.keyPair.d.toBuffer();
229+
var p = this.keyPair.p.toBuffer();
230+
var q = this.keyPair.q.toBuffer();
231+
var dmp1 = this.keyPair.dmp1.toBuffer();
232+
var dmq1 = this.keyPair.dmq1.toBuffer();
233+
var coeff = this.keyPair.coeff.toBuffer();
234+
235+
var length = n.length + d.length + p.length + q.length + dmp1.length + dmq1.length + coeff.length + 512; // magic
236+
var writer = new ber.Writer({size: length});
237+
238+
writer.startSequence();
239+
writer.writeInt(0);
240+
writer.writeBuffer(n, 2);
241+
writer.writeInt(this.keyPair.e);
242+
writer.writeBuffer(d, 2);
243+
writer.writeBuffer(p, 2);
244+
writer.writeBuffer(q, 2);
245+
writer.writeBuffer(dmp1, 2);
246+
writer.writeBuffer(dmq1, 2);
247+
writer.writeBuffer(coeff, 2);
248+
writer.endSequence();
249+
250+
return '-----BEGIN RSA PRIVATE KEY-----\n' +
251+
utils.linebrk(writer.buffer.toString('base64'), 64) +
252+
'\n-----END RSA PRIVATE KEY-----';
253+
};
254+
255+
/**
256+
* private
257+
* @returns {string} public PEM string
258+
*/
259+
NodeRSA.prototype.$makePublicPEM = function() {
260+
var n = this.keyPair.n.toBuffer();
261+
var length = n.length + 512; // magic
262+
263+
var bodyWriter = new ber.Writer({size: length});
264+
bodyWriter.writeByte(0);
265+
bodyWriter.startSequence();
266+
bodyWriter.writeBuffer(n, 2);
267+
bodyWriter.writeInt(this.keyPair.e);
268+
bodyWriter.endSequence();
269+
var body = bodyWriter.buffer;
270+
271+
var writer = new ber.Writer({size: length});
272+
writer.startSequence();
273+
writer.startSequence();
274+
writer.writeOID(PUBLIC_RSA_OID);
275+
writer.writeNull();
276+
writer.endSequence();
277+
writer.writeBuffer(body, 3);
278+
writer.endSequence();
279+
280+
return '-----BEGIN PUBLIC KEY-----\n' +
281+
utils.linebrk(writer.buffer.toString('base64'), 64) +
282+
'\n-----END PUBLIC KEY-----';
283+
};
284+
285+
return NodeRSA;
235286
})();

test/tests.js

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,25 @@
44

55
var assert = require('chai').assert;
66
var _ = require('lodash');
7-
var NodeRSA = (require('../src/NodeRSA'));
7+
var NodeRSA = require('../src/NodeRSA');
88

99
describe('NodeRSA', function(){
1010
var nodeRSA = null;
1111
var privateNodeRSA = null;
1212
var publicNodeRSA = null;
1313

14+
var dataBundle = {
15+
"string": "ascii + юникод スラ ⑨",
16+
"empty string": "",
17+
"long string": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
18+
"buffer": new Buffer("ascii + юникод スラ ⑨"),
19+
"json object": {str: "string", arr: ["a","r","r", "a", "y", true, '⑨'], int: 42, nested: {key: {key: 1}}},
20+
"json array": [1,2,3,4,5,6,7,8,9,[10,11,12,[13],14,15,[16,17,[18]]]]
21+
};
22+
1423
describe('Work with keys', function(){
1524
it('.generateKeyPair() should make key pair', function(){
16-
nodeRSA = new NodeRSA({b: 1024});
25+
nodeRSA = new NodeRSA({b: 512});
1726
assert.instanceOf(nodeRSA.keyPair, Object);
1827
});
1928

@@ -80,15 +89,15 @@ describe('NodeRSA', function(){
8089
});
8190

8291
it('.toPrivatePEM() should return private PEM string', function(){
83-
assert.equal(privateNodeRSA.toPrivatePEM(), privateKeyPEM);
92+
assert.equal(privateNodeRSA.getPrivatePEM(), privateKeyPEM);
8493
});
8594

8695
it('.toPublicPEM() from public key should return public PEM string', function(){
87-
assert.equal(publicNodeRSA.toPublicPEM(), publicKeyPEM);
96+
assert.equal(publicNodeRSA.getPublicPEM(), publicKeyPEM);
8897
});
8998

9099
it('.toPublicPEM() from private key should return public PEM string', function(){
91-
assert.equal(privateNodeRSA.toPublicPEM(), publicKeyPEM);
100+
assert.equal(privateNodeRSA.getPublicPEM(), publicKeyPEM);
92101
});
93102
});
94103
});
@@ -163,4 +172,21 @@ describe('NodeRSA', function(){
163172
assert(_.isEqual(decryptedJSON, JSONForEncrypt));
164173
});
165174
});
175+
176+
describe('Signing & verifying', function () {
177+
178+
179+
var signed = {};
180+
181+
for(var i in dataForSign) {
182+
var sign = dataForSign[i];
183+
var signature = null;
184+
185+
it('should signed '+i, function(){
186+
signature = nodeRSA.sign(sign, 'hex');
187+
console.log(signature)
188+
});
189+
190+
}
191+
});
166192
});

0 commit comments

Comments
 (0)