Jonathan Turner 9 lat temu
rodzic
commit
f14c76358a
3 zmienionych plików z 116 dodań i 34 usunięć
  1. 36 0
      messages/KRBError.go
  2. 64 18
      messages/KRBError_test.go
  3. 16 16
      testdata/test_vectors.go

+ 36 - 0
messages/KRBError.go

@@ -1 +1,37 @@
 package messages
+
+import (
+	"encoding/asn1"
+	"fmt"
+	"github.com/jcmturner/gokrb5/types"
+	"github.com/jcmturner/gokrb5/types/asnAppTag"
+	"time"
+)
+
+type KRBError struct {
+	PVNO      int                 `asn1:"explicit,tag:0"`
+	MsgType   int                 `asn1:"explicit,tag:1"`
+	CTime     time.Time           `asn1:"optional,explicit,tag:2"`
+	Cusec     int                 `asn1:"optional,explicit,tag:3"`
+	STime     time.Time           `asn1:"explicit,tag:4"`
+	Susec     int                 `asn1:"explicit,tag:5"`
+	ErrorCode int                 `asn1:"explicit,tag:6"`
+	CRealm    string              `asn1:"optional,explicit,tag:7"`
+	CName     types.PrincipalName `asn1:"optional,explicit,tag:8"`
+	Realm     string              `asn1:"explicit,tag:9"`
+	SName     types.PrincipalName `asn1:"explicit,tag:10"`
+	EText     string              `asn1:"optional,explicit,tag:11"`
+	EData     []byte              `asn1:"optional,explicit,tag:12"`
+}
+
+func (k *KRBError) Unmarshal(b []byte) error {
+	_, err := asn1.UnmarshalWithParams(b, k, fmt.Sprintf("application,explicit,tag:%v", asnAppTag.KRBError))
+	if err != nil {
+		return err
+	}
+	expectedMsgType := types.KrbDictionary.MsgTypesByName["KRB_ERROR"]
+	if k.MsgType != expectedMsgType {
+		return fmt.Errorf("Message ID does not indicate a KRB_ERROR. Expected: %v; Actual: %v", expectedMsgType, k.MsgType)
+	}
+	return nil
+}

+ 64 - 18
messages/KRBError_test.go

@@ -1,23 +1,69 @@
 package messages
 
+import (
+	"encoding/hex"
+	"github.com/jcmturner/gokrb5/testdata"
+	"github.com/jcmturner/gokrb5/types"
+	"github.com/stretchr/testify/assert"
+	"testing"
+	"time"
+)
 
-/*
-KRB-ERROR       ::= [APPLICATION 30] SEQUENCE {
-	pvno            [0] INTEGER (5),
-	msg-type        [1] INTEGER (30),
-	ctime           [2] KerberosTime OPTIONAL,
-	cusec           [3] Microseconds OPTIONAL,
-	stime           [4] KerberosTime,
-	susec           [5] Microseconds,
-	error-code      [6] Int32,
-	crealm          [7] Realm OPTIONAL,
-	cname           [8] PrincipalName OPTIONAL,
-	realm           [9] Realm -- service realm --,
-	sname           [10] PrincipalName -- service name --,
-	e-text          [11] KerberosString OPTIONAL,
-	e-data          [12] OCTET STRING OPTIONAL
+func TestUnmarshalKRBError(t *testing.T) {
+	var a KRBError
+	v := "encode_krb5_error"
+	b, err := hex.DecodeString(testdata.TestVectors[v])
+	if err != nil {
+		t.Fatalf("Test vector read error of %s: %v\n", v, err)
+	}
+	err = a.Unmarshal(b)
+	if err != nil {
+		t.Fatalf("Unmarshal error of %s: %v\n", v, err)
+	}
+	//Parse the test time value into a time.Time type
+	tt, _ := time.Parse(testdata.TEST_TIME_FORMAT, testdata.TEST_TIME)
+
+	assert.Equal(t, testdata.TEST_KVNO, a.PVNO, "PVNO is not as expected")
+	assert.Equal(t, types.KrbDictionary.MsgTypesByName["KRB_ERROR"], a.MsgType, "Message type is not as expected")
+	assert.Equal(t, tt, a.CTime, "CTime not as expected")
+	assert.Equal(t, 123456, a.Cusec, "Client microseconds not as expected")
+	assert.Equal(t, tt, a.STime, "STime not as expected")
+	assert.Equal(t, 123456, a.Susec, "Service microseconds not as expected")
+	assert.Equal(t, 60, a.ErrorCode, "Error code not as expected")
+	assert.Equal(t, testdata.TEST_REALM, a.CRealm, "CRealm not as expected")
+	assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMETYPE, a.CName.NameType, "CName NameType not as expected")
+	assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.CName.NameString), "CName does not have the expected number of NameStrings")
+	assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.CName.NameString, "CName entries not as expected")
+	assert.Equal(t, testdata.TEST_REALM, a.Realm, "Realm not as expected")
+	assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMETYPE, a.SName.NameType, "Ticket SName NameType not as expected")
+	assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.SName.NameString), "Ticket SName does not have the expected number of NameStrings")
+	assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.SName.NameString, "Ticket SName name string entries not as expected")
+	assert.Equal(t, "krb5data", a.EText, "EText not as expected")
+	assert.Equal(t, []byte("krb5data"), a.EData, "EData not as expected")
 }
-*/
 
