# isomorphic-webcrypto [![NPM](https://img.shields.io/npm/v/isomorphic-webcrypto.svg)](https://npmjs.com/package/isomorphic-webcrypto) webcrypto library for Node, React Native and IE11+ ## What? There's a great Node polyfill for the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API), but [it's not isomorphic](https://github.com/anvilresearch/webcrypto/issues/57). IE11 and versions of Safari < 11 use an older version of the spec, so the browser implementation includes a [webcrypto-shim](https://github.com/vibornoff/webcrypto-shim) to iron out the differences. You'll still need to provide your own Promise polyfill. There's currently no native crypto support in React Native, so [the Microsoft Research library](https://github.com/kevlened/msrCrypto) is exposed. ## Install `npm install isomorphic-webcrypto` ## Usage There's a simple hashing example below, but [there are many more WebCrypto examples here](https://github.com/diafygi/webcrypto-examples). This example requires you to `npm install hex-lite`. ```javascript const crypto = require('isomorphic-webcrypto') const hex = require('hex-lite') // or import crypto from 'isomorphic-webcrypto' import hex from 'hex-lite' crypto.subtle.digest( { name: 'SHA-256' }, new Uint8Array([1,2,3]).buffer ) .then(hash => { // hashes are usually represented as hex strings // hex-lite makes this easier const hashString = hex.fromBuffer(hash); }) ``` ### React Native React Native support is implemented using [the Microsoft Research library](https://github.com/kevlened/msrCrypto). The React Native environment only supports `Math.random()`, so [react-native-securerandom](https://github.com/rh389/react-native-securerandom) is used to provide proper entropy. This is handled automatically, except for `crypto.getRandomValues()`, which requires you wait: ```javascript const crypto = require('isomorphic-webcrypto') (async () => { // Only needed for crypto.getRandomValues // but only wait once, future calls are secure await crypto.ensureSecure(); const array = new Uint8Array(1); crypto.getRandomValues(array); const safeValue = array[0]; })() ``` Working React Native examples: * Using [create-react-native-app](https://github.com/kevlened/webcrypto-react-native-examples/tree/master/crna) with Expo * Using an ejected [create-react-native-app](https://github.com/kevlened/webcrypto-react-native-examples/blob/master/crna-ejected) ## I just want to drop in a script tag You should use [the webcrypto-shim](https://github.com/vibornoff/webcrypto-shim) library directly: ```html ``` ## Compatibility * IE11+ * Safari 8+ * Edge 12+ * Chrome 43+ * Opera 24+ * Firefox 34+ * Node 4+ * React Native Although the library runs on IE11+, the level of functionality varies between implementations. They're organized using the [JWA alg abbreviations](https://tools.ietf.org/html/rfc7518#section-3.1): | Key | Signature, MAC or Key Management Algorithm | | ------------------ | ----------------------------------------------------------------------------- | | HS256 | HMAC using SHA-256 | | HS384 | HMAC using SHA-384 | | HS512 | HMAC using SHA-512 | | RS256 | RSASSA-PKCS1-v1_5 using SHA-256 | | RS384 | RSASSA-PKCS1-v1_5 using SHA-384 | | RS512 | RSASSA-PKCS1-v1_5 using SHA-512 | | ES256 | ECDSA using P-256 and SHA-256 | | ES384 | ECDSA using P-384 and SHA-384 | | ES512 | ECDSA using P-521 and SHA-512 | | PS256 | RSASSA-PSS using SHA-256 and MGF1 with SHA-256 | | PS384 | RSASSA-PSS using SHA-384 and MGF1 with SHA-384 | | PS512 | RSASSA-PSS using SHA-512 and MGF1 with SHA-512 | | RSA1_5 | RSAES-PKCS1-v1_5 | | RSA-OAEP | RSAES OAEP using default parameters | | RSA-OAEP-256 | RSAES OAEP using SHA-256 and MGF1 with SHA-256 | | A128KW | AES Key Wrap with default initial value using 128-bit key | | A192KW | AES Key Wrap with default initial value using 192-bit key | | A256KW | AES Key Wrap with default initial value using 256-bit key | | dir | Direct use of a shared symmetric key as the CEK | | ECDH-ES | Elliptic Curve Diffie-Hellman Ephemeral Static key agreement using Concat KDF | | ECDH-ES+A128KW | ECDH-ES using Concat KDF and CEK wrapped with "A128KW" | | ECDH-ES+A192KW | ECDH-ES using Concat KDF and CEK wrapped with "A192KW" | | ECDH-ES+A256KW | ECDH-ES using Concat KDF and CEK wrapped with "A256KW" | | A128GCMKW | Key wrapping with AES GCM using 128-bit key | | A192GCMKW | Key wrapping with AES GCM using 192-bit key | | A256GCMKW | Key wrapping with AES GCM using 256-bit key | | PBES2-HS256+A128KW | PBES2 with HMAC SHA-256 and "A128KW" wrapping | | PBES2-HS384+A192KW | PBES2 with HMAC SHA-384 and "A192KW" wrapping | | PBES2-HS512+A256KW | PBES2 with HMAC SHA-512 and "A256KW" wrapping | > __Legend__ > > * **~** works with some caveats - see the \_\_tests__ directory for the caveats > * **?** untested > * **x** unsupported algorithm > * **strikethrough** broken method | Key | Node | React Native | Chrome/Firefox | Safari | Edge | IE11 | | ------------------ | ----------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------- | --------------------------------------------------------------- | | HS256 | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | | HS384 | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | | HS512 | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | x | | RS256 | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
~~generateKey~~
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | ~importKey
exportKey
~generateKey
~~sign~~
verify | ~importKey
~exportKey
generateKey
~~sign~~
verify | | RS384 | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
~~generateKey~~
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
~~exportKey~~
generateKey
sign
verify | ~importKey
exportKey
~generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | | RS512 | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
~~generateKey~~
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
~~exportKey~~
generateKey
sign
verify | ~importKey
exportKey
~generateKey
sign
verify | importKey
exportKey
generateKey
~~sign~~
~~verify~~ | | ES256 | importKey
exportKey
generateKey
sign
~~verify~~ | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | x | x | | ES384 | importKey
exportKey
generateKey
sign
~~verify~~ | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | x | x | | ES512 | x | importKey
exportKey
generateKey
sign
verify | importKey
exportKey
generateKey
sign
verify | x | x | x | | PS256 | ? | ? | ? | ? | ? | ? | | PS384 | ? | ? | ? | ? | ? | ? | | PS512 | ? | ? | ? | ? | ? | ? | | RSA1_5 | ? | ? | ? | ? | ? | ? | | RSA-OAEP | ? | ? | ? | ? | ? | ? | | RSA-OAEP-256 | ? | ? | ? | ? | ? | ? | | A128KW | ? | ? | ? | ? | ? | ? | | A192KW | ? | ? | ? | ? | ? | ? | | A256KW | ? | ? | ? | ? | ? | ? | | dir | ? | ? | ? | ? | ? | ? | | ECDH-ES | ? | ? | ? | ? | ? | ? | | ECDH-ES+A128KW | ? | ? | ? | ? | ? | ? | | ECDH-ES+A192KW | ? | ? | ? | ? | ? | ? | | ECDH-ES+A256KW | ? | ? | ? | ? | ? | ? | | A128GCMKW | ? | ? | ? | ? | ? | ? | | A192GCMKW | ? | ? | ? | ? | ? | ? | | A256GCMKW | ? | ? | ? | ? | ? | ? | | PBES2-HS256+A128KW | ? | ? | ? | ? | ? | ? | | PBES2-HS384+A192KW | ? | ? | ? | ? | ? | ? | | PBES2-HS512+A256KW | ? | ? | ? | ? | ? | ? | ## License MIT