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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
/*
* 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 "crypto/s2n_sequence.h"
#include "error/s2n_errno.h"
#include "s2n_test.h"
#include "testlib/s2n_testlib.h"
#include "tls/s2n_crypto.h"
int main(int argc, char **argv)
{
BEGIN_TEST();
EXPECT_SUCCESS(s2n_disable_tls13_in_test());
/* s2n_sequence_number_to_uint64 */
{
/* Converts zero */
{
uint64_t output = 1;
uint8_t data[S2N_TLS_SEQUENCE_NUM_LEN] = { 0 };
struct s2n_blob sequence_number = { 0 };
EXPECT_SUCCESS(s2n_blob_init(&sequence_number, data, S2N_TLS_SEQUENCE_NUM_LEN));
EXPECT_SUCCESS(s2n_sequence_number_to_uint64(&sequence_number, &output));
EXPECT_EQUAL(output, 0);
};
/* Converts one */
{
uint64_t output = 0;
uint8_t data[S2N_TLS_SEQUENCE_NUM_LEN] = { 0 };
data[S2N_TLS_SEQUENCE_NUM_LEN - 1] = 1;
struct s2n_blob sequence_number = { 0 };
EXPECT_SUCCESS(s2n_blob_init(&sequence_number, data, S2N_TLS_SEQUENCE_NUM_LEN));
EXPECT_SUCCESS(s2n_sequence_number_to_uint64(&sequence_number, &output));
EXPECT_EQUAL(output, 1);
};
/* Converts max possible sequence number */
{
uint64_t output = 0;
uint8_t data[S2N_TLS_SEQUENCE_NUM_LEN] = { 0 };
struct s2n_blob sequence_number = { 0 };
EXPECT_SUCCESS(s2n_blob_init(&sequence_number, data, S2N_TLS_SEQUENCE_NUM_LEN));
EXPECT_SUCCESS(s2n_blob_zero(&sequence_number));
for (size_t i = 0; i < S2N_TLS_SEQUENCE_NUM_LEN; i++) {
sequence_number.data[i] = UINT8_MAX;
}
EXPECT_SUCCESS(s2n_sequence_number_to_uint64(&sequence_number, &output));
EXPECT_EQUAL(output, 18446744073709551615U);
};
/* Converts max record number value */
{
uint64_t output = 0;
/* The maximum record number converted to base 256 */
uint8_t data[S2N_TLS_SEQUENCE_NUM_LEN] = { 0, 0, 0, 0, 1, 106, 9, 229 };
struct s2n_blob sequence_number = { 0 };
EXPECT_SUCCESS(s2n_blob_init(&sequence_number, data, S2N_TLS_SEQUENCE_NUM_LEN));
EXPECT_SUCCESS(s2n_sequence_number_to_uint64(&sequence_number, &output));
EXPECT_EQUAL(output, S2N_TLS13_AES_GCM_MAXIMUM_RECORD_NUMBER);
};
/* Matches network order stuffer methods */
{
uint64_t input = 0x1234ABCD;
/* Use stuffer to convert to network order */
uint8_t stuffer_bytes[S2N_TLS_SEQUENCE_NUM_LEN] = { 0 };
struct s2n_blob stuffer_blob = { 0 };
struct s2n_stuffer stuffer = { 0 };
EXPECT_SUCCESS(s2n_blob_init(&stuffer_blob, stuffer_bytes, sizeof(stuffer_bytes)));
EXPECT_SUCCESS(s2n_stuffer_init(&stuffer, &stuffer_blob));
EXPECT_SUCCESS(s2n_stuffer_write_uint64(&stuffer, input));
/* Use s2n_sequence_number_to_uint64 to convert back */
uint64_t output = 0;
EXPECT_SUCCESS(s2n_sequence_number_to_uint64(&stuffer_blob, &output));
EXPECT_EQUAL(input, output);
};
};
END_TEST();
}
|