1 /* 2 * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (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 #include "../ssl/packet_locl.h" 11 12 #define BUF_LEN 255 13 14 static int test_PACKET_remaining(unsigned char buf[BUF_LEN]) 15 { 16 PACKET pkt; 17 18 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 19 || PACKET_remaining(&pkt) != BUF_LEN 20 || !PACKET_forward(&pkt, BUF_LEN - 1) 21 || PACKET_remaining(&pkt) != 1 22 || !PACKET_forward(&pkt, 1) 23 || PACKET_remaining(&pkt) != 0) { 24 fprintf(stderr, "test_PACKET_remaining() failed\n"); 25 return 0; 26 } 27 28 return 1; 29 } 30 31 static int test_PACKET_end(unsigned char buf[BUF_LEN]) 32 { 33 PACKET pkt; 34 35 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 36 || PACKET_remaining(&pkt) != BUF_LEN 37 || PACKET_end(&pkt) != buf + BUF_LEN 38 || !PACKET_forward(&pkt, BUF_LEN - 1) 39 || PACKET_end(&pkt) != buf + BUF_LEN 40 || !PACKET_forward(&pkt, 1) 41 || PACKET_end(&pkt) != buf + BUF_LEN) { 42 fprintf(stderr, "test_PACKET_end() failed\n"); 43 return 0; 44 } 45 46 return 1; 47 } 48 49 static int test_PACKET_get_1(unsigned char buf[BUF_LEN]) 50 { 51 unsigned int i; 52 PACKET pkt; 53 54 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 55 || !PACKET_get_1(&pkt, &i) 56 || i != 0x02 57 || !PACKET_forward(&pkt, BUF_LEN - 2) 58 || !PACKET_get_1(&pkt, &i) 59 || i != 0xfe 60 || PACKET_get_1(&pkt, &i)) { 61 fprintf(stderr, "test_PACKET_get_1() failed\n"); 62 return 0; 63 } 64 65 return 1; 66 } 67 68 static int test_PACKET_get_4(unsigned char buf[BUF_LEN]) 69 { 70 unsigned long i; 71 PACKET pkt; 72 73 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 74 || !PACKET_get_4(&pkt, &i) 75 || i != 0x08060402UL 76 || !PACKET_forward(&pkt, BUF_LEN - 8) 77 || !PACKET_get_4(&pkt, &i) 78 || i != 0xfefcfaf8UL 79 || PACKET_get_4(&pkt, &i)) { 80 fprintf(stderr, "test_PACKET_get_4() failed\n"); 81 return 0; 82 } 83 84 return 1; 85 } 86 87 static int test_PACKET_get_net_2(unsigned char buf[BUF_LEN]) 88 { 89 unsigned int i; 90 PACKET pkt; 91 92 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 93 || !PACKET_get_net_2(&pkt, &i) 94 || i != 0x0204 95 || !PACKET_forward(&pkt, BUF_LEN - 4) 96 || !PACKET_get_net_2(&pkt, &i) 97 || i != 0xfcfe 98 || PACKET_get_net_2(&pkt, &i)) { 99 fprintf(stderr, "test_PACKET_get_net_2() failed\n"); 100 return 0; 101 } 102 103 return 1; 104 } 105 106 static int test_PACKET_get_net_3(unsigned char buf[BUF_LEN]) 107 { 108 unsigned long i; 109 PACKET pkt; 110 111 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 112 || !PACKET_get_net_3(&pkt, &i) 113 || i != 0x020406UL 114 || !PACKET_forward(&pkt, BUF_LEN - 6) 115 || !PACKET_get_net_3(&pkt, &i) 116 || i != 0xfafcfeUL 117 || PACKET_get_net_3(&pkt, &i)) { 118 fprintf(stderr, "test_PACKET_get_net_3() failed\n"); 119 return 0; 120 } 121 122 return 1; 123 } 124 125 static int test_PACKET_get_net_4(unsigned char buf[BUF_LEN]) 126 { 127 unsigned long i; 128 PACKET pkt; 129 130 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 131 || !PACKET_get_net_4(&pkt, &i) 132 || i != 0x02040608UL 133 || !PACKET_forward(&pkt, BUF_LEN - 8) 134 || !PACKET_get_net_4(&pkt, &i) 135 || i != 0xf8fafcfeUL 136 || PACKET_get_net_4(&pkt, &i)) { 137 fprintf(stderr, "test_PACKET_get_net_4() failed\n"); 138 return 0; 139 } 140 141 return 1; 142 } 143 144 static int test_PACKET_get_sub_packet(unsigned char buf[BUF_LEN]) 145 { 146 PACKET pkt, subpkt; 147 unsigned long i; 148 149 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 150 || !PACKET_get_sub_packet(&pkt, &subpkt, 4) 151 || !PACKET_get_net_4(&subpkt, &i) 152 || i != 0x02040608UL 153 || PACKET_remaining(&subpkt) 154 || !PACKET_forward(&pkt, BUF_LEN - 8) 155 || !PACKET_get_sub_packet(&pkt, &subpkt, 4) 156 || !PACKET_get_net_4(&subpkt, &i) 157 || i != 0xf8fafcfeUL 158 || PACKET_remaining(&subpkt) 159 || PACKET_get_sub_packet(&pkt, &subpkt, 4)) { 160 fprintf(stderr, "test_PACKET_get_sub_packet() failed\n"); 161 return 0; 162 } 163 164 return 1; 165 } 166 167 static int test_PACKET_get_bytes(unsigned char buf[BUF_LEN]) 168 { 169 const unsigned char *bytes; 170 PACKET pkt; 171 172 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 173 || !PACKET_get_bytes(&pkt, &bytes, 4) 174 || bytes[0] != 2 || bytes[1] != 4 175 || bytes[2] != 6 || bytes[3] != 8 176 || PACKET_remaining(&pkt) != BUF_LEN -4 177 || !PACKET_forward(&pkt, BUF_LEN - 8) 178 || !PACKET_get_bytes(&pkt, &bytes, 4) 179 || bytes[0] != 0xf8 || bytes[1] != 0xfa 180 || bytes[2] != 0xfc || bytes[3] != 0xfe 181 || PACKET_remaining(&pkt)) { 182 fprintf(stderr, "test_PACKET_get_bytes() failed\n"); 183 return 0; 184 } 185 186 return 1; 187 } 188 189 static int test_PACKET_copy_bytes(unsigned char buf[BUF_LEN]) 190 { 191 unsigned char bytes[4]; 192 PACKET pkt; 193 194 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 195 || !PACKET_copy_bytes(&pkt, bytes, 4) 196 || bytes[0] != 2 || bytes[1] != 4 197 || bytes[2] != 6 || bytes[3] != 8 198 || PACKET_remaining(&pkt) != BUF_LEN - 4 199 || !PACKET_forward(&pkt, BUF_LEN - 8) 200 || !PACKET_copy_bytes(&pkt, bytes, 4) 201 || bytes[0] != 0xf8 || bytes[1] != 0xfa 202 || bytes[2] != 0xfc || bytes[3] != 0xfe 203 || PACKET_remaining(&pkt)) { 204 fprintf(stderr, "test_PACKET_copy_bytes() failed\n"); 205 return 0; 206 } 207 208 return 1; 209 } 210 211 static int test_PACKET_copy_all(unsigned char buf[BUF_LEN]) 212 { 213 unsigned char tmp[BUF_LEN]; 214 PACKET pkt; 215 size_t len; 216 217 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 218 || !PACKET_copy_all(&pkt, tmp, BUF_LEN, &len) 219 || len != BUF_LEN 220 || memcmp(buf, tmp, BUF_LEN) != 0 221 || PACKET_remaining(&pkt) != BUF_LEN 222 || PACKET_copy_all(&pkt, tmp, BUF_LEN - 1, &len)) { 223 fprintf(stderr, "test_PACKET_copy_bytes() failed\n"); 224 return 0; 225 } 226 227 return 1; 228 } 229 230 static int test_PACKET_memdup(unsigned char buf[BUF_LEN]) 231 { 232 unsigned char *data = NULL; 233 size_t len; 234 PACKET pkt; 235 236 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 237 || !PACKET_memdup(&pkt, &data, &len) 238 || len != BUF_LEN 239 || memcmp(data, PACKET_data(&pkt), len) 240 || !PACKET_forward(&pkt, 10) 241 || !PACKET_memdup(&pkt, &data, &len) 242 || len != BUF_LEN - 10 243 || memcmp(data, PACKET_data(&pkt), len)) { 244 fprintf(stderr, "test_PACKET_memdup() failed\n"); 245 OPENSSL_free(data); 246 return 0; 247 } 248 249 OPENSSL_free(data); 250 return 1; 251 } 252 253 static int test_PACKET_strndup() 254 { 255 char buf[10], buf2[10]; 256 char *data = NULL; 257 PACKET pkt; 258 259 memset(buf, 'x', 10); 260 memset(buf2, 'y', 10); 261 buf2[5] = '\0'; 262 263 if ( !PACKET_buf_init(&pkt, (unsigned char*)buf, 10) 264 || !PACKET_strndup(&pkt, &data) 265 || strlen(data) != 10 266 || strncmp(data, buf, 10) 267 || !PACKET_buf_init(&pkt, (unsigned char*)buf2, 10) 268 || !PACKET_strndup(&pkt, &data) 269 || strlen(data) != 5 270 || strcmp(data, buf2)) { 271 fprintf(stderr, "test_PACKET_strndup failed\n"); 272 OPENSSL_free(data); 273 return 0; 274 } 275 276 OPENSSL_free(data); 277 return 1; 278 } 279 280 static int test_PACKET_contains_zero_byte() 281 { 282 char buf[10], buf2[10]; 283 PACKET pkt; 284 285 memset(buf, 'x', 10); 286 memset(buf2, 'y', 10); 287 buf2[5] = '\0'; 288 289 if ( !PACKET_buf_init(&pkt, (unsigned char*)buf, 10) 290 || PACKET_contains_zero_byte(&pkt) 291 || !PACKET_buf_init(&pkt, (unsigned char*)buf2, 10) 292 || !PACKET_contains_zero_byte(&pkt)) { 293 fprintf(stderr, "test_PACKET_contains_zero_byte failed\n"); 294 return 0; 295 } 296 297 return 1; 298 } 299 300 static int test_PACKET_forward(unsigned char buf[BUF_LEN]) 301 { 302 const unsigned char *byte; 303 PACKET pkt; 304 305 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 306 || !PACKET_forward(&pkt, 1) 307 || !PACKET_get_bytes(&pkt, &byte, 1) 308 || byte[0] != 4 309 || !PACKET_forward(&pkt, BUF_LEN - 3) 310 || !PACKET_get_bytes(&pkt, &byte, 1) 311 || byte[0] != 0xfe) { 312 fprintf(stderr, "test_PACKET_forward() failed\n"); 313 return 0; 314 } 315 316 return 1; 317 } 318 319 static int test_PACKET_buf_init() 320 { 321 unsigned char buf[BUF_LEN]; 322 PACKET pkt; 323 324 /* Also tests PACKET_remaining() */ 325 if ( !PACKET_buf_init(&pkt, buf, 4) 326 || PACKET_remaining(&pkt) != 4 327 || !PACKET_buf_init(&pkt, buf, BUF_LEN) 328 || PACKET_remaining(&pkt) != BUF_LEN 329 || PACKET_buf_init(&pkt, buf, -1)) { 330 fprintf(stderr, "test_PACKET_buf_init() failed\n"); 331 return 0; 332 } 333 334 return 1; 335 } 336 337 static int test_PACKET_null_init() 338 { 339 PACKET pkt; 340 341 PACKET_null_init(&pkt); 342 if ( PACKET_remaining(&pkt) != 0 343 || PACKET_forward(&pkt, 1)) { 344 fprintf(stderr, "test_PACKET_null_init() failed\n"); 345 return 0; 346 } 347 348 return 1; 349 } 350 351 static int test_PACKET_equal(unsigned char buf[BUF_LEN]) 352 { 353 PACKET pkt; 354 355 if ( !PACKET_buf_init(&pkt, buf, 4) 356 || !PACKET_equal(&pkt, buf, 4) 357 || PACKET_equal(&pkt, buf + 1, 4) 358 || !PACKET_buf_init(&pkt, buf, BUF_LEN) 359 || !PACKET_equal(&pkt, buf, BUF_LEN) 360 || PACKET_equal(&pkt, buf, BUF_LEN - 1) 361 || PACKET_equal(&pkt, buf, BUF_LEN + 1) 362 || PACKET_equal(&pkt, buf, 0)) { 363 fprintf(stderr, "test_PACKET_equal() failed\n"); 364 return 0; 365 } 366 367 return 1; 368 } 369 370 static int test_PACKET_get_length_prefixed_1() 371 { 372 unsigned char buf[BUF_LEN]; 373 const size_t len = 16; 374 unsigned int i; 375 PACKET pkt, short_pkt, subpkt; 376 377 buf[0] = len; 378 for (i = 1; i < BUF_LEN; i++) { 379 buf[i] = (i * 2) & 0xff; 380 } 381 382 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 383 || !PACKET_buf_init(&short_pkt, buf, len) 384 || !PACKET_get_length_prefixed_1(&pkt, &subpkt) 385 || PACKET_remaining(&subpkt) != len 386 || !PACKET_get_net_2(&subpkt, &i) 387 || i != 0x0204 388 || PACKET_get_length_prefixed_1(&short_pkt, &subpkt) 389 || PACKET_remaining(&short_pkt) != len) { 390 fprintf(stderr, "test_PACKET_get_length_prefixed_1() failed\n"); 391 return 0; 392 } 393 394 return 1; 395 } 396 397 static int test_PACKET_get_length_prefixed_2() 398 { 399 unsigned char buf[1024]; 400 const size_t len = 516; /* 0x0204 */ 401 unsigned int i; 402 PACKET pkt, short_pkt, subpkt; 403 404 for (i = 1; i <= 1024; i++) { 405 buf[i-1] = (i * 2) & 0xff; 406 } 407 408 if ( !PACKET_buf_init(&pkt, buf, 1024) 409 || !PACKET_buf_init(&short_pkt, buf, len) 410 || !PACKET_get_length_prefixed_2(&pkt, &subpkt) 411 || PACKET_remaining(&subpkt) != len 412 || !PACKET_get_net_2(&subpkt, &i) 413 || i != 0x0608 414 || PACKET_get_length_prefixed_2(&short_pkt, &subpkt) 415 || PACKET_remaining(&short_pkt) != len) { 416 fprintf(stderr, "test_PACKET_get_length_prefixed_2() failed\n"); 417 return 0; 418 } 419 420 return 1; 421 } 422 423 static int test_PACKET_get_length_prefixed_3() 424 { 425 unsigned char buf[1024]; 426 const size_t len = 516; /* 0x000204 */ 427 unsigned int i; 428 PACKET pkt, short_pkt, subpkt; 429 430 for (i = 0; i < 1024; i++) { 431 buf[i] = (i * 2) & 0xff; 432 } 433 434 if ( !PACKET_buf_init(&pkt, buf, 1024) 435 || !PACKET_buf_init(&short_pkt, buf, len) 436 || !PACKET_get_length_prefixed_3(&pkt, &subpkt) 437 || PACKET_remaining(&subpkt) != len 438 || !PACKET_get_net_2(&subpkt, &i) 439 || i != 0x0608 440 || PACKET_get_length_prefixed_3(&short_pkt, &subpkt) 441 || PACKET_remaining(&short_pkt) != len) { 442 fprintf(stderr, "test_PACKET_get_length_prefixed_3() failed\n"); 443 return 0; 444 } 445 446 return 1; 447 } 448 449 static int test_PACKET_as_length_prefixed_1() 450 { 451 unsigned char buf[BUF_LEN]; 452 const size_t len = 16; 453 unsigned int i; 454 PACKET pkt, exact_pkt, subpkt; 455 456 buf[0] = len; 457 for (i = 1; i < BUF_LEN; i++) { 458 buf[i] = (i * 2) & 0xff; 459 } 460 461 if ( !PACKET_buf_init(&pkt, buf, BUF_LEN) 462 || !PACKET_buf_init(&exact_pkt, buf, len + 1) 463 || PACKET_as_length_prefixed_1(&pkt, &subpkt) 464 || PACKET_remaining(&pkt) != BUF_LEN 465 || !PACKET_as_length_prefixed_1(&exact_pkt, &subpkt) 466 || PACKET_remaining(&exact_pkt) != 0 467 || PACKET_remaining(&subpkt) != len) { 468 fprintf(stderr, "test_PACKET_as_length_prefixed_1() failed\n"); 469 return 0; 470 } 471 472 return 1; 473 } 474 475 static int test_PACKET_as_length_prefixed_2() 476 { 477 unsigned char buf[1024]; 478 const size_t len = 516; /* 0x0204 */ 479 unsigned int i; 480 PACKET pkt, exact_pkt, subpkt; 481 482 for (i = 1; i <= 1024; i++) { 483 buf[i-1] = (i * 2) & 0xff; 484 } 485 486 if ( !PACKET_buf_init(&pkt, buf, 1024) 487 || !PACKET_buf_init(&exact_pkt, buf, len + 2) 488 || PACKET_as_length_prefixed_2(&pkt, &subpkt) 489 || PACKET_remaining(&pkt) != 1024 490 || !PACKET_as_length_prefixed_2(&exact_pkt, &subpkt) 491 || PACKET_remaining(&exact_pkt) != 0 492 || PACKET_remaining(&subpkt) != len) { 493 fprintf(stderr, "test_PACKET_as_length_prefixed_2() failed\n"); 494 return 0; 495 } 496 497 return 1; 498 } 499 500 int main(int argc, char **argv) 501 { 502 unsigned char buf[BUF_LEN]; 503 unsigned int i; 504 505 for (i=1; i<=BUF_LEN; i++) { 506 buf[i-1] = (i * 2) & 0xff; 507 } 508 i = 0; 509 510 if ( !test_PACKET_buf_init() 511 || !test_PACKET_null_init() 512 || !test_PACKET_remaining(buf) 513 || !test_PACKET_end(buf) 514 || !test_PACKET_equal(buf) 515 || !test_PACKET_get_1(buf) 516 || !test_PACKET_get_4(buf) 517 || !test_PACKET_get_net_2(buf) 518 || !test_PACKET_get_net_3(buf) 519 || !test_PACKET_get_net_4(buf) 520 || !test_PACKET_get_sub_packet(buf) 521 || !test_PACKET_get_bytes(buf) 522 || !test_PACKET_copy_bytes(buf) 523 || !test_PACKET_copy_all(buf) 524 || !test_PACKET_memdup(buf) 525 || !test_PACKET_strndup() 526 || !test_PACKET_contains_zero_byte() 527 || !test_PACKET_forward(buf) 528 || !test_PACKET_get_length_prefixed_1() 529 || !test_PACKET_get_length_prefixed_2() 530 || !test_PACKET_get_length_prefixed_3() 531 || !test_PACKET_as_length_prefixed_1() 532 || !test_PACKET_as_length_prefixed_2()) { 533 return 1; 534 } 535 printf("PASS\n"); 536 return 0; 537 } 538