Jonathan Turner 9 years ago
parent
commit
2f159a58ca
4 changed files with 75 additions and 47 deletions
  1. 4 4
      GSSAPI/MechType.go
  2. 31 35
      GSSAPI/NegotiationToken.go
  3. 37 5
      GSSAPI/NegotiationToken_test.go
  4. 3 3
      GSSAPI/gssapi_test.go

+ 4 - 4
GSSAPI/MechType.go

@@ -1,6 +1,6 @@
 package GSSAPI
 
-const (
-	MechType_Krb5_OIDHex         = "2a864886f712010202" //1.2.840.113554.1.2.2
-	MechType_MSLegacyKrb5_OIDHex = "2a864882f712010202" //1.2.840.48018.1.2.2
-)
+import "github.com/jcmturner/asn1"
+
+var MechTypeOID_Krb5 = asn1.ObjectIdentifier{1, 2, 840, 113554, 1, 2, 2}
+var MechTypeOID_MSLegacyKrb5 = asn1.ObjectIdentifier{1, 2, 840, 48018, 1, 2, 2}

+ 31 - 35
GSSAPI/NegotiationToken.go

@@ -40,13 +40,6 @@ NegTokenResp ::= SEQUENCE {
 }
 */
 
-// Tag attribute of NegotiationToken will indicate type:
-// 0xa0 (160) - negTokenInit
-// 0xa1 (161) - negTokenResp
-type NegotiationToken struct {
-	Choice asn1.RawValue
-}
-
 type NegTokenInit struct {
 	MechTypes    []asn1.ObjectIdentifier `asn1:"explicit,tag:0"`
 	ReqFlags     ContextFlags            `asn1:"explicit,optional,tag:1"`
@@ -55,7 +48,7 @@ type NegTokenInit struct {
 }
 
 type NegTokenResp struct {
-	NegState      asn1.Enumerated       `asn1:"explicit,optional,tag:0"`
+	NegState      asn1.Enumerated       `asn1:"explicit,tag:0"`
 	SupportedMech asn1.ObjectIdentifier `asn1:"explicit,optional,tag:1"`
 	ResponseToken []byte                `asn1:"explicit,optional,tag:2"`
 	MechListMIC   []byte                `asn1:"explicit,optional,tag:3"`
@@ -67,24 +60,25 @@ type NegTokenTarg NegTokenResp
 //
 // The boolean indicates if the response is a NegTokenInit.
 // If error is nil and the boolean is false the response is a NegTokenResp.
-func (n *NegotiationToken) Unmarshal(b []byte) (bool, interface{}, error) {
-	_, err := asn1.Unmarshal(b, n)
+func UnmarshalNegToken(b []byte) (bool, interface{}, error) {
+	var a asn1.RawValue
+	_, err := asn1.Unmarshal(b, &a)
 	if err != nil {
 		return false, nil, fmt.Errorf("Error unmarshalling NegotiationToken: %v", err)
 	}
-	switch n.Choice.Tag {
+	switch a.Tag {
 	case 0:
 		var negToken NegTokenInit
-		_, err = asn1.Unmarshal(b, &negToken)
+		_, err = asn1.Unmarshal(a.Bytes, &negToken)
 		if err != nil {
-			return false, nil, fmt.Errorf("Error unmarshalling NegotiationToken type %d: %v", n.Choice.Tag, err)
+			return false, nil, fmt.Errorf("Error unmarshalling NegotiationToken type %d: %v", a.Tag, err)
 		}
 		return true, negToken, nil
 	case 1:
 		var negToken NegTokenResp
-		_, err = asn1.Unmarshal(b, &negToken)
+		_, err = asn1.Unmarshal(a.Bytes, &negToken)
 		if err != nil {
-			return false, nil, fmt.Errorf("Error unmarshalling NegotiationToken type %d: %v", n.Choice.Tag, err)
+			return false, nil, fmt.Errorf("Error unmarshalling NegotiationToken type %d: %v", a.Tag, err)
 		}
 		return false, negToken, nil
 	default:
@@ -98,19 +92,17 @@ func (n *NegTokenInit) Marshal() ([]byte, error) {
 	if err != nil {
 		return nil, err
 	}
-	//nt := NegotiationToken{
-	//	Choice: asn1.RawValue{
-	//		Tag:        0,
-	//		Class:      2,
-	//		IsCompound: true,
-	//		Bytes:      b,
-	//	},
-	//}
-	//nb, err := asn1.Marshal(nt)
-	//if err != nil {
-	//	return nil, err
-	//}
-	return b, nil
+	nt := asn1.RawValue{
+		Tag:        0,
+		Class:      2,
+		IsCompound: true,
+		Bytes:      b,
+	}
+	nb, err := asn1.Marshal(nt)
+	if err != nil {
+		return nil, err
+	}
+	return nb, nil
 }
 
 // Returns marshalled bytes of a NegotiationToken rather than the NegTokenResp
@@ -119,13 +111,11 @@ func (n *NegTokenResp) Marshal() ([]byte, error) {
 	if err != nil {
 		return nil, err
 	}
-	nt := NegotiationToken{
-		Choice: asn1.RawValue{
-			Tag:        1,
-			Class:      2,
-			IsCompound: true,
-			Bytes:      b,
-		},
+	nt := asn1.RawValue{
+		Tag:        1,
+		Class:      2,
+		IsCompound: true,
+		Bytes:      b,
 	}
 	nb, err := asn1.Marshal(nt)
 	if err != nil {
@@ -133,3 +123,9 @@ func (n *NegTokenResp) Marshal() ([]byte, error) {
 	}
 	return nb, nil
 }
+
+func NewNegTokenInitKrb5() NegTokenInit {
+	return NegTokenInit{
+		MechTypes: []asn1.ObjectIdentifier{MechTypeOID_Krb5},
+	}
+}

+ 37 - 5
GSSAPI/NegotiationToken_test.go

@@ -8,7 +8,8 @@ import (
 )
 
 const (
-	test_negTokenInit = "308202a6a027302506092a864886f71201020206052b0501050206092a864882f71201020206062b0601050205a2820279048202756082027106092a864886f71201020201006e8202603082025ca003020105a10302010ea20703050000000000a38201706182016c30820168a003020105a10d1b0b544553542e474f4b524235a2233021a003020103a11a30181b04485454501b10686f73742e746573742e676f6b726235a382012b30820127a003020112a103020102a282011904820115d4bd890abc456f44e2e7a2e8111bd6767abf03266dfcda97c629af2ece450a5ae1f145e4a4d1bc2c848e66a6c6b31d9740b26b03cdbd2570bfcf126e90adf5f5ebce9e283ff5086da47b129b14fc0aabd4d1df9c1f3c72b80cc614dfc28783450b2c7b7749651f432b47aaa2ff158c0066b757f3fb00dd7b4f63d68276c76373ecdd3f19c66ebc43a81e577f3c263b878356f57e8d6c4eccd587b81538e70392cf7e73fc12a6f7c537a894a7bb5566c83ac4d69757aa320a51d8d690017aebf952add1889adfc3307b0e6cd8c9b57cf8589fbe52800acb6461c25473d49faa1bdceb8bce3f61db23f9cd6a09d5adceb411e1c4546b30b33331e570fd6bc50aa403557e75f488e759750ea038aab6454667d9b64f41a481d23081cfa003020112a281c70481c4eb593beb5afcb1a2a669d54cb85a3772231559f2d40c9f8f053f218ba6eb084ed7efc467d94b88bcd189dda920d6e675ec001a6a2bca11f0a1de37f2f7ae9929f94a86d625b2ec1b213a88cbae6099dda7b172cd3bd1802cb177ae4554d59277004bfd3435248f55044fe7af7b2c9c5a3c43763278c585395aebe2856cdff9f2569d8b823564ce6be2d19748b910ec06bd3c0a9bc5de51ddcf7d875f1108ca6ad935f52d90cb62a18197d9b8e796bef0fbe1463f61df61cfbce6008ae9e1a2d2314a986d"
+	test_negTokenInit = "a08202aa308202a6a027302506092a864886f71201020206052b0501050206092a864882f71201020206062b0601050205a2820279048202756082027106092a864886f71201020201006e8202603082025ca003020105a10302010ea20703050000000000a38201706182016c30820168a003020105a10d1b0b544553542e474f4b524235a2233021a003020103a11a30181b04485454501b10686f73742e746573742e676f6b726235a382012b30820127a003020112a103020102a282011904820115d4bd890abc456f44e2e7a2e8111bd6767abf03266dfcda97c629af2ece450a5ae1f145e4a4d1bc2c848e66a6c6b31d9740b26b03cdbd2570bfcf126e90adf5f5ebce9e283ff5086da47b129b14fc0aabd4d1df9c1f3c72b80cc614dfc28783450b2c7b7749651f432b47aaa2ff158c0066b757f3fb00dd7b4f63d68276c76373ecdd3f19c66ebc43a81e577f3c263b878356f57e8d6c4eccd587b81538e70392cf7e73fc12a6f7c537a894a7bb5566c83ac4d69757aa320a51d8d690017aebf952add1889adfc3307b0e6cd8c9b57cf8589fbe52800acb6461c25473d49faa1bdceb8bce3f61db23f9cd6a09d5adceb411e1c4546b30b33331e570fd6bc50aa403557e75f488e759750ea038aab6454667d9b64f41a481d23081cfa003020112a281c70481c4d67ba2ae4cf5d917caab1d863605249320e90482563662ed92408a543b6ad5edeb8f9375e9060a205491df082fd2a5fec93dfb76f41012bb60cae20f07adbb77a1aa56f0521f36e1ea10dc9fb762902b254dd7664d0bcc6f751f2003e41990af1b4330d10477bfad638b9f0b704ac80cc47731f8ec8d801762bad8884b8de90adb1dbe7fc7b0ffafd38fb5eb8b6547cee30d89873281ce63ad70042a13478b1a7c2bdde0f223ace62dbb84e2d06f1070f4265f66e0544449335e2fcc4d0aee5bf81c5999"
+	test_negTokenResp = "a1143012a0030a0100a10b06092a864886f712010202"
 )
 
 func TestUnmarshal_negTokenInit(t *testing.T) {
@@ -16,8 +17,7 @@ func TestUnmarshal_negTokenInit(t *testing.T) {
 	if err != nil {
 		t.Fatalf("Error converting hex string test data to bytes: %v", err)
 	}
-	var n NegotiationToken
-	isInit, nt, err := n.Unmarshal(b)
+	isInit, nt, err := UnmarshalNegToken(b)
 	if err != nil {
 		t.Fatalf("Error unmarshalling negotiation token: %v", err)
 	}
@@ -39,8 +39,7 @@ func TestMarshal_negTokenInit(t *testing.T) {
 	if err != nil {
 		t.Fatalf("Error converting hex string test data to bytes: %v", err)
 	}
-	var n NegotiationToken
-	_, nt, err := n.Unmarshal(b)
+	_, nt, err := UnmarshalNegToken(b)
 	if err != nil {
 		t.Fatalf("Error unmarshalling negotiation token: %v", err)
 	}
@@ -51,3 +50,36 @@ func TestMarshal_negTokenInit(t *testing.T) {
 	}
 	assert.Equal(t, b, mb, "Marshalled bytes not as expected for NegTokenInit")
 }
+
+func TestUnmarshal_negTokenResp(t *testing.T) {
+	b, err := hex.DecodeString(test_negTokenResp)
+	if err != nil {
+		t.Fatalf("Error converting hex string test data to bytes: %v", err)
+	}
+	isInit, nt, err := UnmarshalNegToken(b)
+	if err != nil {
+		t.Fatalf("Error unmarshalling negotiation token: %v", err)
+	}
+	assert.IsType(t, NegTokenResp{}, nt, "Not the expected type NegTokenResp")
+	assert.False(t, isInit, "Boolean indicating type is negTokenInit is not false")
+	nResp := nt.(NegTokenResp)
+	assert.Equal(t, asn1.Enumerated(0), nResp.NegState)
+	assert.Equal(t, MechTypeOID_Krb5, nResp.SupportedMech, "SupportedMech type not as expected.")
+}
+
+func TestMarshal_negTokenResp(t *testing.T) {
+	b, err := hex.DecodeString(test_negTokenResp)
+	if err != nil {
+		t.Fatalf("Error converting hex string test data to bytes: %v", err)
+	}
+	_, nt, err := UnmarshalNegToken(b)
+	if err != nil {
+		t.Fatalf("Error unmarshalling negotiation token: %v", err)
+	}
+	nResp := nt.(NegTokenResp)
+	mb, err := nResp.Marshal()
+	if err != nil {
+		t.Fatalf("Error marshalling negotiation init token: %v", err)
+	}
+	assert.Equal(t, b, mb, "Marshalled bytes not as expected for NegTokenResp")
+}

+ 3 - 3
GSSAPI/gssapi_test.go

@@ -26,9 +26,9 @@ func TestUnmarshal_SPNEGO_Init(t *testing.T) {
 	assert.False(t, s.Resp, "SPNEGO indicates is contains a NegTokenResp but it shouldn't")
 	assert.Equal(t, 4, len(s.NegTokenInit.MechTypes))
 	expectMechTypes := []asn1.ObjectIdentifier{
-		[]int{1, 2, 840, 113554, 1, 2, 2},
+		MechTypeOID_Krb5,
 		[]int{1, 3, 5, 1, 5, 2},
-		[]int{1, 2, 840, 48018, 1, 2, 2},
+		MechTypeOID_MSLegacyKrb5,
 		[]int{1, 3, 6, 1, 5, 2, 5},
 	}
 	assert.Equal(t, expectMechTypes, s.NegTokenInit.MechTypes, "MechTypes list in NegTokenInit not as expected")
@@ -48,5 +48,5 @@ func TestUnmarshal_SPNEGO_RespTarg(t *testing.T) {
 	assert.True(t, s.Resp, "SPNEGO does not indicate it contains NegTokenResp/Targ as expected")
 	assert.False(t, s.Init, "SPNEGO indicates is contains a NegTokenInit but it shouldn't")
 	assert.Equal(t, asn1.Enumerated(0), s.NegTokenResp.NegState, "Negtiation state not as expected.")
-	assert.Equal(t, asn1.ObjectIdentifier{1, 2, 840, 113554, 1, 2, 2}, s.NegTokenResp.SupportedMech, "SupportedMech type not as expected.")
+	assert.Equal(t, MechTypeOID_Krb5, s.NegTokenResp.SupportedMech, "SupportedMech type not as expected.")
 }