UNPKG

@akanass/rx-crypto

Version:

Crypto module provides some functions for security features like AES key, Key pair, RSA key, PKCS12, Certificate, PEM and more

644 lines (497 loc) 22.7 kB
<div style="margin-bottom:20px;"> <div> <a href="https://www.typescriptlang.org/docs/tutorial.html"> <img src="https://cdn-images-1.medium.com/max/800/1*8lKzkDJVWuVbqumysxMRYw.png" align="right" alt="Typescript logo" width="50" height="50" style="border:none;" /> </a> <a href="http://reactivex.io/rxjs"> <img src="http://reactivex.io/assets/Rx_Logo_S.png" align="right" alt="ReactiveX logo" width="50" height="50" style="border:none;" /> </a> </div> </div> # RSA After created an instance of `RSA` you can have access to all methods and operators. ```javascript import { RSA } from '@akanass/rx-crypto'; const rsa: RSA = new RSA(); ``` ## Table of contents * [API in Detail](#api-in-detail) * [.createKey([keyBits])](#createkeykeyBits) * [.loadKey(key[, format, options])](#loadkeykey-format-options) * [.importKey(key[, format])](#importkeykey-format) * [.generateKeyPair([bits, exponent])](#generatekeypairbits-exponent) * [.exportKey([format])](#exportkeyformat) * [.isPrivate()](#isprivate) * [.isPublic([strict])](#ispublicstrict) * [.isEmptyKey()](#isemptykey) * [.getKeySize()](#getkeysize) * [.getMaxMessageSize()](#getmaxmessagesize) * [.encryptPublic(data[, encoding, sourceEncoding])](#encryptpublicdata-encoding-sourceencoding) * [.encryptPrivate(data[, encoding, sourceEncoding])](#encryptprivatedata-encoding-sourceencoding) * [.decryptPublic(data[, encoding])](#decryptpublicdata-encoding) * [.decryptPrivate(data[, encoding])](#decryptprivatedata-encoding) * [.sign(data[, encoding, sourceEncoding])](#signdata-encoding-sourceencoding) * [.verify(data,signature[, sourceEncoding, signatureEncoding])](#verifydata-signature-sourceencoding-signatureencoding) * [Parameters types in detail](#parameters-types-in-detail) * [Key](#key) * [KeyComponents](#keycomponents) * [Format](#format) * [Options](#options) * [EncryptionScheme](#encryptionscheme) * [AdvancedEncryptionScheme](#advancedencryptionscheme) * [AdvancedEncryptionSchemePKCS1](#advancedencryptionschemepkcs1) * [AdvancedEncryptionSchemePKCS1OAEP](#advancedencryptionschemepkcs10aep) * [HashingAlgorithm](#hashingalgorithm) * [Data](#data) * [Encoding](#encoding) * [Change History](#change-history) ## API in Detail ### `.createKey([keyBits])` Generate new `key` with `length` specified. **Parameters:** > - ***{KeyBits} keyBits*** *(optional): length of the new `RSA key` ({b: number}).* **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully generated `RSA key` will be passed as a `NodeRSA` object.* **Example:** ```javascript rsa.createKey() .subscribe( (nodeRSA: NodeRSA) => console.log(nodeRSA), // Show `NodeRSA` `empty` key in the console e => console.error(e.message) // Show error message in the console ); rsa.createKey({b: 512}) .subscribe( (nodeRSA: NodeRSA) => console.log(nodeRSA), // Show `NodeRSA` `512bit-length` key in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.loadKey(key[, format, options])` Load `key` from `string`, `buffer` or `components`. **Parameters:** > - ***{Key} key*** *(required): parameters for generating key or the key in one of supported formats.* > - ***{Format} format*** *(optional): format for importing key.* > - ***{Options} options*** *(optional): additional settings.* **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully imported `RSA key` will be passed as a `NodeRSA` object.* **Example:** ```javascript rsa.loadKey( '-----BEGIN RSA PRIVATE KEY-----\n'+ '...\n' + '-----END RSA PRIVATE KEY-----' ) .subscribe( (nodeRSA: NodeRSA) => console.log(nodeRSA), // Show `NodeRSA` `'pkcs1-private-pem'` key in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.importKey(key[, format])` Import `key` from `PEM string`, `PEM/DER Buffer` or `components`. This method is an `Observable's` `operator`. **Parameters:** > - ***{Key} key*** *(required): key from `PEM string`, `PEM/DER Buffer` or `components`.* > - ***{Format} format*** *(optional): format for importing key.* **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully imported `RSA key` will be passed as a `NodeRSA` object.* **Example:** ```javascript import { importKey } from '@akanass/rx-crypto/operators/rsa'; ... rsa.createKey() .pipe( importKey( '-----BEGIN RSA PRIVATE KEY-----\n'+ '...\n' + '-----END RSA PRIVATE KEY-----' ) ) .subscribe( (nodeRSA: NodeRSA) => console.log(nodeRSA), // Show `NodeRSA` `'pkcs1-private-pem'` key in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.generateKeyPair([bits, exponent])` Generate new `RSA Key Pair` in pure `Javascript`. We advise to use `PEM.createKeyPair()` instead of. This method is an `Observable's` `operator`. **Parameters:** > - ***{number} bits*** *(optional): Key size in bits. (default `2048`).* > - ***{number} exponent*** *(optional): public exponent. (default `65537`).* **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully generate `RSA Key Pair` will be passed as a `NodeRSA` object.* **Example:** ```javascript import { generateKeyPair } from '@akanass/rx-crypto/operators/rsa'; ... rsa.createKey() .pipe( generateKeyPair() ) .subscribe( (nodeRSA: NodeRSA) => console.log(nodeRSA), // Show `NodeRSA` `key pair` in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.exportKey([format])` Export `key` to `PEM string`, `PEM/DER Buffer` or `components`. This method is an `Observable's` `operator`. **Parameters:** > - ***{Format} format*** *(optional): format for exporting key.* **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully exported `RSA key` will be passed as a `Key` object.* **Example:** ```javascript import { exportKey } from '@akanass/rx-crypto/operators/rsa'; ... rsa.loadKey( '-----BEGIN RSA PRIVATE KEY-----\n'+ '...\n' + '-----END RSA PRIVATE KEY-----' ) .pipe( exportKey() ) .subscribe( (key: Key) => console.log(key), // Show `loaded` key in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.isPrivate()` Check if `key` is `private`. This method is an `Observable's` `operator`. **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully verification will be passed as a `boolean`.* **Example - Lettable operator:** ```javascript import { isPrivate } from '@akanass/rx-crypto/operators/rsa'; ... rsa.loadKey( '-----BEGIN RSA PRIVATE KEY-----\n'+ '...\n' + '-----END RSA PRIVATE KEY-----' ) .pipe( isPrivate() ) .subscribe( (isPrivate: boolean) => console.log(isPrivate), // Show `true` in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.isPublic([strict])` Check if `key` is `public`. This method is an `Observable's` `operator`. **Parameters:** > - ***{boolean} strict*** *(optional): if `true` method will return `false` if `key pair` have `private` exponent. (default: `false`).* **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully verification will be passed as a `boolean`.* **Example:** ```javascript import { isPublic } from '@akanass/rx-crypto/operators/rsa'; ... rsa.loadKey( '-----BEGIN RSA PRIVATE KEY-----\n'+ '...\n' + '-----END RSA PRIVATE KEY-----' ) .pipe( isPublic(true) ) .subscribe( (isPublic: boolean) => console.log(isPublic), // Show `false` in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.isEmptyKey()` Check if `key` is `empty`. This method is an `Observable's` `operator`. **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully verification will be passed as a `boolean`.* **Example:** ```javascript import { isEmptyKey } from '@akanass/rx-crypto/operators/rsa'; ... rsa.loadKey( '-----BEGIN RSA PRIVATE KEY-----\n'+ '...\n' + '-----END RSA PRIVATE KEY-----' ) .pipe( isEmptyKey() ) .subscribe( (isEmptyKey: boolean) => console.log(isEmptyKey), // Show `false` in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.getKeySize()` Return `key` size in `bits`. This method is an `Observable's` `operator`. **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully `key` size will be passed as `bits` value.* **Example:** ```javascript import { getKeySize } from '@akanass/rx-crypto/operators/rsa'; ... rsa.loadKey( '-----BEGIN RSA PRIVATE KEY-----\n'+ 'MIIBOQIBAAJAVY6quuzCwyOWzymJ7C4zXjeV/232wt2ZgJZ1kHzjI73wnhQ3WQcL\n'+ 'DFCSoi2lPUW8/zspk0qWvPdtp6Jg5Lu7hwIDAQABAkBEws9mQahZ6r1mq2zEm3D/\n'+ 'VM9BpV//xtd6p/G+eRCYBT2qshGx42ucdgZCYJptFoW+HEx/jtzWe74yK6jGIkWJ\n'+ 'AiEAoNAMsPqwWwTyjDZCo9iKvfIQvd3MWnmtFmjiHoPtjx0CIQCIMypAEEkZuQUi\n'+ 'pMoreJrOlLJWdc0bfhzNAJjxsTv/8wIgQG0ZqI3GubBxu9rBOAM5EoA4VNjXVigJ\n'+ 'QEEk1jTkp8ECIQCHhsoq90mWM/p9L5cQzLDWkTYoPI49Ji+Iemi2T5MRqwIgQl07\n'+ 'Es+KCn25OKXR/FJ5fu6A6A+MptABL3r8SEjlpLc=\n'+ '-----END RSA PRIVATE KEY-----' ) .pipe( getKeySize() ) .subscribe( (keySize: number) => console.log(keySize), // Show `511` in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.getMaxMessageSize()` Return max `data` size for `encrypt` in `bytes`. This method is an `Observable's` `operator`. **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully max `data` size for `encrypt` will be passed as `bytes` value.* **Example:** ```javascript import { getMaxMessageSize } from '@akanass/rx-crypto/operators/rsa'; ... rsa.loadKey( '-----BEGIN RSA PRIVATE KEY-----\n'+ 'MIIBOQIBAAJAVY6quuzCwyOWzymJ7C4zXjeV/232wt2ZgJZ1kHzjI73wnhQ3WQcL\n'+ 'DFCSoi2lPUW8/zspk0qWvPdtp6Jg5Lu7hwIDAQABAkBEws9mQahZ6r1mq2zEm3D/\n'+ 'VM9BpV//xtd6p/G+eRCYBT2qshGx42ucdgZCYJptFoW+HEx/jtzWe74yK6jGIkWJ\n'+ 'AiEAoNAMsPqwWwTyjDZCo9iKvfIQvd3MWnmtFmjiHoPtjx0CIQCIMypAEEkZuQUi\n'+ 'pMoreJrOlLJWdc0bfhzNAJjxsTv/8wIgQG0ZqI3GubBxu9rBOAM5EoA4VNjXVigJ\n'+ 'QEEk1jTkp8ECIQCHhsoq90mWM/p9L5cQzLDWkTYoPI49Ji+Iemi2T5MRqwIgQl07\n'+ 'Es+KCn25OKXR/FJ5fu6A6A+MptABL3r8SEjlpLc=\n'+ '-----END RSA PRIVATE KEY-----' ) .pipe( getMaxMessageSize() ) .subscribe( (maxMessageSize: number) => console.log(maxMessageSize), // Show `22` in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.encryptPublic(data[, encoding, sourceEncoding])` Encrypting data method with `public key`. This method is an `Observable's` `operator`. **Parameters:** > - ***{Data | Buffer} data*** *(required): data for encrypting. `Object` and `array` will convert to `JSON` string.* > - ***{'buffer' | Encoding} encoding*** *(optional): Encoding for output result. (default: `'buffer'`).* > - ***{Encoding} sourceEncoding*** *(optional): Encoding for given string. (default: `'utf8'`).* **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully `encrypted` data will be passed as a `Buffer` or `Encoding`.* **Example:** ```javascript import { encryptPublic } from '@akanass/rx-crypto/operators/rsa'; ... rsa.loadKey( '-----BEGIN RSA PUBLIC KEY-----\n'+ '...\n' + '-----END RSA PUBLIC KEY-----' ) .pipe( encryptPublic('data') ) .subscribe( (buffer: Buffer) => console.log(buffer), // Show encrypted `Buffer` in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.encryptPrivate(data[, encoding, sourceEncoding])` Encrypting data method with `private key`. This method is an `Observable's` `operator`. **Parameters:** > - ***{Data | Buffer} data*** *(required): data for encrypting. `Object` and `array` will convert to `JSON` string.* > - ***{'buffer' | Encoding} encoding*** *(optional): Encoding for output result. (default: `'buffer'`).* > - ***{Encoding} sourceEncoding*** *(optional): Encoding for given string. (default: `'utf8'`).* **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully `encrypted` data will be passed as a `Buffer` or `Encoding`.* **Example:** ```javascript import { encryptPrivate } from '@akanass/rx-crypto/operators/rsa'; ... rsa.loadKey( '-----BEGIN RSA PRIVATE KEY-----\n'+ '...\n' + '-----END RSA PRIVATE KEY-----' ) .pipe( encryptPrivate('data') ) .subscribe( (buffer: Buffer) => console.log(buffer), // Show encrypted `Buffer` in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.decryptPublic(data[, encoding])` Decrypting data method with `public key`. This method is an `Observable's` `operator`. **Parameters:** > - ***{Buffer | string} data*** *(required): `Buffer` for decrypting.* > - ***{'buffer' | Encoding | 'json'} encoding*** *(optional): Encoding for result `string`, can also take `'json'` or `'buffer'` for the automatic conversion of this type. (default: `'buffer'`).* **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully `decrypted` data will be passed as a `Buffer`, `JSON` or `Encoding`.* **Example:** ```javascript import { decryptPublic } from '@akanass/rx-crypto/operators/rsa'; ... rsa.loadKey( '-----BEGIN RSA PUBLIC KEY-----\n'+ '...\n' + '-----END RSA PUBLIC KEY-----' ) .pipe( decryptPublic(Buffer.from('data')) ) .subscribe( (buffer: Buffer) => console.log(buffer), // Show decrypted `Buffer` in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.decryptPrivate(data[, encoding])` Decrypting data method with `private key`. This method is an `Observable's` `operator`. **Parameters:** > - ***{Buffer | string} data*** *(required): `Buffer` for decrypting.* > - ***{'buffer' | Encoding | 'json'} encoding*** *(optional): Encoding for result `string`, can also take `'json'` or `'buffer'` for the automatic conversion of this type. (default: `'buffer'`).* **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully `decrypted` data will be passed as a `Buffer`, `JSON` or `Encoding`.* **Example:** ```javascript import { decryptPrivate } from '@akanass/rx-crypto/operators/rsa'; ... rsa.loadKey( '-----BEGIN RSA PRIVATE KEY-----\n'+ '...\n' + '-----END RSA PRIVATE KEY-----' ) .pipe( decryptPrivate(Buffer.from('data')) ) .subscribe( (buffer: Buffer) => console.log(buffer), // Show decrypted `Buffer` in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.sign(data[, encoding, sourceEncoding])` Signing data method with `private key`. This method is an `Observable's` `operator`. **Parameters:** > - ***{Data | Buffer} data*** *(required): data for signing. `Object` and `array` will convert to `JSON` string.* > - ***{'buffer' | Encoding} encoding*** *(optional): Encoding for output result. (default: `'buffer'`).* > - ***{Encoding} sourceEncoding*** *(optional): Encoding for given string. (default: `'utf8'`).* **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully `signed` data will be passed as a `Buffer` or `Encoding`.* **Example:** ```javascript import { sign } from '@akanass/rx-crypto/operators/rsa'; ... rsa.loadKey( '-----BEGIN RSA PRIVATE KEY-----\n'+ '...\n' + '-----END RSA PRIVATE KEY-----' ) .pipe( sign('data') ) .subscribe( (buffer: Buffer) => console.log(buffer), // Show signed `Buffer` in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ### `.verify(data, signature[, sourceEncoding, signatureEncoding])` Verifying signed data method with `public key`. This method is an `Observable's` `operator`. **Parameters:** > - ***{Data | Buffer} data*** *(required): data for signing. `Object` and `array` will convert to `JSON` string.* > - ***{string | Buffer} signature*** *(required): signature from sign method.* > - ***{Encoding} sourceEncoding*** *(optional): Encoding for given string. (default: `'utf8'`).* > - ***{Encoding} signatureEncoding*** *(optional): Encoding of given signature. (default: `'buffer'`).* **Response:** > *{[RxJS.Observable](https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts)} The successfully `verified` data will be passed as a `boolean`.* **Example:** ```javascript import { verify } from '@akanass/rx-crypto/operators/rsa'; ... rsa.loadKey( '-----BEGIN RSA PUBLIC KEY-----\n'+ '...\n' + '-----END RSA PUBLIC KEY-----' ) .pipe( verify('data', [SIGNATURE]) ) .subscribe( (verify: boolean) => console.log(verify), // Show `verified` boolean in the console e => console.error(e.message) // Show error message in the console ); ``` [Back to top](#table-of-contents) ## Parameters types in detail ### *Key:* > ***type*** => `string` | `Buffer` | `KeyComponents` ### *KeyComponents:* > ***object*** => {`n`: Buffer, `e`: Buffer | number, `d`: Buffer, `p`: Buffer, `q`: Buffer, `dmp1`: Buffer, `dmq1`: Buffer, `coeff`: Buffer} ### *Format:* Format string composed of several parts: `scheme-[key_type]-[output_type]` **Scheme** — support of multiple format schemes for `import/export` keys: > - `'pkcs1'` — `public` key starts from `'-----BEGIN RSA PUBLIC KEY-----'` header and `private` key starts from `'-----BEGIN RSA PRIVATE KEY-----'` header > - `'pkcs8'` — `public` key starts from `'-----BEGIN PUBLIC KEY-----'` header and `private` key starts from `'-----BEGIN PRIVATE KEY-----'` header > - `'components'` — use it for import/export key from/to raw components (see example below). For `private` key, importing data should contain all `private` key components, for `public` key: only `public` exponent (`e`) and modulus (`n`). All components (except `e`) should be `Buffer`, `e` could be `Buffer` or just normal `number`. **Key type** — can be `'private'` or `'public'`. (default: `'private'`) **Output type** — can be: > - `'pem'` — `Base64` encoded string with header and footer. Used by default. > - `'der'` — `Binary` encoded key data. **Shortcuts** > - `'private'` or `'pkcs1'` or `'pkcs1-private'` == `'pkcs1-private-pem'` — `private` key encoded in `pcks1` scheme as `pem` string. > - `'public'` or `'pkcs8-public'` == `'pkcs8-public-pem'` — `public` key encoded in `pcks8` scheme as `pem` string. > - `'pkcs8'` or `'pkcs8-private'` == `'pkcs8-private-pem'` — `private` key encoded in `pcks8` scheme as `pem` string. > - `'pkcs1-der'` == `'pkcs1-private-der'` — `private` key encoded in `pcks1` scheme as binary `buffer`. > - `'pkcs8-public-der'` — `public` key encoded in `pcks8` scheme as binary `buffer`. ### *Options:* > - ***{EncryptionScheme | AdvancedEncryptionScheme } encryptionScheme*** *(optional): padding scheme for encrypt/decrypt. (default: `'pkcs1_oaep'`).* ### *EncryptionScheme:* > ***string*** => `'pkcs1_oaep'` | `'pkcs1'` ### *AdvancedEncryptionScheme:* > ***type*** => `AdvancedEncryptionSchemePKCS1` | `AdvancedEncryptionSchemePKCS1OAEP` ### *AdvancedEncryptionSchemePKCS1:* > ***object*** => {`scheme`: 'pkcs1', `padding`: number} ### *AdvancedEncryptionSchemePKCS1OAEP:* > ***object*** => {`scheme`: 'pkcs1_oaep', `hash`: HashingAlgorithm} ### *HashingAlgorithm:* > ***string*** => `'ripemd160'` | `'md4'` | `'md5'` | `'sha'` | `'sha1'` | `'sha224'` | `'sha256'` | `'sha384'` | `'sha512'` ### *Data:* > ***type*** => `string` | `object` | `any[]` ### *Encoding:* > ***string*** => `'ascii'` | `'utf8'` | `'utf16le'` | `'ucs2'` | `'latin1'` | `'base64'` | `'hex'` | `'binary'` [Back to top](#table-of-contents) ## Change History * Implementation of all methods (2019-08-27) * [.createKey([keyBits])](#createkeykeyBits) * [.loadKey(key[, format, options])](#loadkeykey-format-options) * [.importKey(key[, format])](#importkeykey-format) * [.generateKeyPair([bits, exponent])](#generatekeypairbits-exponent) * [.exportKey([format])](#exportkeyformat) * [.isPrivate()](#isprivate) * [.isPublic([strict])](#ispublicstrict) * [.isEmptyKey()](#isemptykey) * [.getKeySize()](#getkeysize) * [.getMaxMessageSize()](#getmaxmessagesize) * [.encryptPublic(data[, encoding, sourceEncoding])](#encryptpublicdata-encoding-sourceencoding) * [.encryptPrivate(data[, encoding, sourceEncoding])](#encryptprivatedata-encoding-sourceencoding) * [.decryptPublic(data[, encoding])](#decryptpublicdata-encoding) * [.decryptPrivate(data[, encoding])](#decryptprivatedata-encoding) * [.sign(data[, encoding, sourceEncoding])](#signdata-encoding-sourceencoding) * [.verify(data, signature[, sourceEncoding, signatureEncoding])](#verifydata-signature-sourceencoding-signatureencoding) [Back to top](#table-of-contents)