88 "time"
99
1010 "github.com/jcmturner/gofork/encoding/asn1"
11+ "github.com/jcmturner/gokrb5/v8/asn1tools"
1112 "github.com/jcmturner/gokrb5/v8/config"
1213 "github.com/jcmturner/gokrb5/v8/credentials"
1314 "github.com/jcmturner/gokrb5/v8/crypto"
@@ -103,6 +104,34 @@ func (k *ASRep) Unmarshal(b []byte) error {
103104 return nil
104105}
105106
107+ // Marshal ASRep struct.
108+ func (k * ASRep ) Marshal () ([]byte , error ) {
109+ m := marshalKDCRep {
110+ PVNO : k .PVNO ,
111+ MsgType : k .MsgType ,
112+ PAData : k .PAData ,
113+ CRealm : k .CRealm ,
114+ CName : k .CName ,
115+ EncPart : k .EncPart ,
116+ }
117+ b , err := k .Ticket .Marshal ()
118+ if err != nil {
119+ return []byte {}, err
120+ }
121+ m .Ticket = asn1.RawValue {
122+ Class : asn1 .ClassContextSpecific ,
123+ IsCompound : true ,
124+ Tag : 5 ,
125+ Bytes : b ,
126+ }
127+ mk , err := asn1 .Marshal (m )
128+ if err != nil {
129+ return mk , krberror .Errorf (err , krberror .EncodingError , "error marshaling AS_REP" )
130+ }
131+ mk = asn1tools .AddASNAppTag (mk , asnAppTag .ASREP )
132+ return mk , nil
133+ }
134+
106135// Unmarshal bytes b into the TGSRep struct.
107136func (k * TGSRep ) Unmarshal (b []byte ) error {
108137 var m marshalKDCRep
@@ -130,6 +159,34 @@ func (k *TGSRep) Unmarshal(b []byte) error {
130159 return nil
131160}
132161
162+ // Marshal TGSRep struct.
163+ func (k * TGSRep ) Marshal () ([]byte , error ) {
164+ m := marshalKDCRep {
165+ PVNO : k .PVNO ,
166+ MsgType : k .MsgType ,
167+ PAData : k .PAData ,
168+ CRealm : k .CRealm ,
169+ CName : k .CName ,
170+ EncPart : k .EncPart ,
171+ }
172+ b , err := k .Ticket .Marshal ()
173+ if err != nil {
174+ return []byte {}, err
175+ }
176+ m .Ticket = asn1.RawValue {
177+ Class : asn1 .ClassContextSpecific ,
178+ IsCompound : true ,
179+ Tag : 5 ,
180+ Bytes : b ,
181+ }
182+ mk , err := asn1 .Marshal (m )
183+ if err != nil {
184+ return mk , krberror .Errorf (err , krberror .EncodingError , "error marshaling TGS_REP" )
185+ }
186+ mk = asn1tools .AddASNAppTag (mk , asnAppTag .TGSREP )
187+ return mk , nil
188+ }
189+
133190// Unmarshal bytes b into encrypted part of KRB_KDC_REP.
134191func (e * EncKDCRepPart ) Unmarshal (b []byte ) error {
135192 _ , err := asn1 .UnmarshalWithParams (b , e , fmt .Sprintf ("application,explicit,tag:%v" , asnAppTag .EncASRepPart ))
@@ -145,6 +202,16 @@ func (e *EncKDCRepPart) Unmarshal(b []byte) error {
145202 return nil
146203}
147204
205+ // Marshal encrypted part of KRB_KDC_REP.
206+ func (e * EncKDCRepPart ) Marshal () ([]byte , error ) {
207+ b , err := asn1 .Marshal (* e )
208+ if err != nil {
209+ return b , krberror .Errorf (err , krberror .EncodingError , "marshaling error of AS_REP encpart" )
210+ }
211+ b = asn1tools .AddASNAppTag (b , asnAppTag .EncASRepPart )
212+ return b , nil
213+ }
214+
148215// DecryptEncPart decrypts the encrypted part of an AS_REP.
149216func (k * ASRep ) DecryptEncPart (c * credentials.Credentials ) (types.EncryptionKey , error ) {
150217 var key types.EncryptionKey
@@ -201,6 +268,7 @@ func (k *ASRep) Verify(cfg *config.Config, creds *credentials.Credentials, asReq
201268 if k .DecryptedEncPart .SName .NameType != asReq .ReqBody .SName .NameType || k .DecryptedEncPart .SName .NameString == nil {
202269 return false , krberror .NewErrorf (krberror .KRBMsgError , "SName in response does not match what was requested. Requested: %v; Reply: %v" , asReq .ReqBody .SName , k .DecryptedEncPart .SName )
203270 }
271+ //TODO is there something wrong here...>
204272 for i := range k .CName .NameString {
205273 if k .DecryptedEncPart .SName .NameString [i ] != asReq .ReqBody .SName .NameString [i ] {
206274 return false , krberror .NewErrorf (krberror .KRBMsgError , "SName in response does not match what was requested. Requested: %+v; Reply: %+v" , asReq .ReqBody .SName , k .DecryptedEncPart .SName )
0 commit comments