packetgen 2.8.7 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +0 -1
  3. data/README.md +5 -4
  4. data/lib/packetgen.rb +6 -12
  5. data/lib/packetgen/capture.rb +43 -39
  6. data/lib/packetgen/config.rb +0 -1
  7. data/lib/packetgen/deprecation.rb +1 -1
  8. data/lib/packetgen/header.rb +9 -9
  9. data/lib/packetgen/header/asn1_base.rb +10 -10
  10. data/lib/packetgen/header/base.rb +42 -101
  11. data/lib/packetgen/header/dhcp/option.rb +5 -11
  12. data/lib/packetgen/header/dhcpv6/duid.rb +2 -0
  13. data/lib/packetgen/header/dhcpv6/option.rb +2 -19
  14. data/lib/packetgen/header/dhcpv6/options.rb +7 -0
  15. data/lib/packetgen/header/dns.rb +5 -23
  16. data/lib/packetgen/header/dns/name.rb +1 -0
  17. data/lib/packetgen/header/dns/qdsection.rb +1 -0
  18. data/lib/packetgen/header/dns/question.rb +3 -7
  19. data/lib/packetgen/header/dns/rr.rb +3 -0
  20. data/lib/packetgen/header/dns/rrsection.rb +1 -0
  21. data/lib/packetgen/header/dot11.rb +1 -17
  22. data/lib/packetgen/header/dot1x.rb +1 -0
  23. data/lib/packetgen/header/eap.rb +4 -7
  24. data/lib/packetgen/header/eth.rb +2 -0
  25. data/lib/packetgen/header/http/headers.rb +3 -0
  26. data/lib/packetgen/header/http/request.rb +5 -4
  27. data/lib/packetgen/header/http/response.rb +5 -4
  28. data/lib/packetgen/header/icmp.rb +6 -0
  29. data/lib/packetgen/header/icmpv6.rb +6 -0
  30. data/lib/packetgen/header/igmpv3/mq.rb +2 -0
  31. data/lib/packetgen/header/ip.rb +32 -30
  32. data/lib/packetgen/header/ip/addr.rb +1 -0
  33. data/lib/packetgen/header/ip/option.rb +23 -20
  34. data/lib/packetgen/header/ip/options.rb +11 -24
  35. data/lib/packetgen/header/ipv6.rb +45 -34
  36. data/lib/packetgen/header/ipv6/addr.rb +2 -0
  37. data/lib/packetgen/header/ipv6/hop_by_hop.rb +7 -31
  38. data/lib/packetgen/header/mdns.rb +1 -0
  39. data/lib/packetgen/header/mldv2/mlq.rb +2 -0
  40. data/lib/packetgen/header/ospfv2/lsa.rb +15 -25
  41. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +1 -1
  42. data/lib/packetgen/header/ospfv3/lsa.rb +8 -25
  43. data/lib/packetgen/header/snmp.rb +2 -0
  44. data/lib/packetgen/header/tcp.rb +23 -2
  45. data/lib/packetgen/header/tcp/option.rb +51 -52
  46. data/lib/packetgen/header/tcp/options.rb +17 -52
  47. data/lib/packetgen/header/tftp.rb +3 -0
  48. data/lib/packetgen/header/udp.rb +8 -0
  49. data/lib/packetgen/packet.rb +119 -102
  50. data/lib/packetgen/pcapng/block.rb +4 -10
  51. data/lib/packetgen/pcapng/epb.rb +4 -4
  52. data/lib/packetgen/pcapng/file.rb +7 -3
  53. data/lib/packetgen/pcapng/idb.rb +2 -2
  54. data/lib/packetgen/pcapng/shb.rb +3 -3
  55. data/lib/packetgen/pcapng/spb.rb +1 -8
  56. data/lib/packetgen/pcapng/unknown_block.rb +0 -7
  57. data/lib/packetgen/types.rb +1 -0
  58. data/lib/packetgen/types/array.rb +73 -71
  59. data/lib/packetgen/types/cstring.rb +1 -1
  60. data/lib/packetgen/types/enum.rb +3 -3
  61. data/lib/packetgen/types/fields.rb +66 -106
  62. data/lib/packetgen/types/int.rb +9 -5
  63. data/lib/packetgen/types/length_from.rb +45 -0
  64. data/lib/packetgen/types/oui.rb +2 -0
  65. data/lib/packetgen/types/string.rb +10 -16
  66. data/lib/packetgen/types/tlv.rb +7 -15
  67. data/lib/packetgen/utils.rb +8 -8
  68. data/lib/packetgen/utils/arp_spoofer.rb +1 -2
  69. data/lib/packetgen/version.rb +1 -1
  70. metadata +3 -21
  71. data/lib/packetgen/header/crypto.rb +0 -62
  72. data/lib/packetgen/header/esp.rb +0 -413
  73. data/lib/packetgen/header/ike.rb +0 -243
  74. data/lib/packetgen/header/ike/auth.rb +0 -165
  75. data/lib/packetgen/header/ike/cert.rb +0 -76
  76. data/lib/packetgen/header/ike/certreq.rb +0 -66
  77. data/lib/packetgen/header/ike/id.rb +0 -99
  78. data/lib/packetgen/header/ike/ke.rb +0 -79
  79. data/lib/packetgen/header/ike/nonce.rb +0 -40
  80. data/lib/packetgen/header/ike/notify.rb +0 -176
  81. data/lib/packetgen/header/ike/payload.rb +0 -315
  82. data/lib/packetgen/header/ike/sa.rb +0 -561
  83. data/lib/packetgen/header/ike/sk.rb +0 -261
  84. data/lib/packetgen/header/ike/ts.rb +0 -270
  85. data/lib/packetgen/header/ike/vendor_id.rb +0 -39
  86. data/lib/packetgen/header/netbios.rb +0 -20
  87. data/lib/packetgen/header/netbios/datagram.rb +0 -105
  88. data/lib/packetgen/header/netbios/name.rb +0 -67
  89. data/lib/packetgen/header/netbios/session.rb +0 -64
