Skip to content

Commit f62e379

Browse files
authored
Ensure algorithm query param is passed for CSFLE (#230)
* Add missing algorithm query param * Add test
1 parent 65451d9 commit f62e379

File tree

2 files changed

+85
-1
lines changed

2 files changed

+85
-1
lines changed

schemaregistry/rules/encryption/dekregistry/dekregistry-client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ class DekRegistryClient implements DekClient {
224224
subject = encodeURIComponent(subject);
225225

226226
const response = await this.restService.handleRequest<Dek>(
227-
`/dek-registry/v1/keks/${kekName}/deks/${subject}/versions/${version}?deleted=${deleted}`,
227+
`/dek-registry/v1/keks/${kekName}/deks/${subject}/versions/${version}?algorithm=${algorithm}&deleted=${deleted}`,
228228
'GET');
229229
this.dekCache.set(cacheKey, response.data);
230230
return response.data;

schemaregistry/test/serde/avro.spec.ts

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,90 @@ describe('AvroSerializer', () => {
675675
expect(obj2.stringField).not.toEqual("hi");
676676
expect(obj2.bytesField).not.toEqual(Buffer.from([1, 2]));
677677
})
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+
})
678762
it('basic encryption with logical type', async () => {
679763
let conf: ClientConfig = {
680764
baseURLs: [baseURL],

0 commit comments

Comments
 (0)