Skip to content

Commit 3168a93

Browse files
committed
added algorithm options for signing
1 parent b3e8995 commit 3168a93

File tree

3 files changed

+32
-8
lines changed

3 files changed

+32
-8
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ npm test
2323
## Usage
2424

2525
### Create instance
26+
```js
27+
var key = new NodeRSA([key], [options]);
28+
```
29+
**key** - parameters of a generated key or the key in PEM format.
30+
**options** - additional settings<br/>
31+
* **signingAlgorithm** - algorithm used for signing and verifying. Default _'RSA-SHA256'_
32+
2633
#### "Empty" key
2734
```js
2835
var key = new NodeRSA();

src/NodeRSA.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,21 @@ var PUBLIC_RSA_OID = '1.2.840.113549.1.1.1';
1717

1818
module.exports = (function() {
1919
/**
20-
* @param arg {string|object} Key in PEM format, or data for generate key {b: bits, e: exponent}
20+
* @param key {string|object} Key in PEM format, or data for generate key {b: bits, e: exponent}
2121
* @constructor
2222
*/
23-
function NodeRSA(arg) {
23+
function NodeRSA(key, options) {
2424
this.keyPair = new rsa.Key();
2525
this.$cache = {};
2626

27-
if (_.isObject(arg)) {
28-
this.generateKeyPair(arg.b, arg.e);
29-
} else if (_.isString(arg)) {
30-
this.loadFromPEM(arg);
27+
this.options = _.merge({
28+
signingAlgorithm: 'RSA-SHA256'
29+
}, options || {});
30+
31+
if (_.isObject(key)) {
32+
this.generateKeyPair(key.b, key.e);
33+
} else if (_.isString(key)) {
34+
this.loadFromPEM(key);
3135
}
3236
}
3337

@@ -169,7 +173,7 @@ module.exports = (function() {
169173
}
170174

171175
encoding = (!encoding || encoding == 'buffer' ? null : encoding);
172-
var signer = crypt.createSign('RSA-SHA256');
176+
var signer = crypt.createSign(this.options.signingAlgorithm);
173177
signer.update(this.$getDataForEcrypt(buffer, source_encoding));
174178
return signer.sign(this.getPrivatePEM(), encoding);
175179
};
@@ -185,7 +189,7 @@ module.exports = (function() {
185189
*/
186190
NodeRSA.prototype.verify = function(buffer, signature, source_encoding, signature_encoding) {
187191
signature_encoding = (!signature_encoding || signature_encoding == 'buffer' ? null : signature_encoding);
188-
var verifier = crypt.createVerify('RSA-SHA256');
192+
var verifier = crypt.createVerify(this.options.signingAlgorithm);
189193
verifier.update(this.$getDataForEcrypt(buffer, source_encoding));
190194
return verifier.verify(this.getPublicPEM(), signature, signature_encoding);
191195
};

test/tests.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,12 @@ describe("NodeRSA", function(){
205205
assert(key.verify(suit.data, signed[i]));
206206
});
207207
}
208+
209+
it("signing with custom algorithm", function(){
210+
var key = new NodeRSA(generatedKeys[0].getPrivatePEM(), {signingAlgorithm: 'RSA-MD5'});
211+
var signed = key.sign('data');
212+
assert(key.verify('data', signed));
213+
});
208214
});
209215

210216
describe("Bad cases", function () {
@@ -222,6 +228,13 @@ describe("NodeRSA", function(){
222228
var signed = generatedKeys[0].sign('data');
223229
assert(! generatedKeys[1].verify('data', signed));
224230
});
231+
232+
it("different algorithms", function(){
233+
var singKey = new NodeRSA(generatedKeys[0].getPrivatePEM(), {signingAlgorithm: 'RSA-MD5'});
234+
var verifyKey = new NodeRSA(generatedKeys[0].getPrivatePEM(), {signingAlgorithm: 'RSA-SHA1'});
235+
var signed = singKey.sign('data');
236+
assert(! verifyKey.verify('data', signed));
237+
});
225238
});
226239
});
227240
});

0 commit comments

Comments
 (0)