KDCRep_test.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. package messages
  2. import (
  3. "encoding/hex"
  4. "fmt"
  5. "github.com/jcmturner/gokrb5/credentials"
  6. "github.com/jcmturner/gokrb5/iana/etype"
  7. "github.com/jcmturner/gokrb5/iana/msgtype"
  8. "github.com/jcmturner/gokrb5/keytab"
  9. "github.com/jcmturner/gokrb5/testdata"
  10. "github.com/stretchr/testify/assert"
  11. "testing"
  12. "time"
  13. )
  14. const (
  15. testuser1_etype18_keytab = "05020000004b0001000b544553542e474f4b5242350009746573747573657231000000015898e0770100120020bbdc430aab7e2d4622a0b6951481453b0962e9db8e2f168942ad175cda6d9de900000001"
  16. testuser1_etype18_ASREP = "6b8202f3308202efa003020105a10302010ba22e302c302aa103020113a2230421301f301da003020112a1161b14544553542e474f4b524235746573747573657231a30d1b0b544553542e474f4b524235a4163014a003020101a10d300b1b09746573747573657231a582015a6182015630820152a003020105a10d1b0b544553542e474f4b524235a220301ea003020102a11730151b066b72627467741b0b544553542e474f4b524235a382011830820114a003020112a103020101a28201060482010237e486e32cd18ab1ac9f8d42e93f8babd7b3497084cc5599f18ec61961c6d5242d350354d99d67a7604c451116188d16cb719e84377212eac2743440e8c504ef69c755e489cc6b65f935dd032bfc076f9b2c56d816197845b8fe857d738bc59712787631a50e86833d1b0e4732c8712c856417a6a257758e7d01d3182adb3233f0dde65d228c240ed26aa1af69f8d765dc0bc69096fdb037a75af220fea176839528d44b70f7dabfaa2ea506de1296f847176a60c501fd8cef8e0a51399bb6d5f753962d96292e93ffe344c6630db912931d46d88c0279f00719e22d0efcfd4ee33a702d0b660c1f13970a9beec12c0c8af3dda68bd81ac1fe3f126d2a24ebb445c5a682012c30820128a003020112a282011f0482011bb149cc16018072c4c18788d95a33aba540e52c11b54a93e67e788d05de75d8f3d4aa1afafbbfa6fde3eb40e5aa1890644cea2607efd5213a3fd00345b02eeb9ae1b589f36c74c689cd4ec1239dfe61e42ba6afa33f6240e3cfab291e4abb465d273302dbf7dbd148a299a9369044dd03377c1687e7dd36aa66501284a4ca50c0a7b08f4f87aecfa23b0dd0b11490e3ad330906dab715de81fc52f120d09c39990b8b5330d4601cc396b2ed258834329c4cc02c563a12de3ef9bf11e946258bc2ab5257f4caa4d443a7daf0fc25f6f531c2fcba88af8ca55c85300997cd05abbea52811fe2d038ba8f62fc8e3bc71ce04362d356ea2e1df8ac55c784c53cfb07817d48e39fe99fc8788040d98209c79dcf044d97e80de9f47824646"
  17. test_realm = "TEST.GOKRB5"
  18. test_user = "testuser1"
  19. test_user_password = "passwordvalue"
  20. )
  21. func TestUnmarshalASRep(t *testing.T) {
  22. var a ASRep
  23. v := "encode_krb5_as_rep"
  24. b, err := hex.DecodeString(testdata.TestVectors[v])
  25. if err != nil {
  26. t.Fatalf("Test vector read error of %s: %v\n", v, err)
  27. }
  28. err = a.Unmarshal(b)
  29. if err != nil {
  30. t.Fatalf("Unmarshal error of %s: %v\n", v, err)
  31. }
  32. assert.Equal(t, testdata.TEST_KVNO, a.PVNO, "PVNO not as expected")
  33. assert.Equal(t, msgtype.KRB_AS_REP, a.MsgType, "MsgType not as expected")
  34. assert.Equal(t, 2, len(a.PAData), "Number of PAData items in the sequence not as expected")
  35. for i, pa := range a.PAData {
  36. assert.Equal(t, testdata.TEST_PADATA_TYPE, pa.PADataType, fmt.Sprintf("PAData type for entry %d not as expected", i+1))
  37. assert.Equal(t, []byte(testdata.TEST_PADATA_VALUE), pa.PADataValue, fmt.Sprintf("PAData valye for entry %d not as expected", i+1))
  38. }
  39. assert.Equal(t, testdata.TEST_REALM, a.CRealm, "Client Realm not as expected")
  40. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMETYPE, a.CName.NameType, "CName NameType not as expected")
  41. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.CName.NameString), "CName does not have the expected number of NameStrings")
  42. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.CName.NameString, "CName entries not as expected")
  43. assert.Equal(t, testdata.TEST_KVNO, a.Ticket.TktVNO, "TktVNO not as expected")
  44. assert.Equal(t, testdata.TEST_REALM, a.Ticket.Realm, "Ticket Realm not as expected")
  45. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMETYPE, a.Ticket.SName.NameType, "Ticket service nametype not as expected")
  46. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.Ticket.SName.NameString), "SName in ticket does not have the expected number of NameStrings")
  47. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.Ticket.SName.NameString, "Ticket SName entries not as expected")
  48. assert.Equal(t, testdata.TEST_ETYPE, a.Ticket.EncPart.EType, "Etype of ticket encrypted part not as expected")
  49. assert.Equal(t, testdata.TEST_KVNO, a.Ticket.EncPart.KVNO, "Ticket encrypted part KVNO not as expected")
  50. assert.Equal(t, testdata.TEST_CIPHERTEXT, string(a.Ticket.EncPart.Cipher), "Ticket encrypted part cipher not as expected")
  51. assert.Equal(t, testdata.TEST_ETYPE, a.EncPart.EType, "Etype of encrypted part not as expected")
  52. assert.Equal(t, testdata.TEST_KVNO, a.EncPart.KVNO, "Encrypted part KVNO not as expected")
  53. assert.Equal(t, testdata.TEST_CIPHERTEXT, string(a.EncPart.Cipher), "Ticket encrypted part cipher not as expected")
  54. }
  55. func TestUnmarshalASRep_optionalsNULL(t *testing.T) {
  56. var a ASRep
  57. v := "encode_krb5_as_rep(optionalsNULL)"
  58. b, err := hex.DecodeString(testdata.TestVectors[v])
  59. if err != nil {
  60. t.Fatalf("Test vector read error of %s: %v\n", v, err)
  61. }
  62. err = a.Unmarshal(b)
  63. if err != nil {
  64. t.Fatalf("Unmarshal error of %s: %v\n", v, err)
  65. }
  66. assert.Equal(t, testdata.TEST_KVNO, a.PVNO, "PVNO not as expected")
  67. assert.Equal(t, msgtype.KRB_AS_REP, a.MsgType, "MsgType not as expected")
  68. assert.Equal(t, 0, len(a.PAData), "Number of PAData items in the sequence not as expected")
  69. assert.Equal(t, testdata.TEST_REALM, a.CRealm, "Client Realm not as expected")
  70. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMETYPE, a.CName.NameType, "CName NameType not as expected")
  71. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.CName.NameString), "CName does not have the expected number of NameStrings")
  72. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.CName.NameString, "CName entries not as expected")
  73. assert.Equal(t, testdata.TEST_KVNO, a.Ticket.TktVNO, "TktVNO not as expected")
  74. assert.Equal(t, testdata.TEST_REALM, a.Ticket.Realm, "Ticket Realm not as expected")
  75. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMETYPE, a.Ticket.SName.NameType, "Ticket service nametype not as expected")
  76. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.Ticket.SName.NameString), "SName in ticket does not have the expected number of NameStrings")
  77. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.Ticket.SName.NameString, "Ticket SName entries not as expected")
  78. assert.Equal(t, testdata.TEST_ETYPE, a.Ticket.EncPart.EType, "Etype of ticket encrypted part not as expected")
  79. assert.Equal(t, testdata.TEST_KVNO, a.Ticket.EncPart.KVNO, "Ticket encrypted part KVNO not as expected")
  80. assert.Equal(t, testdata.TEST_CIPHERTEXT, string(a.Ticket.EncPart.Cipher), "Ticket encrypted part cipher not as expected")
  81. assert.Equal(t, testdata.TEST_ETYPE, a.EncPart.EType, "Etype of encrypted part not as expected")
  82. assert.Equal(t, testdata.TEST_KVNO, a.EncPart.KVNO, "Encrypted part KVNO not as expected")
  83. assert.Equal(t, testdata.TEST_CIPHERTEXT, string(a.EncPart.Cipher), "Ticket encrypted part cipher not as expected")
  84. }
  85. func TestUnmarshalTGSRep(t *testing.T) {
  86. var a TGSRep
  87. v := "encode_krb5_tgs_rep"
  88. b, err := hex.DecodeString(testdata.TestVectors[v])
  89. if err != nil {
  90. t.Fatalf("Test vector read error of %s: %v\n", v, err)
  91. }
  92. err = a.Unmarshal(b)
  93. if err != nil {
  94. t.Fatalf("Unmarshal error of %s: %v\n", v, err)
  95. }
  96. assert.Equal(t, testdata.TEST_KVNO, a.PVNO, "PVNO not as expected")
  97. assert.Equal(t, msgtype.KRB_TGS_REP, a.MsgType, "MsgType not as expected")
  98. assert.Equal(t, 2, len(a.PAData), "Number of PAData items in the sequence not as expected")
  99. for i, pa := range a.PAData {
  100. assert.Equal(t, testdata.TEST_PADATA_TYPE, pa.PADataType, fmt.Sprintf("PAData type for entry %d not as expected", i+1))
  101. assert.Equal(t, []byte(testdata.TEST_PADATA_VALUE), pa.PADataValue, fmt.Sprintf("PAData valye for entry %d not as expected", i+1))
  102. }
  103. assert.Equal(t, testdata.TEST_REALM, a.CRealm, "Client Realm not as expected")
  104. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMETYPE, a.CName.NameType, "CName NameType not as expected")
  105. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.CName.NameString), "CName does not have the expected number of NameStrings")
  106. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.CName.NameString, "CName entries not as expected")
  107. assert.Equal(t, testdata.TEST_KVNO, a.Ticket.TktVNO, "TktVNO not as expected")
  108. assert.Equal(t, testdata.TEST_REALM, a.Ticket.Realm, "Ticket Realm not as expected")
  109. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMETYPE, a.Ticket.SName.NameType, "Ticket service nametype not as expected")
  110. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.Ticket.SName.NameString), "SName in ticket does not have the expected number of NameStrings")
  111. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.Ticket.SName.NameString, "Ticket SName entries not as expected")
  112. assert.Equal(t, testdata.TEST_ETYPE, a.Ticket.EncPart.EType, "Etype of ticket encrypted part not as expected")
  113. assert.Equal(t, testdata.TEST_KVNO, a.Ticket.EncPart.KVNO, "Ticket encrypted part KVNO not as expected")
  114. assert.Equal(t, testdata.TEST_CIPHERTEXT, string(a.Ticket.EncPart.Cipher), "Ticket encrypted part cipher not as expected")
  115. assert.Equal(t, testdata.TEST_ETYPE, a.EncPart.EType, "Etype of encrypted part not as expected")
  116. assert.Equal(t, testdata.TEST_KVNO, a.EncPart.KVNO, "Encrypted part KVNO not as expected")
  117. assert.Equal(t, testdata.TEST_CIPHERTEXT, string(a.EncPart.Cipher), "Ticket encrypted part cipher not as expected")
  118. }
  119. func TestUnmarshalTGSRep_optionalsNULL(t *testing.T) {
  120. var a TGSRep
  121. v := "encode_krb5_tgs_rep(optionalsNULL)"
  122. b, err := hex.DecodeString(testdata.TestVectors[v])
  123. if err != nil {
  124. t.Fatalf("Test vector read error of %s: %v\n", v, err)
  125. }
  126. err = a.Unmarshal(b)
  127. if err != nil {
  128. t.Fatalf("Unmarshal error of %s: %v\n", v, err)
  129. }
  130. assert.Equal(t, testdata.TEST_KVNO, a.PVNO, "PVNO not as expected")
  131. assert.Equal(t, msgtype.KRB_TGS_REP, a.MsgType, "MsgType not as expected")
  132. assert.Equal(t, 0, len(a.PAData), "Number of PAData items in the sequence not as expected")
  133. assert.Equal(t, testdata.TEST_REALM, a.CRealm, "Client Realm not as expected")
  134. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMETYPE, a.CName.NameType, "CName NameType not as expected")
  135. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.CName.NameString), "CName does not have the expected number of NameStrings")
  136. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.CName.NameString, "CName entries not as expected")
  137. assert.Equal(t, testdata.TEST_KVNO, a.Ticket.TktVNO, "TktVNO not as expected")
  138. assert.Equal(t, testdata.TEST_REALM, a.Ticket.Realm, "Ticket Realm not as expected")
  139. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMETYPE, a.Ticket.SName.NameType, "Ticket service nametype not as expected")
  140. assert.Equal(t, len(testdata.TEST_PRINCIPALNAME_NAMESTRING), len(a.Ticket.SName.NameString), "SName in ticket does not have the expected number of NameStrings")
  141. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.Ticket.SName.NameString, "Ticket SName entries not as expected")
  142. assert.Equal(t, testdata.TEST_ETYPE, a.Ticket.EncPart.EType, "Etype of ticket encrypted part not as expected")
  143. assert.Equal(t, testdata.TEST_KVNO, a.Ticket.EncPart.KVNO, "Ticket encrypted part KVNO not as expected")
  144. assert.Equal(t, testdata.TEST_CIPHERTEXT, string(a.Ticket.EncPart.Cipher), "Ticket encrypted part cipher not as expected")
  145. assert.Equal(t, testdata.TEST_ETYPE, a.EncPart.EType, "Etype of encrypted part not as expected")
  146. assert.Equal(t, testdata.TEST_KVNO, a.EncPart.KVNO, "Encrypted part KVNO not as expected")
  147. assert.Equal(t, testdata.TEST_CIPHERTEXT, string(a.EncPart.Cipher), "Ticket encrypted part cipher not as expected")
  148. }
  149. func TestUnmarshalEncKDCRepPart(t *testing.T) {
  150. var a EncKDCRepPart
  151. v := "encode_krb5_enc_kdc_rep_part"
  152. b, err := hex.DecodeString(testdata.TestVectors[v])
  153. if err != nil {
  154. t.Fatalf("Test vector read error of %s: %v\n", v, err)
  155. }
  156. err = a.Unmarshal(b)
  157. if err != nil {
  158. t.Fatalf("Unmarshal error of %s: %v\n", v, err)
  159. }
  160. //Parse the test time value into a time.Time type
  161. tt, _ := time.Parse(testdata.TEST_TIME_FORMAT, testdata.TEST_TIME)
  162. assert.Equal(t, 1, a.Key.KeyType, "Key type not as expected")
  163. assert.Equal(t, []byte("12345678"), a.Key.KeyValue, "Key value not as expected")
  164. assert.Equal(t, 2, len(a.LastReqs), "Number of last request entries not as expected")
  165. for i, r := range a.LastReqs {
  166. assert.Equal(t, -5, r.LRType, fmt.Sprintf("Last request typ not as expected for last request entry %d", i+1))
  167. assert.Equal(t, tt, r.LRValue, fmt.Sprintf("Last request time value not as expected for last request entry %d", i+1))
  168. }
  169. assert.Equal(t, testdata.TEST_NONCE, a.Nonce, "Nonce not as expected")
  170. assert.Equal(t, tt, a.KeyExpiration, "key expiration time not as expected")
  171. assert.Equal(t, "fedcba98", hex.EncodeToString(a.Flags.Bytes), "Flags not as expected")
  172. assert.Equal(t, tt, a.AuthTime, "Auth time not as expected")
  173. assert.Equal(t, tt, a.StartTime, "Start time not as expected")
  174. assert.Equal(t, tt, a.EndTime, "End time not as expected")
  175. assert.Equal(t, tt, a.RenewTill, "Renew Till time not as expected")
  176. assert.Equal(t, testdata.TEST_REALM, a.SRealm, "SRealm not as expected")
  177. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMETYPE, a.SName.NameType, "SName type not as expected")
  178. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.SName.NameString, "SName string entries not as expected")
  179. assert.Equal(t, 2, len(a.CAddr), "Number of client addresses not as expected")
  180. for i, addr := range a.CAddr {
  181. assert.Equal(t, 2, addr.AddrType, fmt.Sprintf("Host address type not as expected for address item %d", i+1))
  182. assert.Equal(t, "12d00023", hex.EncodeToString(addr.Address), fmt.Sprintf("Host address not as expected for address item %d", i+1))
  183. }
  184. }
  185. func TestUnmarshalEncKDCRepPart_optionalsNULL(t *testing.T) {
  186. var a EncKDCRepPart
  187. v := "encode_krb5_enc_kdc_rep_part(optionalsNULL)"
  188. b, err := hex.DecodeString(testdata.TestVectors[v])
  189. if err != nil {
  190. t.Fatalf("Test vector read error of %s: %v\n", v, err)
  191. }
  192. err = a.Unmarshal(b)
  193. if err != nil {
  194. t.Fatalf("Unmarshal error of %s: %v\n", v, err)
  195. }
  196. //Parse the test time value into a time.Time type
  197. tt, _ := time.Parse(testdata.TEST_TIME_FORMAT, testdata.TEST_TIME)
  198. assert.Equal(t, 1, a.Key.KeyType, "Key type not as expected")
  199. assert.Equal(t, []byte("12345678"), a.Key.KeyValue, "Key value not as expected")
  200. assert.Equal(t, 2, len(a.LastReqs), "Number of last request entries not as expected")
  201. for i, r := range a.LastReqs {
  202. assert.Equal(t, -5, r.LRType, fmt.Sprintf("Last request typ not as expected for last request entry %d", i+1))
  203. assert.Equal(t, tt, r.LRValue, fmt.Sprintf("Last request time value not as expected for last request entry %d", i+1))
  204. }
  205. assert.Equal(t, testdata.TEST_NONCE, a.Nonce, "Nonce not as expected")
  206. assert.Equal(t, "fe5cba98", hex.EncodeToString(a.Flags.Bytes), "Flags not as expected")
  207. assert.Equal(t, tt, a.AuthTime, "Auth time not as expected")
  208. assert.Equal(t, tt, a.EndTime, "End time not as expected")
  209. assert.Equal(t, testdata.TEST_REALM, a.SRealm, "SRealm not as expected")
  210. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMETYPE, a.SName.NameType, "SName type not as expected")
  211. assert.Equal(t, testdata.TEST_PRINCIPALNAME_NAMESTRING, a.SName.NameString, "SName string entries not as expected")
  212. }
  213. func TestUnmarshalASRepDecodeAndDecrypt(t *testing.T) {
  214. var asRep ASRep
  215. b, _ := hex.DecodeString(testuser1_etype18_ASREP)
  216. err := asRep.Unmarshal(b)
  217. if err != nil {
  218. t.Fatalf("AS REP Unmarshal error: %v\n", err)
  219. }
  220. assert.Equal(t, 5, asRep.PVNO, "PVNO not as expected")
  221. assert.Equal(t, 11, asRep.MsgType, "MsgType not as expected")
  222. assert.Equal(t, test_realm, asRep.CRealm, "Client Realm not as expected")
  223. assert.Equal(t, 1, asRep.CName.NameType, "CName NameType not as expected")
  224. assert.Equal(t, test_user, asRep.CName.NameString[0], "CName NameType not as expected")
  225. assert.Equal(t, 19, asRep.PAData[0].PADataType, "PADataType not as expected")
  226. assert.Equal(t, 5, asRep.Ticket.TktVNO, "TktVNO not as expected")
  227. assert.Equal(t, test_realm, asRep.Ticket.Realm, "Ticket Realm not as expected")
  228. assert.Equal(t, 2, asRep.Ticket.SName.NameType, "Ticket service nametype not as expected")
  229. assert.Equal(t, "krbtgt", asRep.Ticket.SName.NameString[0], "Ticket service name string not as expected")
  230. assert.Equal(t, test_realm, asRep.Ticket.SName.NameString[1], "Ticket service name string not as expected")
  231. assert.Equal(t, etype.ETypesByName["aes256-cts-hmac-sha1-96"], asRep.Ticket.EncPart.EType, "Etype of ticket encrypted part not as expected")
  232. assert.Equal(t, 1, asRep.Ticket.EncPart.KVNO, "Ticket encrypted part KVNO not as expected")
  233. assert.Equal(t, etype.ETypesByName["aes256-cts-hmac-sha1-96"], asRep.EncPart.EType, "Etype of encrypted part not as expected")
  234. assert.Equal(t, 0, asRep.EncPart.KVNO, "Encrypted part KVNO not as expected")
  235. //t.Log("Finished testing unecrypted parts of AS REP")
  236. ktb, _ := hex.DecodeString(testuser1_etype18_keytab)
  237. kt, err := keytab.Parse(ktb)
  238. if err != nil {
  239. t.Fatalf("keytab parse error: %v\n", err)
  240. }
  241. cred := credentials.NewCredentials(test_user)
  242. err = asRep.DecryptEncPart(cred.WithKeytab(kt))
  243. if err != nil {
  244. t.Fatalf("Decryption of AS_REP EncPart failed: %v", err)
  245. }
  246. assert.Equal(t, 18, asRep.DecryptedEncPart.Key.KeyType, "KeyType in decrypted EncPart not as expected")
  247. assert.IsType(t, time.Time{}, asRep.DecryptedEncPart.LastReqs[0].LRValue, "LastReqs did not have a time value")
  248. assert.Equal(t, 2069991465, asRep.DecryptedEncPart.Nonce, "Nonce value not as expected")
  249. assert.IsType(t, time.Time{}, asRep.DecryptedEncPart.KeyExpiration, "Key expriation not a time type")
  250. assert.IsType(t, time.Time{}, asRep.DecryptedEncPart.AuthTime, "AuthTime not a time type")
  251. assert.IsType(t, time.Time{}, asRep.DecryptedEncPart.StartTime, "StartTime not a time type")
  252. assert.IsType(t, time.Time{}, asRep.DecryptedEncPart.EndTime, "StartTime not a time type")
  253. assert.IsType(t, time.Time{}, asRep.DecryptedEncPart.RenewTill, "RenewTill not a time type")
  254. assert.Equal(t, test_realm, asRep.DecryptedEncPart.SRealm, "Service realm not as expected")
  255. assert.Equal(t, 2, asRep.DecryptedEncPart.SName.NameType, "Name type for AS_REP not as expected")
  256. assert.Equal(t, []string{"krbtgt", test_realm}, asRep.DecryptedEncPart.SName.NameString, "Service name string not as expected")
  257. //t.Log("Finished testing ecrypted parts of AS REP")
  258. //TODO should we be able to decrypt this part with the client key?
  259. /*s, err = etype.Decrypt(key, asRep.Ticket.EncPart.Cipher)
  260. if err != nil {
  261. t.Fatalf("Error decrypting ticket encrypted part: %v\n", err)
  262. }
  263. t.Logf("Decypted Ticket EncPart %+v", s)*/
  264. }
  265. func TestUnmarshalASRepDecodeAndDecrypt_withPassword(t *testing.T) {
  266. var asRep ASRep
  267. b, _ := hex.DecodeString(testuser1_etype18_ASREP)
  268. err := asRep.Unmarshal(b)
  269. if err != nil {
  270. t.Fatalf("AS REP Unmarshal error: %v\n", err)
  271. }
  272. assert.Equal(t, 5, asRep.PVNO, "PVNO not as expected")
  273. assert.Equal(t, 11, asRep.MsgType, "MsgType not as expected")
  274. assert.Equal(t, test_realm, asRep.CRealm, "Client Realm not as expected")
  275. assert.Equal(t, 1, asRep.CName.NameType, "CName NameType not as expected")
  276. assert.Equal(t, test_user, asRep.CName.NameString[0], "CName NameType not as expected")
  277. assert.Equal(t, 19, asRep.PAData[0].PADataType, "PADataType not as expected")
  278. assert.Equal(t, 5, asRep.Ticket.TktVNO, "TktVNO not as expected")
  279. assert.Equal(t, test_realm, asRep.Ticket.Realm, "Ticket Realm not as expected")
  280. assert.Equal(t, 2, asRep.Ticket.SName.NameType, "Ticket service nametype not as expected")
  281. assert.Equal(t, "krbtgt", asRep.Ticket.SName.NameString[0], "Ticket service name string not as expected")
  282. assert.Equal(t, test_realm, asRep.Ticket.SName.NameString[1], "Ticket service name string not as expected")
  283. assert.Equal(t, etype.AES256_CTS_HMAC_SHA1_96, asRep.Ticket.EncPart.EType, "Etype of ticket encrypted part not as expected")
  284. assert.Equal(t, 1, asRep.Ticket.EncPart.KVNO, "Ticket encrypted part KVNO not as expected")
  285. assert.Equal(t, etype.AES256_CTS_HMAC_SHA1_96, asRep.EncPart.EType, "Etype of encrypted part not as expected")
  286. assert.Equal(t, 0, asRep.EncPart.KVNO, "Encrypted part KVNO not as expected")
  287. cred := credentials.NewCredentials(test_user)
  288. err = asRep.DecryptEncPart(cred.WithPassword(test_user_password))
  289. if err != nil {
  290. t.Fatalf("Decryption of AS_REP EncPart failed: %v", err)
  291. }
  292. assert.Equal(t, 18, asRep.DecryptedEncPart.Key.KeyType, "KeyType in decrypted EncPart not as expected")
  293. assert.IsType(t, time.Time{}, asRep.DecryptedEncPart.LastReqs[0].LRValue, "LastReqs did not have a time value")
  294. assert.Equal(t, 2069991465, asRep.DecryptedEncPart.Nonce, "Nonce value not as expected")
  295. assert.IsType(t, time.Time{}, asRep.DecryptedEncPart.KeyExpiration, "Key expriation not a time type")
  296. assert.IsType(t, time.Time{}, asRep.DecryptedEncPart.AuthTime, "AuthTime not a time type")
  297. assert.IsType(t, time.Time{}, asRep.DecryptedEncPart.StartTime, "StartTime not a time type")
  298. assert.IsType(t, time.Time{}, asRep.DecryptedEncPart.EndTime, "StartTime not a time type")
  299. assert.IsType(t, time.Time{}, asRep.DecryptedEncPart.RenewTill, "RenewTill not a time type")
  300. assert.Equal(t, test_realm, asRep.DecryptedEncPart.SRealm, "Service realm not as expected")
  301. assert.Equal(t, 2, asRep.DecryptedEncPart.SName.NameType, "Name type for AS_REP not as expected")
  302. assert.Equal(t, []string{"krbtgt", test_realm}, asRep.DecryptedEncPart.SName.NameString, "Service name string not as expected")
  303. //t.Log("Finished testing ecrypted parts of AS REP")
  304. //TODO should we be able to decrypt this part with the client key?
  305. /*s, err = etype.Decrypt(key, asRep.Ticket.EncPart.Cipher)
  306. if err != nil {
  307. t.Fatalf("Error decrypting ticket encrypted part: %v\n", err)
  308. }
  309. t.Logf("Decypted Ticket EncPart %+v", s)*/
  310. }
  311. //func TestKDCRep_Validate(t *testing.T) {
  312. // d, _ := os.Getwd()
  313. // asreqData, err := ioutil.ReadFile(d + "/../testdata/AS-REQ.raw")
  314. // if err != nil {
  315. // t.Fatalf("AS REP read error: %v\n", err)
  316. // }
  317. // asReq, err := UnmarshalASReq(asreqData)
  318. // if err != nil {
  319. // t.Fatalf("AS REP Unmarshal error: %v\n", err)
  320. // }
  321. //
  322. // usr, _ := user.Current()
  323. // dir := usr.HomeDir
  324. // asrepData, err := ioutil.ReadFile(d + "/../testdata/AS-REP.raw")
  325. // if err != nil {
  326. // t.Fatalf("AS REP read error: %v\n", err)
  327. // }
  328. // var asRep ASRep
  329. // err = asRep.Unmarshal(asrepData)
  330. // if err != nil {
  331. // t.Fatalf("AS REP Unmarshal error: %v\n", err)
  332. // }
  333. // kt, err := keytab.Load(dir + "/tmp.keytab")
  334. // if err != nil {
  335. // fmt.Printf("keytab parse error: %v\n", err)
  336. // }
  337. // ok, err := asRep.Validate(asReq, kt)
  338. // if !ok || err != nil {
  339. // t.Fatalf("Validation of AS REP failed: %v", err)
  340. // }
  341. // t.Log("AS REP validation tests finished")
  342. //}