1# -*- mode: perl; -*-
2# Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved.
3#
4# Licensed under the Apache License 2.0 (the "License").  You may not use
5# this file except in compliance with the License.  You can obtain a copy
6# in the file LICENSE in the source distribution or at
7# https://www.openssl.org/source/license.html
8
9
10## Test packet fragmentation
11
12use strict;
13use warnings;
14
15package ssltests;
16
17
18our @tests = (
19    # Default fragment size is 512.
20    {
21        name => "one-fragment-minus-app-data",
22        server => { },
23        client => { },
24        test => {
25            ApplicationData => 511,
26        }
27    },
28    {
29        name => "one-fragment-app-data",
30        server => { },
31        client => { },
32        test => {
33            ApplicationData => 512,
34        }
35    },
36    {
37        name => "one-fragment-plus-app-data",
38        server => { },
39        client => { },
40        test => {
41            ApplicationData => 513,
42        }
43    },
44    {
45        name => "small-app-data",
46        server => { },
47        client => { },
48        test => {
49            ApplicationData => 4 * 1024 + 1,
50        }
51    },
52    {
53        name => "small-app-data-large-fragment-size",
54        server => { },
55        client => { },
56        test => {
57            ApplicationData => 4 * 1024 + 1,
58            MaxFragmentSize => 16384,
59        }
60    },
61    {
62        name => "medium-app-data",
63        server => { },
64        client => { },
65        test => {
66            ApplicationData => 32 * 1024 + 7,
67        }
68    },
69    # Exceeds the 64kB write buffer size.
70    {
71        name => "medium-plus-app-data",
72        server => { },
73        client => { },
74        test => {
75            ApplicationData => 128 * 1024 - 3,
76        }
77    },
78    {
79        name => "large-app-data",
80        server => { },
81        client => { },
82        test => {
83            ApplicationData => 1024 * 1024,
84        }
85    },
86    {
87        name => "large-app-data-large-fragment-size",
88        server => { },
89        client => { },
90        test => {
91            ApplicationData => 1024 * 1024,
92            MaxFragmentSize => 16384,
93        }
94    },
95    {
96        name => "large-app-data-odd-fragment-size",
97        server => { },
98        client => { },
99        test => {
100            ApplicationData => 1024 * 1024,
101            MaxFragmentSize => 5 * 1024 - 5,
102        }
103    },
104    # When the buffer / fragment size ratio is sufficiently large,
105    # multi-buffer code kicks in on some platforms for AES-SHA.  The
106    # exact minimum ratio depends on the platform, and is usually
107    # around 4. Since the test buffer is 64kB, a 4kB fragment is
108    # easily sufficient.
109    #
110    # (We run this test on all platforms though it's only true multibuffer
111    #  on some of them.)
112    {
113        name => "large-app-data-aes-sha1-multibuffer",
114        server => { },
115        client => {
116            CipherString => "AES128-SHA",
117            MaxProtocol => "TLSv1.2"
118        },
119        test => {
120            ApplicationData => 1024 * 1024,
121            MaxFragmentSize => 4 * 1024,
122        }
123    },
124    {
125        name => "large-app-data-aes-sha2-multibuffer",
126        server => { },
127        client => {
128            CipherString => "AES128-SHA256",
129            MaxProtocol => "TLSv1.2"
130        },
131        test => {
132            ApplicationData => 1024 * 1024,
133            MaxFragmentSize => 4 * 1024,
134        }
135    },
136        {
137        name => "large-app-data-aes-sha1-multibuffer-odd-fragment",
138        server => { },
139        client => {
140            CipherString => "AES128-SHA",
141            MaxProtocol => "TLSv1.2"
142        },
143        test => {
144            ApplicationData => 1024 * 1024 + 3,
145            MaxFragmentSize => 5 * 1024 - 5,
146        }
147    },
148    {
149        name => "large-app-data-aes-sha2-multibuffer-odd-fragment",
150        server => { },
151        client => {
152            CipherString => "AES128-SHA256",
153            MaxProtocol => "TLSv1.2"
154        },
155        test => {
156            ApplicationData => 1024 * 1024 - 3,
157            MaxFragmentSize => 5 * 1024 + 5,
158        }
159    },
160    # Test that multibuffer-capable code also handles small data correctly.
161    # Here fragment size == app data size < buffer size,
162    # so no multibuffering should happen.
163    {
164        name => "small-app-data-aes-sha1-multibuffer",
165        server => { },
166        client => {
167            CipherString => "AES128-SHA",
168            MaxProtocol => "TLSv1.2"
169        },
170        test => {
171            ApplicationData => 4 * 1024,
172            MaxFragmentSize => 4 * 1024,
173        }
174    },
175    {
176        name => "small-app-data-aes-sha2-multibuffer",
177        server => { },
178        client => {
179            CipherString => "AES128-SHA256",
180            MaxProtocol => "TLSv1.2"
181        },
182        test => {
183            ApplicationData => 4 * 1024,
184            MaxFragmentSize => 4 * 1024,
185        }
186    },
187    ############################################
188    # Default (Max) Fragment Size is 512.
189    # Default Application data size is 256.
190    {
191        name => "Maximum Fragment Len extension set to 1024 w. FragmentSize disabled",
192        server => { },
193        client => {
194            extra => {
195                MaxFragmentLenExt => 1024,
196            },
197        },
198        test => {
199            ApplicationData => 3072,
200            MaxFragmentSize => 16384,
201        }
202    },
203    {
204        name => "Maximum Fragment Len extension equal FragmentSize to 2048",
205        server => { },
206        client => {
207            extra => {
208                MaxFragmentLenExt => 2048,
209            },
210        },
211        test => {
212            ApplicationData => 3072,
213            MaxFragmentSize => 2048,
214        }
215    },
216    {
217        name => "Maximum Fragment Len extension 512 lower than FragmentSize 1024",
218        server => { },
219        client => {
220            extra => {
221                MaxFragmentLenExt => 512,
222            },
223        },
224        test => {
225            ApplicationData => 3072,
226            MaxFragmentSize => 1024,
227        }
228    },
229    {
230        name => "Maximum Fragment Len extension 1024 lower than FragmentSize 1024",
231        server => { },
232        client => {
233            extra => {
234                MaxFragmentLenExt => 2048,
235            },
236        },
237        test => {
238            ApplicationData => 3072,
239            MaxFragmentSize => 1024,
240        }
241    },
242    {
243        name => "Maximum Fragment Len extension 4096 greater than FragmentSize 2048",
244        server => { },
245        client => {
246            extra => {
247                MaxFragmentLenExt => 4096,
248            },
249        },
250        test => {
251            ApplicationData => 8196,
252            MaxFragmentSize => 2048,
253        }
254    },
255    {
256        name => "Maximum Fragment Len extension 2048 greater than FragmentSize 1024",
257        server => { },
258        client => {
259            extra => {
260                MaxFragmentLenExt => 2048,
261            },
262        },
263        test => {
264            ApplicationData => 3072,
265            MaxFragmentSize => 1024,
266        }
267    },
268);
269