-//encode_krb5_error
-//encode_krb5_error(optionalsNULL)
+func TestUnmarshalKRBError_optionalsNULL(t *testing.T) {
+	var a KRBError
+	v := "encode_krb5_error(optionalsNULL)"
+	b, err := hex.DecodeString(testdata.TestVectors[v])
+	if err != nil {
+		t.Fatalf("Test vector read error of %s: %v\n", v, err)
+	}
+	err = a.Unmarshal(b)
+	if err != nil {
+		t.Fatalf("Unmarshal error of %s: %v\n", v, err)
+	}
+	//Parse the test time value into a time.Time type
+	tt, _ := time.Parse(testdata.TEST_TIME_FORMAT, testdata.TEST_TIME)
+
+	assert.Equal(t, testdata.TEST_KVNO, a.PVNO, "PVNO is not as expected")
+	assert.Equal(t, types.KrbDictionary.MsgTypesByName["KRB_ERROR"], a.MsgType, "Message type is not as expected")
+	assert.Equal(t, 123456, a.Cusec, "Client microseconds not as expected")
+	assert.Equal(t, tt, a.STime, "STime not as expected")
+	assert.Equal(t, 123456, a.Susec, "Service microseconds not as expected")
+	assert.Equal(t, 60, a.ErrorCode, "Error code not as expected")
+	assert.Equal(t, testdata.TEST_REALM, a.Realm, "Realm not as expected")
+	assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMETYPE, a.SName.NameType, "Ticket SName NameType not as expected")
+	assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.SName.NameString), "Ticket SName does not have the expected number of NameStrings")
+	assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.SName.NameString, "Ticket SName name string entries not as expected")
+}

+ 16 - 16
testdata/test_vectors.go

