Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
it('correctly serializes/deserializes a UserGroupCreation test vector', async () => {
const userGroupCreation = {
public_signature_key: makeUint8Array('pub sig key', tcrypto.SIGNATURE_PUBLIC_KEY_SIZE),
public_encryption_key: makeUint8Array('pub enc key', tcrypto.ENCRYPTION_PUBLIC_KEY_SIZE),
encrypted_group_private_signature_key: makeUint8Array('encrypted priv sig key', tcrypto.SEALED_SIGNATURE_PRIVATE_KEY_SIZE),
encrypted_group_private_encryption_keys_for_users: [
{
public_user_encryption_key: makeUint8Array('pub user key', tcrypto.ENCRYPTION_PUBLIC_KEY_SIZE),
encrypted_group_private_encryption_key: makeUint8Array('encrypted group priv key', tcrypto.SEALED_ENCRYPTION_PRIVATE_KEY_SIZE),
},
{
public_user_encryption_key: makeUint8Array('second pub user key', tcrypto.ENCRYPTION_PUBLIC_KEY_SIZE),
encrypted_group_private_encryption_key: makeUint8Array('second encrypted group priv key', tcrypto.SEALED_ENCRYPTION_PRIVATE_KEY_SIZE),
}],
self_signature: makeUint8Array('self signature', tcrypto.SIGNATURE_SIZE),
};
const payload = new Uint8Array([
// public signature key
it('correctly deserializes a ProvisionalIdentityClaim test vector', async () => {
const provisionalIdentityClaim = {
user_id: makeUint8Array('the user id', tcrypto.HASH_SIZE),
app_provisional_identity_signature_public_key: makeUint8Array('the app sig pub key', tcrypto.SIGNATURE_PUBLIC_KEY_SIZE),
tanker_provisional_identity_signature_public_key: makeUint8Array('the tanker sig pub key', tcrypto.SIGNATURE_PUBLIC_KEY_SIZE),
author_signature_by_app_key: makeUint8Array('the author sig by app key', tcrypto.SIGNATURE_SIZE),
author_signature_by_tanker_key: makeUint8Array('the author sig by tanker key', tcrypto.SIGNATURE_SIZE),
recipient_user_public_key: makeUint8Array('user pub key', tcrypto.ENCRYPTION_PUBLIC_KEY_SIZE),
encrypted_provisional_identity_private_keys: makeUint8Array('both encrypted private keys', tcrypto.ENCRYPTION_PRIVATE_KEY_SIZE * 2
+ tcrypto.SEAL_OVERHEAD),
};
const payload = new Uint8Array([
// UserID
0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x69, 0x64, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// AppProvisionalIdentitySignaturePublicKey
0x74, 0x68, 0x65, 0x20,
0x61, 0x70, 0x70, 0x20, 0x73, 0x69, 0x67, 0x20, 0x70, 0x75, 0x62, 0x20,
0x6b, 0x65, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
function _generateAppId(appSecret: Uint8Array): b64string { // eslint-disable-line no-underscore-dangle
const publicKey = appSecret.subarray(tcrypto.SIGNATURE_PRIVATE_KEY_SIZE - tcrypto.SIGNATURE_PUBLIC_KEY_SIZE, tcrypto.SIGNATURE_PRIVATE_KEY_SIZE);
return utils.toBase64(utils.generateAppID(publicKey));
}
describe('KeyStore', () => {
let dbName;
let keystoreConfig;
let datastore;
let secret;
const { schemas } = KeyStore;
const fakeDevice = {
deviceId: random(tcrypto.HASH_SIZE),
devicePublicEncryptionKey: random(tcrypto.ENCRYPTION_PUBLIC_KEY_SIZE),
devicePublicSignatureKey: random(tcrypto.SIGNATURE_PUBLIC_KEY_SIZE),
isGhostDevice: true,
revoked: true,
};
beforeEach(async () => {
dbName = `keystore-test-${makePrefix()}`;
keystoreConfig = { ...dataStoreConfig, dbName, schemas };
datastore = await openDataStore(keystoreConfig);
secret = createUserSecretBinary('trustchainid', 'bob');
});
it('creates a safe when first opened that can be re-opened later', async () => {
const keystore1 = await KeyStore.open(datastore, secret);
const keys1 = keystore1.localData;
await datastore.close();
it('order stuff correctly for UserGroupCreationV1 sign data', async () => {
const record: UserGroupCreationRecordV1 = {
public_signature_key: random(tcrypto.SIGNATURE_PUBLIC_KEY_SIZE),
public_encryption_key: random(tcrypto.ENCRYPTION_PUBLIC_KEY_SIZE),
encrypted_group_private_signature_key: random(tcrypto.SEALED_SIGNATURE_PRIVATE_KEY_SIZE),
encrypted_group_private_encryption_keys_for_users: [
{
public_user_encryption_key: random(tcrypto.ENCRYPTION_PUBLIC_KEY_SIZE),
encrypted_group_private_encryption_key: random(tcrypto.SEALED_ENCRYPTION_PRIVATE_KEY_SIZE),
},
{
public_user_encryption_key: random(tcrypto.ENCRYPTION_PUBLIC_KEY_SIZE),
encrypted_group_private_encryption_key: random(tcrypto.SEALED_ENCRYPTION_PRIVATE_KEY_SIZE),
}],
self_signature: new Uint8Array(0),
};
const expectedSignData = utils.concatArrays(
record.public_signature_key,
it('correctly serializes/deserializes a KeyPublish to provisional user test vector', async () => {
const keyPublish = {
recipientAppPublicKey: makeUint8Array('recipient user', tcrypto.SIGNATURE_PUBLIC_KEY_SIZE),
recipientTankerPublicKey: makeUint8Array('', tcrypto.SIGNATURE_PUBLIC_KEY_SIZE),
resourceId: makeUint8Array('resource mac', tcrypto.MAC_SIZE),
key: makeUint8Array('encrypted key...', tcrypto.TWO_TIMES_SEALED_KEY_SIZE),
};
const payload = new Uint8Array([
0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x75, 0x73, 0x65, 0x72, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x6d, 0x61, 0x63, 0x00, 0x00, 0x00, 0x00,
0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x20, 0x6b, 0x65, 0x79, 0x2e, 0x2e, 0x2e,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
it('throws when getting a group that does not exist', async () => {
await expect(groupManager.getGroups([new Uint8Array(tcrypto.SIGNATURE_PUBLIC_KEY_SIZE)])).to.be.rejectedWith(InvalidArgument);
});
function checkProvisionalGroupEncryptedKeyV2(blockType: string, key: ProvisionalGroupEncryptedKeyV2): void {
if (key.app_provisional_user_public_signature_key.length !== tcrypto.SIGNATURE_PUBLIC_KEY_SIZE)
throw new InternalError(`Assertion error: invalid ${blockType} app signature public key size`);
if (key.tanker_provisional_user_public_signature_key.length !== tcrypto.SIGNATURE_PUBLIC_KEY_SIZE)
throw new InternalError(`Assertion error: invalid ${blockType} tanker signature public key size`);
if (key.encrypted_group_private_encryption_key.length !== tcrypto.TWO_TIMES_SEALED_KEY_SIZE)
throw new InternalError(`Assertion error: invalid ${blockType} encrypted group private encryption key size`);
}
export function serializeUserDeviceV3(userDevice: DeviceCreationRecord): Uint8Array {
if (!utils.equalArray(userDevice.last_reset, new Uint8Array(tcrypto.HASH_SIZE)))
throw new InternalError('Assertion error: user device last reset must be null');
if (userDevice.ephemeral_public_signature_key.length !== tcrypto.SIGNATURE_PUBLIC_KEY_SIZE)
throw new InternalError('Assertion error: invalid user device ephemeral public signature key size');
if (userDevice.user_id.length !== tcrypto.HASH_SIZE)
throw new InternalError('Assertion error: invalid user device user id size');
if (userDevice.delegation_signature.length !== tcrypto.SIGNATURE_SIZE)
throw new InternalError('Assertion error: invalid user device delegation signature size');
if (userDevice.public_signature_key.length !== tcrypto.SIGNATURE_PUBLIC_KEY_SIZE)
throw new InternalError('Assertion error: invalid user device public signature key size');
if (userDevice.public_encryption_key.length !== tcrypto.ENCRYPTION_PUBLIC_KEY_SIZE)
throw new InternalError('Assertion error: invalid user device public encryption key size');
if (!userDevice.user_key_pair)
throw new InternalError('Assertion error: invalid user device user key pair');
if (userDevice.user_key_pair.public_encryption_key.length !== tcrypto.ENCRYPTION_PUBLIC_KEY_SIZE)
throw new InternalError('Assertion error: invalid user device user public encryption key size');
if (userDevice.user_key_pair.encrypted_private_encryption_key.length !== tcrypto.SEALED_KEY_SIZE)
throw new InternalError('Assertion error: invalid user device user encrypted private encryption key size');
const deviceFlags = new Uint8Array(1);
deviceFlags[0] = userDevice.is_ghost_device ? 1 : 0;
return utils.concatArrays(
userDevice.ephemeral_public_signature_key,
userDevice.user_id,
export function serializeUserGroupCreationV2(userGroupCreation: UserGroupCreationRecordV2): Uint8Array {
if (userGroupCreation.public_signature_key.length !== tcrypto.SIGNATURE_PUBLIC_KEY_SIZE)
throw new InternalError('Assertion error: invalid user group creation group public signature key size');
if (userGroupCreation.public_encryption_key.length !== tcrypto.ENCRYPTION_PUBLIC_KEY_SIZE)
throw new InternalError('Assertion error: invalid user group creation group public encryption key size');
if (userGroupCreation.encrypted_group_private_signature_key.length !== tcrypto.SEALED_SIGNATURE_PRIVATE_KEY_SIZE)
throw new InternalError('Assertion error: invalid user group creation encrypted group private signature key size');
userGroupCreation.encrypted_group_private_encryption_keys_for_users.forEach(k => checkGroupEncryptedKeyV2('user group creation V2', k));
userGroupCreation.encrypted_group_private_encryption_keys_for_provisional_users.forEach(k => checkProvisionalGroupEncryptedKeyV2('user group creation V2', k));
if (userGroupCreation.self_signature.length !== tcrypto.SIGNATURE_SIZE)
throw new InternalError('Assertion error: invalid user group creation group self signature size');
return utils.concatArrays(
userGroupCreation.public_signature_key,
userGroupCreation.public_encryption_key,
userGroupCreation.encrypted_group_private_signature_key,
encodeListLength(userGroupCreation.encrypted_group_private_encryption_keys_for_users),
...userGroupCreation.encrypted_group_private_encryption_keys_for_users.map(serializeGroupEncryptedKeyV2),