diff --git a/README.md b/README.md index 060b1e9..39eab23 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,15 @@ -# TS Project (Template for TypeScript) +# CUBETIQ CryptoJS -[![Build Status](https://dci.osa.cubetiqs.com/api/badges/CUBETIQ/ts-project/status.svg)](https://dci.osa.cubetiqs.com/CUBETIQ/ts-project) +- Default Encryption +- E2E Encryption -- TypeScript -- TS Node Dev -- Husky -- Prettier -- ESLint +### Generate for Default Encryption -... +```js +const key = crypto.randomBytes(32) +const iv = crypto.randomBytes(16) +``` ### Contributors -- Sambo Chea \ No newline at end of file + +- Sambo Chea diff --git a/package.json b/package.json index 3dcc640..a2d2776 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "@cubetiq/ts-project", + "name": "@cubetiq/cryptojs", "version": "1.0.0", - "description": "TS project template", + "description": "A basic cryptojs for cubetiq application data encryption and protection.", "main": "dist/index.js", "scripts": { "start": "ts-node-dev --respawn --transpile-only src/index.ts", @@ -12,11 +12,13 @@ }, "repository": { "type": "git", - "url": "https://git.cubetiqs.com/CUBETIQ/ts-project.git" + "url": "https://git.cubetiqs.com/CUBETIQ/cubetiq-cryptojs.git" }, "keywords": [ "TypeScript", - "Nodejs" + "Nodejs", + "Crypto", + "Encryption" ], "author": "Sambo Chea ", "license": "ISC", diff --git a/src/config/index.ts b/src/config/index.ts new file mode 100644 index 0000000..8aeb435 --- /dev/null +++ b/src/config/index.ts @@ -0,0 +1,3 @@ +export const DEFAULT_AES_ALGORITHM = "aes-256-cbc" +export const DEFAULT_BUFFER_TYPE = "base64" +export const DEFAULT_ENCODING_TYPE = "utf-8" diff --git a/src/crypto/default-crypto.ts b/src/crypto/default-crypto.ts new file mode 100644 index 0000000..25907fd --- /dev/null +++ b/src/crypto/default-crypto.ts @@ -0,0 +1,43 @@ +import * as crypto from "crypto" +import { + DEFAULT_AES_ALGORITHM, + DEFAULT_BUFFER_TYPE, + DEFAULT_ENCODING_TYPE, +} from "../config" +import { stringToBuffer } from "../util" + +const encrypt = ( + data: string, + key: string | Buffer, + iv?: string | Buffer | null +): string => { + const cipher = crypto.createCipheriv( + DEFAULT_AES_ALGORITHM, + stringToBuffer(key), + stringToBuffer(iv || key) + ) + let encrypted = cipher.update( + data, + DEFAULT_ENCODING_TYPE, + DEFAULT_BUFFER_TYPE + ) + encrypted += cipher.final(DEFAULT_BUFFER_TYPE) + return encrypted +} + +const decrypt = (data: string, key: Buffer, iv?: Buffer | null): string => { + const decipher = crypto.createDecipheriv( + DEFAULT_AES_ALGORITHM, + stringToBuffer(key), + stringToBuffer(iv || key) + ) + let decrypted = decipher.update( + data, + DEFAULT_BUFFER_TYPE, + DEFAULT_ENCODING_TYPE + ) + decrypted += decipher.final(DEFAULT_ENCODING_TYPE) + return decrypted +} + +export { encrypt, decrypt } diff --git a/src/crypto/e2e-crypto.ts b/src/crypto/e2e-crypto.ts new file mode 100644 index 0000000..1d22551 --- /dev/null +++ b/src/crypto/e2e-crypto.ts @@ -0,0 +1,30 @@ +import * as crypto from "crypto" + +import { DEFAULT_BUFFER_TYPE, DEFAULT_ENCODING_TYPE } from "../config" +import { readFileString, stringToBuffer } from "../util" + +const encrypt = (data: string | Buffer, privOrPubKeyPath: string): string => { + const key = readFileString(privOrPubKeyPath) + const buffer = stringToBuffer(data) + const encrypted = crypto.publicEncrypt(key, buffer) + return encrypted.toString(DEFAULT_BUFFER_TYPE) +} + +const decrypt = ( + data: string | Buffer, + privateKeyPath: string, + passphrase?: string | null +): string => { + const key = readFileString(privateKeyPath) + const buffer = stringToBuffer(data) + const decrypted = crypto.privateDecrypt( + { + key: key, + passphrase: passphrase || "", + }, + buffer + ) + return decrypted.toString(DEFAULT_ENCODING_TYPE) +} + +export { encrypt, decrypt } diff --git a/src/crypto/index.ts b/src/crypto/index.ts new file mode 100644 index 0000000..5e5b39e --- /dev/null +++ b/src/crypto/index.ts @@ -0,0 +1,4 @@ +import { decrypt, encrypt } from "./default-crypto" +import { encrypt as e2eEncrypt, decrypt as e2eDecrypt } from "./e2e-crypto" + +export { encrypt, decrypt, e2eEncrypt, e2eDecrypt } diff --git a/src/index.ts b/src/index.ts index 8cc3c7e..336ce12 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1 @@ -console.log('Welcome to TS Project!'); \ No newline at end of file +export {} diff --git a/src/util/file.util.ts b/src/util/file.util.ts new file mode 100644 index 0000000..496cb36 --- /dev/null +++ b/src/util/file.util.ts @@ -0,0 +1,10 @@ +import * as fs from "fs" +import * as path from "path" +import { DEFAULT_ENCODING_TYPE } from "../config" + +export const readFileStringDefaultEncoding = ( + relativeFilePath: string +): string => { + const absolutePath = path.resolve(relativeFilePath) + return fs.readFileSync(absolutePath, DEFAULT_ENCODING_TYPE) +} diff --git a/src/util/index.ts b/src/util/index.ts new file mode 100644 index 0000000..1afd556 --- /dev/null +++ b/src/util/index.ts @@ -0,0 +1,12 @@ +import { DEFAULT_BUFFER_TYPE } from "../config" +import { readFileStringDefaultEncoding } from "./file.util" + +const stringToBuffer = (data: string | Buffer): Buffer => { + if (data instanceof Buffer) { + return data + } else { + return Buffer.from(data, DEFAULT_BUFFER_TYPE) + } +} + +export { readFileStringDefaultEncoding as readFileString, stringToBuffer }