github.com/jcmturner/gokrb5/v8@v8.4.4/types/PAData.go (about) 1 package types 2 3 // Reference: https://www.ietf.org/rfc/rfc4120.txt 4 // Section: 5.2.7 5 import ( 6 "fmt" 7 "time" 8 9 "github.com/jcmturner/gofork/encoding/asn1" 10 "github.com/jcmturner/gokrb5/v8/iana/patype" 11 ) 12 13 // PAData implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7 14 type PAData struct { 15 PADataType int32 `asn1:"explicit,tag:1"` 16 PADataValue []byte `asn1:"explicit,tag:2"` 17 } 18 19 // PADataSequence implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7 20 type PADataSequence []PAData 21 22 // MethodData implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.9.1 23 type MethodData []PAData 24 25 // PAEncTimestamp implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7.2 26 type PAEncTimestamp EncryptedData 27 28 // PAEncTSEnc implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7.2 29 type PAEncTSEnc struct { 30 PATimestamp time.Time `asn1:"generalized,explicit,tag:0"` 31 PAUSec int `asn1:"explicit,optional,tag:1"` 32 } 33 34 // Contains tests if a PADataSequence contains PA Data of a certain type. 35 func (pas *PADataSequence) Contains(patype int32) bool { 36 for _, pa := range *pas { 37 if pa.PADataType == patype { 38 return true 39 } 40 } 41 return false 42 } 43 44 // GetPAEncTSEncAsnMarshalled returns the bytes of a PAEncTSEnc. 45 func GetPAEncTSEncAsnMarshalled() ([]byte, error) { 46 t := time.Now().UTC() 47 p := PAEncTSEnc{ 48 PATimestamp: t, 49 PAUSec: int((t.UnixNano() / int64(time.Microsecond)) - (t.Unix() * 1e6)), 50 } 51 b, err := asn1.Marshal(p) 52 if err != nil { 53 return b, fmt.Errorf("error mashaling PAEncTSEnc: %v", err) 54 } 55 return b, nil 56 } 57 58 // ETypeInfoEntry implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7.4 59 type ETypeInfoEntry struct { 60 EType int32 `asn1:"explicit,tag:0"` 61 Salt []byte `asn1:"explicit,optional,tag:1"` 62 } 63 64 // ETypeInfo implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7.4 65 type ETypeInfo []ETypeInfoEntry 66 67 // ETypeInfo2Entry implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7.5 68 type ETypeInfo2Entry struct { 69 EType int32 `asn1:"explicit,tag:0"` 70 Salt string `asn1:"explicit,optional,generalstring,tag:1"` 71 S2KParams []byte `asn1:"explicit,optional,tag:2"` 72 } 73 74 // ETypeInfo2 implements RFC 4120 types: https://tools.ietf.org/html/rfc4120#section-5.2.7.5 75 type ETypeInfo2 []ETypeInfo2Entry 76 77 // PAReqEncPARep PA Data Type 78 type PAReqEncPARep struct { 79 ChksumType int32 `asn1:"explicit,tag:0"` 80 Chksum []byte `asn1:"explicit,tag:1"` 81 } 82 83 // Unmarshal bytes into the PAData 84 func (pa *PAData) Unmarshal(b []byte) error { 85 _, err := asn1.Unmarshal(b, pa) 86 return err 87 } 88 89 // Unmarshal bytes into the PADataSequence 90 func (pas *PADataSequence) Unmarshal(b []byte) error { 91 _, err := asn1.Unmarshal(b, pas) 92 return err 93 } 94 95 // Unmarshal bytes into the PAReqEncPARep 96 func (pa *PAReqEncPARep) Unmarshal(b []byte) error { 97 _, err := asn1.Unmarshal(b, pa) 98 return err 99 } 100 101 // Unmarshal bytes into the PAEncTimestamp 102 func (pa *PAEncTimestamp) Unmarshal(b []byte) error { 103 _, err := asn1.Unmarshal(b, pa) 104 return err 105 } 106 107 // Unmarshal bytes into the PAEncTSEnc 108 func (pa *PAEncTSEnc) Unmarshal(b []byte) error { 109 _, err := asn1.Unmarshal(b, pa) 110 return err 111 } 112 113 // Unmarshal bytes into the ETypeInfo 114 func (a *ETypeInfo) Unmarshal(b []byte) error { 115 _, err := asn1.Unmarshal(b, a) 116 return err 117 } 118 119 // Unmarshal bytes into the ETypeInfoEntry 120 func (a *ETypeInfoEntry) Unmarshal(b []byte) error { 121 _, err := asn1.Unmarshal(b, a) 122 return err 123 } 124 125 // Unmarshal bytes into the ETypeInfo2 126 func (a *ETypeInfo2) Unmarshal(b []byte) error { 127 _, err := asn1.Unmarshal(b, a) 128 return err 129 } 130 131 // Unmarshal bytes into the ETypeInfo2Entry 132 func (a *ETypeInfo2Entry) Unmarshal(b []byte) error { 133 _, err := asn1.Unmarshal(b, a) 134 return err 135 } 136 137 // GetETypeInfo returns an ETypeInfo from the PAData. 138 func (pa *PAData) GetETypeInfo() (d ETypeInfo, err error) { 139 if pa.PADataType != patype.PA_ETYPE_INFO { 140 err = fmt.Errorf("PAData does not contain PA EType Info data. TypeID Expected: %v; Actual: %v", patype.PA_ETYPE_INFO, pa.PADataType) 141 return 142 } 143 _, err = asn1.Unmarshal(pa.PADataValue, &d) 144 return 145 } 146 147 // GetETypeInfo2 returns an ETypeInfo2 from the PAData. 148 func (pa *PAData) GetETypeInfo2() (d ETypeInfo2, err error) { 149 if pa.PADataType != patype.PA_ETYPE_INFO2 { 150 err = fmt.Errorf("PAData does not contain PA EType Info 2 data. TypeID Expected: %v; Actual: %v", patype.PA_ETYPE_INFO2, pa.PADataType) 151 return 152 } 153 _, err = asn1.Unmarshal(pa.PADataValue, &d) 154 return 155 }