static int test_PACKET_forward() { const unsigned char *byte; PACKET pkt; if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN)) || !TEST_true(PACKET_forward(&pkt, 1)) || !TEST_true(PACKET_get_bytes(&pkt, &byte, 1)) || !TEST_uchar_eq(byte[0], 4) || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 3)) || !TEST_true(PACKET_get_bytes(&pkt, &byte, 1)) || !TEST_uchar_eq(byte[0], 0xfe)) return 0; return 1; }
static int test_sec_mem_clear(void) { #if defined(OPENSSL_SYS_LINUX) || defined(OPENSSL_SYS_UNIX) const int size = 64; unsigned char *p = NULL; int i, res = 0; if (!TEST_true(CRYPTO_secure_malloc_init(4096, 32)) || !TEST_ptr(p = OPENSSL_secure_malloc(size))) goto err; for (i = 0; i < size; i++) if (!TEST_uchar_eq(p[i], 0)) goto err; for (i = 0; i < size; i++) p[i] = (unsigned char)(i + ' ' + 1); OPENSSL_secure_free(p); /* * A deliberate use after free here to verify that the memory has been * cleared properly. Since secure free doesn't return the memory to * libc's memory pool, it technically isn't freed. However, the header * bytes have to be skipped and these consist of two pointers in the * current implementation. */ for (i = sizeof(void *) * 2; i < size; i++) if (!TEST_uchar_eq(p[i], 0)) return 0; res = 1; p = NULL; err: OPENSSL_secure_free(p); CRYPTO_secure_malloc_done(); return res; #else return 1; #endif }
static int test_PACKET_copy_bytes() { unsigned char bytes[4]; PACKET pkt; if (!TEST_true(PACKET_buf_init(&pkt, smbuf, BUF_LEN)) || !TEST_true(PACKET_copy_bytes(&pkt, bytes, 4)) || !TEST_char_eq(bytes[0], 2) || !TEST_char_eq(bytes[1], 4) || !TEST_char_eq(bytes[2], 6) || !TEST_char_eq(bytes[3], 8) || !TEST_size_t_eq(PACKET_remaining(&pkt), BUF_LEN - 4) || !TEST_true(PACKET_forward(&pkt, BUF_LEN - 8)) || !TEST_true(PACKET_copy_bytes(&pkt, bytes, 4)) || !TEST_uchar_eq(bytes[0], 0xf8) || !TEST_uchar_eq(bytes[1], 0xfa) || !TEST_uchar_eq(bytes[2], 0xfc) || !TEST_uchar_eq(bytes[3], 0xfe) || !TEST_false(PACKET_remaining(&pkt))) return 0; return 1; }