KDCReq_test.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. package messages
  2. import (
  3. "encoding/hex"
  4. "fmt"
  5. "testing"
  6. "time"
  7. "github.com/stretchr/testify/assert"
  8. "gopkg.in/jcmturner/gokrb5.v7/iana"
  9. "gopkg.in/jcmturner/gokrb5.v7/iana/addrtype"
  10. "gopkg.in/jcmturner/gokrb5.v7/iana/msgtype"
  11. "gopkg.in/jcmturner/gokrb5.v7/iana/nametype"
  12. "gopkg.in/jcmturner/gokrb5.v7/iana/patype"
  13. "gopkg.in/jcmturner/gokrb5.v7/test/testdata"
  14. )
  15. func TestUnmarshalKDCReqBody(t *testing.T) {
  16. t.Parallel()
  17. var a KDCReqBody
  18. b, err := hex.DecodeString(testdata.MarshaledKRB5kdc_req_body)
  19. if err != nil {
  20. t.Fatalf("Test vector read error: %v", err)
  21. }
  22. err = a.Unmarshal(b)
  23. if err != nil {
  24. t.Fatalf("Unmarshal error: %v", err)
  25. }
  26. //Parse the test time value into a time.Time type
  27. tt, _ := time.Parse(testdata.TEST_TIME_FORMAT, testdata.TEST_TIME)
  28. assert.Equal(t, "fedcba90", hex.EncodeToString(a.KDCOptions.Bytes), "Request body flags not as expected")
  29. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, a.CName.NameType, "Request body CName NameType not as expected")
  30. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.CName.NameString), "Request body CName does not have the expected number of NameStrings")
  31. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.CName.NameString, "Request body CName entries not as expected")
  32. assert.Equal(t, testdata.TEST_REALM, a.Realm, "Request body Realm not as expected")
  33. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, a.SName.NameType, "Request body SName nametype not as expected")
  34. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.SName.NameString), "Request body SName does not have the expected number of NameStrings")
  35. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.SName.NameString, "Request body SName entries not as expected")
  36. assert.Equal(t, tt, a.From, "Request body From time not as expected")
  37. assert.Equal(t, tt, a.Till, "Request body Till time not as expected")
  38. assert.Equal(t, tt, a.RTime, "Request body RTime time not as expected")
  39. assert.Equal(t, testdata.TEST_NONCE, a.Nonce, "Request body nounce not as expected")
  40. assert.Equal(t, []int32{0, 1}, a.EType, "Etype list not as expected")
  41. assert.Equal(t, 2, len(a.Addresses), "Number of client addresses not as expected")
  42. for i, addr := range a.Addresses {
  43. assert.Equal(t, addrtype.IPv4, addr.AddrType, fmt.Sprintf("Host address type not as expected for address item %d", i+1))
  44. assert.Equal(t, "12d00023", hex.EncodeToString(addr.Address), fmt.Sprintf("Host address not as expected for address item %d", i+1))
  45. }
  46. assert.Equal(t, testdata.TEST_ETYPE, a.EncAuthData.EType, "Etype of request body encrypted authorization data not as expected")
  47. assert.Equal(t, iana.PVNO, a.EncAuthData.KVNO, "KVNO of request body encrypted authorization data not as expected")
  48. assert.Equal(t, []byte(testdata.TEST_CIPHERTEXT), a.EncAuthData.Cipher, "Ciphertext of request body encrypted authorization data not as expected")
  49. assert.Equal(t, 2, len(a.AdditionalTickets), "Number of additional tickets not as expected")
  50. for i, tkt := range a.AdditionalTickets {
  51. assert.Equal(t, iana.PVNO, tkt.TktVNO, fmt.Sprintf("Additional ticket (%v) ticket-vno not as expected", i+1))
  52. assert.Equal(t, testdata.TEST_REALM, tkt.Realm, fmt.Sprintf("Additional ticket (%v) realm not as expected", i+1))
  53. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, tkt.SName.NameType, fmt.Sprintf("Additional ticket (%v) SName NameType not as expected", i+1))
  54. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(tkt.SName.NameString), fmt.Sprintf("Additional ticket (%v) SName does not have the expected number of NameStrings", i+1))
  55. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, tkt.SName.NameString, fmt.Sprintf("Additional ticket (%v) SName name string entries not as expected", i+1))
  56. assert.Equal(t, testdata.TEST_ETYPE, tkt.EncPart.EType, fmt.Sprintf("Additional ticket (%v) encPart etype not as expected", i+1))
  57. assert.Equal(t, iana.PVNO, tkt.EncPart.KVNO, fmt.Sprintf("Additional ticket (%v) encPart KVNO not as expected", i+1))
  58. assert.Equal(t, []byte(testdata.TEST_CIPHERTEXT), tkt.EncPart.Cipher, fmt.Sprintf("Additional ticket (%v) encPart cipher not as expected", i+1))
  59. }
  60. }
  61. func TestUnmarshalKDCReqBody_optionalsNULLexceptsecond_ticket(t *testing.T) {
  62. t.Parallel()
  63. var a KDCReqBody
  64. b, err := hex.DecodeString(testdata.MarshaledKRB5kdc_req_bodyOptionalsNULLexceptsecond_ticket)
  65. if err != nil {
  66. t.Fatalf("Test vector read error: %v", err)
  67. }
  68. err = a.Unmarshal(b)
  69. if err != nil {
  70. t.Fatalf("Unmarshal error: %v", err)
  71. }
  72. //Parse the test time value into a time.Time type
  73. tt, _ := time.Parse(testdata.TEST_TIME_FORMAT, testdata.TEST_TIME)
  74. assert.Equal(t, "fedcba98", hex.EncodeToString(a.KDCOptions.Bytes), "Request body flags not as expected")
  75. assert.Equal(t, testdata.TEST_REALM, a.Realm, "Request body Realm not as expected")
  76. assert.Equal(t, tt, a.Till, "Request body Till time not as expected")
  77. assert.Equal(t, testdata.TEST_NONCE, a.Nonce, "Request body nounce not as expected")
  78. assert.Equal(t, []int32{0, 1}, a.EType, "Etype list not as expected")
  79. assert.Equal(t, 0, len(a.Addresses), "Number of client addresses not empty")
  80. assert.Equal(t, 0, len(a.EncAuthData.Cipher), "Ciphertext of request body encrypted authorization data not empty")
  81. assert.Equal(t, 2, len(a.AdditionalTickets), "Number of additional tickets not as expected")
  82. for i, tkt := range a.AdditionalTickets {
  83. assert.Equal(t, iana.PVNO, tkt.TktVNO, fmt.Sprintf("Additional ticket (%v) ticket-vno not as expected", i+1))
  84. assert.Equal(t, testdata.TEST_REALM, tkt.Realm, fmt.Sprintf("Additional ticket (%v) realm not as expected", i+1))
  85. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, tkt.SName.NameType, fmt.Sprintf("Additional ticket (%v) SName NameType not as expected", i+1))
  86. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(tkt.SName.NameString), fmt.Sprintf("Additional ticket (%v) SName does not have the expected number of NameStrings", i+1))
  87. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, tkt.SName.NameString, fmt.Sprintf("Additional ticket (%v) SName name string entries not as expected", i+1))
  88. assert.Equal(t, testdata.TEST_ETYPE, tkt.EncPart.EType, fmt.Sprintf("Additional ticket (%v) encPart etype not as expected", i+1))
  89. assert.Equal(t, iana.PVNO, tkt.EncPart.KVNO, fmt.Sprintf("Additional ticket (%v) encPart KVNO not as expected", i+1))
  90. assert.Equal(t, []byte(testdata.TEST_CIPHERTEXT), tkt.EncPart.Cipher, fmt.Sprintf("Additional ticket (%v) encPart cipher not as expected", i+1))
  91. }
  92. }
  93. func TestUnmarshalKDCReqBody_optionalsNULLexceptserver(t *testing.T) {
  94. t.Parallel()
  95. var a KDCReqBody
  96. b, err := hex.DecodeString(testdata.MarshaledKRB5kdc_req_bodyOptionalsNULLexceptserver)
  97. if err != nil {
  98. t.Fatalf("Test vector read error: %v", err)
  99. }
  100. err = a.Unmarshal(b)
  101. if err != nil {
  102. t.Fatalf("Unmarshal error: %v", err)
  103. }
  104. //Parse the test time value into a time.Time type
  105. tt, _ := time.Parse(testdata.TEST_TIME_FORMAT, testdata.TEST_TIME)
  106. assert.Equal(t, "fedcba90", hex.EncodeToString(a.KDCOptions.Bytes), "Request body flags not as expected")
  107. assert.Equal(t, testdata.TEST_REALM, a.Realm, "Request body Realm not as expected")
  108. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, a.SName.NameType, "Request body SName nametype not as expected")
  109. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.SName.NameString), "Request body SName does not have the expected number of NameStrings")
  110. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.SName.NameString, "Request body SName entries not as expected")
  111. assert.Equal(t, tt, a.Till, "Request body Till time not as expected")
  112. assert.Equal(t, testdata.TEST_NONCE, a.Nonce, "Request body nounce not as expected")
  113. assert.Equal(t, []int32{0, 1}, a.EType, "Etype list not as expected")
  114. assert.Equal(t, 0, len(a.Addresses), "Number of client addresses not empty")
  115. assert.Equal(t, 0, len(a.EncAuthData.Cipher), "Ciphertext of request body encrypted authorization data not empty")
  116. assert.Equal(t, 0, len(a.AdditionalTickets), "Number of additional tickets not empty")
  117. }
  118. func TestUnmarshalASReq(t *testing.T) {
  119. t.Parallel()
  120. var a ASReq
  121. b, err := hex.DecodeString(testdata.MarshaledKRB5as_req)
  122. if err != nil {
  123. t.Fatalf("Test vector read error: %v", err)
  124. }
  125. err = a.Unmarshal(b)
  126. if err != nil {
  127. t.Fatalf("Unmarshal error: %v", err)
  128. }
  129. //Parse the test time value into a time.Time type
  130. tt, _ := time.Parse(testdata.TEST_TIME_FORMAT, testdata.TEST_TIME)
  131. assert.Equal(t, iana.PVNO, a.PVNO, "PVNO not as expected")
  132. assert.Equal(t, msgtype.KRB_AS_REQ, a.MsgType, "Message ID not as expected")
  133. assert.Equal(t, 2, len(a.PAData), "Number of PAData items in the sequence not as expected")
  134. for i, pa := range a.PAData {
  135. assert.Equal(t, patype.PA_SAM_RESPONSE, pa.PADataType, fmt.Sprintf("PAData type for entry %d not as expected", i+1))
  136. assert.Equal(t, []byte(testdata.TEST_PADATA_VALUE), pa.PADataValue, fmt.Sprintf("PAData valye for entry %d not as expected", i+1))
  137. }
  138. assert.Equal(t, "fedcba90", hex.EncodeToString(a.ReqBody.KDCOptions.Bytes), "Request body flags not as expected")
  139. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, a.ReqBody.CName.NameType, "Request body CName NameType not as expected")
  140. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.ReqBody.CName.NameString), "Request body CName does not have the expected number of NameStrings")
  141. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.ReqBody.CName.NameString, "Request body CName entries not as expected")
  142. assert.Equal(t, testdata.TEST_REALM, a.ReqBody.Realm, "Request body Realm not as expected")
  143. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, a.ReqBody.SName.NameType, "Request body SName nametype not as expected")
  144. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.ReqBody.SName.NameString), "Request body SName does not have the expected number of NameStrings")
  145. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.ReqBody.SName.NameString, "Request body SName entries not as expected")
  146. assert.Equal(t, tt, a.ReqBody.From, "Request body From time not as expected")
  147. assert.Equal(t, tt, a.ReqBody.Till, "Request body Till time not as expected")
  148. assert.Equal(t, tt, a.ReqBody.RTime, "Request body RTime time not as expected")
  149. assert.Equal(t, testdata.TEST_NONCE, a.ReqBody.Nonce, "Request body nounce not as expected")
  150. assert.Equal(t, []int32{0, 1}, a.ReqBody.EType, "Etype list not as expected")
  151. assert.Equal(t, 2, len(a.ReqBody.Addresses), "Number of client addresses not as expected")
  152. for i, addr := range a.ReqBody.Addresses {
  153. assert.Equal(t, addrtype.IPv4, addr.AddrType, fmt.Sprintf("Host address type not as expected for address item %d", i+1))
  154. assert.Equal(t, "12d00023", hex.EncodeToString(addr.Address), fmt.Sprintf("Host address not as expected for address item %d", i+1))
  155. }
  156. assert.Equal(t, testdata.TEST_ETYPE, a.ReqBody.EncAuthData.EType, "Etype of request body encrypted authorization data not as expected")
  157. assert.Equal(t, iana.PVNO, a.ReqBody.EncAuthData.KVNO, "KVNO of request body encrypted authorization data not as expected")
  158. assert.Equal(t, []byte(testdata.TEST_CIPHERTEXT), a.ReqBody.EncAuthData.Cipher, "Ciphertext of request body encrypted authorization data not as expected")
  159. assert.Equal(t, 2, len(a.ReqBody.AdditionalTickets), "Number of additional tickets not as expected")
  160. for i, tkt := range a.ReqBody.AdditionalTickets {
  161. assert.Equal(t, iana.PVNO, tkt.TktVNO, fmt.Sprintf("Additional ticket (%v) ticket-vno not as expected", i+1))
  162. assert.Equal(t, testdata.TEST_REALM, tkt.Realm, fmt.Sprintf("Additional ticket (%v) realm not as expected", i+1))
  163. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, tkt.SName.NameType, fmt.Sprintf("Additional ticket (%v) SName NameType not as expected", i+1))
  164. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(tkt.SName.NameString), fmt.Sprintf("Additional ticket (%v) SName does not have the expected number of NameStrings", i+1))
  165. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, tkt.SName.NameString, fmt.Sprintf("Additional ticket (%v) SName name string entries not as expected", i+1))
  166. assert.Equal(t, testdata.TEST_ETYPE, tkt.EncPart.EType, fmt.Sprintf("Additional ticket (%v) encPart etype not as expected", i+1))
  167. assert.Equal(t, iana.PVNO, tkt.EncPart.KVNO, fmt.Sprintf("Additional ticket (%v) encPart KVNO not as expected", i+1))
  168. assert.Equal(t, []byte(testdata.TEST_CIPHERTEXT), tkt.EncPart.Cipher, fmt.Sprintf("Additional ticket (%v) encPart cipher not as expected", i+1))
  169. }
  170. }
  171. func TestUnmarshalASReq_optionalsNULLexceptsecond_ticket(t *testing.T) {
  172. t.Parallel()
  173. var a ASReq
  174. b, err := hex.DecodeString(testdata.MarshaledKRB5as_reqOptionalsNULLexceptsecond_ticket)
  175. if err != nil {
  176. t.Fatalf("Test vector read error: %v", err)
  177. }
  178. err = a.Unmarshal(b)
  179. if err != nil {
  180. t.Fatalf("Unmarshal error: %v", err)
  181. }
  182. //Parse the test time value into a time.Time type
  183. tt, _ := time.Parse(testdata.TEST_TIME_FORMAT, testdata.TEST_TIME)
  184. assert.Equal(t, iana.PVNO, a.PVNO, "PVNO not as expected")
  185. assert.Equal(t, msgtype.KRB_AS_REQ, a.MsgType, "Message ID not as expected")
  186. assert.Equal(t, 0, len(a.PAData), "Number of PAData items in the sequence not as expected")
  187. assert.Equal(t, "fedcba98", hex.EncodeToString(a.ReqBody.KDCOptions.Bytes), "Request body flags not as expected")
  188. assert.Equal(t, testdata.TEST_REALM, a.ReqBody.Realm, "Request body Realm not as expected")
  189. assert.Equal(t, tt, a.ReqBody.Till, "Request body Till time not as expected")
  190. assert.Equal(t, testdata.TEST_NONCE, a.ReqBody.Nonce, "Request body nounce not as expected")
  191. assert.Equal(t, []int32{0, 1}, a.ReqBody.EType, "Etype list not as expected")
  192. assert.Equal(t, 0, len(a.ReqBody.Addresses), "Number of client addresses not empty")
  193. assert.Equal(t, 0, len(a.ReqBody.EncAuthData.Cipher), "Ciphertext of request body encrypted authorization data not empty")
  194. assert.Equal(t, 2, len(a.ReqBody.AdditionalTickets), "Number of additional tickets not as expected")
  195. for i, tkt := range a.ReqBody.AdditionalTickets {
  196. assert.Equal(t, iana.PVNO, tkt.TktVNO, fmt.Sprintf("Additional ticket (%v) ticket-vno not as expected", i+1))
  197. assert.Equal(t, testdata.TEST_REALM, tkt.Realm, fmt.Sprintf("Additional ticket (%v) realm not as expected", i+1))
  198. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, tkt.SName.NameType, fmt.Sprintf("Additional ticket (%v) SName NameType not as expected", i+1))
  199. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(tkt.SName.NameString), fmt.Sprintf("Additional ticket (%v) SName does not have the expected number of NameStrings", i+1))
  200. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, tkt.SName.NameString, fmt.Sprintf("Additional ticket (%v) SName name string entries not as expected", i+1))
  201. assert.Equal(t, testdata.TEST_ETYPE, tkt.EncPart.EType, fmt.Sprintf("Additional ticket (%v) encPart etype not as expected", i+1))
  202. assert.Equal(t, iana.PVNO, tkt.EncPart.KVNO, fmt.Sprintf("Additional ticket (%v) encPart KVNO not as expected", i+1))
  203. assert.Equal(t, []byte(testdata.TEST_CIPHERTEXT), tkt.EncPart.Cipher, fmt.Sprintf("Additional ticket (%v) encPart cipher not as expected", i+1))
  204. }
  205. }
  206. func TestUnmarshalASReq_optionalsNULLexceptserver(t *testing.T) {
  207. t.Parallel()
  208. var a ASReq
  209. b, err := hex.DecodeString(testdata.MarshaledKRB5as_reqOptionalsNULLexceptserver)
  210. if err != nil {
  211. t.Fatalf("Test vector read error: %v", err)
  212. }
  213. err = a.Unmarshal(b)
  214. if err != nil {
  215. t.Fatalf("Unmarshal error: %v", err)
  216. }
  217. //Parse the test time value into a time.Time type
  218. tt, _ := time.Parse(testdata.TEST_TIME_FORMAT, testdata.TEST_TIME)
  219. assert.Equal(t, iana.PVNO, a.PVNO, "PVNO not as expected")
  220. assert.Equal(t, msgtype.KRB_AS_REQ, a.MsgType, "Message ID not as expected")
  221. assert.Equal(t, 0, len(a.PAData), "Number of PAData items in the sequence not as expected")
  222. assert.Equal(t, "fedcba90", hex.EncodeToString(a.ReqBody.KDCOptions.Bytes), "Request body flags not as expected")
  223. assert.Equal(t, testdata.TEST_REALM, a.ReqBody.Realm, "Request body Realm not as expected")
  224. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, a.ReqBody.SName.NameType, "Request body SName nametype not as expected")
  225. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.ReqBody.SName.NameString), "Request body SName does not have the expected number of NameStrings")
  226. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.ReqBody.SName.NameString, "Request body SName entries not as expected")
  227. assert.Equal(t, tt, a.ReqBody.Till, "Request body Till time not as expected")
  228. assert.Equal(t, testdata.TEST_NONCE, a.ReqBody.Nonce, "Request body nounce not as expected")
  229. assert.Equal(t, []int32{0, 1}, a.ReqBody.EType, "Etype list not as expected")
  230. assert.Equal(t, 0, len(a.ReqBody.Addresses), "Number of client addresses not empty")
  231. assert.Equal(t, 0, len(a.ReqBody.EncAuthData.Cipher), "Ciphertext of request body encrypted authorization data not empty")
  232. assert.Equal(t, 0, len(a.ReqBody.AdditionalTickets), "Number of additional tickets not empty")
  233. }
  234. func TestUnmarshalTGSReq(t *testing.T) {
  235. t.Parallel()
  236. var a TGSReq
  237. b, err := hex.DecodeString(testdata.MarshaledKRB5tgs_req)
  238. if err != nil {
  239. t.Fatalf("Test vector read error: %v", err)
  240. }
  241. err = a.Unmarshal(b)
  242. if err != nil {
  243. t.Fatalf("Unmarshal error: %v", err)
  244. }
  245. //Parse the test time value into a time.Time type
  246. tt, _ := time.Parse(testdata.TEST_TIME_FORMAT, testdata.TEST_TIME)
  247. assert.Equal(t, iana.PVNO, a.PVNO, "PVNO not as expected")
  248. assert.Equal(t, msgtype.KRB_TGS_REQ, a.MsgType, "Message ID not as expected")
  249. assert.Equal(t, 2, len(a.PAData), "Number of PAData items in the sequence not as expected")
  250. for i, pa := range a.PAData {
  251. assert.Equal(t, patype.PA_SAM_RESPONSE, pa.PADataType, fmt.Sprintf("PAData type for entry %d not as expected", i+1))
  252. assert.Equal(t, []byte(testdata.TEST_PADATA_VALUE), pa.PADataValue, fmt.Sprintf("PAData valye for entry %d not as expected", i+1))
  253. }
  254. assert.Equal(t, "fedcba90", hex.EncodeToString(a.ReqBody.KDCOptions.Bytes), "Request body flags not as expected")
  255. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, a.ReqBody.CName.NameType, "Request body CName NameType not as expected")
  256. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.ReqBody.CName.NameString), "Request body CName does not have the expected number of NameStrings")
  257. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.ReqBody.CName.NameString, "Request body CName entries not as expected")
  258. assert.Equal(t, testdata.TEST_REALM, a.ReqBody.Realm, "Request body Realm not as expected")
  259. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, a.ReqBody.SName.NameType, "Request body SName nametype not as expected")
  260. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.ReqBody.SName.NameString), "Request body SName does not have the expected number of NameStrings")
  261. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.ReqBody.SName.NameString, "Request body SName entries not as expected")
  262. assert.Equal(t, tt, a.ReqBody.From, "Request body From time not as expected")
  263. assert.Equal(t, tt, a.ReqBody.Till, "Request body Till time not as expected")
  264. assert.Equal(t, tt, a.ReqBody.RTime, "Request body RTime time not as expected")
  265. assert.Equal(t, testdata.TEST_NONCE, a.ReqBody.Nonce, "Request body nounce not as expected")
  266. assert.Equal(t, []int32{0, 1}, a.ReqBody.EType, "Etype list not as expected")
  267. assert.Equal(t, 2, len(a.ReqBody.Addresses), "Number of client addresses not as expected")
  268. for i, addr := range a.ReqBody.Addresses {
  269. assert.Equal(t, addrtype.IPv4, addr.AddrType, fmt.Sprintf("Host address type not as expected for address item %d", i+1))
  270. assert.Equal(t, "12d00023", hex.EncodeToString(addr.Address), fmt.Sprintf("Host address not as expected for address item %d", i+1))
  271. }
  272. assert.Equal(t, testdata.TEST_ETYPE, a.ReqBody.EncAuthData.EType, "Etype of request body encrypted authorization data not as expected")
  273. assert.Equal(t, iana.PVNO, a.ReqBody.EncAuthData.KVNO, "KVNO of request body encrypted authorization data not as expected")
  274. assert.Equal(t, []byte(testdata.TEST_CIPHERTEXT), a.ReqBody.EncAuthData.Cipher, "Ciphertext of request body encrypted authorization data not as expected")
  275. assert.Equal(t, 2, len(a.ReqBody.AdditionalTickets), "Number of additional tickets not as expected")
  276. for i, tkt := range a.ReqBody.AdditionalTickets {
  277. assert.Equal(t, iana.PVNO, tkt.TktVNO, fmt.Sprintf("Additional ticket (%v) ticket-vno not as expected", i+1))
  278. assert.Equal(t, testdata.TEST_REALM, tkt.Realm, fmt.Sprintf("Additional ticket (%v) realm not as expected", i+1))
  279. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, tkt.SName.NameType, fmt.Sprintf("Additional ticket (%v) SName NameType not as expected", i+1))
  280. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(tkt.SName.NameString), fmt.Sprintf("Additional ticket (%v) SName does not have the expected number of NameStrings", i+1))
  281. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, tkt.SName.NameString, fmt.Sprintf("Additional ticket (%v) SName name string entries not as expected", i+1))
  282. assert.Equal(t, testdata.TEST_ETYPE, tkt.EncPart.EType, fmt.Sprintf("Additional ticket (%v) encPart etype not as expected", i+1))
  283. assert.Equal(t, iana.PVNO, tkt.EncPart.KVNO, fmt.Sprintf("Additional ticket (%v) encPart KVNO not as expected", i+1))
  284. assert.Equal(t, []byte(testdata.TEST_CIPHERTEXT), tkt.EncPart.Cipher, fmt.Sprintf("Additional ticket (%v) encPart cipher not as expected", i+1))
  285. }
  286. }
  287. func TestUnmarshalTGSReq_optionalsNULLexceptsecond_ticket(t *testing.T) {
  288. t.Parallel()
  289. var a TGSReq
  290. b, err := hex.DecodeString(testdata.MarshaledKRB5tgs_reqOptionalsNULLexceptsecond_ticket)
  291. if err != nil {
  292. t.Fatalf("Test vector read error: %v", err)
  293. }
  294. err = a.Unmarshal(b)
  295. if err != nil {
  296. t.Fatalf("Unmarshal error: %v", err)
  297. }
  298. //Parse the test time value into a time.Time type
  299. tt, _ := time.Parse(testdata.TEST_TIME_FORMAT, testdata.TEST_TIME)
  300. assert.Equal(t, iana.PVNO, a.PVNO, "PVNO not as expected")
  301. assert.Equal(t, msgtype.KRB_TGS_REQ, a.MsgType, "Message ID not as expected")
  302. assert.Equal(t, 0, len(a.PAData), "Number of PAData items in the sequence not as expected")
  303. assert.Equal(t, "fedcba98", hex.EncodeToString(a.ReqBody.KDCOptions.Bytes), "Request body flags not as expected")
  304. assert.Equal(t, testdata.TEST_REALM, a.ReqBody.Realm, "Request body Realm not as expected")
  305. assert.Equal(t, tt, a.ReqBody.Till, "Request body Till time not as expected")
  306. assert.Equal(t, testdata.TEST_NONCE, a.ReqBody.Nonce, "Request body nounce not as expected")
  307. assert.Equal(t, []int32{0, 1}, a.ReqBody.EType, "Etype list not as expected")
  308. assert.Equal(t, 0, len(a.ReqBody.Addresses), "Number of client addresses not empty")
  309. assert.Equal(t, 0, len(a.ReqBody.EncAuthData.Cipher), "Ciphertext of request body encrypted authorization data not empty")
  310. assert.Equal(t, 2, len(a.ReqBody.AdditionalTickets), "Number of additional tickets not as expected")
  311. for i, tkt := range a.ReqBody.AdditionalTickets {
  312. assert.Equal(t, iana.PVNO, tkt.TktVNO, fmt.Sprintf("Additional ticket (%v) ticket-vno not as expected", i+1))
  313. assert.Equal(t, testdata.TEST_REALM, tkt.Realm, fmt.Sprintf("Additional ticket (%v) realm not as expected", i+1))
  314. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, tkt.SName.NameType, fmt.Sprintf("Additional ticket (%v) SName NameType not as expected", i+1))
  315. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(tkt.SName.NameString), fmt.Sprintf("Additional ticket (%v) SName does not have the expected number of NameStrings", i+1))
  316. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, tkt.SName.NameString, fmt.Sprintf("Additional ticket (%v) SName name string entries not as expected", i+1))
  317. assert.Equal(t, testdata.TEST_ETYPE, tkt.EncPart.EType, fmt.Sprintf("Additional ticket (%v) encPart etype not as expected", i+1))
  318. assert.Equal(t, iana.PVNO, tkt.EncPart.KVNO, fmt.Sprintf("Additional ticket (%v) encPart KVNO not as expected", i+1))
  319. assert.Equal(t, []byte(testdata.TEST_CIPHERTEXT), tkt.EncPart.Cipher, fmt.Sprintf("Additional ticket (%v) encPart cipher not as expected", i+1))
  320. }
  321. }
  322. func TestUnmarshalTGSReq_optionalsNULLexceptserver(t *testing.T) {
  323. t.Parallel()
  324. var a TGSReq
  325. b, err := hex.DecodeString(testdata.MarshaledKRB5tgs_reqOptionalsNULLexceptserver)
  326. if err != nil {
  327. t.Fatalf("Test vector read error: %v", err)
  328. }
  329. err = a.Unmarshal(b)
  330. if err != nil {
  331. t.Fatalf("Unmarshal error: %v", err)
  332. }
  333. //Parse the test time value into a time.Time type
  334. tt, _ := time.Parse(testdata.TEST_TIME_FORMAT, testdata.TEST_TIME)
  335. assert.Equal(t, iana.PVNO, a.PVNO, "PVNO not as expected")
  336. assert.Equal(t, msgtype.KRB_TGS_REQ, a.MsgType, "Message ID not as expected")
  337. assert.Equal(t, 0, len(a.PAData), "Number of PAData items in the sequence not as expected")
  338. assert.Equal(t, "fedcba90", hex.EncodeToString(a.ReqBody.KDCOptions.Bytes), "Request body flags not as expected")
  339. assert.Equal(t, testdata.TEST_REALM, a.ReqBody.Realm, "Request body Realm not as expected")
  340. assert.Equal(t, nametype.KRB_NT_PRINCIPAL, a.ReqBody.SName.NameType, "Request body SName nametype not as expected")
  341. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.ReqBody.SName.NameString), "Request body SName does not have the expected number of NameStrings")
  342. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.ReqBody.SName.NameString, "Request body SName entries not as expected")
  343. assert.Equal(t, tt, a.ReqBody.Till, "Request body Till time not as expected")
  344. assert.Equal(t, testdata.TEST_NONCE, a.ReqBody.Nonce, "Request body nounce not as expected")
  345. assert.Equal(t, []int32{0, 1}, a.ReqBody.EType, "Etype list not as expected")
  346. assert.Equal(t, 0, len(a.ReqBody.Addresses), "Number of client addresses not empty")
  347. assert.Equal(t, 0, len(a.ReqBody.EncAuthData.Cipher), "Ciphertext of request body encrypted authorization data not empty")
  348. assert.Equal(t, 0, len(a.ReqBody.AdditionalTickets), "Number of additional tickets not empty")
  349. }
  350. //// Marshal Tests ////
  351. func TestMarshalKDCReqBody(t *testing.T) {
  352. t.Parallel()
  353. var a KDCReqBody
  354. b, err := hex.DecodeString(testdata.MarshaledKRB5kdc_req_body)
  355. if err != nil {
  356. t.Fatalf("Test vector read error: %v", err)
  357. }
  358. err = a.Unmarshal(b)
  359. if err != nil {
  360. t.Fatalf("Unmarshal error: %v", err)
  361. }
  362. // Marshal and re-unmarshal the result nd then compare
  363. mb, err := a.Marshal()
  364. if err != nil {
  365. t.Fatalf("Unmarshal error: %v", err)
  366. }
  367. assert.Equal(t, b, mb, "Marshal bytes of KDCReqBody not as expected")
  368. }
  369. func TestMarshalASReq(t *testing.T) {
  370. t.Parallel()
  371. var a ASReq
  372. b, err := hex.DecodeString(testdata.MarshaledKRB5as_req)
  373. if err != nil {
  374. t.Fatalf("Test vector read error: %v", err)
  375. }
  376. err = a.Unmarshal(b)
  377. if err != nil {
  378. t.Fatalf("Unmarshal error: %v", err)
  379. }
  380. mb, err := a.Marshal()
  381. if err != nil {
  382. t.Fatalf("Marshal of ticket errored: %v", err)
  383. }
  384. assert.Equal(t, b, mb, "Marshal bytes of ASReq not as expected")
  385. }
  386. func TestMarshalTGSReq(t *testing.T) {
  387. t.Parallel()
  388. var a TGSReq
  389. b, err := hex.DecodeString(testdata.MarshaledKRB5tgs_req)
  390. if err != nil {
  391. t.Fatalf("Test vector read error: %v", err)
  392. }
  393. err = a.Unmarshal(b)
  394. if err != nil {
  395. t.Fatalf("Unmarshal error: %v", err)
  396. }
  397. mb, err := a.Marshal()
  398. if err != nil {
  399. t.Fatalf("Marshal of ticket errored: %v", err)
  400. }
  401. assert.Equal(t, b, mb, "Marshal bytes of TGSReq not as expected")
  402. }