# Install

`npm install @cryptolize/core --save`

# Usage

## ES6 (Javascript Modules)

```javascript
import * as CryptolizeCore from '@cryptolize/core'

const keys = CryptolizeCore.createAsymmetricKeys()

...

import { encryptRecordAsync } from '@cryptolize/core'

encryptRecordAsync(...).then((record) => console.log(record))
```

## ES5 (CommonJS)

```javascript
var CryptolizeCore = require('@cryptolize/core')

var keys = CryptolizeCore.createAsymmetricKeys()
CryptolizeCore.encryptRecordAsync(...).then((record) => console.log(record))
```

## UMD (Browser)

```javascript
var keys = CryptolizeCore.createAsymmetricKeys()
CryptolizeCore.encryptRecordAsync(...).then((record) => console.log(record))
```

# Record Format

<!-- Generated by documentation.js. Update this documentation by updating the source code. -->

## Record

Record

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `headerWrapper`  
-   `headerWrapperEncryptionParams`  
-   `blocks`  

**Properties**

-   `headerWrapper` **[HeaderWrapper](#headerwrapper)** 
-   `headerWrapperEncryptionParams` **[HeaderWrapperEncryptionParams](#headerwrapperencryptionparams)** 
-   `blocks` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Block](#block)>** consists of the data and files keys only. the header is stored inside the encrypted headerWrapper.

**Examples**

```javascript
const record = {
   headerWrapper: {
     metadata: {
       type: 'standard',
       id: 'id',
       creator: 'creator',
       personalPage: 'personalPage',
       signature: 'signature',
       signatureKeyVersion: 'signatureKeyVersion',
       timestamp: 1488992366155,
       timezoneOffset: 120,
       isOnce: false,
       expiration: 1488992300000,
       subject: 'subject',
       origin: 'origin',
       custom: {
         key1: value1,
         key2: value2,
         ...
       }
     },
     blocks: [
       {
         symmetricEncryption: [
           {
             hint: 'hint',
             derivationParams: {
               iterations: 'iterations',
               salt: 'salt'
             },
             encryptionParams: {
               iv: 'iv',
               mode: 'gcm',
               ts: 128,
               adata: 'cryptolize'
             },
             encryptedKey: 'encryptedKey'
           },
           ...
         ],
         asymmetricEncryption: [
           {
             id: 'id',
             version: 'version',
             tag: 'tag',
             encryptionParams: {
               iv: 'iv',
               mode: 'gcm',
               ts: 128,
               adata: 'cryptolize'
             },
             encryptedKey: 'encryptedKey'
           },
           ...
         ],
         dataEncryptionParams: {
           iv: 'iv',
           mode: 'gcm',
           ts: 128,
           adata: 'cryptolize'
         },
         filesEncryptionParams: [
           {
             id: 'id',
             encryptionParams: {
               iv: 'iv',
               mode: 'gcm',
               ts: 128,
               adata: 'cryptolize'
             }
           },
           ...
         ],
         filesStorageParams: [
           {
             id: 'id',
             path: 'path',
             service: 'service'
           },
           ...
         ]
       }
       ...
     ]
   },
   headerWrapperEncryptionParams: {
     id: 'id',
     tag: 'tag',
     encryptionParams: {
       iv: 'iv',
       mode: 'gcm',
       ts: 128,
       adata: 'cryptolize'
     },
   },
   blocks: [
     {
       data: {
         text: 'text',
         files: [
           {
             name: 'name',
             size: 'size',
             type: 'type',
             id: 'id'
           },
           ...
         ]
       },
       files: [
         {
           id: 'id',
           data: 'data'
         },
         ...
       ]
     },
     ...
   ]
 }
```

## HeaderWrapper

Header wrapper

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `metadata`  
-   `blocks`  

**Properties**

-   `metadata` **[RecordMetadata](#recordmetadata)** 
-   `blocks` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[Header](#header)>** 

## RecordMetadata

RecordMetadata

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `id`  
-   `creator`  
-   `personalPage`  
-   `signature`  
-   `signatureKeyVersion`  
-   `timestamp`  
-   `timezoneOffset`  
-   `isOnce`  
-   `expiration`  
-   `subject`  
-   `origin`  
-   `custom`  

**Properties**

-   `type` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `creator` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** 
-   `personalPage` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** 
-   `signature` **Base64UrlString?** 
-   `signatureKeyVersion` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** 
-   `timestamp` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** 
-   `timezoneOffset` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** 
-   `isOnce` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** 
-   `expiration` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** 
-   `subject` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** 
-   `origin` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** 
-   `custom` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)?** 

## HeaderWrapperEncryptionParams

Header wrapper encryption params

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `id`  
-   `tag`  
-   `encryptionParams`  

**Properties**

-   `keyId` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `tag` **Base64UrlString** 
-   `encryptionParams` **[SymmetricEncryptionParams](#symmetricencryptionparams)** 

## Block

Block

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `header`  
-   `data`  
-   `files`  

**Properties**

-   `header` **[Header](#header)** 
-   `data` **[Data](#data)** encrypted and represented by Base64UrlString
-   `files` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[EncryptedFile](#encryptedfile)>** 

## Header

Header

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `symmetricEncryption`  
-   `asymmetricEncryption`  
-   `dataEncryptionParams`  
-   `filesEncryptionParams`  
-   `filesStorageParams`  

**Properties**

-   `symmetricEncryption` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[SymmetricEncryptionWrapper](#symmetricencryptionwrapper)>** 
-   `asymmetricEncryption` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[AsymmetricEncryptionWrapper](#asymmetricencryptionwrapper)>** 
-   `encryptionParams` **[SymmetricEncryptionParams](#symmetricencryptionparams)** 
-   `filesEncryptionParams` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[FilesEncryptionParams](#filesencryptionparams)>** 
-   `filesStorageParams` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[FilesStorageParams](#filesstorageparams)>** 

## SymmetricEncryptionWrapper

Symmetric encryption wrapper

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `hint`  
-   `derivationParams`  
-   `encryptionParams`  
-   `encryptedKey`  

**Properties**

-   `hint` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `derivationParams` **[DerivationParams](#derivationparams)** 
-   `encryptionParams` **[SymmetricEncryptionParams](#symmetricencryptionparams)** 
-   `encryptedKey` **Base64UrlString** 

## AsymmetricEncryptionWrapper

Asymmetric encryption wrapper

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `id`  
-   `version`  
-   `tag`  
-   `encryptionParams`  
-   `encryptedKey`  

**Properties**

-   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `version` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `tag` **Base64UrlString** 
-   `encryptionParams` **[SymmetricEncryptionParams](#symmetricencryptionparams)** 
-   `encryptedKey` **Base64UrlString** 

## FilesEncryptionParams

Files encryption params

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `id`  
-   `encryptionParams`  

**Properties**

-   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `encryptionParams` **[SymmetricEncryptionParams](#symmetricencryptionparams)** 

## FilesStorageParams

Files storage params

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `id`  
-   `path`  
-   `service`  

**Properties**

-   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `path` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `service` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 

## Data

Data

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `text`  
-   `files`  

**Properties**

-   `text` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `files` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[FileMetadata](#filemetadata)>** 

## FileMetadata

File metadata

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `name`  
-   `size`  
-   `type`  
-   `id`  

**Properties**

-   `name` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `size` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** 
-   `type` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 

## EncryptedFile

Encrypted file

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `id`  
-   `path`  
-   `service`  
-   `data`  

**Properties**

-   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `path` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `service` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `data` **[ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)** 

## SymmetricEncryptionParams

Symmetric encryption params

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `iv`  

**Properties**

-   `iv` **Base64UrlString** 
-   `mode` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `ts` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** 
-   `adata` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 

## DerivationParams

Derivation params

Type: [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)

**Parameters**

-   `iterations`  
-   `salt`  

**Properties**

-   `iterations` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** 
-   `salt` **Base64UrlString** 

# API

## Sync

<!-- Generated by documentation.js. Update this documentation by updating the source code. -->

### deriveKey

Derives encryption key from simple text

**Parameters**

-   `password` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `$1` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** derivation params
    -   `$1.salt` **Base64UrlString** 
    -   `$1.iterations` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** 


-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a parameter is invalid

Returns **Base64UrlString** 

### createRandom

Create random string

**Parameters**

-   `bits` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** number of bits [64, 128, 256]


-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a generator isn't seeded

Returns **Base64UrlString** 

### createKey

Create encryption key of size 256 bits

-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a generator isn't seeded

Returns **Base64UrlString** 

### createIV

Create initialization vector of size 128 bits

-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a generator isn't seeded

Returns **Base64UrlString** 

### createAsymmetricKeys

Create ECC (P-521 NIST curve) public and private keys

**Parameters**

-   `privateKey` **ElGamalPrivateKey?** create the keys from specific private key

**Examples**

```javascript
const keys = CryptolizeCore.createAsymmetricKeys()
 console.log(keys.public)
 console.log(keys.private)
```

-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a parameter is invalid or generator isn't seeded

Returns **{public: ElGamalPublicKey, private: PrivateKey}** 

### createAsymmetricKeysECDSA

Create ECC (P-521 NIST curve) public and private keys for ECDSA

**Parameters**

-   `privateKey` **ECDSAPrivateKey?** create the keys from specific private key

**Examples**

```javascript
const keys = CryptolizeCore.createAsymmetricKeysECDSA()
 console.log(keys.public)
 console.log(keys.private)
```

-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a parameter is invalid or generator isn't seeded

Returns **{public: PublicKey, private: PrivateKey}** 

### signWithECDSAPrivateKey

Sign text with ECDSA private key

**Parameters**

-   `privateKey` **ECDSAPrivateKey** the key to sign with
-   `text` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** the text to sign

**Examples**

```javascript
const keys = CryptolizeCore.createAsymmetricKeysECDSA()
 const signature = CryptolizeCore.signWithECDSAPrivateKey(keys.private, 'text to sign')
```

Returns **Base64UrlString** 

### verifyWithECDSAPublicKey

Verify text with ECDSA public key

**Parameters**

-   `publicKey` **ECDSAPublicKey** the key to verify with
-   `text` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** the text to verify
-   `signature` **Base64UrlString** the signature to verify with

**Examples**

```javascript
const keys = CryptolizeCore.createAsymmetricKeysECDSA()
 const signature = CryptolizeCore.signWithECDSAPrivateKey(keys.private, 'text to sign')
 const isOk = CryptolizeCore.verifyWithECDSAPublicKey(keys.public, 'text to sign', signature)
```

Returns **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** 

### createRecordMetadata

Create record metadata

**Parameters**

-   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `creator` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** 
-   `personalPage` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** 
-   `signature` **Base64UrlString?** 
-   `signatureKeyVersion` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** 
-   `timestamp` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** 
-   `timezoneOffset` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** 
-   `isOnce` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** 
-   `expiration` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** 
-   `subject` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** 
-   `origin` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** 
-   `custom` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)?** 

Returns **RecordMetadata** 

### createEncryptionParams

Create encryption params

**Parameters**

-   `iv` **Base64UrlString** 

Returns **SymmetricEncryptionParams** 

### encryptText

Encrypt text

**Parameters**

-   `data` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `key` **Base64UrlString** 
-   `encryptionParams` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
    -   `encryptionParams.iv` **Base64UrlString** initialization vector
    -   `encryptionParams.mode` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** aes encryption mode ['ccm', 'gcm', 'ocb2']
    -   `encryptionParams.ts` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** tag size [64, 96, 128]
    -   `encryptionParams.adata` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** authenticated data to associate with the data


-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a parameter is invalid

Returns **Base64UrlString** the encrypted data

### encryptObject

Encrypt object

**Parameters**

-   `data` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
-   `key` **Base64UrlString** 
-   `encryptionParams` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
    -   `encryptionParams.iv` **Base64UrlString** initialization vector
    -   `encryptionParams.mode` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** aes encryption mode ['ccm', 'gcm', 'ocb2']
    -   `encryptionParams.ts` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** tag size [64, 96, 128]
    -   `encryptionParams.adata` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** authenticated data to associate with the data


-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a parameter is invalid

Returns **Base64UrlString** the encrypted data

### encryptKey

Encrypt key

**Parameters**

-   `data` **Base64UrlString** 
-   `key` **Base64UrlString** 
-   `encryptionParams` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
    -   `encryptionParams.iv` **Base64UrlString** initialization vector
    -   `encryptionParams.mode` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** aes encryption mode ['ccm', 'gcm', 'ocb2']
    -   `encryptionParams.ts` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** tag size [64, 96, 128]
    -   `encryptionParams.adata` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** authenticated data to associate with the data


-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a parameter is invalid

Returns **Base64UrlString** the encrypted data

### decryptText

Decrypt text

**Parameters**

-   `data` **Base64UrlString** 
-   `key` **Base64UrlString** 
-   `encryptionParams` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
    -   `encryptionParams.iv` **Base64UrlString** initialization vector
    -   `encryptionParams.mode` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** aes encryption mode ['ccm', 'gcm', 'ocb2']
    -   `encryptionParams.ts` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** tag size [64, 96, 128]
    -   `encryptionParams.adata` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** authenticated data to associate with the data


-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a parameter is invalid, data is corrupt or wrong key

Returns **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** the decrypted data

### decryptObject

Decrypt object

**Parameters**

-   `data` **Base64UrlString** 
-   `key` **Base64UrlString** 
-   `encryptionParams` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
    -   `encryptionParams.iv` **Base64UrlString** initialization vector
    -   `encryptionParams.mode` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** aes encryption mode ['ccm', 'gcm', 'ocb2']
    -   `encryptionParams.ts` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** tag size [64, 96, 128]
    -   `encryptionParams.adata` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** authenticated data to associate with the data


-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a parameter is invalid, data is corrupt or wrong key

Returns **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** the decrypted data

### decryptFile

Decrypt file

**Parameters**

-   `data` **[ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)** 
-   `decryptionKey` **Base64UrlString** 
-   `decryptionParams` **SymmetricEncryptionParams** 

**Examples**

```javascript
const keys = CryptolizeCore.createAsymmetricKeys()
 const password = 'password'
 const hint = 'hint'
 const record = CryptolizeCore.encryptRecord(..., keys.public, ..., [{ password, hint }], ...)
 const header = CryptolizeCore.decryptRecord(record, keys.private)[0]
 const key = CryptolizeCore.decryptKeyWithSymmetricEncryption(password, header)
 const file = CryptolizeCore.decryptFile(record.blocks[0].files[0].data, key, header.filesEncryptionParams[0].encryptionParams)
 console.log(file)
```

-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a parameter is invalid, data is corrupt or wrong key

Returns **[ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)** 

### decryptKey

Decrypt key

**Parameters**

-   `data` **Base64UrlString** 
-   `key` **Base64UrlString** 
-   `encryptionParams` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
    -   `encryptionParams.iv` **Base64UrlString** initialization vector
    -   `encryptionParams.mode` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** aes encryption mode ['ccm', 'gcm', 'ocb2']
    -   `encryptionParams.ts` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** tag size [64, 96, 128]
    -   `encryptionParams.adata` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** authenticated data to associate with the data


-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a parameter is invalid, data is corrupt or wrong key

Returns **Base64UrlString** the decrypted data

### encryptRecord

Encrypt record

**Parameters**

-   `headerKey` **ElGamalPublicKey** public key for header encryption
-   `metadata` **RecordMetadata** 
-   `blocks` **{text: [String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String), files: [Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;{name: [String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String), size: [Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number), type: [String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String), id: [String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String), path: [String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String), service: [String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String), data: [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)}>, passwords: [Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;{password: [String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String), hint: [String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String), iterations: [Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)}>, publicKeys: [Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;{id: [String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String), version: [String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String), key: ElGamalPublicKey}>}** 

**Examples**

```javascript
const headerKey = CryptolizeCore.createAsymmetricKeys().public

 const metadata = CryptolizeCore.createRecordMetadata(
   'id',
   'creator',
   'personalPage',
   'signature',
   'signatureKeyVersion',
   new Date().getTime(),
   new Date().getTimezoneOffset(),
   false,
   new Date().getTime(),
   'subject',
   'origin',
   {
     key1: 'value1',
     key2: 'value2'
   }
 )

 const password = { password: 'password', hint: 'hint', iterations: 100000 }
 const publicKey = { id: 'publicKeyOwnerId', version: CryptolizeCore.createAsymmetricKeys().public, key: CryptolizeCore.createAsymmetricKeys().public }
 const text = 'text'
 const file = {
   name: 'name',
   size: 1024,
   type: 'type',
   id: 'id',
   path: 'path',
   service: 'service',
   data: 'ArrayBuffer'
 }
 const block = { passwords: [password], publicKeys: [publicKey], text: 'text', files: [file] }

 const record = CryptolizeCore.encryptRecord(headerKey, metadata, [block])
 console.log(record)
```

-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a parameter is invalid

Returns **Record** the encrypted record

### decryptRecord

Decrypt record

**Parameters**

-   `record` **Record** 
-   `headerKey` **ElGamalPrivateKey** 

**Examples**

```javascript
const keys = CryptolizeCore.createAsymmetricKeys()
 const record = CryptolizeCore.encryptRecord(..., keys.public, ...)
 const headerWrapper = CryptolizeCore.decryptRecord(record, keys.private)
 console.log(headerWrapper)
```

-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a parameter is invalid, data is corrupt or wrong key

Returns **HeaderWrapper** header wrapper

### decryptKeyWithSymmetricEncryption

Decrypt key with symmetric encryption

**Parameters**

-   `password` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `header` **Header** 
    -   `header.symmetricEncryption`  

**Examples**

```javascript
const keys = CryptolizeCore.createAsymmetricKeys()
 const password = 'password'
 const hint = 'hint'
 const record = CryptolizeCore.encryptRecord(..., keys.public, ..., [{ password, hint }], ...)
 const headers = CryptolizeCore.decryptRecord(record, keys.private)
 const key = CryptolizeCore.decryptKeyWithSymmetricEncryption(password, header[0])
 console.log(key)
```

-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if the symmetricEncryption array is empty, data is corrupt or wrong password

Returns **Base64UrlString** encrypted key

### decryptKeyWithAsymmetricEncryption

Decrypt key with asymmetric encryption

**Parameters**

-   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `version` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `privateKey` **ElGamalPrivateKey** 
-   `header` **Header** 
    -   `header.asymmetricEncryption`  

**Examples**

```javascript
const headerKeys = CryptolizeCore.createAsymmetricKeys()
 const id = 'id'
 const keys = CryptolizeCore.createAsymmetricKeys()
 const password = 'password'
 const hint = 'hint'
 const record = CryptolizeCore.encryptRecord(..., headerKeys.public, ..., [{ id: id, version: keys.public, key: keys.public }], ...)
 const headers = CryptolizeCore.decryptRecord(record, headerKeys.private)
 const key = CryptolizeCore.decryptKeyWithAsymmetricEncryption(id, keys.public, keys.private, header[0])
 console.log(key)
```

-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if the asymmetricEncryption array is empty, data is corrupt or wrong keyId

Returns **Base64UrlString** encrypted key

### hasSymmetricEncryption

returns true if symmetric encryption exists, false otherwise

**Parameters**

-   `header` **Header** 
    -   `header.symmetricEncryption`  

**Examples**

```javascript
const headerKeys = CryptolizeCore.createAsymmetricKeys()
 const id = 'id'
 const keys = CryptolizeCore.createAsymmetricKeys()
 const password = 'password'
 const hint = 'hint'
 const record = CryptolizeCore.encryptRecord(..., headerKeys.public, ..., [{ id: id, version: keys.public, key: keys.public }], ...)
 const headers = CryptolizeCore.decryptRecord(record, headerKeys.private)
 const hasSymmetricEncryption = CryptolizeCore.hasSymmetricEncryption(header[0])
 console.log(hasSymmetricEncryption)
```

Returns **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** 

### hasAsymmetricEncryption

returns true if asymmetric encryption with supplied id exists, false otherwise

**Parameters**

-   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `header` **Header** 

**Examples**

```javascript
const headerKeys = CryptolizeCore.createAsymmetricKeys()
 const id = 'id'
 const keys = CryptolizeCore.createAsymmetricKeys()
 const password = 'password'
 const hint = 'hint'
 const record = CryptolizeCore.encryptRecord(..., headerKeys.public, ..., [{ id: id, version: keys.public, key: keys.public }], ...)
 const headers = CryptolizeCore.decryptRecord(record, headerKeys.private)
 const hasAsymmetricEncryption = CryptolizeCore.hasAsymmetricEncryption(id, header[0])
 console.log(hasAsymmetricEncryption)
```

Returns **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** 

### getAsymmetricEncryptionParams

returns asymmetric encryption params of the supplied id

**Parameters**

-   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-   `header` **Header** 
    -   `header.asymmetricEncryption`  

**Examples**

```javascript
const headerKeys = CryptolizeCore.createAsymmetricKeys()
 const id = 'id'
 const keys = CryptolizeCore.createAsymmetricKeys()
 const password = 'password'
 const hint = 'hint'
 const record = CryptolizeCore.encryptRecord(..., headerKeys.public, ..., [{ id: id, version: keys.public, key: keys.public }], ...)
 const headers = CryptolizeCore.decryptRecord(record, headerKeys.private)
 const asymmetricEncryptionParams = CryptolizeCore.getAsymmetricEncryptionParams(id, header[0])
 console.log(asymmetricEncryptionParams)
```

Returns **(AsymmetricEncryptionWrapper | [undefined](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined))** 

### decryptData

Decrypt data

**Parameters**

-   `data` **Base64UrlString** 
-   `decryptionKey` **Base64UrlString** 
-   `decryptionParams` **SymmetricEncryptionParams** 

**Examples**

```javascript
const keys = CryptolizeCore.createAsymmetricKeys()
 const password = 'password'
 const hint = 'hint'
 const record = CryptolizeCore.encryptRecord(..., keys.public, ..., [{ password, hint }], ...)
 const header = CryptolizeCore.decryptRecord(record, keys.private)[0]
 const key = CryptolizeCore.decryptKeyWithSymmetricEncryption(password, header)
 const data = CryptolizeCore.decryptData(record.blocks[0].data, key, header.dataEncryptionParams)
 console.log(data)
```

-   Throws **[Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)** if a parameter is invalid, data is corrupt or wrong key

Returns **Data** decrypted data

## Async

Same as the sync API (except the `createRecordMetadata` and `createEncryptionParams` functions) but with `Async` suffix (`encryptRecord` -> `encryptRecordAsync`) and the functions return Promise

Can be used in browser environment only

# Development

-   make sure node installed - install [nvm](https://github.com/creationix/nvm) if not
-   `git clone git@bitbucket.org:witalize/cryptolize-core.git`
-   `cd cryptolize-core`
-   `npm install`
-   lint code - `npm run lint`
-   run tests - `npm test`
-   run benchmarks - `npm run benchmark`
-   build from src - `npm run build`
-   update README - `npm run docs`
-   publish to npm (runs automatically tests, lint and build before) - `npm publish`
