-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsession_transcript.go
103 lines (86 loc) · 2.49 KB
/
session_transcript.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package mdoc
import (
"bytes"
"errors"
"github.com/fxamacker/cbor/v2"
)
var (
ErrUnrecognizedHandover = errors.New("unrecognized handover")
)
type SessionTranscript struct {
DeviceEngagementBytes *TaggedEncodedCBOR
EReaderKeyBytes *TaggedEncodedCBOR
Handover Handover
}
type intermediateSessionTranscript struct {
_ struct{} `cbor:",toarray"`
DeviceEngagementBytes *TaggedEncodedCBOR
EReaderKeyBytes *TaggedEncodedCBOR
Handover cbor.RawMessage
}
func (st *SessionTranscript) MarshalCBOR() ([]byte, error) {
var handoverBytes []byte
var err error
switch handover := st.Handover.(type) {
case QRHandover:
handoverBytes, err = cbor.Marshal(&handover)
if err != nil {
return nil, err
}
case NFCHandover:
handoverBytes, err = cbor.Marshal(&handover)
if err != nil {
return nil, err
}
default:
return nil, ErrUnrecognizedHandover
}
intermediateSessionTranscript := intermediateSessionTranscript{
DeviceEngagementBytes: st.DeviceEngagementBytes,
EReaderKeyBytes: st.EReaderKeyBytes,
Handover: handoverBytes,
}
return cbor.Marshal(&intermediateSessionTranscript)
}
func (st *SessionTranscript) UnmarshalCBOR(data []byte) error {
var err error
var intermediateSessionTranscript intermediateSessionTranscript
if err = cbor.Unmarshal(data, &intermediateSessionTranscript); err != nil {
return err
}
{
var qrHandover QRHandover
if err = cbor.Unmarshal(intermediateSessionTranscript.Handover, &qrHandover); err == nil {
st.DeviceEngagementBytes = intermediateSessionTranscript.DeviceEngagementBytes
st.EReaderKeyBytes = intermediateSessionTranscript.EReaderKeyBytes
st.Handover = qrHandover
return nil
}
}
{
var nfcHandover NFCHandover
if err = cbor.Unmarshal(intermediateSessionTranscript.Handover, &nfcHandover); err == nil {
st.DeviceEngagementBytes = intermediateSessionTranscript.DeviceEngagementBytes
st.EReaderKeyBytes = intermediateSessionTranscript.EReaderKeyBytes
st.Handover = nfcHandover
return nil
}
}
return ErrUnrecognizedHandover
}
type Handover any
type QRHandover struct{}
func (qrh *QRHandover) MarshalCBOR() ([]byte, error) {
return []byte{cborNull}, nil
}
func (qrh *QRHandover) UnmarshalCBOR(data []byte) error {
if !bytes.Equal([]byte{cborNull}, data) {
return errors.New("not a qr handover")
}
return nil
}
type NFCHandover struct {
_ struct{} `cbor:",toarray"`
HandoverSelect []byte
HandoverRequest []byte `cbor:",omitempty"`
}