2828import com .apple .foundationdb .record .logging .KeyValueLogMessage ;
2929import com .apple .foundationdb .record .logging .LogMessageKeys ;
3030import com .apple .foundationdb .record .metadata .RecordType ;
31+ import com .apple .foundationdb .record .util .RandomSecretUtil ;
3132import com .apple .foundationdb .tuple .Tuple ;
32- import com .apple .test .BooleanSource ;
3333import com .apple .test .ParameterizedTestUtils ;
3434import com .apple .test .RandomSeedSource ;
3535import com .apple .test .RandomizedTestUtils ;
4848
4949import javax .annotation .Nonnull ;
5050import javax .annotation .Nullable ;
51- import javax .crypto .KeyGenerator ;
5251import javax .crypto .SecretKey ;
5352import java .nio .ByteBuffer ;
5453import java .nio .ByteOrder ;
5554import java .security .InvalidKeyException ;
5655import java .security .Key ;
57- import java .security .SecureRandom ;
5856import java .util .ArrayList ;
5957import java .util .Arrays ;
6058import java .util .List ;
@@ -374,11 +372,9 @@ void unrecognizedEncoding() {
374372 }
375373
376374 @ ParameterizedTest
377- @ BooleanSource
378- void encryptWhenSerializing (boolean compressToo ) throws Exception {
379- KeyGenerator keyGen = KeyGenerator .getInstance ("AES" );
380- keyGen .init (128 );
381- SecretKey key = keyGen .generateKey ();
375+ @ MethodSource ("randomAndCompressed" )
376+ void encryptWhenSerializing (long seed , boolean compressToo ) {
377+ SecretKey key = RandomSecretUtil .randomSecretKey (seed );
382378 TransformedRecordSerializer <Message > serializer = TransformedRecordSerializerJCE .newDefaultBuilder ()
383379 .setEncryptWhenSerializing (true )
384380 .setEncryptionKey (key )
@@ -517,7 +513,7 @@ public static Stream<Arguments> randomAndCompressed() {
517513
518514 @ ParameterizedTest
519515 @ MethodSource ("randomAndCompressed" )
520- void encryptRollingKeys (long seed , boolean compressToo ) throws Exception {
516+ void encryptRollingKeys (long seed , boolean compressToo ) {
521517 RollingTestKeyManager keyManager = new RollingTestKeyManager (seed );
522518 TransformedRecordSerializer <Message > serializer = TransformedRecordSerializerJCE .newDefaultBuilder ()
523519 .setEncryptWhenSerializing (true )
@@ -550,12 +546,11 @@ void encryptRollingKeys(long seed, boolean compressToo) throws Exception {
550546 assertEquals (records , deserialized );
551547 }
552548
553- @ Test
554- void cannotDecryptUnknownKey () throws Exception {
555- KeyGenerator keyGen = KeyGenerator .getInstance ("AES" );
556- keyGen .init (128 );
557- SecretKey key = keyGen .generateKey ();
558- SecureRandom random = new SecureRandom ();
549+ @ ParameterizedTest
550+ @ RandomSeedSource
551+ void cannotDecryptUnknownKey (long seed ) {
552+ Random random = new Random (seed );
553+ SecretKey key = RandomSecretUtil .randomSecretKey (random );
559554 TransformedRecordSerializer <Message > serializer = TransformedRecordSerializerJCE .newDefaultBuilder ()
560555 .setEncryptWhenSerializing (true )
561556 .setKeyManager (new SerializationKeyManager () {
@@ -592,14 +587,20 @@ public Random getRandom(final int keyNumber) {
592587 assertThat (e .getMessage (), containsString ("only provide key number 0" ));
593588 }
594589
590+ public static Stream <Arguments > randomAndJCE () {
591+ return ParameterizedTestUtils .cartesianProduct (
592+ RandomizedTestUtils .randomSeeds (0xC0DE6EEDL , 0x6EEDC0DEL ),
593+ ParameterizedTestUtils .booleans ("jce" )
594+ );
595+ }
596+
595597 @ ParameterizedTest
596- @ BooleanSource
597- void cannotDecryptWithoutKey (boolean jce ) throws Exception {
598- KeyGenerator keyGen = KeyGenerator .getInstance ("AES" );
599- keyGen .init (128 );
598+ @ MethodSource ("randomAndJCE" )
599+ void cannotDecryptWithoutKey (long seed , boolean jce ) {
600+ SecretKey key = RandomSecretUtil .randomSecretKey (seed );
600601 TransformedRecordSerializer <Message > serializer = TransformedRecordSerializerJCE .newDefaultBuilder ()
601602 .setEncryptWhenSerializing (true )
602- .setEncryptionKey (keyGen . generateKey () )
603+ .setEncryptionKey (key )
603604 .setWriteValidationRatio (1.0 )
604605 .build ();
605606 MySimpleRecord simpleRecord = MySimpleRecord .newBuilder ().setRecNo (PRIMARY_KEY_REC_NO ).setStrValueIndexed ("Hello" ).build ();
@@ -621,7 +622,7 @@ void cannotDecryptWithoutKey(boolean jce) throws Exception {
621622 }
622623
623624 @ Test
624- void cannotEncryptAfterClearKey () throws Exception {
625+ void cannotEncryptAfterClearKey () {
625626 RollingTestKeyManager keyManager = new RollingTestKeyManager (0 );
626627 TransformedRecordSerializerJCE .Builder <Message > builder = TransformedRecordSerializerJCE .newDefaultBuilder ()
627628 .setEncryptWhenSerializing (true )
@@ -631,14 +632,15 @@ void cannotEncryptAfterClearKey() throws Exception {
631632 assertThat (e .getMessage (), containsString ("cannot encrypt when serializing if encryption key is not set" ));
632633 }
633634
634- @ Test
635- void keyDoesNotMatchAlgorithm () throws Exception {
636- KeyGenerator keyGen = KeyGenerator .getInstance ("DES" );
637- keyGen .init (56 );
635+ @ ParameterizedTest
636+ @ RandomSeedSource
637+ void keyDoesNotMatchAlgorithm (long seed ) {
638+ Random random = new Random (seed );
639+ SecretKey key = RandomSecretUtil .randomSecretKey (random , "DES" , 56 );
638640 try {
639641 TransformedRecordSerializer <Message > serializer = TransformedRecordSerializerJCE .newDefaultBuilder ()
640642 .setEncryptWhenSerializing (true )
641- .setEncryptionKey (keyGen . generateKey () )
643+ .setEncryptionKey (key )
642644 .setWriteValidationRatio (1.0 )
643645 .build ();
644646 MySimpleRecord simpleRecord = MySimpleRecord .newBuilder ().setRecNo (PRIMARY_KEY_REC_NO ).setStrValueIndexed ("Hello" ).build ();
@@ -653,23 +655,23 @@ void keyDoesNotMatchAlgorithm() throws Exception {
653655 }
654656 }
655657
656- @ Test
657- void changeAlgorithm () throws Exception {
658- KeyGenerator keyGen = KeyGenerator .getInstance ("AES" );
659- keyGen .init (128 );
658+ @ ParameterizedTest
659+ @ RandomSeedSource
660+ void changeAlgorithm (long seed ) {
661+ Random random = new Random (seed );
662+ SecretKey key = RandomSecretUtil .randomSecretKey (random , "AES" , 128 );
660663 TransformedRecordSerializer <Message > serializer = TransformedRecordSerializerJCE .newDefaultBuilder ()
661664 .setEncryptWhenSerializing (true )
662- .setEncryptionKey (keyGen . generateKey () )
665+ .setEncryptionKey (key )
663666 .setWriteValidationRatio (1.0 )
664667 .build ();
665668 MySimpleRecord simpleRecord = MySimpleRecord .newBuilder ().setRecNo (PRIMARY_KEY_REC_NO ).setStrValueIndexed ("Hello" ).build ();
666669 byte [] serialized = serialize (serializer , simpleRecord );
667- KeyGenerator keyGen2 = KeyGenerator .getInstance ("DES" );
668- keyGen2 .init (56 );
670+ SecretKey key2 = RandomSecretUtil .randomSecretKey (random , "DES" , 56 );
669671 TransformedRecordSerializer <Message > deserializer = TransformedRecordSerializerJCE .newDefaultBuilder ()
670672 .setEncryptWhenSerializing (true )
671- .setCipherName ("DES" )
672- .setEncryptionKey (keyGen2 . generateKey () )
673+ .setCipherName ("DES" )
674+ .setEncryptionKey (key2 )
673675 .setWriteValidationRatio (1.0 )
674676 .build ();
675677 RecordSerializationException e = assertThrows (RecordSerializationException .class ,
@@ -679,13 +681,14 @@ void changeAlgorithm() throws Exception {
679681
680682 public static Stream <Arguments > compressedAndOrEncrypted () {
681683 return ParameterizedTestUtils .cartesianProduct (
684+ RandomizedTestUtils .randomSeeds (),
682685 ParameterizedTestUtils .booleans ("compressed" ),
683686 ParameterizedTestUtils .booleans ("encrypted" ));
684687 }
685688
686689 @ ParameterizedTest
687690 @ MethodSource ("compressedAndOrEncrypted" )
688- void typed (boolean compressed , boolean encrypted ) throws Exception {
691+ void typed (long seed , boolean compressed , boolean encrypted ) {
689692 RecordSerializer <MySimpleRecord > typedSerializer = new TypedRecordSerializer <>(
690693 TestRecords1Proto .RecordTypeUnion .getDescriptor ().findFieldByNumber (TestRecords1Proto .RecordTypeUnion ._MYSIMPLERECORD_FIELD_NUMBER ),
691694 TestRecords1Proto .RecordTypeUnion ::newBuilder ,
@@ -695,9 +698,7 @@ void typed(boolean compressed, boolean encrypted) throws Exception {
695698 MySimpleRecord rec = MySimpleRecord .newBuilder ().setRecNo (PRIMARY_KEY_REC_NO ).setStrValueIndexed (SONNET_108 ).build ();
696699
697700 if (encrypted ) {
698- KeyGenerator keyGen = KeyGenerator .getInstance ("AES" );
699- keyGen .init (128 );
700- SecretKey key = keyGen .generateKey ();
701+ SecretKey key = RandomSecretUtil .randomSecretKey (seed );
701702 typedSerializer = TransformedRecordSerializerJCE .newBuilder (typedSerializer )
702703 .setEncryptWhenSerializing (true )
703704 .setEncryptionKey (key )
@@ -726,13 +727,13 @@ void typed(boolean compressed, boolean encrypted) throws Exception {
726727 assertEquals (rec , untypedDeserialized );
727728 }
728729
729- @ Test
730- void defaultKeyManagerKey () throws Exception {
731- KeyGenerator keyGen = KeyGenerator . getInstance ( "AES" );
732- keyGen . init ( 128 );
730+ @ ParameterizedTest
731+ @ RandomSeedSource
732+ void defaultKeyManagerKey ( long seed ) {
733+ SecretKey key = RandomSecretUtil . randomSecretKey ( seed );
733734 TransformedRecordSerializerJCE <Message > serializer = TransformedRecordSerializerJCE .newDefaultBuilder ()
734735 .setEncryptWhenSerializing (true )
735- .setEncryptionKey (keyGen . generateKey () )
736+ .setEncryptionKey (key )
736737 .setWriteValidationRatio (1.0 )
737738 .build ();
738739 SerializationKeyManager keyManager = serializer .keyManager ;
@@ -753,7 +754,7 @@ void defaultKeyManagerKey() throws Exception {
753754 }
754755
755756 @ Test
756- void invalidKeyManagerBuilder () throws Exception {
757+ void invalidKeyManagerBuilder () {
757758 TransformedRecordSerializerJCE .Builder <Message > builder = TransformedRecordSerializerJCE .newDefaultBuilder ();
758759 builder .setEncryptWhenSerializing (true );
759760
@@ -774,7 +775,7 @@ void invalidKeyManagerBuilder() throws Exception {
774775 }
775776
776777 @ Test
777- void reuseBuilder () throws Exception {
778+ void reuseBuilder () {
778779 RollingTestKeyManager keyManager = new RollingTestKeyManager (0 );
779780 TransformedRecordSerializerJCE .Builder <Message > builderWithEncryptionKey = TransformedRecordSerializerJCE
780781 .newDefaultBuilder ()
0 commit comments