-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrequests.go
87 lines (76 loc) · 2.43 KB
/
requests.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package kmip
import (
"encoding/binary"
"time"
"github.com/ovh/kmip-go/ttlv"
)
type RequestMessage struct {
Header RequestHeader
BatchItem []RequestBatchItem
}
func NewRequestMessage(version ProtocolVersion, payloads ...OperationPayload) RequestMessage {
timestamp := time.Now().Truncate(time.Second)
msg := RequestMessage{
Header: RequestHeader{
ProtocolVersion: version,
TimeStamp: ×tamp,
BatchCount: int32(len(payloads)),
},
}
for i, pl := range payloads {
item := RequestBatchItem{
Operation: pl.Operation(),
RequestPayload: pl,
}
if len(payloads) > 1 {
item.UniqueBatchItemID = binary.BigEndian.AppendUint64(item.UniqueBatchItemID, uint64(i))
}
msg.BatchItem = append(msg.BatchItem, item)
}
return msg
}
type RequestHeader struct {
ProtocolVersion ProtocolVersion `ttlv:",set-version"`
MaximumResponseSize int32 `ttlv:",omitempty"`
ClientCorrelationValue string `ttlv:",omitempty,version=v1.4.."`
ServerCorrelationValue string `ttlv:",omitempty,version=v1.4.."`
AsynchronousIndicator *bool
AttestationCapableIndicator *bool `ttlv:",version=v1.2.."`
AttestationType []AttestationType `ttlv:",version=v1.2.."`
Authentication *Authentication
BatchErrorContinuationOption BatchErrorContinuationOption `ttlv:",omitempty"`
BatchOrderOption *bool
TimeStamp *time.Time
BatchCount int32
}
type RequestBatchItem struct {
Operation Operation
UniqueBatchItemID []byte `ttlv:",omitempty"`
RequestPayload OperationPayload
MessageExtension *MessageExtension
}
func (pv *RequestBatchItem) TagEncodeTTLV(e *ttlv.Encoder, tag int) {
e.Struct(tag, func(e *ttlv.Encoder) {
e.Any(pv.Operation)
if len(pv.UniqueBatchItemID) > 0 {
e.ByteString(TagUniqueBatchItemID, pv.UniqueBatchItemID)
}
e.TagAny(TagRequestPayload, pv.RequestPayload)
e.Any(pv.MessageExtension)
})
}
func (pv *RequestBatchItem) TagDecodeTTLV(d *ttlv.Decoder, tag int) error {
return d.Struct(tag, func(d *ttlv.Decoder) error {
if err := d.Any(&pv.Operation); err != nil {
return err
}
if err := d.Opt(TagUniqueBatchItemID, &pv.UniqueBatchItemID); err != nil {
return err
}
pv.RequestPayload = newRequestPayload(pv.Operation)
if err := d.TagAny(TagRequestPayload, &pv.RequestPayload); err != nil {
return err
}
return d.Opt(TagMessageExtension, &pv.MessageExtension)
})
}