KRBError.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package messages
  2. import (
  3. "fmt"
  4. "github.com/jcmturner/asn1"
  5. "github.com/jcmturner/gokrb5/iana/asnAppTag"
  6. "github.com/jcmturner/gokrb5/iana/msgtype"
  7. "github.com/jcmturner/gokrb5/types"
  8. "time"
  9. )
  10. type KRBError struct {
  11. PVNO int `asn1:"explicit,tag:0"`
  12. MsgType int `asn1:"explicit,tag:1"`
  13. CTime time.Time `asn1:"generalized,optional,explicit,tag:2"`
  14. Cusec int `asn1:"optional,explicit,tag:3"`
  15. STime time.Time `asn1:"generalized,explicit,tag:4"`
  16. Susec int `asn1:"explicit,tag:5"`
  17. ErrorCode int `asn1:"explicit,tag:6"`
  18. CRealm string `asn1:"generalstring,optional,explicit,tag:7"`
  19. CName types.PrincipalName `asn1:"optional,explicit,tag:8"`
  20. Realm string `asn1:"generalstring,explicit,tag:9"`
  21. SName types.PrincipalName `asn1:"explicit,tag:10"`
  22. EText string `asn1:"generalstring,optional,explicit,tag:11"`
  23. EData []byte `asn1:"optional,explicit,tag:12"`
  24. }
  25. func (k *KRBError) Unmarshal(b []byte) error {
  26. _, err := asn1.UnmarshalWithParams(b, k, fmt.Sprintf("application,explicit,tag:%v", asnAppTag.KRBError))
  27. if err != nil {
  28. return err
  29. }
  30. expectedMsgType := msgtype.KRB_ERROR
  31. if k.MsgType != expectedMsgType {
  32. return fmt.Errorf("Message ID does not indicate a KRB_ERROR. Expected: %v; Actual: %v", expectedMsgType, k.MsgType)
  33. }
  34. return nil
  35. }
  36. func (k KRBError) Error() string {
  37. return fmt.Sprintf("KRB Error: %d - %s", k.ErrorCode, k.EText)
  38. }