gssapi.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package GSSAPI
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/jcmturner/asn1"
  6. )
  7. const (
  8. SPNEGO_OIDHex = "2b0601050502" //1.3.6.1.5.5.2
  9. )
  10. type SPNEGO struct {
  11. Init bool
  12. Resp bool
  13. NegTokenInit NegTokenInit
  14. NegTokenResp NegTokenResp
  15. }
  16. func (s *SPNEGO) Unmarshal(b []byte) error {
  17. var r []byte
  18. var err error
  19. if b[0] != byte(161) {
  20. // Not a NegTokenResp/Targ could be a NegTokenInit
  21. var oid asn1.ObjectIdentifier
  22. r, err = asn1.UnmarshalWithParams(b, &oid, fmt.Sprintf("application,explicit,tag:%v", 0))
  23. if err != nil {
  24. return fmt.Errorf("Not a valid SPNEGO token: %v", err)
  25. }
  26. // Check the OID is the SPNEGO OID value
  27. if !oid.Equal(asn1.ObjectIdentifier{1, 3, 6, 1, 5, 5, 2}) {
  28. return errors.New("OID does not match SPNEGO OID 1.3.6.1.5.5.2")
  29. }
  30. } else {
  31. // Could be a NegTokenResp/Targ
  32. r = b
  33. }
  34. var a asn1.RawValue
  35. _, err = asn1.Unmarshal(r, &a)
  36. if err != nil {
  37. return fmt.Errorf("Error unmarshalling SPNEGO: %v", err)
  38. }
  39. switch a.Tag {
  40. case 0:
  41. _, err = asn1.Unmarshal(a.Bytes, &s.NegTokenInit)
  42. if err != nil {
  43. return fmt.Errorf("Error unmarshalling NegotiationToken type %d: %v", a.Tag, err)
  44. }
  45. s.Init = true
  46. case 1:
  47. _, err = asn1.Unmarshal(a.Bytes, &s.NegTokenResp)
  48. if err != nil {
  49. return fmt.Errorf("Error unmarshalling NegotiationToken type %d: %v", a.Tag, err)
  50. }
  51. s.Resp = true
  52. default:
  53. return errors.New("Unknown choice type for NegotiationToken")
  54. }
  55. return nil
  56. }