debug.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package main
  2. import (
  3. "encoding/hex"
  4. "fmt"
  5. "github.com/jcmturner/asn1"
  6. "github.com/jcmturner/gokrb5/client"
  7. "github.com/jcmturner/gokrb5/config"
  8. "github.com/jcmturner/gokrb5/crypto"
  9. "github.com/jcmturner/gokrb5/iana/keyusage"
  10. "github.com/jcmturner/gokrb5/keytab"
  11. "github.com/jcmturner/gokrb5/messages"
  12. "github.com/jcmturner/gokrb5/types"
  13. "os"
  14. )
  15. const ktab = "05020000003b0001000b544553542e474f4b524235000974657374757365723100000001589b9b2b0100110010698c4df8e9f60e7eea5a21bf4526ad25000000010000004b0001000b544553542e474f4b524235000974657374757365723100000001589b9b2b0100120020bbdc430aab7e2d4622a0b6951481453b0962e9db8e2f168942ad175cda6d9de900000001"
  16. const krb5conf = `[libdefaults]
  17. default_realm = TEST.GOKRB5
  18. dns_lookup_realm = false
  19. dns_lookup_kdc = false
  20. ticket_lifetime = 24h
  21. forwardable = yes
  22. default_tkt_enctypes = aes256-cts-hmac-sha1-96
  23. [realms]
  24. TEST.GOKRB5 = {
  25. kdc = 10.80.88.88:88
  26. admin_server = 10.80.88.88:749
  27. default_domain = test.gokrb5
  28. }
  29. [domain_realm]
  30. .test.gokrb5 = TEST.GOKRB5
  31. test.gokrb5 = TEST.GOKRB5`
  32. func main() {
  33. c, err := config.NewConfigFromString(krb5conf)
  34. if err != nil {
  35. fmt.Fprintf(os.Stderr, "Error creating config: %v", err)
  36. }
  37. fmt.Fprintf(os.Stdout, "Config: %+v\n", *c)
  38. a := messages.NewASReq(c, "testuser1")
  39. fmt.Fprintf(os.Stdout, "AS_REQ: %+v\n", a)
  40. b, err := a.Marshal()
  41. if err != nil {
  42. fmt.Fprintf(os.Stderr, "Error marshalling AS_REQ: %v\n", err)
  43. }
  44. rb, err := client.SendToKDC(c, b)
  45. if err != nil {
  46. fmt.Fprintf(os.Stderr, "Error sending to KDC: %v\n", err)
  47. }
  48. var ar messages.ASRep
  49. ar.Unmarshal(rb)
  50. kb, _ := hex.DecodeString(ktab)
  51. kt, err := keytab.Parse(kb)
  52. if err != nil {
  53. fmt.Fprintf(os.Stderr, "KT load err: %v\n\n", err)
  54. }
  55. err = ar.DecryptEncPartWithKeytab(kt)
  56. if err != nil {
  57. fmt.Fprintf(os.Stderr, "\nDecrypt err: %v\n", err)
  58. } else {
  59. fmt.Fprintf(os.Stdout, "\n\nAS REP decrypted with keytab: %+v\n", ar)
  60. var p types.PAReqEncPARep
  61. _, err = asn1.Unmarshal(ar.DecryptedEncPart.EncPAData[0].PADataValue, &p)
  62. if err != nil {
  63. fmt.Fprintf(os.Stderr, "Error unmarshal PAReqEncPARep: %v\n", err)
  64. }
  65. fmt.Fprintf(os.Stdout, "PAReqEncPARep: %+v\n", p)
  66. var et crypto.Aes256CtsHmacSha96
  67. cb, err := crypto.GetChecksum(b, ar.DecryptedEncPart.Key.KeyValue, keyusage.KEY_USAGE_AS_REQ, et)
  68. if err != nil {
  69. fmt.Fprintf(os.Stderr, "Error getting checksum PAReqEncPARep: %v\n", err)
  70. } else {
  71. fmt.Fprintf(os.Stdout, "AS REQ checksum: %+v\n", cb[:et.GetHMACBitLength()/8])
  72. }
  73. }
  74. }