-
Notifications
You must be signed in to change notification settings - Fork 704
/
s2n_stuffer_base64_test.c
87 lines (70 loc) · 3.11 KB
/
s2n_stuffer_base64_test.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
#include <string.h>
#include "api/s2n.h"
#include "s2n_test.h"
#include "stuffer/s2n_stuffer.h"
#include "utils/s2n_random.h"
int main(int argc, char **argv)
{
char hello_world[] = "Hello world!";
uint8_t hello_world_base64[] = "SGVsbG8gd29ybGQhAA==";
struct s2n_stuffer stuffer = { 0 }, known_data = { 0 }, scratch = { 0 }, entropy = { 0 }, mirror = { 0 };
uint8_t pad[50];
struct s2n_blob r = { 0 };
EXPECT_SUCCESS(s2n_blob_init(&r, pad, sizeof(pad)));
BEGIN_TEST();
EXPECT_SUCCESS(s2n_disable_tls13_in_test());
/* Create a 100 byte stuffer */
EXPECT_SUCCESS(s2n_stuffer_alloc(&stuffer, 1000));
/* Write our known data */
EXPECT_SUCCESS(s2n_stuffer_alloc_ro_from_string(&known_data, hello_world));
EXPECT_SUCCESS(s2n_stuffer_write_base64(&stuffer, &known_data));
EXPECT_SUCCESS(s2n_stuffer_free(&known_data));
/* Check it against the known output */
EXPECT_EQUAL(memcmp(stuffer.blob.data, hello_world_base64, strlen((char *) hello_world)), 0);
/* Check that we can read it again */
EXPECT_SUCCESS(s2n_stuffer_alloc(&scratch, 50));
EXPECT_SUCCESS(s2n_stuffer_read_base64(&stuffer, &scratch));
EXPECT_SUCCESS(memcmp(scratch.blob.data, hello_world, strlen(hello_world)));
/* Now try with some randomly generated data. Make sure we try each boundary case,
* where size % 3 == 0, 1, 2
*/
EXPECT_SUCCESS(s2n_stuffer_alloc(&entropy, 50));
EXPECT_SUCCESS(s2n_stuffer_alloc(&mirror, 50));
for (size_t i = entropy.blob.size; i > 0; i--) {
EXPECT_SUCCESS(s2n_stuffer_wipe(&stuffer));
EXPECT_SUCCESS(s2n_stuffer_wipe(&entropy));
EXPECT_SUCCESS(s2n_stuffer_wipe(&mirror));
/* Get i bytes of random data */
r.size = i;
EXPECT_OK(s2n_get_public_random_data(&r));
EXPECT_SUCCESS(s2n_stuffer_write_bytes(&entropy, pad, i));
/* Write i bytes it, base64 encoded */
/* Read it back, decoded */
EXPECT_SUCCESS(s2n_stuffer_write_base64(&stuffer, &entropy));
/* Should be (i / 3) * 4 + a carry */
EXPECT_EQUAL((i / 3) * 4 + ((i % 3) ? 4 : 0), s2n_stuffer_data_available(&stuffer));
/* Read it back, decoded */
EXPECT_SUCCESS(s2n_stuffer_read_base64(&stuffer, &mirror));
/* Verify it's the same */
EXPECT_EQUAL(memcmp(mirror.blob.data, entropy.blob.data, i), 0);
}
EXPECT_SUCCESS(s2n_stuffer_free(&stuffer));
EXPECT_SUCCESS(s2n_stuffer_free(&scratch));
EXPECT_SUCCESS(s2n_stuffer_free(&mirror));
EXPECT_SUCCESS(s2n_stuffer_free(&entropy));
END_TEST();
}