88 */
99
1010var rsa = require ( './libs/rsa.js' ) ;
11+ var crypt = require ( 'crypto' ) ;
1112var ber = require ( 'asn1' ) . Ber ;
1213var _ = require ( 'lodash' ) ;
1314var 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} ) ( ) ;
0 commit comments