Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ const userID = 'user ID';
const db = await openDatabase(userID);

// Derive database key
const key = await deriveIndexKey(baseKey);
const key = await deriveDatabaseKey(baseKey);

// Encrypt and store one or several emails
await encryptAndStoreEmail(email, key, db);
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "internxt-crypto",
"version": "1.0.2",
"version": "1.1.0",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"module": "dist/index.js",
Expand Down
12 changes: 11 additions & 1 deletion src/derive-key/deriveKeysFromKey.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { blake3 } from '@noble/hashes/blake3.js';
import { AES_KEY_BYTE_LENGTH, CONTEXT_DERIVE } from '../constants';
import { AES_KEY_BYTE_LENGTH, CONTEXT_DERIVE, CONTEXT_INDEX } from '../constants';
import { UTF8ToUint8 } from '../utils';

/**
Expand Down Expand Up @@ -32,3 +32,13 @@ export function deriveSymmetricKeyFromTwoKeys(key1: Uint8Array, key2: Uint8Array
throw new Error('Failed to derive symmetric key from two keys and context', { cause: error });
}
}

/**
* Derives database encryption key for the given user
*
* @param baseKey - The base key (NOT PASSWORD!)
* @returns The symmetric key for protecting database
*/
export const deriveDatabaseKey = async (baseKey: Uint8Array): Promise<Uint8Array> => {
return deriveSymmetricKeyFromContext(CONTEXT_INDEX, baseKey);
};
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export { deriveSecretKey, generateEccKeys } from './asymmetric-crypto';
export { deriveSymmetricKeyFromTwoKeys, deriveSymmetricKeyFromContext } from './derive-key';
export { deriveSymmetricKeyFromTwoKeys, deriveSymmetricKeyFromContext, deriveDatabaseKey } from './derive-key';
export { getKeyFromPassword, getKeyFromPasswordAndSalt } from './derive-password';
export {
encryptEmailHybrid,
Expand Down
5 changes: 0 additions & 5 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,6 @@ export type EncryptedKeystore = {
privateKeyEncrypted: string;
};

export type User = {
email: string;
name: string;
};

export type RecipientWithPublicKey = {
email: string;
publicHybridKey: Uint8Array;
Expand Down
10 changes: 9 additions & 1 deletion tests/derive-keys/deriveKeys.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { describe, expect, it } from 'vitest';
import { deriveSymmetricKeyFromTwoKeys, deriveSymmetricKeyFromContext } from '../../src/derive-key';
import { deriveSymmetricKeyFromTwoKeys, deriveSymmetricKeyFromContext, deriveDatabaseKey } from '../../src/derive-key';
import { uint8ArrayToHex } from '../../src/utils';
import { AES_KEY_BYTE_LENGTH } from '../../src/constants';
import { genSymmetricKey } from '../../src/symmetric-crypto';
Expand Down Expand Up @@ -38,4 +38,12 @@ describe('Test derive key', () => {
/Failed to derive symmetric key from two keys/,
);
});

it('should derive symmetric key for database encryption', async () => {
const baseKey = genSymmetricKey();
const key = await deriveDatabaseKey(baseKey);
expect(key.length).toBe(AES_KEY_BYTE_LENGTH);
const key2 = await deriveDatabaseKey(baseKey);
expect(key2).toStrictEqual(key);
});
});
Loading