use of com.google.crypto.tink.StreamingAead in project tink by google.
the class StreamingAeadWrapperTest method testMultipleKeys.
@Test
public void testMultipleKeys() throws Exception {
byte[] primaryKeyValue = Random.randBytes(KDF_KEY_SIZE);
byte[] otherKeyValue = Random.randBytes(KDF_KEY_SIZE);
byte[] anotherKeyValue = Random.randBytes(KDF_KEY_SIZE);
int derivedKeySize = AES_KEY_SIZE;
Key primaryKey = TestUtil.createKey(TestUtil.createAesGcmHkdfStreamingKeyData(primaryKeyValue, derivedKeySize, 512), 42, KeyStatusType.ENABLED, OutputPrefixType.RAW);
// Another key with a smaller segment size than the primary key
Key otherKey = TestUtil.createKey(TestUtil.createAesCtrHmacStreamingKeyData(otherKeyValue, derivedKeySize, 256), 43, KeyStatusType.ENABLED, OutputPrefixType.RAW);
// Another key with a larger segment size than the primary key
Key anotherKey = TestUtil.createKey(TestUtil.createAesGcmHkdfStreamingKeyData(anotherKeyValue, derivedKeySize, 1024), 72, KeyStatusType.ENABLED, OutputPrefixType.RAW);
PrimitiveSet<StreamingAead> primitives = TestUtil.createPrimitiveSet(TestUtil.createKeyset(primaryKey, otherKey, anotherKey), StreamingAead.class);
StreamingAead streamingAead = new StreamingAeadWrapper().wrap(primitives);
StreamingAead primaryAead = new StreamingAeadWrapper().wrap(TestUtil.createPrimitiveSet(TestUtil.createKeyset(primaryKey), StreamingAead.class));
StreamingAead otherAead = new StreamingAeadWrapper().wrap(TestUtil.createPrimitiveSet(TestUtil.createKeyset(otherKey), StreamingAead.class));
StreamingAead anotherAead = new StreamingAeadWrapper().wrap(TestUtil.createPrimitiveSet(TestUtil.createKeyset(anotherKey), StreamingAead.class));
StreamingTestUtil.testEncryptionAndDecryption(streamingAead, streamingAead);
StreamingTestUtil.testEncryptionAndDecryption(streamingAead, primaryAead);
StreamingTestUtil.testEncryptionAndDecryption(primaryAead, streamingAead);
StreamingTestUtil.testEncryptionAndDecryption(otherAead, streamingAead);
StreamingTestUtil.testEncryptionAndDecryption(anotherAead, streamingAead);
StreamingTestUtil.testEncryptionAndDecryption(primaryAead, primaryAead);
StreamingTestUtil.testEncryptionAndDecryption(otherAead, otherAead);
StreamingTestUtil.testEncryptionAndDecryption(anotherAead, anotherAead);
IOException expected = assertThrows(IOException.class, () -> StreamingTestUtil.testEncryptionAndDecryption(otherAead, primaryAead));
assertExceptionContains(expected, "No matching key");
IOException expected2 = assertThrows(IOException.class, () -> StreamingTestUtil.testEncryptionAndDecryption(anotherAead, primaryAead));
assertExceptionContains(expected2, "No matching key");
}
use of com.google.crypto.tink.StreamingAead in project tink by google.
the class StreamingAeadIntegrationTest method testBasicAesCtrHmacStreamingAead.
@Test
public void testBasicAesCtrHmacStreamingAead() throws Exception {
byte[] keyValue = Random.randBytes(KDF_KEY_SIZE);
int derivedKeySize = AES_KEY_SIZE;
int ciphertextSegmentSize = 128;
KeysetHandle keysetHandle = TestUtil.createKeysetHandle(TestUtil.createKeyset(TestUtil.createKey(TestUtil.createAesCtrHmacStreamingKeyData(keyValue, derivedKeySize, ciphertextSegmentSize), 42, KeyStatusType.ENABLED, OutputPrefixType.RAW)));
StreamingAead streamingAead = keysetHandle.getPrimitive(StreamingAead.class);
StreamingTestUtil.testEncryptionAndDecryption(streamingAead);
}
use of com.google.crypto.tink.StreamingAead in project tink by google.
the class StreamingAeadIntegrationTest method testMultipleKeys.
@Test
public void testMultipleKeys() throws Exception {
byte[] primaryKeyValue = Random.randBytes(KDF_KEY_SIZE);
byte[] otherKeyValue = Random.randBytes(KDF_KEY_SIZE);
byte[] anotherKeyValue = Random.randBytes(KDF_KEY_SIZE);
int derivedKeySize = AES_KEY_SIZE;
Key primaryKey = TestUtil.createKey(TestUtil.createAesGcmHkdfStreamingKeyData(primaryKeyValue, derivedKeySize, 512), 42, KeyStatusType.ENABLED, OutputPrefixType.RAW);
// Another key with a smaller segment size than the primary key
Key otherKey = TestUtil.createKey(TestUtil.createAesCtrHmacStreamingKeyData(otherKeyValue, derivedKeySize, 256), 43, KeyStatusType.ENABLED, OutputPrefixType.RAW);
// Another key with a larger segment size than the primary key
Key anotherKey = TestUtil.createKey(TestUtil.createAesGcmHkdfStreamingKeyData(anotherKeyValue, derivedKeySize, 1024), 72, KeyStatusType.ENABLED, OutputPrefixType.RAW);
KeysetHandle keysetHandle = TestUtil.createKeysetHandle(TestUtil.createKeyset(primaryKey, otherKey, anotherKey));
StreamingAead streamingAead = keysetHandle.getPrimitive(StreamingAead.class);
StreamingAead primaryAead = TestUtil.createKeysetHandle(TestUtil.createKeyset(primaryKey)).getPrimitive(StreamingAead.class);
StreamingAead otherAead = TestUtil.createKeysetHandle(TestUtil.createKeyset(otherKey)).getPrimitive(StreamingAead.class);
StreamingAead anotherAead = TestUtil.createKeysetHandle(TestUtil.createKeyset(anotherKey)).getPrimitive(StreamingAead.class);
StreamingTestUtil.testEncryptionAndDecryption(streamingAead, streamingAead);
StreamingTestUtil.testEncryptionAndDecryption(streamingAead, primaryAead);
StreamingTestUtil.testEncryptionAndDecryption(primaryAead, streamingAead);
StreamingTestUtil.testEncryptionAndDecryption(otherAead, streamingAead);
StreamingTestUtil.testEncryptionAndDecryption(anotherAead, streamingAead);
StreamingTestUtil.testEncryptionAndDecryption(primaryAead, primaryAead);
StreamingTestUtil.testEncryptionAndDecryption(otherAead, otherAead);
StreamingTestUtil.testEncryptionAndDecryption(anotherAead, anotherAead);
IOException expected = assertThrows(IOException.class, () -> StreamingTestUtil.testEncryptionAndDecryption(otherAead, primaryAead));
assertExceptionContains(expected, "No matching key");
IOException expected2 = assertThrows(IOException.class, () -> StreamingTestUtil.testEncryptionAndDecryption(anotherAead, primaryAead));
assertExceptionContains(expected2, "No matching key");
}
use of com.google.crypto.tink.StreamingAead in project tink by google.
the class SeekableByteChannelDecrypter method nextAttemptingChannel.
@GuardedBy("this")
private synchronized SeekableByteChannel nextAttemptingChannel() throws IOException {
while (!remainingPrimitives.isEmpty()) {
ciphertextChannel.position(startingPosition);
StreamingAead streamingAead = this.remainingPrimitives.removeFirst();
try {
SeekableByteChannel decChannel = streamingAead.newSeekableDecryptingChannel(ciphertextChannel, associatedData);
if (cachedPosition >= 0) {
// Caller already set new position.
decChannel.position(cachedPosition);
}
return decChannel;
} catch (GeneralSecurityException e) {
// Try another primitive.
}
}
throw new IOException("No matching key found for the ciphertext in the stream.");
}
use of com.google.crypto.tink.StreamingAead in project tink by google.
the class StreamingAeadServiceImpl method encrypt.
/**
* Encrypts a message.
*/
@Override
public void encrypt(StreamingAeadEncryptRequest request, StreamObserver<StreamingAeadEncryptResponse> responseObserver) {
StreamingAeadEncryptResponse response;
try {
KeysetHandle keysetHandle = CleartextKeysetHandle.read(BinaryKeysetReader.withBytes(request.getKeyset().toByteArray()));
StreamingAead streamingAead = keysetHandle.getPrimitive(StreamingAead.class);
ByteArrayOutputStream ciphertextStream = new ByteArrayOutputStream();
try (OutputStream encryptingStream = streamingAead.newEncryptingStream(ciphertextStream, request.getAssociatedData().toByteArray())) {
request.getPlaintext().writeTo(encryptingStream);
}
response = StreamingAeadEncryptResponse.newBuilder().setCiphertext(ByteString.copyFrom(ciphertextStream.toByteArray())).build();
} catch (GeneralSecurityException | InvalidProtocolBufferException e) {
response = StreamingAeadEncryptResponse.newBuilder().setErr(e.toString()).build();
} catch (IOException e) {
responseObserver.onError(Status.UNKNOWN.withDescription(e.getMessage()).asException());
return;
}
responseObserver.onNext(response);
responseObserver.onCompleted();
}
Aggregations