@@ -54,22 +54,22 @@ var TestVectors = map[string]string{
 	"encode_krb5_cred":                                           "7681F63081F3A003020105A103020116A281BF3081BC615C305AA003020105A1101B0E415448454E412E4D49542E454455A21A3018A003020101A111300F1B066866747361691B056578747261A3253023A003020100A103020105A21704156B726241534E2E312074657374206D657373616765615C305AA003020105A1101B0E415448454E412E4D49542E454455A21A3018A003020101A111300F1B066866747361691B056578747261A3253023A003020100A103020105A21704156B726241534E2E312074657374206D657373616765A3253023A003020100A103020105A21704156B726241534E2E312074657374206D657373616765",
 	"encode_krb5_enc_cred_part":                                  "7D8202233082021FA08201DA308201D63081E8A0133011A003020101A10A04083132333435363738A1101B0E415448454E412E4D49542E454455A21A3018A003020101A111300F1B066866747361691B056578747261A307030500FEDCBA98A411180F31393934303631303036303331375AA511180F31393934303631303036303331375AA611180F31393934303631303036303331375AA711180F31393934303631303036303331375AA8101B0E415448454E412E4D49542E454455A91A3018A003020101A111300F1B066866747361691B056578747261AA20301E300DA003020102A106040412D00023300DA003020102A106040412D000233081E8A0133011A003020101A10A04083132333435363738A1101B0E415448454E412E4D49542E454455A21A3018A003020101A111300F1B066866747361691B056578747261A307030500FEDCBA98A411180F31393934303631303036303331375AA511180F31393934303631303036303331375AA611180F31393934303631303036303331375AA711180F31393934303631303036303331375AA8101B0E415448454E412E4D49542E454455A91A3018A003020101A111300F1B066866747361691B056578747261AA20301E300DA003020102A106040412D00023300DA003020102A106040412D00023A10302012AA211180F31393934303631303036303331375AA305020301E240A40F300DA003020102A106040412D00023A50F300DA003020102A106040412D00023",
 	"encode_krb5_enc_cred_part(optionalsNULL)":                   "7D82010E3082010AA0820106308201023015A0133011A003020101A10A040831323334353637383081E8A0133011A003020101A10A04083132333435363738A1101B0E415448454E412E4D49542E454455A21A3018A003020101A111300F1B066866747361691B056578747261A307030500FEDCBA98A411180F31393934303631303036303331375AA511180F31393934303631303036303331375AA611180F31393934303631303036303331375AA711180F31393934303631303036303331375AA8101B0E415448454E412E4D49542E454455A91A3018A003020101A111300F1B066866747361691B056578747261AA20301E300DA003020102A106040412D00023300DA003020102A106040412D00023",
-	//"encode_krb5_error":                                          "7E81BA3081B7A003020105A10302011EA211180F31393934303631303036303331375AA305020301E240A411180F31393934303631303036303331375AA505020301E240A60302013CA7101B0E415448454E412E4D49542E454455A81A3018A003020101A111300F1B066866747361691B056578747261A9101B0E415448454E412E4D49542E454455AA1A3018A003020101A111300F1B066866747361691B056578747261AB0A1B086B72623564617461AC0A04086B72623564617461",
-	//"encode_krb5_error(optionalsNULL)":                           "7E60305EA003020105A10302011EA305020301E240A411180F31393934303631303036303331375AA505020301E240A60302013CA9101B0E415448454E412E4D49542E454455AA1A3018A003020101A111300F1B066866747361691B056578747261",
-	"encode_krb5_authorization_data":     "3022300FA003020101A1080406666F6F626172300FA003020101A1080406666F6F626172",
-	"encode_krb5_padata_sequence":        "30243010A10302010DA209040770612D646174613010A10302010DA209040770612D64617461",
-	"encode_krb5_typed_data":             "30243010A00302010DA109040770612D646174613010A00302010DA109040770612D64617461",
-	"encode_krb5_padata_sequence(empty)": "3000",
-	"encode_krb5_etype_info":             "30333014A003020100A10D040B4D6F72746F6E27732023303005A0030201013014A003020102A10D040B4D6F72746F6E2773202332",
-	"encode_krb5_etype_info(only1)":      "30163014A003020100A10D040B4D6F72746F6E2773202330",
-	"encode_krb5_etype_info(noinfo)":     "3000",
-	"encode_krb5_etype_info2":            "3051301EA003020100A10D1B0B4D6F72746F6E2773202330A208040673326B3A2030300FA003020101A208040673326B3A2031301EA003020102A10D1B0B4D6F72746F6E2773202332A208040673326B3A2032",
-	"encode_krb5_etype_info2(only1)":     "3020301EA003020100A10D1B0B4D6F72746F6E2773202330A208040673326B3A2030",
-	"encode_krb5_pa_enc_ts":              "301AA011180F31393934303631303036303331375AA105020301E240",
-	"encode_krb5_pa_enc_ts(nousec)":      "3013A011180F31393934303631303036303331375A",
-	"encode_krb5_enc_data":               "3023A003020100A103020105A21704156B726241534E2E312074657374206D657373616765",
-	"encode_krb5_enc_data(MSB-setkvno)":  "3026A003020100A1060204FF000000A21704156B726241534E2E312074657374206D657373616765",
-	"encode_krb5_enc_data(kvno= -1)":     "3023A003020100A1030201FFA21704156B726241534E2E312074657374206D657373616765",
+	"encode_krb5_error":                                          "7E81BA3081B7A003020105A10302011EA211180F31393934303631303036303331375AA305020301E240A411180F31393934303631303036303331375AA505020301E240A60302013CA7101B0E415448454E412E4D49542E454455A81A3018A003020101A111300F1B066866747361691B056578747261A9101B0E415448454E412E4D49542E454455AA1A3018A003020101A111300F1B066866747361691B056578747261AB0A1B086B72623564617461AC0A04086B72623564617461",
+	"encode_krb5_error(optionalsNULL)":                           "7E60305EA003020105A10302011EA305020301E240A411180F31393934303631303036303331375AA505020301E240A60302013CA9101B0E415448454E412E4D49542E454455AA1A3018A003020101A111300F1B066866747361691B056578747261",
+	"encode_krb5_authorization_data":                             "3022300FA003020101A1080406666F6F626172300FA003020101A1080406666F6F626172",
+	"encode_krb5_padata_sequence":                                "30243010A10302010DA209040770612D646174613010A10302010DA209040770612D64617461",
+	"encode_krb5_typed_data":                                     "30243010A00302010DA109040770612D646174613010A00302010DA109040770612D64617461",
+	"encode_krb5_padata_sequence(empty)":                         "3000",
+	"encode_krb5_etype_info":                                     "30333014A003020100A10D040B4D6F72746F6E27732023303005A0030201013014A003020102A10D040B4D6F72746F6E2773202332",
+	"encode_krb5_etype_info(only1)":                              "30163014A003020100A10D040B4D6F72746F6E2773202330",
+	"encode_krb5_etype_info(noinfo)":                             "3000",
+	"encode_krb5_etype_info2":                                    "3051301EA003020100A10D1B0B4D6F72746F6E2773202330A208040673326B3A2030300FA003020101A208040673326B3A2031301EA003020102A10D1B0B4D6F72746F6E2773202332A208040673326B3A2032",
+	"encode_krb5_etype_info2(only1)":                             "3020301EA003020100A10D1B0B4D6F72746F6E2773202330A208040673326B3A2030",
+	"encode_krb5_pa_enc_ts":                                      "301AA011180F31393934303631303036303331375AA105020301E240",
+	"encode_krb5_pa_enc_ts(nousec)":                              "3013A011180F31393934303631303036303331375A",
+	"encode_krb5_enc_data":                                       "3023A003020100A103020105A21704156B726241534E2E312074657374206D657373616765",
+	"encode_krb5_enc_data(MSB-setkvno)":                          "3026A003020100A1060204FF000000A21704156B726241534E2E312074657374206D657373616765",
+	"encode_krb5_enc_data(kvno= -1)":                             "3023A003020100A1030201FFA21704156B726241534E2E312074657374206D657373616765",
 	//"encode_krb5_sam_challenge_2":                                "3022A00D300B04096368616C6C656E6765A111300F300DA003020101A106040431323334",
 	//"encode_krb5_sam_challenge_2_body":                           "3064A00302012AA10703050080000000A20B040974797065206E616D65A411040F6368616C6C656E6765206C6162656CA510040E6368616C6C656E67652069707365A6160414726573706F6E73655F70726F6D70742069707365A8050203543210A903020101",
 	//"encode_krb5_sam_response_2":                                 "3042A00302012BA10703050080000000A20C040A747261636B2064617461A31D301BA003020101A10402020D36A20E040C6E6F6E6365206F7220736164A4050203543210",