Skip to content

Commit 50ad099

Browse files
committed
Add a test of new capability
1 parent 69ada50 commit 50ad099

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/provider/common/TransformedRecordSerializerTest.java

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,15 @@
4747
import javax.crypto.SecretKey;
4848
import java.nio.ByteBuffer;
4949
import java.nio.ByteOrder;
50+
import java.security.Key;
51+
import java.security.NoSuchAlgorithmException;
52+
import java.security.SecureRandom;
53+
import java.util.ArrayList;
5054
import java.util.Arrays;
55+
import java.util.HashMap;
5156
import java.util.List;
57+
import java.util.Map;
58+
import java.util.Random;
5259
import java.util.stream.Stream;
5360
import java.util.zip.Deflater;
5461

@@ -450,6 +457,39 @@ public void corruptAnyBit() {
450457
}
451458
}
452459

460+
@Test
461+
public void encryptDifferentKeys() throws Exception {
462+
RollingKeyManager keyManager = new RollingKeyManager();
463+
TransformedRecordSerializer<Message> serializer = TransformedRecordSerializerJCE.newDefaultBuilder()
464+
.setEncryptWhenSerializing(true)
465+
.setKeyManager(keyManager)
466+
.setWriteValidationRatio(1.0)
467+
.build();
468+
469+
List<MySimpleRecord> records = new ArrayList<>();
470+
for (int i = 0; i < 10; i++) {
471+
records.add(MySimpleRecord.newBuilder()
472+
.setRecNo(1000 + i)
473+
.setNumValue2(i)
474+
.setStrValueIndexed(SONNET_108)
475+
.build());
476+
}
477+
478+
List<byte[]> serialized = new ArrayList<>();
479+
for (MySimpleRecord record : records) {
480+
serialized.add(serialize(serializer, record));
481+
}
482+
483+
assertThat(keyManager.numberOfKeys(), greaterThan(5));
484+
485+
List<Message> deserialized = new ArrayList<>();
486+
for (int i = 0; i < serialized.size(); i++) {
487+
deserialized.add(deserialize(serializer, Tuple.from(1000L + i), serialized.get(i)));
488+
}
489+
490+
assertEquals(records, deserialized);
491+
}
492+
453493
private boolean isCompressed(byte[] serialized) {
454494
byte headerByte = serialized[0];
455495
return headerByte == TransformedRecordSerializerPrefix.PREFIX_COMPRESSED ||
@@ -505,4 +545,49 @@ public RecordSerializer<Message> widen() {
505545
throw new UnsupportedOperationException("cannot widen this serializer");
506546
}
507547
}
548+
549+
private static class RollingKeyManager implements TransformedRecordSerializerKeyManager {
550+
private final KeyGenerator keyGenerator;
551+
private final Map<Integer, SecretKey> keys;
552+
private final Random random;
553+
554+
public RollingKeyManager() throws NoSuchAlgorithmException {
555+
keyGenerator = KeyGenerator.getInstance("AES");
556+
keyGenerator.init(128);
557+
keys = new HashMap<>();
558+
random = new SecureRandom();
559+
}
560+
561+
@Override
562+
public int getSerializationKey() {
563+
int newKey = random.nextInt();
564+
if (!keys.containsKey(newKey)) {
565+
keys.put(newKey, keyGenerator.generateKey());
566+
}
567+
return newKey;
568+
}
569+
570+
@Override
571+
public Key getKey(final int keyNumber) {
572+
if (!keys.containsKey(keyNumber)) {
573+
throw new RecordCoreArgumentException("invalid key number");
574+
}
575+
return keys.get(keyNumber);
576+
}
577+
578+
@Override
579+
public String getCipher(final int keyNumber) {
580+
return CipherPool.DEFAULT_CIPHER;
581+
}
582+
583+
@Override
584+
public Random getRandom(final int keyNumber) {
585+
return random;
586+
}
587+
588+
public int numberOfKeys() {
589+
return keys.size();
590+
}
591+
}
592+
508593
}

0 commit comments

Comments
 (0)