UNPKG

pooja-docucomb-tink-crypto

Version:

A multi-language, cross-platform library that provides cryptographic APIs that are secure, easy to use correctly, and hard(er) to misuse.

119 lines (100 loc) 3.81 kB
/** * @license * Copyright 2020 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import * as Random from '../subtle/random'; import {assertMessageEquals} from '../testing/internal/test_utils'; import {BinaryKeysetReader} from './binary_keyset_reader'; import {PbKeyData, PbKeyset, PbKeysetKey, PbKeyStatusType, PbOutputPrefixType} from './proto'; describe('binary keyset reader test', function() { it('read, invalid serialized keyset proto', function() { for (let i = 0; i < 2; i++) { // The Uint8Array is not a serialized keyset. const reader = BinaryKeysetReader.withUint8Array(new Uint8Array(i)); try { reader.read(); fail('An exception should be thrown.'); } catch (e: any) { expect(e.toString()).toBe(ExceptionText.invalidSerialization()); } } }); it('read', function() { // Create keyset proto and serialize it. const keyset = new PbKeyset(); // The for cycle starts from 1 as setting any proto value to 0 sets it to // null and after serialization and deserialization null is changed to // undefined and the assertion at the end fails (unless you compare the // keyset and newly created keyset value by value). for (let i = 1; i < 20; i++) { let outputPrefix; switch (i % 3) { case 0: outputPrefix = PbOutputPrefixType.TINK; break; case 1: outputPrefix = PbOutputPrefixType.RAW; break; default: outputPrefix = PbOutputPrefixType.LEGACY; } keyset.addKey(createDummyKeysetKey( /* keyId = */ i, outputPrefix, /* enabled = */ i % 4 < 3)); } keyset.setPrimaryKeyId(1); const serializedKeyset = keyset.serializeBinary(); // Read the keyset proto serialization. const reader = BinaryKeysetReader.withUint8Array(serializedKeyset); const keysetFromReader = reader.read(); // Test that it returns the same object as was created. assertMessageEquals(keysetFromReader, keyset); }); it('read encrypted, not implemented yet', function() { const reader = BinaryKeysetReader.withUint8Array(new Uint8Array(10)); try { reader.readEncrypted(); fail('An exception should be thrown.'); } catch (e: any) { expect(e.toString()).toBe(ExceptionText.notImplemented()); } }); }); //////////////////////////////////////////////////////////////////////////////// // helper functions and classes for tests //////////////////////////////////////////////////////////////////////////////// /** * Class which holds texts for each type of exception. * @final */ class ExceptionText { static notImplemented(): string { return 'SecurityException: Not implemented yet.'; } static nullKeyset(): string { return 'SecurityException: Serialized keyset has to be non-null.'; } static invalidSerialization(): string { return 'SecurityException: Could not parse the given serialized proto as ' + 'a keyset proto.'; } } /** Function for creating keys for testing purposes. */ function createDummyKeysetKey( keyId: number, outputPrefix: PbOutputPrefixType, enabled: boolean): PbKeysetKey { const key = new PbKeysetKey(); if (enabled) { key.setStatus(PbKeyStatusType.ENABLED); } else { key.setStatus(PbKeyStatusType.DISABLED); } key.setOutputPrefixType(outputPrefix); key.setKeyId(keyId); // Set some key data. key.setKeyData(new PbKeyData()); key.getKeyData()?.setTypeUrl('SOME_KEY_TYPE_URL_' + keyId.toString()); key.getKeyData()?.setKeyMaterialType(PbKeyData.KeyMaterialType.SYMMETRIC); key.getKeyData()?.setValue(Random.randBytes(10)); return key; }