mirror of
https://github.com/cupcakearmy/cryptgeon.git
synced 2024-12-23 16:56:28 +00:00
Nicco
d7e5a34b14
* move to packages * update deps * update deps * actions maintenance * don't use blob * cli * fix default import * use synthetic default imports * remove comment * cli packaging * node 18 guard * packages * build system * testing * test pipeline * pipelines * changelog * version bump * update locales * update deps * update deps * update dependecies
62 lines
1.9 KiB
TypeScript
62 lines
1.9 KiB
TypeScript
import { AES, Bytes, type TypedArray } from 'occulto'
|
|
import type { EncryptedFileDTO, FileDTO } from './api'
|
|
|
|
abstract class CryptAdapter<T> {
|
|
abstract encrypt(plaintext: T, key: TypedArray): Promise<string>
|
|
abstract decrypt(ciphertext: string, key: TypedArray): Promise<T>
|
|
}
|
|
|
|
class CryptTextAdapter implements CryptAdapter<string> {
|
|
async encrypt(plaintext: string, key: TypedArray) {
|
|
return await AES.encrypt(Bytes.encode(plaintext), key)
|
|
}
|
|
async decrypt(ciphertext: string, key: TypedArray) {
|
|
return Bytes.decode(await AES.decrypt(ciphertext, key))
|
|
}
|
|
}
|
|
|
|
class CryptBlobAdapter implements CryptAdapter<TypedArray> {
|
|
async encrypt(plaintext: TypedArray, key: TypedArray) {
|
|
return await AES.encrypt(plaintext, key)
|
|
}
|
|
|
|
async decrypt(ciphertext: string, key: TypedArray) {
|
|
return await AES.decrypt(ciphertext, key)
|
|
// const plaintext = await AES.decrypt(ciphertext, key)
|
|
// return new Blob([plaintext], { type: 'application/octet-stream' })
|
|
}
|
|
}
|
|
|
|
class CryptFilesAdapter implements CryptAdapter<FileDTO[]> {
|
|
async encrypt(plaintext: FileDTO[], key: TypedArray) {
|
|
const adapter = new CryptBlobAdapter()
|
|
const data: Promise<EncryptedFileDTO>[] = plaintext.map(async (file) => ({
|
|
name: file.name,
|
|
size: file.size,
|
|
type: file.type,
|
|
contents: await adapter.encrypt(file.contents, key),
|
|
}))
|
|
return JSON.stringify(await Promise.all(data))
|
|
}
|
|
|
|
async decrypt(ciphertext: string, key: TypedArray) {
|
|
const adapter = new CryptBlobAdapter()
|
|
const data: EncryptedFileDTO[] = JSON.parse(ciphertext)
|
|
const files: FileDTO[] = await Promise.all(
|
|
data.map(async (file) => ({
|
|
name: file.name,
|
|
size: file.size,
|
|
type: file.type,
|
|
contents: await adapter.decrypt(file.contents, key),
|
|
}))
|
|
)
|
|
return files
|
|
}
|
|
}
|
|
|
|
export const Adapters = {
|
|
Text: new CryptTextAdapter(),
|
|
Blob: new CryptBlobAdapter(),
|
|
Files: new CryptFilesAdapter(),
|
|
}
|