crypto_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package ike
  2. import (
  3. "bytes"
  4. "errors"
  5. "testing"
  6. )
  7. func legacyTestSuite() negotiatedSuite {
  8. return negotiatedSuite{
  9. EncryptionID: encryptionAESCBC,
  10. EncryptionBits: 128,
  11. PRFID: prfHMACSHA1,
  12. IntegrityID: integrityHMACSHA1_96,
  13. DHID: dhMODP1024,
  14. }
  15. }
  16. func TestMODP1024UsesGroup2PrimeAnd128ByteKE(t *testing.T) {
  17. exchange, err := newDHExchange(dhMODP1024, bytes.NewReader(bytes.Repeat([]byte{0x42}, 128)))
  18. if err != nil {
  19. t.Fatalf("newDHExchange() error = %v", err)
  20. }
  21. if bits := exchange.prime.BitLen(); bits != 1024 {
  22. t.Fatalf("group 2 prime BitLen() = %d, want 1024", bits)
  23. }
  24. if length := len(exchange.Public); length != 128 {
  25. t.Fatalf("group 2 public KE length = %d, want 128", length)
  26. }
  27. peer, err := newDHExchange(dhMODP1024, bytes.NewReader(bytes.Repeat([]byte{0x24}, 128)))
  28. if err != nil {
  29. t.Fatalf("peer newDHExchange() error = %v", err)
  30. }
  31. firstSecret, err := exchange.shared(peer.Public)
  32. if err != nil {
  33. t.Fatalf("exchange.shared() error = %v", err)
  34. }
  35. secondSecret, err := peer.shared(exchange.Public)
  36. if err != nil {
  37. t.Fatalf("peer.shared() error = %v", err)
  38. }
  39. if len(firstSecret) != 128 || !bytes.Equal(firstSecret, secondSecret) {
  40. t.Fatal("MODP group 2 shared secrets differ or are not 128 bytes")
  41. }
  42. }
  43. func TestEncryptedPayloadRoundTripAndTamperDetection(t *testing.T) {
  44. suite := legacyTestSuite()
  45. encryptionKey := bytes.Repeat([]byte{0x11}, 16)
  46. integrityKey := bytes.Repeat([]byte{0x22}, 20)
  47. header := ikeHeader{
  48. InitiatorSPI: [8]byte{1, 2, 3, 4, 5, 6, 7, 8},
  49. ResponderSPI: [8]byte{8, 7, 6, 5, 4, 3, 2, 1},
  50. Exchange: exchangeIKEAuth,
  51. Flags: flagInitiator,
  52. MessageID: 7,
  53. }
  54. inner := []payload{
  55. {Type: payloadIDi, Body: []byte{3, 0, 0, 0, 'u', '@', 'r'}},
  56. {Type: payloadEAP, Body: []byte{1, 9, 0, 5, 1}},
  57. }
  58. packet, err := encryptPayloads(
  59. header,
  60. inner,
  61. suite,
  62. encryptionKey,
  63. integrityKey,
  64. bytes.NewReader(bytes.Repeat([]byte{0x33}, 64)),
  65. )
  66. if err != nil {
  67. t.Fatalf("encryptPayloads() error = %v", err)
  68. }
  69. decodedHeader, decoded, err := decryptPayloads(packet, suite, encryptionKey, integrityKey)
  70. if err != nil {
  71. t.Fatalf("decryptPayloads() error = %v", err)
  72. }
  73. if decodedHeader.MessageID != header.MessageID || len(decoded) != len(inner) {
  74. t.Fatalf("decoded header/payload count mismatch: %#v %#v", decodedHeader, decoded)
  75. }
  76. for index := range inner {
  77. if decoded[index].Type != inner[index].Type || !bytes.Equal(decoded[index].Body, inner[index].Body) {
  78. t.Fatalf("decoded payload %d = %#v, want %#v", index, decoded[index], inner[index])
  79. }
  80. }
  81. tampered := append([]byte(nil), packet...)
  82. tampered[len(tampered)-1] ^= 0x80
  83. if _, _, err := decryptPayloads(tampered, suite, encryptionKey, integrityKey); !errors.Is(err, errIntegrityMismatch) {
  84. t.Fatalf("tampered decrypt error = %v, want errIntegrityMismatch", err)
  85. }
  86. }
  87. func TestIKEKeyDerivationSeparatesDirections(t *testing.T) {
  88. suite := legacyTestSuite()
  89. keys, err := deriveIKEKeys(
  90. suite,
  91. bytes.Repeat([]byte{0x44}, 128),
  92. bytes.Repeat([]byte{0x55}, 32),
  93. bytes.Repeat([]byte{0x66}, 32),
  94. [8]byte{1},
  95. [8]byte{2},
  96. )
  97. if err != nil {
  98. t.Fatalf("deriveIKEKeys() error = %v", err)
  99. }
  100. if len(keys.SKd) != 20 || len(keys.SKai) != 20 || len(keys.SKar) != 20 ||
  101. len(keys.SKei) != 16 || len(keys.SKer) != 16 ||
  102. len(keys.SKpi) != 20 || len(keys.SKpr) != 20 {
  103. t.Fatalf("unexpected key lengths: %+v", keys)
  104. }
  105. if bytes.Equal(keys.SKai, keys.SKar) || bytes.Equal(keys.SKei, keys.SKer) ||
  106. bytes.Equal(keys.SKpi, keys.SKpr) {
  107. t.Fatal("initiator and responder keys were not separated")
  108. }
  109. }