@@ -929,6 +929,74 @@ def test_avro_encryption():
929929 assert obj == obj2
930930
931931
932+ def test_avro_encryption_deterministic ():
933+ executor = FieldEncryptionExecutor .register_with_clock (FakeClock ())
934+
935+ conf = {'url' : _BASE_URL }
936+ client = SchemaRegistryClient .new_client (conf )
937+ ser_conf = {'auto.register.schemas' : False , 'use.latest.version' : True }
938+ rule_conf = {'secret' : 'mysecret' }
939+ schema = {
940+ 'type' : 'record' ,
941+ 'name' : 'test' ,
942+ 'fields' : [
943+ {'name' : 'intField' , 'type' : 'int' },
944+ {'name' : 'doubleField' , 'type' : 'double' },
945+ {'name' : 'stringField' , 'type' : 'string' , 'confluent:tags' : ['PII' ]},
946+ {'name' : 'booleanField' , 'type' : 'boolean' },
947+ {'name' : 'bytesField' , 'type' : 'bytes' , 'confluent:tags' : ['PII' ]},
948+ ]
949+ }
950+
951+ rule = Rule (
952+ "test-encrypt" ,
953+ "" ,
954+ RuleKind .TRANSFORM ,
955+ RuleMode .WRITEREAD ,
956+ "ENCRYPT" ,
957+ ["PII" ],
958+ RuleParams ({
959+ "encrypt.kek.name" : "kek1" ,
960+ "encrypt.kms.type" : "local-kms" ,
961+ "encrypt.kms.key.id" : "mykey" ,
962+ "encrypt.dek.algorithm" : "AES256_SIV"
963+ }),
964+ None ,
965+ None ,
966+ "ERROR,NONE" ,
967+ False
968+ )
969+ client .register_schema (_SUBJECT , Schema (
970+ json .dumps (schema ),
971+ "AVRO" ,
972+ [],
973+ None ,
974+ RuleSet (None , [rule ])
975+ ))
976+
977+ obj = {
978+ 'intField' : 123 ,
979+ 'doubleField' : 45.67 ,
980+ 'stringField' : 'hi' ,
981+ 'booleanField' : True ,
982+ 'bytesField' : b'foobar' ,
983+ }
984+ ser = AvroSerializer (client , schema_str = None , conf = ser_conf , rule_conf = rule_conf )
985+ dek_client = executor .client
986+ ser_ctx = SerializationContext (_TOPIC , MessageField .VALUE )
987+ obj_bytes = ser (obj , ser_ctx )
988+
989+ # reset encrypted fields
990+ assert obj ['stringField' ] != 'hi'
991+ obj ['stringField' ] = 'hi'
992+ obj ['bytesField' ] = b'foobar'
993+
994+ deser = AvroDeserializer (client , rule_conf = rule_conf )
995+ executor .client = dek_client
996+ obj2 = deser (obj_bytes , ser_ctx )
997+ assert obj == obj2
998+
999+
9321000def test_avro_encryption_cel ():
9331001 executor = FieldEncryptionExecutor .register_with_clock (FakeClock ())
9341002
0 commit comments