@@ -21,7 +21,7 @@ import (
2121 "github.com/cloudflare/cfssl/helpers/derhelpers"
2222)
2323
24- //go:generate stringer -type=Tag,Op -output=protocol_string.go
24+ //go:generate stringer -type=Tag,Op,ComplianceRegion -output=protocol_string.go
2525
2626// Tag marks the type of an Item.
2727type Tag byte
@@ -51,6 +51,8 @@ const (
5151 TagJaegerSpan Tag = 0x15
5252 // TagReqContext contains request metadata
5353 TagReqContext Tag = 0x16
54+ // TagComplianceRegion implies the compliance region of the operation which can impact behavior
55+ TagComplianceRegion Tag = 0x17
5456 // TagPadding implies an item with a meaningless payload added for padding.
5557 TagPadding Tag = 0x20
5658)
@@ -202,6 +204,16 @@ func (e Error) String() string {
202204 }
203205}
204206
207+ // ComplianceRegion describes any guardrails that gokeyless should follow when accessing data from
208+ // external applications
209+ type ComplianceRegion byte
210+
211+ const (
212+ // ComplianceRegionFedRAMPHigh signals that this operation should only interact
213+ // with the FedRAMP High QS instance
214+ ComplianceRegionFedRAMPHigh ComplianceRegion = 0x01
215+ )
216+
205217const (
206218 paddedLength = 1024
207219 headerSize = 8
@@ -405,30 +417,32 @@ func (p *Packet) ReadFrom(r io.Reader) (n int64, err error) {
405417
406418// Operation defines a single (repeatable) keyless operation.
407419type Operation struct {
408- Opcode Op
409- Payload []byte
410- Extra []byte
411- SKI SKI
412- Digest Digest
413- ClientIP net.IP
414- ServerIP net.IP
415- SNI string
416- CertID string
417- ForwardingSvc int64
418- CustomFuncName string
419- JaegerSpan []byte
420- ReqContext []byte
420+ Opcode Op
421+ Payload []byte
422+ Extra []byte
423+ SKI SKI
424+ Digest Digest
425+ ClientIP net.IP
426+ ServerIP net.IP
427+ SNI string
428+ CertID string
429+ ForwardingSvc int64
430+ CustomFuncName string
431+ JaegerSpan []byte
432+ ReqContext []byte
433+ ComplianceRegion ComplianceRegion
421434}
422435
423436func (o * Operation ) String () string {
424- return fmt .Sprintf ("[Opcode: %v, SKI: %v, Digest: %02x, Client IP: %s, Server IP: %s, SNI: %s, Forwarding Service: %v]" ,
437+ return fmt .Sprintf ("[Opcode: %v, SKI: %v, Digest: %02x, Client IP: %s, Server IP: %s, SNI: %s, Forwarding Service: %v, ComplianceRegion %v ]" ,
425438 o .Opcode ,
426439 o .SKI ,
427440 o .Digest ,
428441 o .ClientIP ,
429442 o .ServerIP ,
430443 o .SNI ,
431444 o .ForwardingSvc ,
445+ o .ComplianceRegion ,
432446 )
433447}
434448
@@ -512,6 +526,8 @@ func (o *Operation) Bytes() uint16 {
512526 if o .ReqContext != nil {
513527 add (tlvLen (len (o .ReqContext )))
514528 }
529+ // compliance region
530+ add (tlvLen (1 ))
515531 if int (length )+ headerSize < paddedLength {
516532 // TODO: Are we sure that's the right behavior?
517533
@@ -586,6 +602,8 @@ func (o *Operation) MarshalBinary() ([]byte, error) {
586602 b = append (b , tlvBytes (TagReqContext , o .ReqContext )... )
587603 }
588604
605+ b = append (b , tlvBytes (TagComplianceRegion , []byte {byte (o .ComplianceRegion )})... )
606+
589607 if len (b )+ headerSize < paddedLength {
590608 // TODO: Are we sure that's the right behavior?
591609
@@ -673,6 +691,11 @@ func (o *Operation) UnmarshalBinary(body []byte) error {
673691 o .JaegerSpan = data
674692 case TagReqContext :
675693 o .ReqContext = data
694+ case TagComplianceRegion :
695+ if len (data ) != 1 {
696+ return fmt .Errorf ("invalid ComplianceRegion: %s" , data )
697+ }
698+ o .ComplianceRegion = ComplianceRegion (data [0 ])
676699 default :
677700 // Silently ignore any unknown tags (to allow for new tags to be gradually added to the protocol).
678701 continue
0 commit comments