Skip to content
This repository has been archived by the owner on Feb 2, 2024. It is now read-only.

feat: add cipher for async and sync #34

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions src/AsyncCryptor.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
import CryptoJSCore from 'crypto-js/core'
import AES from 'crypto-js/aes'
import Stream from 'readable-stream'
import { makeConfig } from './helpers'

export default class AsyncCryptor {
constructor(secretKey) {
const salt = CryptoJSCore.lib.WordArray.random(8)
const cipher = CryptoJSCore.kdf.OpenSSL.execute(secretKey, 8, 4, salt)
constructor(secretKey, configParam) {
this.key = CryptoJSCore.enc.Utf8.parse(secretKey)
this.cryptorParams = {
iv: cipher.iv
}
this.cryptorParams = makeConfig(configParam)
}

encrypt(state) {
Expand Down
6 changes: 4 additions & 2 deletions src/async.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { createTransform } from 'redux-persist'
import CryptoJSCore from 'crypto-js/core'
import { makeEncryptor, makeDecryptor } from './helpers'
import { makeEncryptor, makeDecryptor, makeConfig } from './helpers'
import AsyncCryptor from './AsyncCryptor'

const makeAsyncEncryptor = cryptor =>
Expand All @@ -23,7 +23,9 @@ export default config => {
'redux-persist-transform-encrypt: async support is still a work in progress.'
)
}
const asyncCryptor = new AsyncCryptor(config.secretKey)
config.cypher = true
const configParam = makeConfig(config)
const asyncCryptor = new AsyncCryptor(config.secretKey, configParam)
const inbound = makeAsyncEncryptor(asyncCryptor)
const outbound = makeAsyncDecryptor(asyncCryptor)
return createTransform(inbound, outbound, config)
Expand Down
19 changes: 19 additions & 0 deletions src/helpers.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import stringify from 'json-stringify-safe'
import CryptoJSCore from 'crypto-js'

export const handleError = (handler, err) => {
if (typeof handler === 'function') {
Expand Down Expand Up @@ -30,3 +31,21 @@ export const makeDecryptor = (transform, onError) => (state, key) => {
return null
}
}

export const makeConfig = config => {
if (config.cipher || config.mode || config.padding) {
const salt = CryptoJSCore.lib.WordArray.random(128 / 8)
const cipher = CryptoJSCore.kdf.OpenSSL.execute(
config.secretKey,
256 / 32,
128 / 32,
salt
)
return {
iv: cipher.iv,
mode: config.mode || CryptoJSCore.mode.ECB,
padding: config.padding || CryptoJSCore.pad.Pkcs7
}
}
return {}
}
19 changes: 12 additions & 7 deletions src/sync.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { createTransform } from 'redux-persist'
import CryptoJSCore from 'crypto-js/core'
import AES from 'crypto-js/aes'
import { makeEncryptor, makeDecryptor } from './helpers'
import { makeEncryptor, makeDecryptor, makeConfig } from './helpers'

const makeSyncEncryptor = secretKey =>
makeEncryptor(state => AES.encrypt(state, secretKey).toString())
const makeSyncEncryptor = (secretKey, cfg) =>
makeEncryptor(state => AES.encrypt(state, secretKey, cfg).toString())

const makeSyncDecryptor = (secretKey, onError) =>
const makeSyncDecryptor = (secretKey, onError, cfg) =>
makeDecryptor(state => {
try {
const bytes = AES.decrypt(state, secretKey)
const bytes = AES.decrypt(state, secretKey, cfg)
const decryptedString = bytes.toString(CryptoJSCore.enc.Utf8)
return JSON.parse(decryptedString)
} catch (err) {
Expand All @@ -20,7 +20,12 @@ const makeSyncDecryptor = (secretKey, onError) =>
}, onError)

export default config => {
const inbound = makeSyncEncryptor(config.secretKey)
const outbound = makeSyncDecryptor(config.secretKey, config.onError)
const configParam = makeConfig(config)
const inbound = makeSyncEncryptor(config.secretKey, configParam)
const outbound = makeSyncDecryptor(
config.secretKey,
config.onError,
configParam
)
return createTransform(inbound, outbound, config)
}