@@ -675,6 +675,90 @@ describe('AvroSerializer', () => {
675
675
expect ( obj2 . stringField ) . not . toEqual ( "hi" ) ;
676
676
expect ( obj2 . bytesField ) . not . toEqual ( Buffer . from ( [ 1 , 2 ] ) ) ;
677
677
} )
678
+ it ( 'deterministic encryption' , async ( ) => {
679
+ let conf : ClientConfig = {
680
+ baseURLs : [ baseURL ] ,
681
+ cacheCapacity : 1000
682
+ }
683
+ let client = SchemaRegistryClient . newClient ( conf )
684
+ let serConfig : AvroSerializerConfig = {
685
+ useLatestVersion : true ,
686
+ ruleConfig : {
687
+ secret : 'mysecret'
688
+ }
689
+ }
690
+ let ser = new AvroSerializer ( client , SerdeType . VALUE , serConfig )
691
+ let dekClient = fieldEncryptionExecutor . client !
692
+
693
+ let encRule : Rule = {
694
+ name : 'test-encrypt' ,
695
+ kind : 'TRANSFORM' ,
696
+ mode : RuleMode . WRITEREAD ,
697
+ type : 'ENCRYPT' ,
698
+ tags : [ 'PII' ] ,
699
+ params : {
700
+ 'encrypt.kek.name' : 'kek1' ,
701
+ 'encrypt.kms.type' : 'local-kms' ,
702
+ 'encrypt.kms.key.id' : 'mykey' ,
703
+ 'encrypt.dek.algorithm' : 'AES256_SIV' ,
704
+ } ,
705
+ onFailure : 'ERROR,NONE'
706
+ }
707
+ let ruleSet : RuleSet = {
708
+ domainRules : [ encRule ]
709
+ }
710
+
711
+ let info : SchemaInfo = {
712
+ schemaType : 'AVRO' ,
713
+ schema : demoSchema ,
714
+ ruleSet
715
+ }
716
+
717
+ await client . register ( subject , info , false )
718
+
719
+ let obj = {
720
+ intField : 123 ,
721
+ doubleField : 45.67 ,
722
+ stringField : 'hi' ,
723
+ boolField : true ,
724
+ bytesField : Buffer . from ( [ 1 , 2 ] ) ,
725
+ }
726
+ let bytes = await ser . serialize ( topic , obj )
727
+
728
+ // reset encrypted field
729
+ obj . stringField = 'hi'
730
+ obj . bytesField = Buffer . from ( [ 1 , 2 ] )
731
+
732
+ let deserConfig : AvroDeserializerConfig = {
733
+ ruleConfig : {
734
+ secret : 'mysecret'
735
+ }
736
+ }
737
+ let deser = new AvroDeserializer ( client , SerdeType . VALUE , deserConfig )
738
+ fieldEncryptionExecutor . client = dekClient
739
+ let obj2 = await deser . deserialize ( topic , bytes )
740
+ expect ( obj2 . intField ) . toEqual ( obj . intField ) ;
741
+ expect ( obj2 . doubleField ) . toBeCloseTo ( obj . doubleField , 0.001 ) ;
742
+ expect ( obj2 . stringField ) . toEqual ( obj . stringField ) ;
743
+ expect ( obj2 . boolField ) . toEqual ( obj . boolField ) ;
744
+ expect ( obj2 . bytesField ) . toEqual ( obj . bytesField ) ;
745
+
746
+ let registry = new RuleRegistry ( )
747
+ registry . registerExecutor ( new FieldEncryptionExecutor ( ) )
748
+ registry . registerOverride ( { type : 'ENCRYPT' , disabled : true } )
749
+ deser = new AvroDeserializer ( client , SerdeType . VALUE , deserConfig , registry )
750
+ obj2 = await deser . deserialize ( topic , bytes )
751
+ expect ( obj2 . stringField ) . not . toEqual ( "hi" ) ;
752
+ expect ( obj2 . bytesField ) . not . toEqual ( Buffer . from ( [ 1 , 2 ] ) ) ;
753
+
754
+ clearKmsClients ( )
755
+ registry = new RuleRegistry ( )
756
+ registry . registerExecutor ( new FieldEncryptionExecutor ( ) )
757
+ deser = new AvroDeserializer ( client , SerdeType . VALUE , { } , registry )
758
+ obj2 = await deser . deserialize ( topic , bytes )
759
+ expect ( obj2 . stringField ) . not . toEqual ( "hi" ) ;
760
+ expect ( obj2 . bytesField ) . not . toEqual ( Buffer . from ( [ 1 , 2 ] ) ) ;
761
+ } )
678
762
it ( 'basic encryption with logical type' , async ( ) => {
679
763
let conf : ClientConfig = {
680
764
baseURLs : [ baseURL ] ,
0 commit comments