@@ -44,10 +44,11 @@ func init() {
44
44
// Register registers the encryption rule executor
45
45
func Register () {
46
46
serde .RegisterRuleExecutor (NewExecutor ())
47
+ serde .RegisterRuleExecutor (NewFieldExecutor ())
47
48
}
48
49
49
- // RegisterWithClock registers the encryption rule executor with a given clock
50
- func RegisterWithClock (c Clock ) * FieldEncryptionExecutor {
50
+ // RegisterExecutorWithClock registers the encryption rule executor with a given clock
51
+ func RegisterExecutorWithClock (c Clock ) * Executor {
51
52
f := NewExecutorWithClock (c )
52
53
serde .RegisterRuleExecutor (f )
53
54
return f
@@ -60,10 +61,8 @@ func NewExecutor() serde.RuleExecutor {
60
61
}
61
62
62
63
// NewExecutorWithClock creates a new encryption rule executor with a given clock
63
- func NewExecutorWithClock (c Clock ) * FieldEncryptionExecutor {
64
- a := & serde.AbstractFieldRuleExecutor {}
65
- f := & FieldEncryptionExecutor {* a , nil , nil , c }
66
- f .FieldRuleExecutor = f
64
+ func NewExecutorWithClock (c Clock ) * Executor {
65
+ f := & Executor {nil , nil , c }
67
66
return f
68
67
}
69
68
@@ -101,16 +100,15 @@ func (*clock) NowUnixMilli() int64 {
101
100
return time .Now ().UnixMilli ()
102
101
}
103
102
104
- // FieldEncryptionExecutor is a field encryption executor
105
- type FieldEncryptionExecutor struct {
106
- serde.AbstractFieldRuleExecutor
103
+ // Executor is an encryption executor
104
+ type Executor struct {
107
105
Config map [string ]string
108
106
Client deks.Client
109
107
Clock Clock
110
108
}
111
109
112
110
// Configure configures the executor
113
- func (f * FieldEncryptionExecutor ) Configure (clientConfig * schemaregistry.Config , config map [string ]string ) error {
111
+ func (f * Executor ) Configure (clientConfig * schemaregistry.Config , config map [string ]string ) error {
114
112
if f .Client != nil {
115
113
if ! schemaregistry .ConfigsEqual (f .Client .Config (), clientConfig ) {
116
114
return errors .New ("executor already configured" )
@@ -143,12 +141,21 @@ func (f *FieldEncryptionExecutor) Configure(clientConfig *schemaregistry.Config,
143
141
}
144
142
145
143
// Type returns the type of the executor
146
- func (f * FieldEncryptionExecutor ) Type () string {
147
- return "ENCRYPT"
144
+ func (f * Executor ) Type () string {
145
+ return "ENCRYPT_PAYLOAD"
146
+ }
147
+
148
+ // Transform transforms the message using the rule
149
+ func (f * Executor ) Transform (ctx serde.RuleContext , msg interface {}) (interface {}, error ) {
150
+ transform , err := f .NewTransform (ctx )
151
+ if err != nil {
152
+ return nil , err
153
+ }
154
+ return transform .Transform (ctx , serde .TypeBytes , msg )
148
155
}
149
156
150
157
// NewTransform creates a new transform
151
- func (f * FieldEncryptionExecutor ) NewTransform (ctx serde.RuleContext ) (serde. FieldTransform , error ) {
158
+ func (f * Executor ) NewTransform (ctx serde.RuleContext ) (* ExecutorTransform , error ) {
152
159
kekName , err := getKekName (ctx )
153
160
if err != nil {
154
161
return nil , err
@@ -157,7 +164,7 @@ func (f *FieldEncryptionExecutor) NewTransform(ctx serde.RuleContext) (serde.Fie
157
164
if err != nil {
158
165
return nil , err
159
166
}
160
- transform := FieldEncryptionExecutorTransform {
167
+ transform := ExecutorTransform {
161
168
Executor : * f ,
162
169
Cryptor : getCryptor (ctx ),
163
170
KekName : kekName ,
@@ -172,13 +179,13 @@ func (f *FieldEncryptionExecutor) NewTransform(ctx serde.RuleContext) (serde.Fie
172
179
}
173
180
174
181
// Close closes the executor
175
- func (f * FieldEncryptionExecutor ) Close () error {
182
+ func (f * Executor ) Close () error {
176
183
return f .Client .Close ()
177
184
}
178
185
179
- // FieldEncryptionExecutorTransform is a field encryption executor transform
180
- type FieldEncryptionExecutorTransform struct {
181
- Executor FieldEncryptionExecutor
186
+ // ExecutorTransform is a field encryption executor transform
187
+ type ExecutorTransform struct {
188
+ Executor Executor
182
189
Cryptor Cryptor
183
190
KekName string
184
191
Kek deks.Kek
@@ -290,11 +297,11 @@ func getDekExpiryDays(ctx serde.RuleContext) (int, error) {
290
297
return i , nil
291
298
}
292
299
293
- func (f * FieldEncryptionExecutorTransform ) isDekRotated () bool {
300
+ func (f * ExecutorTransform ) isDekRotated () bool {
294
301
return f .DekExpiryDays > 0
295
302
}
296
303
297
- func (f * FieldEncryptionExecutorTransform ) getOrCreateKek (ctx serde.RuleContext ) (* deks.Kek , error ) {
304
+ func (f * ExecutorTransform ) getOrCreateKek (ctx serde.RuleContext ) (* deks.Kek , error ) {
298
305
isRead := ctx .RuleMode == schemaregistry .Read
299
306
kekID := deks.KekID {
300
307
Name : f .KekName ,
@@ -334,7 +341,7 @@ func (f *FieldEncryptionExecutorTransform) getOrCreateKek(ctx serde.RuleContext)
334
341
return kek , nil
335
342
}
336
343
337
- func (f * FieldEncryptionExecutorTransform ) retrieveKekFromRegistry (key deks.KekID ) (* deks.Kek , error ) {
344
+ func (f * ExecutorTransform ) retrieveKekFromRegistry (key deks.KekID ) (* deks.Kek , error ) {
338
345
kek , err := f .Executor .Client .GetKek (key .Name , key .Deleted )
339
346
if err != nil {
340
347
var restErr * rest.Error
@@ -348,7 +355,7 @@ func (f *FieldEncryptionExecutorTransform) retrieveKekFromRegistry(key deks.KekI
348
355
return & kek , nil
349
356
}
350
357
351
- func (f * FieldEncryptionExecutorTransform ) storeKekToRegistry (key deks.KekID , kmsType string , kmsKeyID string , shared bool ) (* deks.Kek , error ) {
358
+ func (f * ExecutorTransform ) storeKekToRegistry (key deks.KekID , kmsType string , kmsKeyID string , shared bool ) (* deks.Kek , error ) {
352
359
kek , err := f .Executor .Client .RegisterKek (key .Name , kmsType , kmsKeyID , nil , "" , shared )
353
360
if err != nil {
354
361
var restErr * rest.Error
@@ -362,7 +369,7 @@ func (f *FieldEncryptionExecutorTransform) storeKekToRegistry(key deks.KekID, km
362
369
return & kek , nil
363
370
}
364
371
365
- func (f * FieldEncryptionExecutorTransform ) getOrCreateDek (ctx serde.RuleContext , version * int ) (* deks.Dek , error ) {
372
+ func (f * ExecutorTransform ) getOrCreateDek (ctx serde.RuleContext , version * int ) (* deks.Dek , error ) {
366
373
isRead := ctx .RuleMode == schemaregistry .Read
367
374
ver := 1
368
375
if version != nil {
@@ -442,7 +449,7 @@ func (f *FieldEncryptionExecutorTransform) getOrCreateDek(ctx serde.RuleContext,
442
449
return dek , nil
443
450
}
444
451
445
- func (f * FieldEncryptionExecutorTransform ) createDek (dekID deks.DekID , newVersion int , encryptedDek []byte ) (* deks.Dek , error ) {
452
+ func (f * ExecutorTransform ) createDek (dekID deks.DekID , newVersion int , encryptedDek []byte ) (* deks.Dek , error ) {
446
453
newDekID := deks.DekID {
447
454
KekName : dekID .KekName ,
448
455
Subject : dekID .Subject ,
@@ -466,7 +473,7 @@ func (f *FieldEncryptionExecutorTransform) createDek(dekID deks.DekID, newVersio
466
473
return dek , nil
467
474
}
468
475
469
- func (f * FieldEncryptionExecutorTransform ) retrieveDekFromRegistry (key deks.DekID ) (* deks.Dek , error ) {
476
+ func (f * ExecutorTransform ) retrieveDekFromRegistry (key deks.DekID ) (* deks.Dek , error ) {
470
477
var dek deks.Dek
471
478
var err error
472
479
if key .Version != 0 {
@@ -486,7 +493,7 @@ func (f *FieldEncryptionExecutorTransform) retrieveDekFromRegistry(key deks.DekI
486
493
return & dek , nil
487
494
}
488
495
489
- func (f * FieldEncryptionExecutorTransform ) storeDekToRegistry (key deks.DekID , encryptedDek []byte ) (* deks.Dek , error ) {
496
+ func (f * ExecutorTransform ) storeDekToRegistry (key deks.DekID , encryptedDek []byte ) (* deks.Dek , error ) {
490
497
var encryptedDekStr string
491
498
if encryptedDek != nil {
492
499
encryptedDekStr = base64 .StdEncoding .EncodeToString (encryptedDek )
@@ -510,7 +517,7 @@ func (f *FieldEncryptionExecutorTransform) storeDekToRegistry(key deks.DekID, en
510
517
return & dek , nil
511
518
}
512
519
513
- func (f * FieldEncryptionExecutorTransform ) isExpired (ctx serde.RuleContext , dek * deks.Dek ) bool {
520
+ func (f * ExecutorTransform ) isExpired (ctx serde.RuleContext , dek * deks.Dek ) bool {
514
521
now := f .Executor .Clock .NowUnixMilli ()
515
522
return ctx .RuleMode != schemaregistry .Read &&
516
523
f .DekExpiryDays > 0 &&
@@ -519,15 +526,15 @@ func (f *FieldEncryptionExecutorTransform) isExpired(ctx serde.RuleContext, dek
519
526
}
520
527
521
528
// Transform transforms the field value using the rule
522
- func (f * FieldEncryptionExecutorTransform ) Transform (ctx serde.RuleContext , fieldCtx serde.FieldContext , fieldValue interface {}) (interface {}, error ) {
529
+ func (f * ExecutorTransform ) Transform (ctx serde.RuleContext , fieldType serde.FieldType , fieldValue interface {}) (interface {}, error ) {
523
530
if fieldValue == nil {
524
531
return nil , nil
525
532
}
526
533
switch ctx .RuleMode {
527
534
case schemaregistry .Write :
528
- plaintext := toBytes (fieldCtx . Type , fieldValue )
535
+ plaintext := toBytes (fieldType , fieldValue )
529
536
if plaintext == nil {
530
- return nil , fmt .Errorf ("type '%v' not supported for encryption" , fieldCtx . Type )
537
+ return nil , fmt .Errorf ("type '%v' not supported for encryption" , fieldType )
531
538
}
532
539
var version * int
533
540
if f .isDekRotated () {
@@ -552,16 +559,16 @@ func (f *FieldEncryptionExecutorTransform) Transform(ctx serde.RuleContext, fiel
552
559
return nil , err
553
560
}
554
561
}
555
- if fieldCtx . Type == serde .TypeString {
562
+ if fieldType == serde .TypeString {
556
563
return base64 .StdEncoding .EncodeToString (ciphertext ), nil
557
564
}
558
565
return ciphertext , nil
559
566
case schemaregistry .Read :
560
- ciphertext := toBytes (fieldCtx . Type , fieldValue )
567
+ ciphertext := toBytes (fieldType , fieldValue )
561
568
if ciphertext == nil {
562
569
return fieldValue , nil
563
570
}
564
- if fieldCtx . Type == serde .TypeString {
571
+ if fieldType == serde .TypeString {
565
572
var err error
566
573
ciphertext , err = base64 .StdEncoding .DecodeString (string (ciphertext ))
567
574
if err != nil {
@@ -589,7 +596,7 @@ func (f *FieldEncryptionExecutorTransform) Transform(ctx serde.RuleContext, fiel
589
596
if err != nil {
590
597
return nil , err
591
598
}
592
- return toObject (fieldCtx . Type , plaintext ), nil
599
+ return toObject (fieldType , plaintext ), nil
593
600
default :
594
601
return nil , fmt .Errorf ("unsupported rule mode %v" , ctx .RuleMode )
595
602
}
0 commit comments