forked from mfdooom/gokrb5
-
Notifications
You must be signed in to change notification settings - Fork 0
/
PAData.go
155 lines (130 loc) · 4.41 KB
/
PAData.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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package types
// Reference: https://www.ietf.org/rfc/rfc4120.txt
// Section: 5.2.7
import (
"fmt"
"time"
"github.com/jcmturner/gofork/encoding/asn1"
"gopkg.in/jcmturner/gokrb5.v7/iana/patype"
)
// PAData implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7
type PAData struct {
PADataType int32 `asn1:"explicit,tag:1"`
PADataValue []byte `asn1:"explicit,tag:2"`
}
// PADataSequence implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7
type PADataSequence []PAData
// MethodData implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.9.1
type MethodData []PAData
// PAEncTimestamp implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7.2
type PAEncTimestamp EncryptedData
// PAEncTSEnc implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7.2
type PAEncTSEnc struct {
PATimestamp time.Time `asn1:"generalized,explicit,tag:0"`
PAUSec int `asn1:"explicit,optional,tag:1"`
}
// Contains tests if a PADataSequence contains PA Data of a certain type.
func (pas *PADataSequence) Contains(patype int32) bool {
for _, pa := range *pas {
if pa.PADataType == patype {
return true
}
}
return false
}
// GetPAEncTSEncAsnMarshalled returns the bytes of a PAEncTSEnc.
func GetPAEncTSEncAsnMarshalled() ([]byte, error) {
t := time.Now().UTC()
p := PAEncTSEnc{
PATimestamp: t,
PAUSec: int((t.UnixNano() / int64(time.Microsecond)) - (t.Unix() * 1e6)),
}
b, err := asn1.Marshal(p)
if err != nil {
return b, fmt.Errorf("error mashaling PAEncTSEnc: %v", err)
}
return b, nil
}
// ETypeInfoEntry implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7.4
type ETypeInfoEntry struct {
EType int32 `asn1:"explicit,tag:0"`
Salt []byte `asn1:"explicit,optional,tag:1"`
}
// ETypeInfo implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7.4
type ETypeInfo []ETypeInfoEntry
// ETypeInfo2Entry implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7.5
type ETypeInfo2Entry struct {
EType int32 `asn1:"explicit,tag:0"`
Salt string `asn1:"explicit,optional,generalstring,tag:1"`
S2KParams []byte `asn1:"explicit,optional,tag:2"`
}
// ETypeInfo2 implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7.5
type ETypeInfo2 []ETypeInfo2Entry
// PAReqEncPARep PA Data Type
type PAReqEncPARep struct {
ChksumType int32 `asn1:"explicit,tag:0"`
Chksum []byte `asn1:"explicit,tag:1"`
}
// Unmarshal bytes into the PAData
func (pa *PAData) Unmarshal(b []byte) error {
_, err := asn1.Unmarshal(b, pa)
return err
}
// Unmarshal bytes into the PADataSequence
func (pas *PADataSequence) Unmarshal(b []byte) error {
_, err := asn1.Unmarshal(b, pas)
return err
}
// Unmarshal bytes into the PAReqEncPARep
func (pa *PAReqEncPARep) Unmarshal(b []byte) error {
_, err := asn1.Unmarshal(b, pa)
return err
}
// Unmarshal bytes into the PAEncTimestamp
func (pa *PAEncTimestamp) Unmarshal(b []byte) error {
_, err := asn1.Unmarshal(b, pa)
return err
}
// Unmarshal bytes into the PAEncTSEnc
func (pa *PAEncTSEnc) Unmarshal(b []byte) error {
_, err := asn1.Unmarshal(b, pa)
return err
}
// Unmarshal bytes into the ETypeInfo
func (a *ETypeInfo) Unmarshal(b []byte) error {
_, err := asn1.Unmarshal(b, a)
return err
}
// Unmarshal bytes into the ETypeInfoEntry
func (a *ETypeInfoEntry) Unmarshal(b []byte) error {
_, err := asn1.Unmarshal(b, a)
return err
}
// Unmarshal bytes into the ETypeInfo2
func (a *ETypeInfo2) Unmarshal(b []byte) error {
_, err := asn1.Unmarshal(b, a)
return err
}
// Unmarshal bytes into the ETypeInfo2Entry
func (a *ETypeInfo2Entry) Unmarshal(b []byte) error {
_, err := asn1.Unmarshal(b, a)
return err
}
// GetETypeInfo returns an ETypeInfo from the PAData.
func (pa *PAData) GetETypeInfo() (d ETypeInfo, err error) {
if pa.PADataType != patype.PA_ETYPE_INFO {
err = fmt.Errorf("PAData does not contain PA EType Info data. TypeID Expected: %v; Actual: %v", patype.PA_ETYPE_INFO, pa.PADataType)
return
}
_, err = asn1.Unmarshal(pa.PADataValue, &d)
return
}
// GetETypeInfo2 returns an ETypeInfo2 from the PAData.
func (pa *PAData) GetETypeInfo2() (d ETypeInfo2, err error) {
if pa.PADataType != patype.PA_ETYPE_INFO2 {
err = fmt.Errorf("PAData does not contain PA EType Info 2 data. TypeID Expected: %v; Actual: %v", patype.PA_ETYPE_INFO2, pa.PADataType)
return
}
_, err = asn1.Unmarshal(pa.PADataValue, &d)
return
}