0
votes

I'm working with a project that currently is doing encryption in a salesforce apex class (using the Crypto library) and that logic needs to be moved into a javascript file. The node.js package I'm trying to use to do the encryption is node-rsa.

Here's the code that currently exists in apex:

    String algName = 'RSA';
    blob signature;
    String signGen = '';
    String pKey =  'MIIEvgIBADANBgkqhkiG<rest of key snipped>';
    String payload = 'some payload';

    blob privateKey = EncodingUtil.base64Decode(pKey);
    blob input = Blob.valueOf(payload);

    signature = Crypto.sign(algName, input, privateKey);

    signGen = EncodingUtil.base64Encode(signature);

And here's the initial javascript implementation:

    var tmp = forge.util.decode64(pKey);
    var privateKey2 = new NodeRSA(tmp);

    payload = 'some payload
    var encrypted = key.encrypt(payload, 'base64');

The problem I'm having is that the line: var privateKey2 = new NodeRSA(tmp);

is causing the following error: Invalid PEM format

The private key that the node-rsa uses in their example has markets at the beginning and end of the key of: ---- BEGIN RSA PRIVATE KEY ----- ---- END RSA PRIVATE KEY -----

So I'm not sure if I have to somehow indicate to the node-rsa library that this key is in a different format. Or maybe there's another RSA javascript library I could try using?

1
I use this RSA JavaScript code in my Node.js applications: ohdave.com/rsa There isn't an NPM for it... I've been meaning to make one but haven't gotten around to it yet. Maybe that alternative will help you.Brad

1 Answers

3
votes

I left you a response for how to do this using forge here: https://github.com/digitalbazaar/forge/issues/150

var pkey = 'some base64-encoded private key';
var pkeyDer = forge.util.decode64(pkey);
var pkeyAsn1 = forge.asn1.fromDer(pkeyDer);
var privateKey = forge.pki.privateKeyFromAsn1(pkeyAsn1);

// above could be simplified if pkey is stored in standard PEM format, then just do this:
// var pkey = 'some private key in pem format';
// var privateKey = forge.pki.privateKeyFromPem(pkey);

var payload = 'some string payload';
var md = forge.md.sha1.create();
md.update(payload, 'utf8');

var signature = privateKey.sign(md);
var signature64 = forge.util.encode64(signature);

// signature64 is now a base64-encoded RSA signature on a SHA-1 digest
// using PKCS#1v1.5 padding... see the examples for other padding options if necessary