import { AsymmetricDataEncryptor, EncryptedData } from "./asymmetric-data-encryptor"; import { AsymmetricDataSigner, SignedData } from "./asymmetric-data-signer"; import { ApplicationDataEncryptor, ApplicationDataEncryptorI } from "./application-data-encryptor"; import { JSONValue } from "encoding/json/types"; import { ExportedKey } from "encoding/key"; export interface DataEncryptorI { encrypt(jsonableObj: JSONValue): Promise; decrypt(encryptedData: EncryptedData): Promise; update( newData: JSONValue, existingEncryptedObject: EncryptedData, encryptedKeyOverride?: string ): Promise; share( encryptedObject: EncryptedData, publicKeyObj: JsonWebKey ): Promise; exportPublicKey(): Promise; sign(jsonableInput: JSONValue): Promise; verify(signedObject: SignedData): Promise; verifyAgainst( publicKeyObj: ExportedKey, signedObject: SignedData ): Promise; createApplicationEncryptor(): Promise; loadApplicationEncryptorForEncryption( publicKeyObj: JsonWebKey ): Promise; loadApplicationEncryptorForDecryption( publicKeyObj: JsonWebKey, encryptedPrivateKey: EncryptedData ): Promise; } export function DataEncryptor( encryptionKeyPair: CryptoKeyPair, signingKeyPair: CryptoKeyPair ): DataEncryptorI { const asymmetricDataEncryptor = AsymmetricDataEncryptor(encryptionKeyPair); const asymmetricDataSigner = AsymmetricDataSigner(signingKeyPair); return { // Symmetric key encryption encrypt: asymmetricDataEncryptor.encrypt, decrypt: asymmetricDataEncryptor.decrypt, update: asymmetricDataEncryptor.update, share: asymmetricDataEncryptor.share, exportPublicKey: asymmetricDataEncryptor.exportPublicKey, // Asymmetric key signing sign: asymmetricDataSigner.sign, verify: asymmetricDataSigner.verify, verifyAgainst: AsymmetricDataSigner.verifyAgainst, // Application related stuff createApplicationEncryptor: ApplicationDataEncryptor.create, loadApplicationEncryptorForEncryption: ApplicationDataEncryptor.loadForEncryption, loadApplicationEncryptorForDecryption: function( publicKey: JsonWebKey, encryptedPrivateKey: EncryptedData ): Promise { return ApplicationDataEncryptor.loadForDecryption( publicKey, encryptionKeyPair.privateKey, encryptedPrivateKey ); } }; } DataEncryptor.getDefaultAsymmetricEncryptionAlgorithm = AsymmetricDataEncryptor.getDefaultAlgorithm; DataEncryptor.generateAsymmetricEncryptionKeyPair = AsymmetricDataEncryptor.generateKeyPair; DataEncryptor.getDefaultSigningAlgorithm = AsymmetricDataSigner.getDefaultAlgorithm; DataEncryptor.generateSigningKeyPair = AsymmetricDataSigner.generateKeyPair;