@@ -1,315 +0,0 @@
1
- # This file is part of PacketGen
2
- # See https://github.com/sdaubert/packetgen for more informations
3
- # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
- # This program is published under MIT license.
5
-
6
- # frozen_string_literal: true
7
-
8
- module PacketGen
9
- module Header
10
- class IKE
11
- # Base class for IKE payloads. This class may also be used for unknown payloads.
12
- #
13
- # This class handles generic IKE payload header:
14
- # 1 2 3
15
- # 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
16
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
17
- # | Next Payload |C| RESERVED | Payload Length |
18
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
19
- # to which a {#content} field is added to handle content of unknown payload types.
20
- # @author Sylvain Daubert
21
- class Payload < Base
22
- # @!attribute next
23
- # 8-bit next payload
24
- # @return [Integer]
25
- define_field :next, Types::Int8
26
- # @!attribute flags
27
- # 8-bit flags
28
- # @return [Integer]
29
- define_field :flags, Types::Int8
30
- # @!attribute length
31
- # 16-bit payload total length, including generic payload header
32
- # @return [Integer]
33
- define_field :length, Types::Int16
34
- # @!attribute content
35
- # Payload content. Depends on payload. Variable length.
36
- # @return [String]
37
- define_field :content, Types::String
38
-
39
- # Defining a body permits using Packet#parse to parse next IKE payloads.
40
- define_field :body, Types::String
41
-
42
- # @!attribute critical
43
- # critical flag
44
- # @return [Boolean]
45
- # @!attribute hreserved
46
- # reserved part of {#flags} field
47
- # @return [Integer]
48
- define_bit_fields_on :flags, :critical, :hreserved, 7
49
-
50
- def initialize(options={})
51
- super
52
- self[:length].value = sz unless options[:length]
53
- end
54
-
55
- # @private
56
- alias base_read read
57
-
58
- # Populate object from a string
59
- # @param [String] str
60
- # @return [self]
61
- def read(str)
62
- base_read str
63
- unless self[:content].nil?
64
- content_length = length - self.class.new.sz
65
- if content_length >= 0
66
- self[:body] = self[:content][content_length..-1]
67
- self[:content] = self[:content][0, content_length]
68
- end
69
- end
70
- self
71
- end
72
-
73
- # Compute length and set {#length} field
74
- # @return [Integer] new length
75
- def calc_length
76
- # Here, #body is next payload, so body size should not be taken in
77
- # account (payload's real body is #content).
78
- self[:length].value = sz - body.sz
79
- end
80
- end
81
- end
82
-
83
- self.add_class IKE::Payload
84
- end
85
- end
86
-
87
- # here, future payloads to be required
88
- require_relative 'sa'
89
- require_relative 'ke'
90
- require_relative 'nonce'
91
- require_relative 'notify'
92
- require_relative 'sk'
93
- require_relative 'id'
94
- require_relative 'cert'
95
- require_relative 'certreq'
96
- require_relative 'auth'
97
- require_relative 'ts'
98
- require_relative 'vendor_id'
99
-
100
- module PacketGen
101
- module Header
102
- IKE.bind IKE::SA, next: IKE::SA::PAYLOAD_TYPE
103
- IKE::Payload.bind IKE::SA, next: IKE::SA::PAYLOAD_TYPE
104
- IKE::KE.bind IKE::SA, next: IKE::SA::PAYLOAD_TYPE
105
- IKE::Nonce.bind IKE::SA, next: IKE::SA::PAYLOAD_TYPE
106
- IKE::Notify.bind IKE::SA, next: IKE::SA::PAYLOAD_TYPE
107
- IKE::SK.bind IKE::SA, next: IKE::SA::PAYLOAD_TYPE
108
- IKE::IDi.bind IKE::SA, next: IKE::SA::PAYLOAD_TYPE
109
- IKE::IDr.bind IKE::SA, next: IKE::SA::PAYLOAD_TYPE
110
- IKE::Cert.bind IKE::SA, next: IKE::SA::PAYLOAD_TYPE
111
- IKE::CertReq.bind IKE::SA, next: IKE::SA::PAYLOAD_TYPE
112
- IKE::Auth.bind IKE::SA, next: IKE::SA::PAYLOAD_TYPE
113
- IKE::TSi.bind IKE::SA, next: IKE::SA::PAYLOAD_TYPE
114
- IKE::TSr.bind IKE::SA, next: IKE::SA::PAYLOAD_TYPE
115
- IKE::VendorID.bind IKE::SA, next: IKE::SA::PAYLOAD_TYPE
116
-
117
- IKE.bind IKE::KE, next: IKE::KE::PAYLOAD_TYPE
118
- IKE::Payload.bind IKE::KE, next: IKE::KE::PAYLOAD_TYPE
119
- IKE::SA.bind IKE::KE, next: IKE::KE::PAYLOAD_TYPE
120
- IKE::Nonce.bind IKE::KE, next: IKE::KE::PAYLOAD_TYPE
121
- IKE::Notify.bind IKE::KE, next: IKE::KE::PAYLOAD_TYPE
122
- IKE::SK.bind IKE::KE, next: IKE::KE::PAYLOAD_TYPE
123
- IKE::IDi.bind IKE::KE, next: IKE::KE::PAYLOAD_TYPE
124
- IKE::IDr.bind IKE::KE, next: IKE::KE::PAYLOAD_TYPE
125
- IKE::Cert.bind IKE::KE, next: IKE::KE::PAYLOAD_TYPE
126
- IKE::CertReq.bind IKE::KE, next: IKE::KE::PAYLOAD_TYPE
127
- IKE::Auth.bind IKE::KE, next: IKE::KE::PAYLOAD_TYPE
128
- IKE::TSi.bind IKE::KE, next: IKE::KE::PAYLOAD_TYPE
129
- IKE::TSr.bind IKE::KE, next: IKE::KE::PAYLOAD_TYPE
130
- IKE::VendorID.bind IKE::KE, next: IKE::KE::PAYLOAD_TYPE
131
-
132
- IKE.bind IKE::Nonce, next: IKE::Nonce::PAYLOAD_TYPE
133
- IKE::Payload.bind IKE::Nonce, next: IKE::Nonce::PAYLOAD_TYPE
134
- IKE::SA.bind IKE::Nonce, next: IKE::Nonce::PAYLOAD_TYPE
135
- IKE::KE.bind IKE::Nonce, next: IKE::Nonce::PAYLOAD_TYPE
136
- IKE::Notify.bind IKE::Nonce, next: IKE::Nonce::PAYLOAD_TYPE
137
- IKE::SK.bind IKE::Nonce, next: IKE::Nonce::PAYLOAD_TYPE
138
- IKE::IDi.bind IKE::Nonce, next: IKE::Nonce::PAYLOAD_TYPE
139
- IKE::IDr.bind IKE::Nonce, next: IKE::Nonce::PAYLOAD_TYPE
140
- IKE::Cert.bind IKE::Nonce, next: IKE::Nonce::PAYLOAD_TYPE
141
- IKE::CertReq.bind IKE::Nonce, next: IKE::Nonce::PAYLOAD_TYPE
142
- IKE::Auth.bind IKE::Nonce, next: IKE::Nonce::PAYLOAD_TYPE
143
- IKE::TSi.bind IKE::Nonce, next: IKE::Nonce::PAYLOAD_TYPE
144
- IKE::TSr.bind IKE::Nonce, next: IKE::Nonce::PAYLOAD_TYPE
145
- IKE::VendorID.bind IKE::Nonce, next: IKE::Nonce::PAYLOAD_TYPE
146
-
147
- IKE.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
148
- IKE::Payload.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
149
- IKE::SA.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
150
- IKE::KE.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
151
- IKE::Nonce.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
152
- IKE::Notify.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
153
- IKE::SK.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
154
- IKE::IDi.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
155
- IKE::IDr.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
156
- IKE::Cert.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
157
- IKE::CertReq.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
158
- IKE::Auth.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
159
- IKE::TSi.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
160
- IKE::TSr.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
161
- IKE::VendorID.bind IKE::Notify, next: IKE::Notify::PAYLOAD_TYPE
162
-
163
- IKE.bind IKE::SK, next: IKE::SK::PAYLOAD_TYPE
164
- IKE::Payload.bind IKE::SK, next: IKE::SK::PAYLOAD_TYPE
165
- IKE::SA.bind IKE::SK, next: IKE::SK::PAYLOAD_TYPE
166
- IKE::KE.bind IKE::SK, next: IKE::SK::PAYLOAD_TYPE
167
- IKE::Nonce.bind IKE::SK, next: IKE::SK::PAYLOAD_TYPE
168
- IKE::Notify.bind IKE::SK, next: IKE::SK::PAYLOAD_TYPE
169
- IKE::IDi.bind IKE::SK, next: IKE::SK::PAYLOAD_TYPE
170
- IKE::IDr.bind IKE::SK, next: IKE::SK::PAYLOAD_TYPE
171
- IKE::Cert.bind IKE::SK, next: IKE::SK::PAYLOAD_TYPE
172
- IKE::CertReq.bind IKE::SK, next: IKE::SK::PAYLOAD_TYPE
173
- IKE::Auth.bind IKE::SK, next: IKE::SK::PAYLOAD_TYPE
174
- IKE::TSi.bind IKE::SK, next: IKE::SK::PAYLOAD_TYPE
175
- IKE::TSr.bind IKE::SK, next: IKE::SK::PAYLOAD_TYPE
176
- IKE::VendorID.bind IKE::SK, next: IKE::SK::PAYLOAD_TYPE
177
-
178
- IKE.bind IKE::IDi, next: IKE::IDi::PAYLOAD_TYPE
179
- IKE::Payload.bind IKE::IDi, next: IKE::IDi::PAYLOAD_TYPE
180
- IKE::SA.bind IKE::IDi, next: IKE::IDi::PAYLOAD_TYPE
181
- IKE::KE.bind IKE::IDi, next: IKE::IDi::PAYLOAD_TYPE
182
- IKE::Nonce.bind IKE::IDi, next: IKE::IDi::PAYLOAD_TYPE
183
- IKE::Notify.bind IKE::IDi, next: IKE::IDi::PAYLOAD_TYPE
184
- IKE::SK.bind IKE::IDi, next: IKE::IDi::PAYLOAD_TYPE
185
- IKE::IDr.bind IKE::IDi, next: IKE::IDi::PAYLOAD_TYPE
186
- IKE::Cert.bind IKE::IDi, next: IKE::IDi::PAYLOAD_TYPE
187
- IKE::CertReq.bind IKE::IDi, next: IKE::IDi::PAYLOAD_TYPE
188
- IKE::Auth.bind IKE::IDi, next: IKE::IDi::PAYLOAD_TYPE
189
- IKE::TSi.bind IKE::IDi, next: IKE::IDi::PAYLOAD_TYPE
190
- IKE::TSr.bind IKE::IDi, next: IKE::IDi::PAYLOAD_TYPE
191
- IKE::VendorID.bind IKE::IDi, next: IKE::IDi::PAYLOAD_TYPE
192
-
193
- IKE.bind IKE::IDr, next: IKE::IDr::PAYLOAD_TYPE
194
- IKE::Payload.bind IKE::IDr, next: IKE::IDr::PAYLOAD_TYPE
195
- IKE::SA.bind IKE::IDr, next: IKE::IDr::PAYLOAD_TYPE
196
- IKE::KE.bind IKE::IDr, next: IKE::IDr::PAYLOAD_TYPE
197
- IKE::Nonce.bind IKE::IDr, next: IKE::IDr::PAYLOAD_TYPE
198
- IKE::Notify.bind IKE::IDr, next: IKE::IDr::PAYLOAD_TYPE
199
- IKE::SK.bind IKE::IDr, next: IKE::IDr::PAYLOAD_TYPE
200
- IKE::IDi.bind IKE::IDr, next: IKE::IDr::PAYLOAD_TYPE
201
- IKE::Cert.bind IKE::IDr, next: IKE::IDr::PAYLOAD_TYPE
202
- IKE::CertReq.bind IKE::IDr, next: IKE::IDr::PAYLOAD_TYPE
203
- IKE::Auth.bind IKE::IDr, next: IKE::IDr::PAYLOAD_TYPE
204
- IKE::TSi.bind IKE::IDr, next: IKE::IDr::PAYLOAD_TYPE
205
- IKE::TSr.bind IKE::IDr, next: IKE::IDr::PAYLOAD_TYPE
206
- IKE::VendorID.bind IKE::IDr, next: IKE::IDr::PAYLOAD_TYPE
207
-
208
- IKE.bind IKE::Cert, next: IKE::Cert::PAYLOAD_TYPE
209
- IKE::Payload.bind IKE::Cert, next: IKE::Cert::PAYLOAD_TYPE
210
- IKE::SA.bind IKE::Cert, next: IKE::Cert::PAYLOAD_TYPE
211
- IKE::KE.bind IKE::Cert, next: IKE::Cert::PAYLOAD_TYPE
212
- IKE::Nonce.bind IKE::Cert, next: IKE::Cert::PAYLOAD_TYPE
213
- IKE::Notify.bind IKE::Cert, next: IKE::Cert::PAYLOAD_TYPE
214
- IKE::SK.bind IKE::Cert, next: IKE::Cert::PAYLOAD_TYPE
215
- IKE::IDi.bind IKE::Cert, next: IKE::Cert::PAYLOAD_TYPE
216
- IKE::IDr.bind IKE::Cert, next: IKE::Cert::PAYLOAD_TYPE
217
- IKE::CertReq.bind IKE::Cert, next: IKE::Cert::PAYLOAD_TYPE
218
- IKE::Auth.bind IKE::Cert, next: IKE::Cert::PAYLOAD_TYPE
219
- IKE::TSi.bind IKE::Cert, next: IKE::Cert::PAYLOAD_TYPE
220
- IKE::TSr.bind IKE::Cert, next: IKE::Cert::PAYLOAD_TYPE
221
- IKE::VendorID.bind IKE::Cert, next: IKE::Cert::PAYLOAD_TYPE
222
-
223
- IKE.bind IKE::CertReq, next: IKE::CertReq::PAYLOAD_TYPE
224
- IKE::Payload.bind IKE::CertReq, next: IKE::CertReq::PAYLOAD_TYPE
225
- IKE::SA.bind IKE::CertReq, next: IKE::CertReq::PAYLOAD_TYPE
226
- IKE::KE.bind IKE::CertReq, next: IKE::CertReq::PAYLOAD_TYPE
227
- IKE::Nonce.bind IKE::CertReq, next: IKE::CertReq::PAYLOAD_TYPE
228
- IKE::Notify.bind IKE::CertReq, next: IKE::CertReq::PAYLOAD_TYPE
229
- IKE::SK.bind IKE::CertReq, next: IKE::CertReq::PAYLOAD_TYPE
230
- IKE::IDi.bind IKE::CertReq, next: IKE::CertReq::PAYLOAD_TYPE
231
- IKE::IDr.bind IKE::CertReq, next: IKE::CertReq::PAYLOAD_TYPE
232
- IKE::Cert.bind IKE::CertReq, next: IKE::CertReq::PAYLOAD_TYPE
233
- IKE::Auth.bind IKE::CertReq, next: IKE::CertReq::PAYLOAD_TYPE
234
- IKE::TSi.bind IKE::CertReq, next: IKE::CertReq::PAYLOAD_TYPE
235
- IKE::TSr.bind IKE::CertReq, next: IKE::CertReq::PAYLOAD_TYPE
236
- IKE::VendorID.bind IKE::CertReq, next: IKE::CertReq::PAYLOAD_TYPE
237
-
238
- IKE.bind IKE::Auth, next: IKE::Auth::PAYLOAD_TYPE
239
- IKE::Payload.bind IKE::Auth, next: IKE::Auth::PAYLOAD_TYPE
240
- IKE::SA.bind IKE::Auth, next: IKE::Auth::PAYLOAD_TYPE
241
- IKE::KE.bind IKE::Auth, next: IKE::Auth::PAYLOAD_TYPE
242
- IKE::Nonce.bind IKE::Auth, next: IKE::Auth::PAYLOAD_TYPE
243
- IKE::Notify.bind IKE::Auth, next: IKE::Auth::PAYLOAD_TYPE
244
- IKE::SK.bind IKE::Auth, next: IKE::Auth::PAYLOAD_TYPE
245
- IKE::IDi.bind IKE::Auth, next: IKE::Auth::PAYLOAD_TYPE
246
- IKE::IDr.bind IKE::Auth, next: IKE::Auth::PAYLOAD_TYPE
247
- IKE::Cert.bind IKE::Auth, next: IKE::Auth::PAYLOAD_TYPE
248
- IKE::CertReq.bind IKE::Auth, next: IKE::Auth::PAYLOAD_TYPE
249
- IKE::TSi.bind IKE::Auth, next: IKE::Auth::PAYLOAD_TYPE
250
- IKE::TSr.bind IKE::Auth, next: IKE::Auth::PAYLOAD_TYPE
251
- IKE::VendorID.bind IKE::Auth, next: IKE::Auth::PAYLOAD_TYPE
252
-
253
- IKE.bind IKE::TSi, next: IKE::TSi::PAYLOAD_TYPE
254
- IKE::Payload.bind IKE::TSi, next: IKE::TSi::PAYLOAD_TYPE
255
- IKE::SA.bind IKE::TSi, next: IKE::TSi::PAYLOAD_TYPE
256
- IKE::KE.bind IKE::TSi, next: IKE::TSi::PAYLOAD_TYPE
257
- IKE::Nonce.bind IKE::TSi, next: IKE::TSi::PAYLOAD_TYPE
258
- IKE::Notify.bind IKE::TSi, next: IKE::TSi::PAYLOAD_TYPE
259
- IKE::SK.bind IKE::TSi, next: IKE::TSi::PAYLOAD_TYPE
260
- IKE::IDi.bind IKE::TSi, next: IKE::TSi::PAYLOAD_TYPE
261
- IKE::IDr.bind IKE::TSi, next: IKE::TSi::PAYLOAD_TYPE
262
- IKE::Cert.bind IKE::TSi, next: IKE::TSi::PAYLOAD_TYPE
263
- IKE::CertReq.bind IKE::TSi, next: IKE::TSi::PAYLOAD_TYPE
264
- IKE::Auth.bind IKE::TSi, next: IKE::TSi::PAYLOAD_TYPE
265
- IKE::TSr.bind IKE::TSi, next: IKE::TSi::PAYLOAD_TYPE
266
- IKE::VendorID.bind IKE::TSi, next: IKE::TSi::PAYLOAD_TYPE
267
-
268
- IKE.bind IKE::TSr, next: IKE::TSr::PAYLOAD_TYPE
269
- IKE::Payload.bind IKE::TSr, next: IKE::TSr::PAYLOAD_TYPE
270
- IKE::SA.bind IKE::TSr, next: IKE::TSr::PAYLOAD_TYPE
271
- IKE::KE.bind IKE::TSr, next: IKE::TSr::PAYLOAD_TYPE
272
- IKE::Nonce.bind IKE::TSr, next: IKE::TSr::PAYLOAD_TYPE
273
- IKE::Notify.bind IKE::TSr, next: IKE::TSr::PAYLOAD_TYPE
274
- IKE::SK.bind IKE::TSr, next: IKE::TSr::PAYLOAD_TYPE
275
- IKE::IDi.bind IKE::TSr, next: IKE::TSr::PAYLOAD_TYPE
276
- IKE::IDr.bind IKE::TSr, next: IKE::TSr::PAYLOAD_TYPE
277
- IKE::Cert.bind IKE::TSr, next: IKE::TSr::PAYLOAD_TYPE
278
- IKE::CertReq.bind IKE::TSr, next: IKE::TSr::PAYLOAD_TYPE
279
- IKE::Auth.bind IKE::TSr, next: IKE::TSr::PAYLOAD_TYPE
280
- IKE::TSi.bind IKE::TSr, next: IKE::TSr::PAYLOAD_TYPE
281
- IKE::VendorID.bind IKE::TSr, next: IKE::TSr::PAYLOAD_TYPE
282
-
283
- IKE.bind IKE::VendorID, next: IKE::VendorID::PAYLOAD_TYPE
284
- IKE::Payload.bind IKE::VendorID, next: IKE::VendorID::PAYLOAD_TYPE
285
- IKE::SA.bind IKE::VendorID, next: IKE::VendorID::PAYLOAD_TYPE
286
- IKE::KE.bind IKE::VendorID, next: IKE::VendorID::PAYLOAD_TYPE
287
- IKE::Nonce.bind IKE::VendorID, next: IKE::VendorID::PAYLOAD_TYPE
288
- IKE::Notify.bind IKE::VendorID, next: IKE::VendorID::PAYLOAD_TYPE
289
- IKE::SK.bind IKE::VendorID, next: IKE::VendorID::PAYLOAD_TYPE
290
- IKE::IDi.bind IKE::VendorID, next: IKE::VendorID::PAYLOAD_TYPE
291
- IKE::IDr.bind IKE::VendorID, next: IKE::VendorID::PAYLOAD_TYPE
292
- IKE::Cert.bind IKE::VendorID, next: IKE::VendorID::PAYLOAD_TYPE
293
- IKE::CertReq.bind IKE::VendorID, next: IKE::VendorID::PAYLOAD_TYPE
294
- IKE::Auth.bind IKE::VendorID, next: IKE::VendorID::PAYLOAD_TYPE
295
- IKE::TSi.bind IKE::VendorID, next: IKE::VendorID::PAYLOAD_TYPE
296
- IKE::TSr.bind IKE::VendorID, next: IKE::VendorID::PAYLOAD_TYPE
297
-
298
- # Last defined. To be used as default if no other may be parsed.
299
- IKE::SA.bind IKE::Payload, next: ->(v) { v > 0 }
300
- IKE::KE.bind IKE::Payload, next: ->(v) { v > 0 }
301
- IKE::Nonce.bind IKE::Payload, next: ->(v) { v > 0 }
302
- IKE::Notify.bind IKE::Payload, next: ->(v) { v > 0 }
303
- IKE::SK.bind IKE::Payload, next: ->(v) { v > 0 }
304
- IKE::IDi.bind IKE::Payload, next: ->(v) { v > 0 }
305
- IKE::IDr.bind IKE::Payload, next: ->(v) { v > 0 }
306
- IKE::Cert.bind IKE::Payload, next: ->(v) { v > 0 }
307
- IKE::CertReq.bind IKE::Payload, next: ->(v) { v > 0 }
308
- IKE::Auth.bind IKE::Payload, next: ->(v) { v > 0 }
309
- IKE::TSi.bind IKE::Payload, next: ->(v) { v > 0 }
310
- IKE::TSr.bind IKE::Payload, next: ->(v) { v > 0 }
311
- IKE::VendorID.bind IKE::Payload, next: ->(v) { v > 0 }
312
- IKE.bind IKE::Payload, next: ->(v) { v > 0 }
313
- IKE::Payload.bind IKE::Payload, next: ->(v) { v > 0 }
314
- end
315
- end
@@ -1,561 +0,0 @@
1
- # coding: utf-8
2
- # This file is part of PacketGen
3
- # See https://github.com/sdaubert/packetgen for more informations
4
- # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
5
- # This program is published under MIT license.
6
-
7
- # frozen_string_literal: true
8
-
9
- module PacketGen
10
- module Header
11
- class IKE
12
- # Transform attribute.
13
- # 1 2 3
14
- # 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
15
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16
- # |A| Attribute Type | AF=0 Attribute Length |
17
- # |F| | AF=1 Attribute Value |
18
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
19
- # | AF=0 Attribute Value |
20
- # | AF=1 Not Transmitted |
21
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
22
- # Such an attribute may have a TLV (Type/length/value) format if AF=0,
23
- # or a TV format (AF=1).
24
- # @author Sylvain Daubert
25
- class Attribute < Types::Fields
26
- TYPE_KEY_LENGTH = 14
27
-
28
- # @!attribute type
29
- # attribute type
30
- # @return [Integer]
31
- define_field :type, Types::Int16
32
- # @!attribute length
33
- # attribute length
34
- # @return [Integer]
35
- define_field :length, Types::Int16
36
- # @!attribute value
37
- # attribute value
38
- # @return [Integer]
39
- define_field :value, Types::Int32
40
-
41
- def initialize(options={})
42
- super
43
- if tv_format?
44
- self[:length].value = (options[:value] & 0xffff)
45
- else
46
- self[:length].value = 8 unless options[:length]
47
- end
48
- end
49
-
50
- # @return [Integer]
51
- def length
52
- tv_format? ? 4 : self[:length].to_i
53
- end
54
-
55
- # @return [Integer]
56
- def value
57
- tv_format? ? self[:length].to_i : self[:value].to_i
58
- end
59
-
60
- # Populate object from a string
61
- # @param [String] str
62
- # @return [self]
63
- def read(str)
64
- return self if str.nil?
65
- force_binary str
66
- self[:type].read str[0, 2]
67
- self[:length].read str[2, 2]
68
- self[:value].read str[4, 4] unless tv_format?
69
- self
70
- end
71
-
72
- # Get binary string
73
- # @return [String]
74
- def to_s
75
- str = self[:type].to_s + self[:length].to_s
76
- str << self[:value].to_s unless tv_format?
77
- str
78
- end
79
-
80
- # Get a human readable string
81
- # @return [String]
82
- def to_human
83
- name = self.class.constants.grep(/TYPE_/)
84
- .detect { |c| self.class.const_get(c) == (type & 0x7fff) } || "attr[#{type & 0x7fff}]"
85
- name = name.to_s.sub(/TYPE_/, '')
86
- "#{name}=#{value}"
87
- end
88
-
89
- # Say if attribute use TV format (+true+) or TLV one (+false+)
90
- # @return [Boolean]
91
- def tv_format?
92
- type & 0x8000 == 0x8000
93
- end
94
- end
95
-
96
- # Set of {Attribute} in a {Transform}
97
- # @author Sylvain Daubert
98
- class Attributes < Types::Array
99
- set_of Attribute
100
- end
101
-
102
- # SA Tranform substructure, as defined in RFC 7296 §3.3.2
103
- # 1 2 3
104
- # 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
105
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
106
- # | Last Substruc | RESERVED | Transform Length |
107
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
108
- # |Transform Type | RESERVED | Transform ID |
109
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
110
- # | |
111
- # ~ Transform Attributes ~
112
- # | |
113
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
114
- #
115
- # == Create a Transform
116
- # # using type and id names
117
- # trans = PacketGen::Header::IKE::Transform.new(type: 'ENCR', id: 'AES_CBC')
118
- # # using integer values
119
- # trans = PacketGen::Header::IKE::Transform.new(type: 1, id: 12)
120
- # == Add attributes to a transform
121
- # # using an Attribute object
122
- # attr = PacketGen::Header::IKE::Attribute.new(type: 14, value: 128)
123
- # trans.attributes << attr
124
- # # using a hash
125
- # trans.attributes << { type: 14, value: 128 }
126
- # @author Sylvain Daubert
127
- class Transform < Types::Fields
128
- TYPES = {
129
- 'ENCR' => 1,
130
- 'PRF' => 2,
131
- 'INTG' => 3,
132
- 'DH' => 4,
133
- 'ESN' => 5
134
- }.freeze
135
-
136
- ENCR_DES_IV64 = 1
137
- ENCR_DES = 2
138
- ENCR_3DES = 3
139
- ENCR_RC5 = 4
140
- ENCR_IDEA = 5
141
- ENCR_CAST = 6
142
- ENCR_BLOWFISH = 7
143
- ENCR_3IDEA = 8
144
- ENCR_DES_IV32 = 9
145
- ENCR_AES_CBC = 12
146
- ENCR_AES_CTR = 13
147
- ENCR_AES_CCM8 = 14
148
- ENCR_AES_CCM12 = 15
149
- ENCR_AES_CCM16 = 16
150
- ENCR_AES_GCM8 = 18
151
- ENCR_AES_GCM12 = 19
152
- ENCR_AES_GCM16 = 20
153
- ENCR_CAMELLIA_CBC = 23
154
- ENCR_CAMELLIA_CTR = 24
155
- ENCR_CAMELLIA_CCM8 = 25
156
- ENCR_CAMELLIA_CCM12 = 26
157
- ENCR_CAMELLIA_CCM16 = 27
158
- ENCR_CHACHA20_POLY1305 = 28
159
-
160
- PRF_HMAC_MD5 = 1
161
- PRF_HMAC_SHA1 = 2
162
- PRF_AES128_XCBC = 4
163
- PRF_HMAC_SHA2_256 = 5
164
- PRF_HMAC_SHA2_384 = 6
165
- PRF_HMAC_SHA2_512 = 7
166
- PRF_AES128_CMAC = 8
167
-
168
- INTG_NONE = 0
169
- INTG_HMAC_MD5_96 = 1
170
- INTG_HMAC_SHA1_96 = 2
171
- INTG_AES_XCBC_96 = 5
172
- INTG_HMAC_MD5_128 = 6
173
- INTG_HMAC_SHA1_160 = 7
174
- INTG_AES_CMAC_96 = 8
175
- INTG_AES128_GMAC = 9
176
- INTG_AES192_GMAC = 10
177
- INTG_AES256_GMAC = 11
178
- INTG_HMAC_SHA2_256_128 = 12
179
- INTG_HMAC_SHA2_384_192 = 13
180
- INTG_HMAC_SHA2_512_256 = 14
181
-
182
- DH_NONE = 0
183
- DH_MODP768 = 1
184
- DH_MODP1024 = 2
185
- DH_MODP1536 = 5
186
- DH_MODP2048 = 14
187
- DH_MODP3072 = 15
188
- DH_MODP4096 = 16
189
- DH_MODP6144 = 17
190
- DH_MODP8192 = 18
191
- DH_ECP256 = 19
192
- DH_ECP384 = 20
193
- DH_ECP521 = 21
194
- DH_BRAINPOOLP224 = 27
195
- DH_BRAINPOOLP256 = 28
196
- DH_BRAINPOOLP384 = 29
197
- DH_BRAINPOOLP512 = 30
198
- DH_CURVE25519 = 31
199
- DH_CURVE448 = 32
200
-
201
- ESN_NO_ESN = 0
202
- ESN_ESN = 1
203
-
204
- # @!attribute last
205
- # 8-bit last substructure. Specifies whether or not this is the
206
- # last Transform Substructure in the Proposal. This field has a value of 0
207
- # if this was the last Transform Substructure, and a value of 3 if
208
- # there are more Transform Substructures.
209
- # @return [Integer]
210
- define_field :last, Types::Int8
211
- # @!attribute rsv1
212
- # 8-bit reserved field
213
- # @return [Integer]
214
- define_field :rsv1, Types::Int8
215
- # @!attribute length
216
- # 16-bit proposal length
217
- # @return [Integer]
218
- define_field :length, Types::Int16
219
- # @!attribute [r] type
220
- # 8-bit transform type. The Transform Type is the cryptographic
221
- # algorithm type (i.e. encryption, PRF, integrity, etc.)
222
- # @return [Integer]
223
- define_field :type, Types::Int8Enum, enum: TYPES
224
- # @!attribute rsv2
225
- # 8-bit reserved field
226
- # @return [Integer]
227
- define_field :rsv2, Types::Int8
228
- # @!attribute [r] id
229
- # 16-bit transform ID. The Transform ID is the specific instance of
230
- # the proposed transform type.
231
- # @return [Integer]
232
- define_field :id, Types::Int16
233
- # @!attribute attributes
234
- # Set of attributes for this transform
235
- # @return [Attributes]
236
- define_field :attributes, Attributes
237
-
238
- def initialize(options={})
239
- super
240
- self[:length].value = sz unless options[:length]
241
- self.type = options[:type] if options[:type]
242
- self.id = options[:id] if options[:id]
243
- end
244
-
245
- # Set transform ID
246
- # @param [Integer,String] value
247
- # @return [Integer]
248
- def id=(value)
249
- id = case value
250
- when Integer
251
- value
252
- else
253
- c = self.class.constants.grep(/#{human_type}_#{value}/).first
254
- c ? self.class.const_get(c) : nil
255
- end
256
- raise ArgumentError, "unknown ID #{value.inspect}" unless id
257
- self[:id].value = id
258
- end
259
-
260
- # Populate object from a string
261
- # @param [String] str
262
- # @return [self]
263
- def read(str)
264
- super
265
- hlen = self.class.new.sz
266
- attr_len = length - hlen
267
- attributes.read(str[hlen, attr_len])
268
- self
269
- end
270
-
271
- # Compute length and set {#length} field
272
- # @return [Integer] new length
273
- def calc_length
274
- Base.calculate_and_set_length self
275
- end
276
-
277
- # Get a human readable string
278
- # @return [String]
279
- def to_human
280
- h = "#{human_type}(#{human_id}".dup
281
- h << ",#{attributes.to_human}" unless attributes.empty?
282
- h << ')'
283
- end
284
-
285
- # Get human-readable type
286
- # @return [String]
287
- def human_type
288
- if self[:type].enum.value? self.type
289
- self[:type].to_human
290
- else
291
- "type[#{self.type}]"
292
- end
293
- end
294
-
295
- # Get human-readable ID
296
- # @return [String]
297
- def human_id
298
- name = self.class.constants.grep(/#{human_type}_/)
299
- .detect { |c| self.class.const_get(c) == id } || "ID=#{id}"
300
- name.to_s.sub(/#{human_type}_/, '')
301
- end
302
-
303
- # Say if this transform is the last one (from {#last} field)
304
- # @return [Boolean,nil] returns a Boolean when {#last} has defined value (+0+ => +true+, +3+ => +false+), else +nil+ is returned.
305
- def last?
306
- case last
307
- when 0
308
- true
309
- when 3
310
- false
311
- end
312
- end
313
- end
314
-
315
- # Set of {Transform} in a {SAProposal}
316
- # @author Sylvain Daubert
317
- class Transforms < Types::Array
318
- set_of Transform
319
-
320
- # Same as {Types::Array#push} but update previous {Transform#last} attribute
321
- # @see Types::Array#push
322
- def push(trans)
323
- super
324
- self[-2].last = 3 if size > 1
325
- self[-1].last = 0
326
- self
327
- end
328
- end
329
-
330
- # SA Proposal, as defined in RFC 7296 §3.3.1
331
- # 1 2 3
332
- # 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
333
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
334
- # | Last Substruc | RESERVED | Proposal Length |
335
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
336
- # | Proposal Num | Protocol ID | SPI Size |Num Transforms|
337
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
338
- # ~ SPI (variable) ~
339
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
340
- # | |
341
- # ~ <Transforms> ~
342
- # | |
343
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
344
- #
345
- # == Create a proposal
346
- # # using protocol name
347
- # proposal = PacketGen::Header::IKE::Proposal.new(num: 1, protocol: 'IKE')
348
- # # using integer values
349
- # proposal = PacketGen::Header::IKE::Proposal.new(num: 1, protocol: 1)
350
- # == Add transforms to a proposal
351
- # # using a Transform object
352
- # trans = PacketGen::Header::IKE::Transform.new(type: 'ENCR', id: '3DES')
353
- # proposal.transforms << trans
354
- # # using a hash
355
- # proposal.transforms << { type: 'ENCR', id: '3DES' }
356
- # @author Sylvain Daubert
357
- class SAProposal < Types::Fields
358
- # @!attribute last
359
- # 8-bit last substructure. Specifies whether or not this is the
360
- # last Proposal Substructure in the SA. This field has a value of 0
361
- # if this was the last Proposal Substructure, and a value of 2 if
362
- # there are more Proposal Substructures.
363
- # @return [Integer]
364
- define_field :last, Types::Int8
365
- # @!attribute reserved
366
- # 8-bit reserved field
367
- # @return [Integer]
368
- define_field :reserved, Types::Int8
369
- # @!attribute length
370
- # 16-bit proposal length
371
- # @return [Integer]
372
- define_field :length, Types::Int16
373
- # @!attribute num
374
- # 8-bit proposal number. When a proposal is made, the first
375
- # proposal in an SA payload MUST be 1, and subsequent proposals MUST
376
- # be one more than the previous proposal (indicating an OR of the
377
- # two proposals). When a proposal is accepted, the proposal number
378
- # in the SA payload MUST match the number on the proposal sent that
379
- # was accepted.
380
- # @return [Integer]
381
- define_field :num, Types::Int8, default: 1
382
- # @!attribute [r] protocol
383
- # 8-bit protocol ID. Specify IPsec protocol currently negociated.
384
- # May 1 (IKE), 2 (AH) or 3 (ESP).
385
- # @return [Integer]
386
- define_field :protocol, Types::Int8
387
- # @!attribute spi_size
388
- # 8-bit SPI size. Give size of SPI field. Set to 0 for an initial IKE SA
389
- # negotiation, as SPI is obtained from outer header.
390
- # @return [Integer]
391
- define_field :spi_size, Types::Int8, default: 0
392
- # @!attribute num_trans
393
- # 8-bit number of transformations
394
- # @return [Integer]
395
- define_field :num_trans, Types::Int8, default: 0
396
- # @!attribute spi
397
- # the sending entity's SPI. When the {#spi_size} field is zero,
398
- # this field is not present in the proposal.
399
- # @return [String]
400
- define_field :spi, Types::String, builder: ->(h, t) { t.new(length_from: h[:spi_size]) }
401
- # @!attribute transforms
402
- # 8-bit set of tranforms for this proposal
403
- # @return [Transforms]
404
- define_field :transforms, Transforms, builder: ->(h, t) { t.new(counter: h[:num_trans]) }
405
-
406
- def initialize(options={})
407
- if options[:spi] && options[:spi_size].nil?
408
- options[:spi_size] = options[:spi].size
409
- end
410
- super
411
- self[:length].value = sz unless options[:length]
412
- self.protocol = options[:protocol] if options[:protocol]
413
- end
414
-
415
- # Set protocol
416
- # @param [Integer,String] value
417
- # @return [Integer]
418
- def protocol=(value)
419
- proto = case value
420
- when Integer
421
- value
422
- else
423
- c = IKE.constants.grep(/PROTO_#{value}/).first
424
- c ? IKE.const_get(c) : nil
425
- end
426
- raise ArgumentError, "unknown protocol #{value.inspect}" unless proto
427
- self[:protocol].value = proto
428
- end
429
-
430
- # Populate object from a string
431
- # @param [String] str
432
- # @return [self]
433
- def read(str)
434
- super
435
- hlen = self.class.new.sz + spi_size
436
- tlen = length - hlen
437
- transforms.read(str[hlen, tlen])
438
- self
439
- end
440
-
441
- # Compute length and set {#length} field
442
- # @return [Integer] new length
443
- def calc_length
444
- transforms.each(&:calc_length)
445
- Base.calculate_and_set_length self
446
- end
447
-
448
- # Get a human readable string
449
- # @return [String]
450
- def to_human
451
- str = "##{num} #{human_protocol}".dup
452
- case spi_size
453
- when 4
454
- str << '(spi:0x%08x)' % Types::Int32.new.read(spi).to_i
455
- when 8
456
- str << '(spi:0x%016x)' % Types::Int64.new.read(spi).to_i
457
- end
458
- str << ":#{transforms.to_human}"
459
- end
460
-
461
- # Get protocol name
462
- # @return [String]
463
- def human_protocol
464
- name = IKE.constants.grep(/PROTO/)
465
- .detect { |c| IKE.const_get(c) == protocol } || "proto #{protocol}"
466
- name.to_s.sub(/PROTO_/, '')
467
- end
468
-
469
- # Say if this proposal is the last one (from {#last} field)
470
- # @return [Boolean,nil] returns a Boolean when {#last} has defined value
471
- # (+0+ => +true+, +2+ => +false+), else +nil+ is returned.
472
- def last?
473
- case last
474
- when 0
475
- true
476
- when 2
477
- false
478
- end
479
- end
480
- end
481
-
482
- # Set of {SAProposal}
483
- # @author Sylvain Daubert
484
- class SAProposals < Types::Array
485
- set_of SAProposal
486
-
487
- # Separator used between proposals in {#to_human}
488
- HUMAN_SEPARATOR = '; '
489
-
490
- # Same as {Types::Array#push} but update previous {SAProposal#last} attribute
491
- # @see Types::Array#push
492
- def push(prop)
493
- super
494
- self[-2].last = 2 if size > 1
495
- self[-1].last = 0
496
- self
497
- end
498
- end
499
-
500
- # This class handles Security Assocation payloads, as defined in RFC 7296 §3.3.
501
- #
502
- # A SA payload contains a generic payload header (see {Payload}) and a set of
503
- # {SAProposal} ({#proposals} field, which is a {SAProposals} object):
504
- # 1 2 3
505
- # 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
506
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
507
- # | Next Payload |C| RESERVED | Payload Length |
508
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
509
- # | |
510
- # ~ <Proposals> ~
511
- # | |
512
- # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
513
- #
514
- # == Create a SA payload
515
- # # Create a IKE packet with a SA payload
516
- # pkt = PacketGen.gen('IP').add('UDP').add('IKE').add('IKE::SA')
517
- # # add a proposal. Protocol name is taken from SAProposal::PROTO_* constants
518
- # pkt.ike_sa.proposals << { num: 1, protocol: 'ESP' }
519
- # # add a transform to this proposal.
520
- # # type name is taken from Transform::TYPE_* constants.
521
- # # ID is taken from Transform::<TYPE>_* constants.
522
- # pkt.ike_sa.proposals.first.transforms << { type: 'ENCR', id: 'AES_CTR' }
523
- # # and finally, add an attribute to this transform (here, KEY_SIZE = 128 bits)
524
- # pkt.ike_sa.proposals[0].transforms[0].attributes << { type: 0x800e, value: 128 }
525
- # pkt.calc_length
526
- # @author Sylvain Daubert
527
- class SA < Payload
528
- # Payload type number
529
- PAYLOAD_TYPE = 33
530
-
531
- remove_field :content
532
-
533
- # @!attribute proposals
534
- # Set of SA proposals
535
- # @return [SAProposals]
536
- define_field_before :body, :proposals, SAProposals
537
-
538
- # Populate object from a string
539
- # @param [String] str
540
- # @return [self]
541
- def read(str)
542
- super
543
- hlen = self.class.new.sz
544
- plen = length - hlen
545
- proposals.read str[hlen, plen]
546
- body.read str[hlen + plen..-1]
547
- self
548
- end
549
-
550
- # Compute length and set {#length} field
551
- # @return [Integer] new length
552
- def calc_length
553
- proposals.each(&:calc_length)
554
- super
555
- end
556
- end
557
- end
558
-
559
- self.add_class IKE::SA
560
- end
561
- end