From ce34d6d68a5592ada1176f95f958bd594e0a3d12 Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 07:01:08 -0500 Subject: [PATCH 01/18] #1 - Removed docs/gcrypt.pdf; --- docs/gcrypt.pdf | Bin 576953 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/gcrypt.pdf diff --git a/docs/gcrypt.pdf b/docs/gcrypt.pdf deleted file mode 100644 index 9bba6aa94bdcb58133fac86ba7758763816c5a3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 576953 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
  • VOXCr5tc}TO78tyDIB!$U@wL8owBxIM%3B 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

    G!2(Wl*OEmLH^BENpd9=gJ9d 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 d<4^WSu4^I?t? diff --git a/unit_test/ciphers/itc_cmac128_test.c b/unit_test/ciphers/itc_cmac128_test.c deleted file mode 100644 index 442b8a58..00000000 --- a/unit_test/ciphers/itc_cmac128_test.c +++ /dev/null @@ -1,403 +0,0 @@ -#include -#include -#include -#include -#include -#include "itc_cmac128.h" - -#define MAX_LINE_SIZE 2048 - -enum pass_fail -{ - FAIL, - PASS -}; - -struct cmac128_test_vector -{ - unsigned char key[16]; - size_t length; - unsigned char * message; - unsigned char tag[16]; - enum pass_fail tag_valid; -}; - -static void print_hex(const unsigned char * hex, size_t length) -{ - size_t i; - - for(i = 0; i < length; ++i) - { - printf("%02x ", hex[i]); - } - printf("\n"); -} - -//zero if equal -static int compare_hex(const unsigned char * hex1, const unsigned char * hex2, size_t length) -{ - size_t i; - - for(i = 0; i < length; ++i) - { - if(hex1[i] != hex2[i]) - return -1; - } - return 0; -} - -static void uninit_test_vector(struct cmac128_test_vector *tv) -{ - if(tv != NULL) - { - tv->length = 0; - if(tv->message != NULL) - { - free(tv->message); - tv->message = NULL; - } - } -} - -static int init_test_vector(struct cmac128_test_vector *tv, size_t length) -{ - assert(tv != NULL); - - tv->length = length; - tv->message = NULL; - - if(length > 0) - { - tv->message = malloc(length * sizeof(unsigned char)); - - if(tv->message == NULL) - { - uninit_test_vector(tv); - return -1; - } - } - - return 0; -} - -//Parses integer value of simple key/value pair. specifier should specify everything before the number. -// e.g., for line [Keylen = 128], to get 128 out, call as: parse_field(line, "[Keylen = ", val_out); -static int parse_field(const char *line, const char * specifier, long int * value) -{ - const char * match; - - match = strstr(line, specifier); - - if(match != NULL) //found match! - { - //match points to start of matching string - add strlen of specifier to get start of num - long int tempValue = strtol(match + strlen(specifier), NULL, 10); - - //not really any point in checking for the error values of strtol... - *value = tempValue; - return 0; - } - else - { - return -1; - } -} - -//parses string of hex until a NULL character is found. Returns number of unsigned char's parsed. -// max specifies maximum number of unsigned chars that can be placed in output -static int parse_hex(const char *hex_string, const char * specifier, unsigned char * output, int max) -{ - assert(hex_string != NULL); - - const char *string; - int index = 0; - int bytes_parsed = 0; - unsigned int temp; - - if(specifier != NULL) - { - const char * match = strstr(hex_string, specifier); - if(match == NULL) - return 0; - - string = match + strlen(specifier); - } - else - { - string = hex_string; - } - - while(bytes_parsed <= max) - { - if(string[index] == '\0' || string[index] == '\n') - break; - if(string[index+1] == '\0' || string[index+1] == '\n') - break; - - if(sscanf(string+index, "%2x", &temp) != 1) - { - printf("failed to parse a byte from hex string.\n"); - break; - } - else - { - output[bytes_parsed] = (unsigned char)temp; - ++bytes_parsed; - index += 2; - } - } - - return bytes_parsed; -} - -static int get_next_test(FILE *fp, struct cmac128_test_vector *tv) -{ - char tempLine[MAX_LINE_SIZE]; - int returnCode = -1; // default value (failed) - long int count, keyLength, msgLength, tagLength; - - while(feof(fp) == 0) - { - if(fgets(tempLine, MAX_LINE_SIZE, fp) == tempLine) - { - - if(parse_field(tempLine, "Count = ", &count)) - { - // didn't find, keep looking. - continue; - } - - // Key Length - if(fgets(tempLine, MAX_LINE_SIZE, fp) != tempLine) - { - printf("could not read Key length line\n"); - break; - } - - if(parse_field(tempLine, "Klen = ", &keyLength)) - { - printf("Could not parse key length\n"); - break; - } - - if(keyLength != 16) - { - printf("Key length is incorrect.\n"); - break; - } - - // Message Length - if(fgets(tempLine, MAX_LINE_SIZE, fp) != tempLine) - { - printf("could not read message length line\n"); - break; - } - - if(parse_field(tempLine, "Mlen = ", &msgLength)) - { - printf("Could not parse message length\n"); - break; - } - - // Tag Length - if(fgets(tempLine, MAX_LINE_SIZE, fp) != tempLine) - { - printf("could not read tag length line\n"); - break; - } - - if(parse_field(tempLine, "Tlen = ", &tagLength)) - { - printf("Could not parse tag length\n"); - break; - } - - if(tagLength != 16) - { - printf("Tag length is incorrect.\n"); - break; - } - - // initialize test vector - if(init_test_vector(tv, msgLength)) - { - printf("Could not initialize test struct\n"); - break; - } - - // Key - if(fgets(tempLine, MAX_LINE_SIZE, fp) != tempLine) - { - printf("could not read Key line\n"); - break; - } - - if(parse_hex(tempLine, "Key = ", tv->key, sizeof(tv->key)) != sizeof(tv->key)) - { - printf("could not parse key\n"); - break; - } - - // Message - if(fgets(tempLine, MAX_LINE_SIZE, fp) != tempLine) - { - printf("could not read Message line\n"); - break; - } - - if(tv->length > 0) - { - if((int) parse_hex(tempLine, "Msg = ", tv->message, tv->length) != (int) tv->length) - { - printf("could not parse message\n"); - break; - } - } - - // Mac - if(fgets(tempLine, MAX_LINE_SIZE, fp) != tempLine) - { - printf("could not read Mac line\n"); - break; - } - - if(parse_hex(tempLine, "Mac = ", tv->tag, sizeof(tv->tag)) != sizeof(tv->tag)) - { - printf("could not parse tag\n"); - break; - } - - // Result - if(fgets(tempLine, MAX_LINE_SIZE, fp) != tempLine) - { - printf("could not read Result line\n"); - break; - } - - if(strncmp("Result = F", tempLine, 10) == 0) - { - tv->tag_valid = FAIL; - } - else if(strncmp("Result = P", tempLine, 10) == 0) - { - tv->tag_valid = PASS; - } - else - { - printf("Could not parse Result line\n"); - break; - } - - returnCode = 0; - break; - } - } - - return returnCode; -} - -static int run_mac_validation_test(struct cmac128_test_vector * tv) -{ - struct itc_cmac128_context ctx; - unsigned char temp_tag[16]; - int err; - - itc_cmac128_init(&ctx, tv->key); - - err = itc_cmac128_generate_tag(&ctx, tv->length, tv->message, temp_tag); - - if(err != ITC_CMAC128_SUCCESS) - { - printf("Call to itc_cmac128_generate_tag() failed.\n\n"); - return -1; - } - - err = compare_hex(tv->tag, temp_tag, sizeof(tv->tag)); - - printf("Provided Tag: "); - print_hex(tv->tag, sizeof(tv->tag)); - printf("Computed Tag: "); - print_hex(temp_tag, sizeof(temp_tag)); - printf("Expected Result: Tag %s\n", tv->tag_valid == PASS ? "Passed" : "Failed" ); - printf("Actual Result: Tag %s\n", err == 0 ? "Passed" : "Failed"); - - if(tv->tag_valid == PASS && err != 0) - { - printf("Test FAILED! Tag should have been valid but was rejected.\n\n"); - return -1; - } - else if(tv->tag_valid == FAIL && err == 0) - { - printf("Test FAILED! Tag should have been rejected but was passed.\n\n"); - return -1; - } - else - { - printf("Test PASSED!\n\n"); - return 0; - } -} - -static void run_tests(const char *filepath) -{ - FILE *fp; - int err, result; - int testsPassed = 0, testsFailed = 0; - struct cmac128_test_vector test; - - assert(filepath != NULL); - - fp = fopen(filepath, "r"); - - if(fp == NULL) - { - perror("Could not open file"); - goto exit; - } - - init_test_vector(&test, 0); - - while( (feof(fp) == 0) ) - { - uninit_test_vector(&test); - err = get_next_test(fp, &test); - - if(err) - { - printf("Could not parse test. Checking for another next one...\n"); - } - else - { - //Run test! - printf("\nRunning test %d...\n", testsFailed + testsPassed + 1); - - result = run_mac_validation_test(&test); - - if(result) - ++testsFailed; - else - ++testsPassed; - } - } - - printf("Finished running tests. %d/%d cases passed.\n", testsPassed, testsPassed+testsFailed); - - exit: - uninit_test_vector(&test); - if(fp != NULL) - fclose(fp); -} - - -int main(int argc, char * argv[]) -{ - if(argc < 2) - { - printf("Missing arguments. usage:\n\t%s \n", argv[0]); - return -1; - } - - run_tests(argv[1]); - - return 0; -} \ No newline at end of file diff --git a/unit_test/ciphers/itc_gcm128_test b/unit_test/ciphers/itc_gcm128_test deleted file mode 100644 index 2d2274fc9ea5e19a71f7dfb37dfeabce984032fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32488 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 PfxvZ;CMVrxuK&LQFKDYk diff --git a/unit_test/ciphers/itc_gcm128_test.c b/unit_test/ciphers/itc_gcm128_test.c deleted file mode 100644 index 090e6e4a..00000000 --- a/unit_test/ciphers/itc_gcm128_test.c +++ /dev/null @@ -1,701 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "itc_gcm128.h" - -#define MAX_LINE_SIZE 2048 // Max line size. If it is longer in a file, bad things will happen. - -// todo: API tests (check error returns for bad input) -// todo: decryption tests - -enum pass_fail -{ - FAIL, - PASS -}; - -enum test_mode -{ - ENCRYPT, - DECRYPT -}; - -struct gcm128_test_vector -{ - unsigned char key[16]; - unsigned char iv[12]; - size_t aad_length; - unsigned char * aad; - size_t data_length; - unsigned char * plaintext; - unsigned char * ciphertext; - unsigned char tag[16]; - enum pass_fail tag_valid; -}; - -// releases any memory that was allocated for aad/plaintext/ciphertext. does not free struct itself. -static void uninit_test_vector(struct gcm128_test_vector *tv) -{ - if(tv != NULL) - { - tv->aad_length = 0; - tv->data_length = 0; - - if(tv->aad != NULL) - { - free(tv->aad); - tv->aad = NULL; - } - if(tv->plaintext != NULL) - { - free(tv->plaintext); - tv->plaintext = NULL; - - } - if(tv->ciphertext != NULL) - { - free(tv->ciphertext); - tv->ciphertext = NULL; - } - } -} - -// allocates space for aad/plaintext/ciphertext -static int init_test_vector(struct gcm128_test_vector *tv, size_t aad_length, size_t data_length) -{ - assert(tv != NULL); - - tv->aad_length = aad_length; - tv->data_length = data_length; - tv->aad = NULL; - tv->plaintext = NULL; - tv->ciphertext = NULL; - - if(aad_length > 0) - { - tv->aad = malloc(aad_length * sizeof(unsigned char)); - } - - if(data_length > 0) - { - tv->plaintext = malloc(data_length * sizeof(unsigned char)); - tv->ciphertext = malloc(data_length * sizeof(unsigned char)); - } - - if( (aad_length > 0 && tv->aad == NULL) || - (data_length > 0 && (tv->plaintext == NULL || tv->ciphertext == NULL)) ) - { - uninit_test_vector(tv); - return -1; - } - else - { - return 0; - } - -} - -static void print_hex(const unsigned char * hex, size_t length) -{ - size_t i; - - for(i = 0; i < length; ++i) - { - printf("%02x ", hex[i]); - } - printf("\n"); -} - -//zero if equal -static int compare_hex(const unsigned char * hex1, const unsigned char * hex2, size_t length) -{ - size_t i; - - for(i = 0; i < length; ++i) - { - if(hex1[i] != hex2[i]) - return -1; - } - return 0; -} - -//Parses integer value of simple key/value pair. specifier should specify everything before the number. -// e.g., for line [Keylen = 128], to get 128 out, call as: parse_field(line, "[Keylen = ", val_out); -static int parse_field(const char *line, const char * specifier, long int * value) -{ - const char * match; - - match = strstr(line, specifier); - - if(match != NULL) //found match! - { - //match points to start of matching string - add strlen of specifier to get start of num - long int tempValue = strtol(match + strlen(specifier), NULL, 10); - - //not really any point in checking for the error values of strtol... - *value = tempValue; - return 0; - } - else - { - return -1; - } -} - -//parses string of hex until a NULL character is found. Returns number of unsigned char's parsed. -// max specifies maximum number of unsigned chars that can be placed in output -static int parse_hex(const char *hex_string, const char * specifier, unsigned char * output, int max) -{ - assert(hex_string != NULL); - - const char *string; - int index = 0; - int bytes_parsed = 0; - unsigned int temp; - - if(specifier != NULL) - { - const char * match = strstr(hex_string, specifier); - if(match == NULL) - return 0; - - string = match + strlen(specifier); - } - else - { - string = hex_string; - } - - //short-circuit evaluation should prevent out-of-bounds access on [index+1] - while(bytes_parsed <= max) - { - if(string[index] == '\0' || string[index] == '\n') - break; - if(string[index+1] == '\0' || string[index+1] == '\n') - break; - - if(sscanf(string+index, "%2x", &temp) != 1) - { - printf("failed to parse a byte from hex string.\n"); - break; - } - else - { - output[bytes_parsed] = (unsigned char)temp; - ++bytes_parsed; - index += 2; - } - } - - return bytes_parsed; -} - -// Reads the file stream to parse the header info. -static int parse_test_header(FILE *fp, long int * keylen, long int * ivlen, long int * ptlen, long int * aadlen, long int * taglen) -{ - char tempLine[MAX_LINE_SIZE]; - int returnVal = -1; // default value (failed) - - //read until find a line that starts "[Keylen = " - while(feof(fp) == 0) - { - if(fgets(tempLine, MAX_LINE_SIZE, fp) == tempLine) - { - //is line a match for Keylen? - if(parse_field(tempLine, "[Keylen = ", keylen)) - { - // didn't find, keep looking. - continue; - } - else - { - // woohoo! found they key length! find the other fields - if(fgets(tempLine, MAX_LINE_SIZE, fp) == tempLine) // IVlen line - { - if(parse_field(tempLine, "[IVlen = ", ivlen)) - break; - } - else - { - break; - } - - if(fgets(tempLine, MAX_LINE_SIZE, fp) == tempLine) // PTlen line - { - if(parse_field(tempLine, "[PTlen = ", ptlen)) - break; - } - else - { - break; - } - - if(fgets(tempLine, MAX_LINE_SIZE, fp) == tempLine) // AADlen line - { - if(parse_field(tempLine, "[AADlen = ", aadlen)) - break; - } - else - { - break; - } - - if(fgets(tempLine, MAX_LINE_SIZE, fp) == tempLine) // Taglen line - { - if(parse_field(tempLine, "[Taglen = ", taglen)) - break; - } - else - { - break; - } - - returnVal = 0; - break; - } - } - else - { - // error reading from file (EOF or other issue) - break; - } - } - - return returnVal; -} - -// reads from current location in file stream and tries to find the next test. Return 0 if success. -static int get_next_test(FILE *fp, struct gcm128_test_vector *tv, enum test_mode mode) -{ - char tempLine[MAX_LINE_SIZE]; - int returnCode = -1; // default value (failed) - long int count; - - //then read the next 6 lines to get Key, IV, PT, AAD, CT, and Tag - - while(feof(fp) == 0) - { - if(fgets(tempLine, MAX_LINE_SIZE, fp) == tempLine) - { - if(parse_field(tempLine, "Count = ", &count)) - { - // didn't find, keep looking. - continue; - } - - // Key - if(fgets(tempLine, MAX_LINE_SIZE, fp) != tempLine) - { - printf("could not read Key line\n"); - break; - } - - if(parse_hex(tempLine, "Key = ", tv->key, sizeof(tv->key)) != sizeof(tv->key)) - { - printf("could not parse key\n"); - break; - } - - // IV - if(fgets(tempLine, MAX_LINE_SIZE, fp) != tempLine) - { - printf("could not read IV line\n"); - break; - } - - if(parse_hex(tempLine, "IV = ", tv->iv, sizeof(tv->iv)) != sizeof(tv->iv)) - { - printf("could not parse IV\n"); - break; - } - - // PT or CT - if(fgets(tempLine, MAX_LINE_SIZE, fp) != tempLine) - { - printf("could not read %s line\n", mode == ENCRYPT ? "PT" : "CT"); - break; - } - - if(tv->data_length > 0) - { - if(mode == ENCRYPT) - { - if((int) parse_hex(tempLine, "PT = ", tv->plaintext, tv->data_length) != (int) tv->data_length) - { - printf("could not parse PT\n"); - break; - } - } - else - { - if((int) parse_hex(tempLine, "CT = ", tv->ciphertext, tv->data_length) != (int) tv->data_length) - { - printf("could not parse CT\n"); - break; - } - } - } - - // AAD - if(fgets(tempLine, MAX_LINE_SIZE, fp) != tempLine) - { - printf("could not read AAD line\n"); - break; - } - - if(tv->aad_length > 0) - { - if((int) parse_hex(tempLine, "AAD = ", tv->aad, tv->aad_length) != (int) tv->aad_length) - { - printf("could not parse AAD\n"); - break; - } - } - - // CT - if(mode == ENCRYPT) - { - if(fgets(tempLine, MAX_LINE_SIZE, fp) != tempLine) - { - printf("could not read CT line\n"); - break; - } - - if(tv->data_length > 0) - { - if((int) parse_hex(tempLine, "CT = ", tv->ciphertext, tv->data_length) != (int) tv->data_length) - { - printf("could not parse CT\n"); - break; - } - } - } - - // Tag - if(fgets(tempLine, MAX_LINE_SIZE, fp) != tempLine) - { - printf("could not read Tag line\n"); - break; - } - - if((int) parse_hex(tempLine, "Tag = ", tv->tag, sizeof(tv->tag)) != (int) sizeof(tv->tag)) - { - printf("could not parse Tag\n"); - break; - } - - //FAIL or plaintext if decrypt mode - if(mode == DECRYPT) - { - if(fgets(tempLine, MAX_LINE_SIZE, fp) != tempLine) - { - printf("could not read FAIL/PT line\n"); - break; - } - - if(strncmp("FAIL", tempLine, 4) == 0) - { - tv->tag_valid = FAIL; - } - else - { - tv->tag_valid = PASS; - if(tv->data_length > 0) - { - if((int) parse_hex(tempLine, "PT = ", tv->plaintext, tv->data_length) != (int) tv->data_length) - { - printf("could not parse PT\n"); - break; - } - } - } - } - - returnCode = 0; - break; - } - } - - return returnCode; -} - -static int run_encryption_test(struct gcm128_test_vector *tv) -{ - struct itc_gcm128_context ctx; - unsigned char tag[16]; - int err, returnCode = -1; - - unsigned char * computed_ciphertext = NULL; - - itc_gcm128_init(&ctx, tv->key); - - err = itc_gcm128_encrypt_start(&ctx, tv->iv, tv->aad_length, tv->aad); - if(err != ITC_GCM128_SUCCESS) - { - printf("Error during call to itc_gcm128_encrypt_start()\n"); - returnCode = -1; - goto exit; - } - - if(tv->data_length > 0) - { - computed_ciphertext = malloc(tv->data_length * sizeof(unsigned char)); - if(computed_ciphertext == NULL) - { - printf("Could not allocate memory to store ciphertext.\n"); - returnCode = -1; - goto exit; - } - } - err = itc_gcm128_encrypt_update(&ctx, tv->data_length, tv->plaintext, computed_ciphertext); - if(err != ITC_GCM128_SUCCESS) - { - printf("Error during call to itc_gcm128_encrypt_update()\n"); - returnCode = -1; - goto exit; - } - - err = itc_gcm128_encrypt_finish(&ctx, tag); - if(err != ITC_GCM128_SUCCESS) - { - printf("Error during call to itc_gcm128_encrypt_finish()\n"); - returnCode = -1; - goto exit; - } - - //compare tags - printf("Expected tag: "); - print_hex(tv->tag, 16); - printf("Computed tag: "); - print_hex(tag, 16); - - if(compare_hex(tv->tag, tag, sizeof(tag))) - { - printf("Test FAILED! Tag does not match.\n"); - returnCode = -1; - goto exit; - } - - //compare plaintext/ciphertext - if(tv->data_length > 0) - { - printf("Plaintext: "); - print_hex(tv->plaintext, tv->data_length); - printf("Expected Ciphertext: "); - print_hex(tv->ciphertext, tv->data_length); - printf("Computed Ciphertext: "); - print_hex(computed_ciphertext, tv->data_length); - - if(compare_hex(tv->ciphertext, computed_ciphertext, tv->data_length)) - { - printf("Test FAILED! ciphertext does not match.\n"); - returnCode = -1; - goto exit; - } - } - - printf("Test PASSED!\n\n"); - returnCode = 0; - -exit: - if(computed_ciphertext != NULL) - free(computed_ciphertext); - return returnCode; - -} - -static int run_decryption_test(struct gcm128_test_vector *tv) -{ - struct itc_gcm128_context ctx; - int err, returnCode = -1; - - unsigned char * computed_plaintext = NULL; - - itc_gcm128_init(&ctx, tv->key); - - err = itc_gcm128_decrypt_start(&ctx, tv->iv, tv->aad_length, tv->aad); - if(err != ITC_GCM128_SUCCESS) - { - printf("Error during call to itc_gcm128_decrypt_start()\n"); - returnCode = -1; - goto exit; - } - - if(tv->data_length > 0) - { - computed_plaintext = malloc(tv->data_length * sizeof(unsigned char)); - if(computed_plaintext == NULL) - { - printf("Could not allocate memory to store plaintext.\n"); - returnCode = -1; - goto exit; - } - } - err = itc_gcm128_decrypt_update(&ctx, tv->data_length, tv->ciphertext, computed_plaintext); - if(err != ITC_GCM128_SUCCESS) - { - printf("Error during call to itc_gcm128_decrypt_update()\n"); - returnCode = -1; - goto exit; - } - - err = itc_gcm128_decrypt_finish(&ctx, tv->tag); - - printf("Expected result: Tag %s\n", tv->tag_valid == PASS ? "Passed" : "Failed"); - printf("Actual result: Tag %s\n", err == ITC_GCM128_SUCCESS ? "Passed" : "Failed"); - - // err should either be success if tag matched, or bad_tag if not - if(err == ITC_GCM128_SUCCESS && tv->tag_valid == FAIL) - { - printf("Test FAILED! Tag should have been invalid but was accepted.\n"); - returnCode = -1; - goto exit; - } - if(err == ITC_GCM128_BAD_TAG && tv->tag_valid == PASS) - { - printf("Test FAILED! Tag should have been valid but was rejected.\n"); - returnCode = -1; - goto exit; - } - - // if tag_valid == PASS && err == SUCCESS, or tag_valid == FAIL && err == BAD_TAG, continue... - - //compare plaintext/ciphertext (only if it was supposed to pass) - if(tv->tag_valid == PASS && tv->data_length > 0) - { - printf("Ciphertext: "); - print_hex(tv->ciphertext, tv->data_length); - printf("Expected Plaintext: "); - print_hex(tv->plaintext, tv->data_length); - printf("Computed Plaintext: "); - print_hex(computed_plaintext, tv->data_length); - - if(compare_hex(tv->plaintext, computed_plaintext, tv->data_length)) - { - printf("Test FAILED! plaintext does not match.\n"); - returnCode = -1; - goto exit; - } - } - - printf("Test PASSED!\n\n"); - returnCode = 0; - -exit: - if(computed_plaintext != NULL) - free(computed_plaintext); - return returnCode; -} - - -/* Runs encryption tests from file. Files must be extremely well-formed, parser is very brittle. - * - * \param filepath file path -*/ -static void run_tests(const char *filepath, enum test_mode mode) -{ - FILE *fp; - int err, result = -1; - struct gcm128_test_vector test; - int testsPassed = 0, testsFailed = 0; - - assert(filepath != NULL); - - fp = fopen(filepath, "r"); - - if(fp == NULL) - { - perror("Could not open file"); - goto exit; - } - - long int keyLength, ivLength, ptLength, aadLength, tagLength; - - err = parse_test_header(fp, &keyLength, &ivLength, &ptLength, &aadLength, &tagLength); - if(err) - { - printf("error parsing header.\n"); - goto exit; - } - - printf("Test attributes for file %s:\n\tKey Length: %ld\n\tIV Length: %ld\n\tPT Length: %ld\n\tAAD Length: %ld\n\tTag Length: %ld\n", - filepath, keyLength, ivLength, ptLength, aadLength, tagLength); - - if(keyLength != 128 || ivLength != 96 || tagLength != 128) - { - printf("Test attributes not valid. Ignoring file.\n"); - goto exit; - } - - //divide by 8 to get length in bytes - if(init_test_vector(&test, aadLength/8, ptLength/8)) - { - printf("Could not initialized test struct\n"); - goto exit; - } - - while( (feof(fp) == 0) ) - { - err = get_next_test(fp, &test, mode); - - if(err) - { - printf("Could not parse test. Checking for another next one...\n"); - } - else - { - //Run test! - printf("\nRunning test %d...\n", testsFailed + testsPassed + 1); - - if(mode == ENCRYPT) - { - result = run_encryption_test(&test); - } - else - { - result = run_decryption_test(&test); - } - - if(result) - ++testsFailed; - else - ++testsPassed; - } - } - - printf("Finished running tests. %d/%d cases passed.\n", testsPassed, testsPassed+testsFailed); - -exit: - uninit_test_vector(&test); - if(fp != NULL) - fclose(fp); -} - -int main(int argc, char* argv[]) -{ - if(argc < 3) - { - printf("Missing arguments. usage:\n\t%s <-e|-d> \n", argv[0]); - return -1; - } - - //check arg 1 for encrypt or decrypt - if(strncmp("-e", argv[1], 2) == 0) - { - run_tests(argv[2], ENCRYPT); - } - else if(strncmp("-d", argv[1], 2) == 0) - { - run_tests(argv[2], DECRYPT); - } - else - { - printf("Unexpected value for mode. Must be -e for an encryption test or -d for decryption test\n"); - return -1; - } - - return 0; -} \ No newline at end of file From a407ed31131d264c610e6d2f799e47341a984dc3 Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 07:16:24 -0500 Subject: [PATCH 04/18] #1 - Renamed unit_test to test and included python script; --- fsw/20190717_tm_testing.txt | 9 -- fsw/crypto_util/app/et_dt_validation.c | 2 +- .../crypto_util}/encryption_test.py | 0 fsw/for_build/Makefile | 125 ------------------ {unit_test => test}/crypto_test.py | 0 {unit_test => test}/sdls_ep_interop/tc4.txt | 0 {unit_test => test}/sdls_ep_interop/tc5.txt | 0 {unit_test => test}/sdls_ep_interop/tc6.txt | 0 unit_test/Makefile | 26 ---- 9 files changed, 1 insertion(+), 161 deletions(-) delete mode 100644 fsw/20190717_tm_testing.txt rename {python => fsw/crypto_util}/encryption_test.py (100%) delete mode 100644 fsw/for_build/Makefile rename {unit_test => test}/crypto_test.py (100%) rename {unit_test => test}/sdls_ep_interop/tc4.txt (100%) rename {unit_test => test}/sdls_ep_interop/tc5.txt (100%) rename {unit_test => test}/sdls_ep_interop/tc6.txt (100%) delete mode 100644 unit_test/Makefile diff --git a/fsw/20190717_tm_testing.txt b/fsw/20190717_tm_testing.txt deleted file mode 100644 index c3ee9b98..00000000 --- a/fsw/20190717_tm_testing.txt +++ /dev/null @@ -1,9 +0,0 @@ -nasa@ccsds-nasa:~/cFS_SDLS/support$ python TO_SLE_Link.py -ready for data... - -Length = "1145" -sent: 0x"7f04000056000000000f0031020218000001001a0080ffff0004b10000404307ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff00000039000000000000000000000000000000000000000000000000010000009d6d" to STS_SLE - -Length = "1145" -sent: 0x"7f04000056000000000f0031030318220001001a000000000000000000000000000000000000000000000000000000000000000000000080ffff0004b10000404307ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff000000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ff00000039000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000100d955" to STS_SLE - diff --git a/fsw/crypto_util/app/et_dt_validation.c b/fsw/crypto_util/app/et_dt_validation.c index 0757f46d..44e38e6a 100644 --- a/fsw/crypto_util/app/et_dt_validation.c +++ b/fsw/crypto_util/app/et_dt_validation.c @@ -61,7 +61,7 @@ int EndPython() void python_auth_encryption(char* data, char* key, char* iv, char* header, char* bitmask, uint8** expected, long* expected_length) { Py_Initialize(); - PyRun_SimpleString("import sys\nsys.path.append('../../python')"); + PyRun_SimpleString("import sys\nsys.path.append('../../test')"); pName = PyUnicode_FromString("encryption_test"); pModule = PyImport_Import(pName); diff --git a/python/encryption_test.py b/fsw/crypto_util/encryption_test.py similarity index 100% rename from python/encryption_test.py rename to fsw/crypto_util/encryption_test.py diff --git a/fsw/for_build/Makefile b/fsw/for_build/Makefile deleted file mode 100644 index 72ec052c..00000000 --- a/fsw/for_build/Makefile +++ /dev/null @@ -1,125 +0,0 @@ -# Copyright (C) 2009 - 2017 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. -# -# This software is provided "as is" without any warranty of any, kind either express, implied, or statutory, including, but not -# limited to, any warranty that the software will conform to, specifications any implied warranties of merchantability, fitness -# for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or -# any warranty that the software will be error free. -# -# In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, -# arising out of, resulting from, or in any way connected with the software or its documentation. Whether or not based upon warranty, -# contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, -# documentation or services provided hereunder -# -# ITC Team -# NASA IV&V -# ivv-itc@lists.nasa.gov - -############################################################################### -# File: CFS Application Makefile -############################################################################### -# -# Subsystem produced by this makefile. -# -APPTARGET = crypto - -# -# Entry Point for task -# -ENTRY_PT = crypto_Init - -# -# Object files required to build subsystem. -# -OBJS = itc_aes128.o -OBJS += itc_gcm128.o -OBJS += itc_cmac128.o -OBJS += crypto.o -OBJS += crypto_print.o - -# -# Source files required to build subsystem; used to generate dependencies. -# As long as there are no assembly files this can be automated. -# -SOURCES = $(OBJS:.o=.c) - - -## -## Specify extra C Flags needed to build this subsystem -## -LOCAL_COPTS = -Wfatal-errors -Werror -Wall -Wextra -Wstrict-prototypes - - -## -## EXEDIR is defined here, just in case it needs to be different for a custom -## build -## -EXEDIR=../exe - -## -## Certain OSs and Application Loaders require the following option for -## Shared libraries. Currently only needed for vxWorks 5.5 and RTEMS. -## For each shared library that this app depends on, you need to have an -## entry like the following: -## -R../tst_lib/tst_lib.elf -## -SHARED_LIB_LINK = -lgcrypt - -######################################################################## -# Should not have to change below this line, except for customized -# Mission and cFE directory structures -######################################################################## - -# -# Set build type to CFE_APP. This allows us to -# define different compiler flags for the cFE Core and Apps. -# -BUILD_TYPE = CFE_APP - -## -## Include all necessary cFE make rules -## Any of these can be copied to a local file and -## changed if needed. -## -## -## cfe-config.mak contains PSP and OS selection -## -include ../cfe/cfe-config.mak -## -## debug-opts.mak contains debug switches -## -include ../cfe/debug-opts.mak -## -## compiler-opts.mak contains compiler definitions and switches/defines -## -include $(CFE_PSP_SRC)/$(PSP)/make/compiler-opts.mak - -## -## Setup the include path for this subsystem -## The OS specific includes are in the build-rules.make file -## -## If this subsystem needs include files from another app, add the path here. -## -INCLUDE_PATH = \ --I$(OSAL_SRC)/inc \ --I$(CFE_CORE_SRC)/inc \ --I$(CFE_PSP_SRC)/inc \ --I$(CFE_PSP_SRC)/$(PSP)/inc \ --I$(CFS_APP_SRC)/inc \ --I$(CFS_APP_SRC)/$(APPTARGET)/fsw/src \ --I$(CFS_MISSION_INC) \ --I../cfe/inc \ --I../inc - -## -## Define the VPATH make variable. -## This can be modified to include source from another directory. -## If there is no corresponding app in the cfs-apps directory, then this can be discarded, or -## if the mission chooses to put the src in another directory such as "src", then that can be -## added here as well. -## -VPATH = $(CFS_APP_SRC)/$(APPTARGET)/fsw/src - -## -## Include the common make rules for building a cFE Application -## -include $(CFE_CORE_SRC)/make/app-rules.mak diff --git a/unit_test/crypto_test.py b/test/crypto_test.py similarity index 100% rename from unit_test/crypto_test.py rename to test/crypto_test.py diff --git a/unit_test/sdls_ep_interop/tc4.txt b/test/sdls_ep_interop/tc4.txt similarity index 100% rename from unit_test/sdls_ep_interop/tc4.txt rename to test/sdls_ep_interop/tc4.txt diff --git a/unit_test/sdls_ep_interop/tc5.txt b/test/sdls_ep_interop/tc5.txt similarity index 100% rename from unit_test/sdls_ep_interop/tc5.txt rename to test/sdls_ep_interop/tc5.txt diff --git a/unit_test/sdls_ep_interop/tc6.txt b/test/sdls_ep_interop/tc6.txt similarity index 100% rename from unit_test/sdls_ep_interop/tc6.txt rename to test/sdls_ep_interop/tc6.txt diff --git a/unit_test/Makefile b/unit_test/Makefile deleted file mode 100644 index b2d9c266..00000000 --- a/unit_test/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -OBJECTS := sdls_ep_interop_test.o - -CFLAGS = \ --I../fsw/public_inc/ \ --I../cfe/inc \ --I../../../osal/src/os/inc/ - -VPATH = ../fsw/src ../fsw/public_inc - -.PHONY: clean - -all : clean sdls_ep_interop_test lib_crypto.a - -sdls_ep_interop : sdls_ep_interop_test.o - gcc sdls_ep_interop_test.o -o sdls_ep_interop - -lib_crypto.a : sdls_ep_interop_test.o - ar -crsv $@ sdls_ep_interop_test.o - -%.o : %.c - cc -c $(CFLAGS) $< -o $@ - - - -clean : - -rm $(OBJECTS) sdls_ep_interop_test lib_crypto.a \ No newline at end of file From efb1b67493ce287a9200831d8b690bbae099da08 Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 07:21:21 -0500 Subject: [PATCH 05/18] #1 - Renamed fsw to be src and public_inc to be include; --- CMakeLists.txt | 4 ++-- fsw/crypto_tests/data/tc4.1.dat | Bin 161 -> 0 bytes fsw/crypto_tests/data/tc5.1.dat | Bin 49 -> 0 bytes fsw/crypto_tests/data/tc5.2.dat | Bin 35 -> 0 bytes fsw/crypto_tests/data/tc5.3.dat | Bin 56 -> 0 bytes {fsw/public_inc => include}/cfe_minimum.h | 0 .../public_inc => include}/common_types_minimum.h | 0 {fsw/public_inc => include}/crypto.h | 0 {fsw/public_inc => include}/crypto_config.h | 0 .../crypto_config_structs.h | 0 {fsw/public_inc => include}/crypto_error.h | 0 {fsw/public_inc => include}/crypto_events.h | 0 {fsw/public_inc => include}/crypto_print.h | 0 {fsw/public_inc => include}/crypto_structs.h | 0 .../itc_common_types_minimum.h | 0 {fsw/public_inc => include}/osapi_minimum.h | 0 {fsw/public_inc => include}/sadb_mariadb_error.h | 0 {fsw/public_inc => include}/sadb_routine.h | 0 {fsw => src}/CMakeLists.txt | 4 ++-- .../sadb_mariadb_admin_scripts/create_sadb.sql | 0 ...e_sadb_jpl_unit_test_security_associations.sql | 0 ...reate_sadb_unit_test_security_associations.sql | 0 .../create_sadb_user_grant_permissions.sql | 0 .../sadb_mariadb_admin_scripts/delete_sadb.sql | 0 {fsw => src}/crypto_tests/CMakeLists.txt | 0 {fsw => src}/crypto_util/CMakeLists.txt | 0 {fsw => src}/crypto_util/app/apply_security.c | 0 {fsw => src}/crypto_util/app/crypto_sequence.c | 0 {fsw => src}/crypto_util/app/et_dt_validation.c | 0 {fsw => src}/crypto_util/app/process_security.c | 0 {fsw => src}/crypto_util/app/ut_tc_apply.c | 0 {fsw => src}/crypto_util/encryption_test.py | 0 {fsw => src}/crypto_util/include/apply_security.h | 0 .../crypto_util/include/crypto_sequence.h | 0 .../crypto_util/include/et_dt_validation.h | 0 .../crypto_util/include/process_security.h | 0 {fsw => src}/crypto_util/include/shared_util.h | 0 {fsw => src}/crypto_util/include/ut_tc_apply.h | 0 {fsw => src}/crypto_util/include/utest.h | 0 {fsw => src}/crypto_util/src/shared_util.c | 0 .../mysql_stub/sadb_routine_mariadb.stub.c | 0 {fsw/src => src/src_main}/crypto.c | 0 {fsw/src => src/src_main}/crypto_print.c | 0 {fsw/src => src/src_main}/sadb_routine.c | 0 .../src_main}/sadb_routine_inmemory.template.c | 0 .../src_mysql/sadb_routine_mariadb.template.c | 0 46 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 fsw/crypto_tests/data/tc4.1.dat delete mode 100644 fsw/crypto_tests/data/tc5.1.dat delete mode 100644 fsw/crypto_tests/data/tc5.2.dat delete mode 100644 fsw/crypto_tests/data/tc5.3.dat rename {fsw/public_inc => include}/cfe_minimum.h (100%) rename {fsw/public_inc => include}/common_types_minimum.h (100%) rename {fsw/public_inc => include}/crypto.h (100%) rename {fsw/public_inc => include}/crypto_config.h (100%) rename {fsw/public_inc => include}/crypto_config_structs.h (100%) rename {fsw/public_inc => include}/crypto_error.h (100%) rename {fsw/public_inc => include}/crypto_events.h (100%) rename {fsw/public_inc => include}/crypto_print.h (100%) rename {fsw/public_inc => include}/crypto_structs.h (100%) rename {fsw/public_inc => include}/itc_common_types_minimum.h (100%) rename {fsw/public_inc => include}/osapi_minimum.h (100%) rename {fsw/public_inc => include}/sadb_mariadb_error.h (100%) rename {fsw/public_inc => include}/sadb_routine.h (100%) rename {fsw => src}/CMakeLists.txt (97%) rename {fsw => src}/crypto_sadb/sadb_mariadb_admin_scripts/create_sadb.sql (100%) rename {fsw => src}/crypto_sadb/sadb_mariadb_admin_scripts/create_sadb_jpl_unit_test_security_associations.sql (100%) rename {fsw => src}/crypto_sadb/sadb_mariadb_admin_scripts/create_sadb_unit_test_security_associations.sql (100%) rename {fsw => src}/crypto_sadb/sadb_mariadb_admin_scripts/create_sadb_user_grant_permissions.sql (100%) rename {fsw => src}/crypto_sadb/sadb_mariadb_admin_scripts/delete_sadb.sql (100%) rename {fsw => src}/crypto_tests/CMakeLists.txt (100%) rename {fsw => src}/crypto_util/CMakeLists.txt (100%) rename {fsw => src}/crypto_util/app/apply_security.c (100%) rename {fsw => src}/crypto_util/app/crypto_sequence.c (100%) rename {fsw => src}/crypto_util/app/et_dt_validation.c (100%) rename {fsw => src}/crypto_util/app/process_security.c (100%) rename {fsw => src}/crypto_util/app/ut_tc_apply.c (100%) rename {fsw => src}/crypto_util/encryption_test.py (100%) rename {fsw => src}/crypto_util/include/apply_security.h (100%) rename {fsw => src}/crypto_util/include/crypto_sequence.h (100%) rename {fsw => src}/crypto_util/include/et_dt_validation.h (100%) rename {fsw => src}/crypto_util/include/process_security.h (100%) rename {fsw => src}/crypto_util/include/shared_util.h (100%) rename {fsw => src}/crypto_util/include/ut_tc_apply.h (100%) rename {fsw => src}/crypto_util/include/utest.h (100%) rename {fsw => src}/crypto_util/src/shared_util.c (100%) rename {fsw => src}/src_feature_stubs/mysql_stub/sadb_routine_mariadb.stub.c (100%) rename {fsw/src => src/src_main}/crypto.c (100%) rename {fsw/src => src/src_main}/crypto_print.c (100%) rename {fsw/src => src/src_main}/sadb_routine.c (100%) rename {fsw/src => src/src_main}/sadb_routine_inmemory.template.c (100%) rename {fsw => src}/src_mysql/sadb_routine_mariadb.template.c (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index b3283955..53c6b7b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,7 +39,7 @@ if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) enable_testing() endif() -include_directories(fsw/public_inc) +include_directories(include) # The shared OSAL and cFE include directories should always be used # Note that this intentionally does NOT include PSP-specific includes, just the generic @@ -56,4 +56,4 @@ if(NOT DEFINED ${PROJECT_BINARY_DIR}) set(PROJECT_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build) endif() -add_subdirectory(fsw) +add_subdirectory(src) diff --git a/fsw/crypto_tests/data/tc4.1.dat b/fsw/crypto_tests/data/tc4.1.dat deleted file mode 100644 index 6f4bf17bd230c0c781bfb1e73979d3eab324991f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmV;S0ABwf0|1@?{{R6102qMKHvo(oe+vKs0E7SlG)R)W#ZOa}DSb>g7cVM2M)s&2 z6G`dfYRCzN*t^wQSQN%$bK`>7`kax*%%8C5DC6&LMgr7f;; diff --git a/fsw/crypto_tests/data/tc5.1.dat b/fsw/crypto_tests/data/tc5.1.dat deleted file mode 100644 index 7526bfcf5b3d352da23ed123c5b0160ddf131a53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49 scmY#jX3%2z&%nsQAklDP4TFSaJvW0G0}lfmLn{LkxHWbDiBK>A0M2F!o&W#< diff --git a/fsw/crypto_tests/data/tc5.2.dat b/fsw/crypto_tests/data/tc5.2.dat deleted file mode 100644 index cb4f0e79cddb79a71680b63be37e6fdbe7811c13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35 qcmY#jW>8@G&%nsQAklDPEd!rqJvW0i0}BHi1A~FXx9`iOLPG&}FbDPk diff --git a/fsw/crypto_tests/data/tc5.3.dat b/fsw/crypto_tests/data/tc5.3.dat deleted file mode 100644 index ed021679f47a744f0d274d70f499f110b73670ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56 zcmY#jW-(#-&%nlj0E~(+PKOqI9rW&u4s@-w+Im-YwV<|7eD%zmtgM1eD<2vi4h; Date: Fri, 17 Dec 2021 07:35:41 -0500 Subject: [PATCH 06/18] #1 - Renamed crypto_util/app to crypto_util/util; --- CMakeLists.txt | 4 ++++ src/CMakeLists.txt | 4 ---- src/crypto_util/CMakeLists.txt | 4 ++-- src/crypto_util/{app => util}/apply_security.c | 0 src/crypto_util/{app => util}/crypto_sequence.c | 0 src/crypto_util/{app => util}/et_dt_validation.c | 0 src/crypto_util/{app => util}/process_security.c | 0 src/crypto_util/{app => util}/ut_tc_apply.c | 0 {src/crypto_tests => test}/CMakeLists.txt | 0 {src/crypto_util => test}/encryption_test.py | 0 10 files changed, 6 insertions(+), 6 deletions(-) rename src/crypto_util/{app => util}/apply_security.c (100%) rename src/crypto_util/{app => util}/crypto_sequence.c (100%) rename src/crypto_util/{app => util}/et_dt_validation.c (100%) rename src/crypto_util/{app => util}/process_security.c (100%) rename src/crypto_util/{app => util}/ut_tc_apply.c (100%) rename {src/crypto_tests => test}/CMakeLists.txt (100%) rename {src/crypto_util => test}/encryption_test.py (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 53c6b7b1..bae9fe42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,3 +57,7 @@ if(NOT DEFINED ${PROJECT_BINARY_DIR}) endif() add_subdirectory(src) + +if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR MYPROJECT_BUILD_TESTING) AND BUILD_TESTING) + add_subdirectory(test) +endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2f7d1208..87737e74 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -60,7 +60,3 @@ add_custom_command(TARGET Crypto POST_BUILD ) add_subdirectory(crypto_util) - -if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR MYPROJECT_BUILD_TESTING) AND BUILD_TESTING) - add_subdirectory(crypto_tests) -endif() diff --git a/src/crypto_util/CMakeLists.txt b/src/crypto_util/CMakeLists.txt index c9b7a420..cadd2a1d 100644 --- a/src/crypto_util/CMakeLists.txt +++ b/src/crypto_util/CMakeLists.txt @@ -28,9 +28,9 @@ if(${ENCTEST}) endif(${ENCTEST}) aux_source_directory(src UTIL_SRC_FILES) -aux_source_directory(app APP_SRC_FILES) +aux_source_directory(util APP_SRC_FILES) -file( GLOB SOURCE_FILES app/*.c ) +file( GLOB SOURCE_FILES util/*.c ) foreach(SOURCE_PATH ${SOURCE_FILES}) get_filename_component(EXECUTABLE_NAME ${SOURCE_PATH} NAME_WE) diff --git a/src/crypto_util/app/apply_security.c b/src/crypto_util/util/apply_security.c similarity index 100% rename from src/crypto_util/app/apply_security.c rename to src/crypto_util/util/apply_security.c diff --git a/src/crypto_util/app/crypto_sequence.c b/src/crypto_util/util/crypto_sequence.c similarity index 100% rename from src/crypto_util/app/crypto_sequence.c rename to src/crypto_util/util/crypto_sequence.c diff --git a/src/crypto_util/app/et_dt_validation.c b/src/crypto_util/util/et_dt_validation.c similarity index 100% rename from src/crypto_util/app/et_dt_validation.c rename to src/crypto_util/util/et_dt_validation.c diff --git a/src/crypto_util/app/process_security.c b/src/crypto_util/util/process_security.c similarity index 100% rename from src/crypto_util/app/process_security.c rename to src/crypto_util/util/process_security.c diff --git a/src/crypto_util/app/ut_tc_apply.c b/src/crypto_util/util/ut_tc_apply.c similarity index 100% rename from src/crypto_util/app/ut_tc_apply.c rename to src/crypto_util/util/ut_tc_apply.c diff --git a/src/crypto_tests/CMakeLists.txt b/test/CMakeLists.txt similarity index 100% rename from src/crypto_tests/CMakeLists.txt rename to test/CMakeLists.txt diff --git a/src/crypto_util/encryption_test.py b/test/encryption_test.py similarity index 100% rename from src/crypto_util/encryption_test.py rename to test/encryption_test.py From fd8b343d2456714aac335c62b7e52de78b6fdcfe Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 07:36:30 -0500 Subject: [PATCH 07/18] #1 - Find and replace OS_printf: --- include/cfe_minimum.h | 2 +- src/crypto_util/util/apply_security.c | 10 +- src/src_main/crypto.c | 464 +++++++++--------- src/src_main/crypto_print.c | 286 +++++------ src/src_main/sadb_routine_inmemory.template.c | 96 ++-- 5 files changed, 429 insertions(+), 429 deletions(-) diff --git a/include/cfe_minimum.h b/include/cfe_minimum.h index 42ded8d4..20b2d001 100644 --- a/include/cfe_minimum.h +++ b/include/cfe_minimum.h @@ -45,6 +45,6 @@ #define CFE_PSP_MemCpy memcpy #define CFE_PSP_MemSet memset -#define OS_printf printf +#define printf printf #endif /* _cfe_ */ diff --git a/src/crypto_util/util/apply_security.c b/src/crypto_util/util/apply_security.c index a6226bbb..06206a16 100644 --- a/src/crypto_util/util/apply_security.c +++ b/src/crypto_util/util/apply_security.c @@ -61,15 +61,15 @@ int main(int argc, char *argv[]) { } #ifdef TC_DEBUG - OS_printf(KYEL "ApplySecurity Output:\n" RESET); - OS_printf(KYEL "\tBuffer size int:%d\n" RESET, enc_frame_len); - OS_printf(KYEL "\tEncrypted Frame Contents: \n\t" RESET); + printf(KYEL "ApplySecurity Output:\n" RESET); + printf(KYEL "\tBuffer size int:%d\n" RESET, enc_frame_len); + printf(KYEL "\tEncrypted Frame Contents: \n\t" RESET); for(int i=0; i < enc_frame_len; i++) { - OS_printf(KYEL "%02X" RESET, *(ptr_enc_frame+i)); + printf(KYEL "%02X" RESET, *(ptr_enc_frame+i)); } - OS_printf("\n"); + printf("\n"); #endif free(buffer); diff --git a/src/src_main/crypto.c b/src/src_main/crypto.c index ccbd9247..9684a044 100644 --- a/src/src_main/crypto.c +++ b/src/src_main/crypto.c @@ -166,12 +166,12 @@ int32 Crypto_Init(void) if(crypto_config==NULL){ status = CRYPTO_CONFIGURATION_NOT_COMPLETE; - OS_printf(KRED "ERROR: CryptoLib must be configured before intializing!\n" RESET); + printf(KRED "ERROR: CryptoLib must be configured before intializing!\n" RESET); return status; //No configuration set -- return! } if(gvcid_managed_parameters==NULL){ status = CRYPTO_MANAGED_PARAM_CONFIGURATION_NOT_COMPLETE; - OS_printf(KRED "ERROR: CryptoLib Managed Parameters must be configured before intializing!\n" RESET); + printf(KRED "ERROR: CryptoLib Managed Parameters must be configured before intializing!\n" RESET); return status; //No Managed Parameter configuration set -- return! } @@ -184,7 +184,7 @@ int32 Crypto_Init(void) else if (crypto_config->sadb_type == SADB_TYPE_MARIADB){ if(sadb_mariadb_config == NULL){ status = CRYPTO_MARIADB_CONFIGURATION_NOT_COMPLETE; - OS_printf(KRED "ERROR: CryptoLib MariaDB must be configured before intializing!\n" RESET); + printf(KRED "ERROR: CryptoLib MariaDB must be configured before intializing!\n" RESET); return status; //MariaDB connection specified but no configuration exists, return! } sadb_routine = get_sadb_routine_mariadb(); @@ -195,11 +195,11 @@ int32 Crypto_Init(void) if (!gcry_check_version(GCRYPT_VERSION)) { fprintf(stderr, "Gcrypt Version: %s",GCRYPT_VERSION); - OS_printf(KRED "\tERROR: gcrypt version mismatch! \n" RESET); + printf(KRED "\tERROR: gcrypt version mismatch! \n" RESET); } if (gcry_control(GCRYCTL_SELFTEST) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcrypt self test failed\n" RESET); + printf(KRED "ERROR: gcrypt self test failed\n" RESET); } gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); @@ -216,7 +216,7 @@ int32 Crypto_Init(void) Crypto_Calc_CRC_Init_Table(); // cFS Standard Initialized Message - OS_printf (KBLU "Crypto Lib Intialized. Version %d.%d.%d.%d\n" RESET, + printf (KBLU "Crypto Lib Intialized. Version %d.%d.%d.%d\n" RESET, CRYPTO_LIB_MAJOR_VERSION, CRYPTO_LIB_MINOR_VERSION, CRYPTO_LIB_REVISION, @@ -889,7 +889,7 @@ static void Crypto_Calc_CRC_Init_Table(void) crc = (crc >> 1) ^ (-(int)(crc & 1) & poly); } crc32Table[i] = crc; - //OS_printf("crc32Table[%d] = 0x%08x \n", i, crc32Table[i]); + //printf("crc32Table[%d] = 0x%08x \n", i, crc32Table[i]); } // Code provided by ESA @@ -905,7 +905,7 @@ static void Crypto_Calc_CRC_Init_Table(void) if ( (i & 64) != 0 ) val ^= 0x48C4; if ( (i & 128) != 0 ) val ^= 0x9188; crc16Table[i] = val; - //OS_printf("crc16Table[%d] = 0x%04x \n", i, crc16Table[i]); + //printf("crc16Table[%d] = 0x%04x \n", i, crc16Table[i]); } } @@ -929,15 +929,15 @@ static int32 Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *s int mac_size = sa_ptr->stmacf_len; #ifdef TC_DEBUG - OS_printf("Get_tcPayloadLength Debug [byte lengths]:\n"); - OS_printf("\thdr.fl\t%d\n", tc_frame->tc_header.fl); - OS_printf("\ttf_hdr\t%d\n",tf_hdr); - OS_printf("\tSeg hdr\t%d\t\n",seg_hdr); - OS_printf("\tspi \t%d\n",spi); - OS_printf("\tiv_size\t%d\n",iv_size); - OS_printf("\tmac\t%d\n",mac_size); - OS_printf("\tfecf \t%d\n",fecf); - OS_printf("\tTOTAL LENGTH: %d\n", (tc_frame->tc_header.fl - (tf_hdr + seg_hdr + spi + iv_size ) - (mac_size + fecf))); + printf("Get_tcPayloadLength Debug [byte lengths]:\n"); + printf("\thdr.fl\t%d\n", tc_frame->tc_header.fl); + printf("\ttf_hdr\t%d\n",tf_hdr); + printf("\tSeg hdr\t%d\t\n",seg_hdr); + printf("\tspi \t%d\n",spi); + printf("\tiv_size\t%d\n",iv_size); + printf("\tmac\t%d\n",mac_size); + printf("\tfecf \t%d\n",fecf); + printf("\tTOTAL LENGTH: %d\n", (tc_frame->tc_header.fl - (tf_hdr + seg_hdr + spi + iv_size ) - (mac_size + fecf))); #endif return (tc_frame->tc_header.fl + 1 - (tf_hdr + seg_hdr + spi + iv_size ) - (mac_size + fecf) ); @@ -990,13 +990,13 @@ static uint8* Crypto_Prepare_TC_AAD(uint8* buffer, uint16 len_aad, uint8* abm_bu } #ifdef MAC_DEBUG - OS_printf(KYEL "Preparing AAD:\n"); - OS_printf("\tUsing AAD Length of %d\n\t", len_aad); + printf(KYEL "Preparing AAD:\n"); + printf("\tUsing AAD Length of %d\n\t", len_aad); for (int i = 0; i < len_aad; i++) { - OS_printf("%02x", aad[i]); + printf("%02x", aad[i]); } - OS_printf("\n" RESET); + printf("\n" RESET); #endif return aad; @@ -1075,7 +1075,7 @@ static void Crypto_TM_updatePDU(char* ingest, int len_ingest) // Copy actual packet while (x < len_ingest + tm_offset) { - //OS_printf("ingest[x - tm_offset] = 0x%02x \n", (uint8)ingest[x - tm_offset]); + //printf("ingest[x - tm_offset] = 0x%02x \n", (uint8)ingest[x - tm_offset]); tm_frame.tm_pdu[x] = (uint8)ingest[x - tm_offset]; x++; } @@ -1334,7 +1334,7 @@ static int32 Crypto_FECF(int fecf, char* ingest, int len_ingest,TC_t* tc_frame) } else { // TODO: Error Correction - OS_printf(KRED "Error: FECF incorrect!\n" RESET); + printf(KRED "Error: FECF incorrect!\n" RESET); if (log_summary.rs > 0) { Crypto_increment((uint8*)&log_summary.num_se, 4); @@ -1347,7 +1347,7 @@ static int32 Crypto_FECF(int fecf, char* ingest, int len_ingest,TC_t* tc_frame) log.blk[log_count++].em_len = 4; } #ifdef FECF_DEBUG - OS_printf("\t Calculated = 0x%04x \n\t Received = 0x%04x \n", calc_fecf, tc_frame->tc_sec_trailer.fecf); + printf("\t Calculated = 0x%04x \n\t Received = 0x%04x \n", calc_fecf, tc_frame->tc_sec_trailer.fecf); #endif result = OS_ERROR; } @@ -1390,14 +1390,14 @@ static uint16 Crypto_Calc_FECF(char* ingest, int len_ingest) } #ifdef FECF_DEBUG - OS_printf(KCYN "Crypto_Calc_FECF: 0x%02x%02x%02x%02x%02x, len_ingest = %d\n" RESET, ingest[0], ingest[1], ingest[2], ingest[3], ingest[4], len_ingest); - OS_printf(KCYN "0x" RESET); + printf(KCYN "Crypto_Calc_FECF: 0x%02x%02x%02x%02x%02x, len_ingest = %d\n" RESET, ingest[0], ingest[1], ingest[2], ingest[3], ingest[4], len_ingest); + printf(KCYN "0x" RESET); for (int x = 0; x < len_ingest; x++) { - OS_printf(KCYN "%02x" RESET, (uint8)*(ingest+x)); + printf(KCYN "%02x" RESET, (uint8)*(ingest+x)); } - OS_printf(KCYN "\n" RESET); - OS_printf(KCYN "In Crypto_Calc_FECF! fecf = 0x%04x\n" RESET, fecf); + printf(KCYN "\n" RESET); + printf(KCYN "In Crypto_Calc_FECF! fecf = 0x%04x\n" RESET, fecf); #endif return fecf; @@ -1416,7 +1416,7 @@ static uint16 Crypto_Calc_CRC16(char* data, int size) for ( ; size > 0; size--) { - //OS_printf("*data = 0x%02x \n", (uint8) *data); + //printf("*data = 0x%02x \n", (uint8) *data); crc = ((crc << 8) & 0xFF00) ^ crc16Table[(crc >> 8) ^ *data++]; } @@ -1468,7 +1468,7 @@ static int32 Crypto_Key_OTAR(void) log.blk[log_count].emv[3] = 0x41; log.blk[log_count++].em_len = 4; } - OS_printf(KRED "Error: MKID is not valid! \n" RESET); + printf(KRED "Error: MKID is not valid! \n" RESET); status = OS_ERROR; return status; } @@ -1476,14 +1476,14 @@ static int32 Crypto_Key_OTAR(void) for (int count = 2; count < (2 + IV_SIZE); count++) { // Initialization Vector packet.iv[count-2] = sdls_frame.pdu.data[count]; - //OS_printf("packet.iv[%d] = 0x%02x\n", count-2, packet.iv[count-2]); + //printf("packet.iv[%d] = 0x%02x\n", count-2, packet.iv[count-2]); } count = sdls_frame.pdu.pdu_len - MAC_SIZE; for (int w = 0; w < 16; w++) { // MAC packet.mac[w] = sdls_frame.pdu.data[count + w]; - //OS_printf("packet.mac[%d] = 0x%02x\n", w, packet.mac[w]); + //printf("packet.mac[%d] = 0x%02x\n", w, packet.mac[w]); } gcry_error = gcry_cipher_open( @@ -1494,7 +1494,7 @@ static int32 Crypto_Key_OTAR(void) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -1505,7 +1505,7 @@ static int32 Crypto_Key_OTAR(void) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -1516,7 +1516,7 @@ static int32 Crypto_Key_OTAR(void) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -1529,7 +1529,7 @@ static int32 Crypto_Key_OTAR(void) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -1540,7 +1540,7 @@ static int32 Crypto_Key_OTAR(void) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -1564,7 +1564,7 @@ static int32 Crypto_Key_OTAR(void) log.blk[log_count].emv[3] = 0x41; // A log.blk[log_count++].em_len = 4; } - OS_printf(KRED "Error: Cannot OTAR master key! \n" RESET); + printf(KRED "Error: Cannot OTAR master key! \n" RESET); status = OS_ERROR; return status; } @@ -1575,7 +1575,7 @@ static int32 Crypto_Key_OTAR(void) { // Encrypted Key packet.EKB[x].ek[y-count] = sdls_frame.pdu.data[y]; #ifdef SA_DEBUG - OS_printf("\t packet.EKB[%d].ek[%d] = 0x%02x\n", x, y-count, packet.EKB[x].ek[y-count]); + printf("\t packet.EKB[%d].ek[%d] = 0x%02x\n", x, y-count, packet.EKB[x].ek[y-count]); #endif // Setup Key Ring @@ -1589,15 +1589,15 @@ static int32 Crypto_Key_OTAR(void) } #ifdef PDU_DEBUG - OS_printf("Received %d keys via master key %d: \n", pdu_keys, packet.mkid); + printf("Received %d keys via master key %d: \n", pdu_keys, packet.mkid); for (int x = 0; x < pdu_keys; x++) { - OS_printf("%d) Key ID = %d, 0x", x+1, packet.EKB[x].ekid); + printf("%d) Key ID = %d, 0x", x+1, packet.EKB[x].ekid); for(int y = 0; y < KEY_SIZE; y++) { - OS_printf("%02x", packet.EKB[x].ek[y]); + printf("%02x", packet.EKB[x].ek[y]); } - OS_printf("\n"); + printf("\n"); } #endif @@ -1615,7 +1615,7 @@ static int32 Crypto_Key_update(uint8 state) int count = 0; int pdu_keys = sdls_frame.pdu.pdu_len / 2; #ifdef PDU_DEBUG - OS_printf("Keys "); + printf("Keys "); #endif // Read in PDU for (int x = 0; x < pdu_keys; x++) @@ -1625,35 +1625,35 @@ static int32 Crypto_Key_update(uint8 state) #ifdef PDU_DEBUG if (x != (pdu_keys - 1)) { - OS_printf("%d, ", packet.kblk[x].kid); + printf("%d, ", packet.kblk[x].kid); } else { - OS_printf("and %d ", packet.kblk[x].kid); + printf("and %d ", packet.kblk[x].kid); } #endif } #ifdef PDU_DEBUG - OS_printf("changed to state "); + printf("changed to state "); switch (state) { case KEY_PREACTIVE: - OS_printf("PREACTIVE. \n"); + printf("PREACTIVE. \n"); break; case KEY_ACTIVE: - OS_printf("ACTIVE. \n"); + printf("ACTIVE. \n"); break; case KEY_DEACTIVATED: - OS_printf("DEACTIVATED. \n"); + printf("DEACTIVATED. \n"); break; case KEY_DESTROYED: - OS_printf("DESTROYED. \n"); + printf("DESTROYED. \n"); break; case KEY_CORRUPTED: - OS_printf("CORRUPTED. \n"); + printf("CORRUPTED. \n"); break; default: - OS_printf("ERROR. \n"); + printf("ERROR. \n"); break; } #endif @@ -1674,7 +1674,7 @@ static int32 Crypto_Key_update(uint8 state) log.blk[log_count].emv[3] = 0x41; log.blk[log_count++].em_len = 4; } - OS_printf(KRED "Error: MKID state cannot be changed! \n" RESET); + printf(KRED "Error: MKID state cannot be changed! \n" RESET); // TODO: Exit } @@ -1682,7 +1682,7 @@ static int32 Crypto_Key_update(uint8 state) { ek_ring[packet.kblk[x].kid].key_state = state; #ifdef PDU_DEBUG - //OS_printf("Key ID %d state changed to ", packet.kblk[x].kid); + //printf("Key ID %d state changed to ", packet.kblk[x].kid); #endif } else @@ -1698,7 +1698,7 @@ static int32 Crypto_Key_update(uint8 state) log.blk[log_count].emv[3] = 0x41; log.blk[log_count++].em_len = 4; } - OS_printf(KRED "Error: Key %d cannot transition to desired state! \n" RESET, packet.kblk[x].kid); + printf(KRED "Error: Key %d cannot transition to desired state! \n" RESET, packet.kblk[x].kid); } } return OS_SUCCESS; @@ -1759,7 +1759,7 @@ static int32 Crypto_Key_verify(char* ingest,TC_t* tc_frame) //uint8 tmp_mac[MAC_SIZE]; #ifdef PDU_DEBUG - OS_printf("Crypto_Key_verify: Requested %d key(s) to verify \n", pdu_keys); + printf("Crypto_Key_verify: Requested %d key(s) to verify \n", pdu_keys); #endif // Read in PDU @@ -1769,7 +1769,7 @@ static int32 Crypto_Key_verify(char* ingest,TC_t* tc_frame) packet.blk[x].kid = ((uint8)sdls_frame.pdu.data[count] << 8) | ((uint8)sdls_frame.pdu.data[count+1]); count = count + 2; #ifdef PDU_DEBUG - OS_printf("Crypto_Key_verify: Block %d Key ID is %d \n", x, packet.blk[x].kid); + printf("Crypto_Key_verify: Block %d Key ID is %d \n", x, packet.blk[x].kid); #endif // Key Challenge for (int y = 0; y < CHALLENGE_SIZE; y++) @@ -1777,7 +1777,7 @@ static int32 Crypto_Key_verify(char* ingest,TC_t* tc_frame) packet.blk[x].challenge[y] = sdls_frame.pdu.data[count++]; } #ifdef PDU_DEBUG - OS_printf("\n"); + printf("\n"); #endif } @@ -1808,7 +1808,7 @@ static int32 Crypto_Key_verify(char* ingest,TC_t* tc_frame) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); } gcry_error = gcry_cipher_setkey( tmp_hd, @@ -1817,7 +1817,7 @@ static int32 Crypto_Key_verify(char* ingest,TC_t* tc_frame) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); } gcry_error = gcry_cipher_setiv( tmp_hd, @@ -1826,7 +1826,7 @@ static int32 Crypto_Key_verify(char* ingest,TC_t* tc_frame) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); } gcry_error = gcry_cipher_encrypt( tmp_hd, @@ -1837,7 +1837,7 @@ static int32 Crypto_Key_verify(char* ingest,TC_t* tc_frame) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_encrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_encrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); } count = count + CHALLENGE_SIZE; // Don't forget to increment count! @@ -1848,7 +1848,7 @@ static int32 Crypto_Key_verify(char* ingest,TC_t* tc_frame) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_gettag error code %d \n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_gettag error code %d \n" RESET,gcry_error & GPG_ERR_CODE_MASK); } count = count + CHALLENGE_MAC_SIZE; // Don't forget to increment count! @@ -1861,7 +1861,7 @@ static int32 Crypto_Key_verify(char* ingest,TC_t* tc_frame) } #ifdef PDU_DEBUG - OS_printf("Crypto_Key_verify: Response is %d bytes \n", count); + printf("Crypto_Key_verify: Response is %d bytes \n", count); #endif return count; @@ -1912,8 +1912,8 @@ static int32 Crypto_MC_status(char* ingest) ingest[count++] = (log_summary.rs & 0x00FF); #ifdef PDU_DEBUG - OS_printf("log_summary.num_se = 0x%02x \n",log_summary.num_se); - OS_printf("log_summary.rs = 0x%02x \n",log_summary.rs); + printf("log_summary.num_se = 0x%02x \n",log_summary.num_se); + printf("log_summary.rs = 0x%02x \n",log_summary.rs); #endif return count; @@ -1946,9 +1946,9 @@ static int32 Crypto_MC_dump(char* ingest) } #ifdef PDU_DEBUG - OS_printf("log_count = %d \n", log_count); - OS_printf("log_summary.num_se = 0x%02x \n",log_summary.num_se); - OS_printf("log_summary.rs = 0x%02x \n",log_summary.rs); + printf("log_count = %d \n", log_count); + printf("log_summary.num_se = 0x%02x \n",log_summary.num_se); + printf("log_summary.rs = 0x%02x \n",log_summary.rs); #endif return count; @@ -2068,15 +2068,15 @@ static int32 Crypto_SA_readARSN(char* ingest) } #ifdef PDU_DEBUG - OS_printf("spi = %d \n", spi); + printf("spi = %d \n", spi); if (sa_ptr->shivf_len > 0) { - OS_printf("ARSN = 0x"); + printf("ARSN = 0x"); for (int x = 0; x < sa_ptr->shivf_len; x++) { - OS_printf("%02x", *(sa_ptr->iv + x)); + printf("%02x", *(sa_ptr->iv + x)); } - OS_printf("\n"); + printf("\n"); } #endif @@ -2203,11 +2203,11 @@ static int32 Crypto_User_ModifyKey(void) { case 1: // Invalidate Key ek_ring[kid].value[KEY_SIZE-1]++; - OS_printf("Key %d value invalidated! \n", kid); + printf("Key %d value invalidated! \n", kid); break; case 2: // Modify key state ek_ring[kid].key_state = (uint8)sdls_frame.pdu.data[3] & 0x0F; - OS_printf("Key %d state changed to %d! \n", kid, mod); + printf("Key %d state changed to %d! \n", kid, mod); break; default: // Error @@ -2251,7 +2251,7 @@ static int32 Crypto_User_ModifyVCID(void) if (sa_ptr->gvcid_tm_blk[j].vcid == tm_frame.tm_header.vcid) { tm_frame.tm_sec_header.spi = i; - OS_printf("TM Frame SPI changed to %d \n",i); + printf("TM Frame SPI changed to %d \n",i); break; } } @@ -2287,42 +2287,42 @@ static int32 Crypto_PDU(char* ingest,TC_t* tc_frame) { case PID_OTAR: #ifdef PDU_DEBUG - OS_printf(KGRN "Key OTAR\n" RESET); + printf(KGRN "Key OTAR\n" RESET); #endif status = Crypto_Key_OTAR(); break; case PID_KEY_ACTIVATION: #ifdef PDU_DEBUG - OS_printf(KGRN "Key Activate\n" RESET); + printf(KGRN "Key Activate\n" RESET); #endif status = Crypto_Key_update(KEY_ACTIVE); break; case PID_KEY_DEACTIVATION: #ifdef PDU_DEBUG - OS_printf(KGRN "Key Deactivate\n" RESET); + printf(KGRN "Key Deactivate\n" RESET); #endif status = Crypto_Key_update(KEY_DEACTIVATED); break; case PID_KEY_VERIFICATION: #ifdef PDU_DEBUG - OS_printf(KGRN "Key Verify\n" RESET); + printf(KGRN "Key Verify\n" RESET); #endif status = Crypto_Key_verify(ingest,tc_frame); break; case PID_KEY_DESTRUCTION: #ifdef PDU_DEBUG - OS_printf(KGRN "Key Destroy\n" RESET); + printf(KGRN "Key Destroy\n" RESET); #endif status = Crypto_Key_update(KEY_DESTROYED); break; case PID_KEY_INVENTORY: #ifdef PDU_DEBUG - OS_printf(KGRN "Key Inventory\n" RESET); + printf(KGRN "Key Inventory\n" RESET); #endif status = Crypto_Key_inventory(ingest); break; default: - OS_printf(KRED "Error: Crypto_PDU failed interpreting Key Management Procedure Identification Field! \n" RESET); + printf(KRED "Error: Crypto_PDU failed interpreting Key Management Procedure Identification Field! \n" RESET); break; } break; @@ -2331,66 +2331,66 @@ static int32 Crypto_PDU(char* ingest,TC_t* tc_frame) { case PID_CREATE_SA: #ifdef PDU_DEBUG - OS_printf(KGRN "SA Create\n" RESET); + printf(KGRN "SA Create\n" RESET); #endif status = sadb_routine->sadb_sa_create(); break; case PID_DELETE_SA: #ifdef PDU_DEBUG - OS_printf(KGRN "SA Delete\n" RESET); + printf(KGRN "SA Delete\n" RESET); #endif status = sadb_routine->sadb_sa_delete(); break; case PID_SET_ARSNW: #ifdef PDU_DEBUG - OS_printf(KGRN "SA setARSNW\n" RESET); + printf(KGRN "SA setARSNW\n" RESET); #endif status = sadb_routine->sadb_sa_setARSNW(); break; case PID_REKEY_SA: #ifdef PDU_DEBUG - OS_printf(KGRN "SA Rekey\n" RESET); + printf(KGRN "SA Rekey\n" RESET); #endif status = sadb_routine->sadb_sa_rekey(); break; case PID_EXPIRE_SA: #ifdef PDU_DEBUG - OS_printf(KGRN "SA Expire\n" RESET); + printf(KGRN "SA Expire\n" RESET); #endif status = sadb_routine->sadb_sa_expire(); break; case PID_SET_ARSN: #ifdef PDU_DEBUG - OS_printf(KGRN "SA SetARSN\n" RESET); + printf(KGRN "SA SetARSN\n" RESET); #endif status = sadb_routine->sadb_sa_setARSN(); break; case PID_START_SA: #ifdef PDU_DEBUG - OS_printf(KGRN "SA Start\n" RESET); + printf(KGRN "SA Start\n" RESET); #endif status = sadb_routine->sadb_sa_start(tc_frame); break; case PID_STOP_SA: #ifdef PDU_DEBUG - OS_printf(KGRN "SA Stop\n" RESET); + printf(KGRN "SA Stop\n" RESET); #endif status = sadb_routine->sadb_sa_stop(); break; case PID_READ_ARSN: #ifdef PDU_DEBUG - OS_printf(KGRN "SA readARSN\n" RESET); + printf(KGRN "SA readARSN\n" RESET); #endif status = Crypto_SA_readARSN(ingest); break; case PID_SA_STATUS: #ifdef PDU_DEBUG - OS_printf(KGRN "SA Status\n" RESET); + printf(KGRN "SA Status\n" RESET); #endif status = sadb_routine->sadb_sa_status(ingest); break; default: - OS_printf(KRED "Error: Crypto_PDU failed interpreting SA Procedure Identification Field! \n" RESET); + printf(KRED "Error: Crypto_PDU failed interpreting SA Procedure Identification Field! \n" RESET); break; } break; @@ -2399,47 +2399,47 @@ static int32 Crypto_PDU(char* ingest,TC_t* tc_frame) { case PID_PING: #ifdef PDU_DEBUG - OS_printf(KGRN "MC Ping\n" RESET); + printf(KGRN "MC Ping\n" RESET); #endif status = Crypto_MC_ping(ingest); break; case PID_LOG_STATUS: #ifdef PDU_DEBUG - OS_printf(KGRN "MC Status\n" RESET); + printf(KGRN "MC Status\n" RESET); #endif status = Crypto_MC_status(ingest); break; case PID_DUMP_LOG: #ifdef PDU_DEBUG - OS_printf(KGRN "MC Dump\n" RESET); + printf(KGRN "MC Dump\n" RESET); #endif status = Crypto_MC_dump(ingest); break; case PID_ERASE_LOG: #ifdef PDU_DEBUG - OS_printf(KGRN "MC Erase\n" RESET); + printf(KGRN "MC Erase\n" RESET); #endif status = Crypto_MC_erase(ingest); break; case PID_SELF_TEST: #ifdef PDU_DEBUG - OS_printf(KGRN "MC Selftest\n" RESET); + printf(KGRN "MC Selftest\n" RESET); #endif status = Crypto_MC_selftest(ingest); break; case PID_ALARM_FLAG: #ifdef PDU_DEBUG - OS_printf(KGRN "MC Reset Alarm\n" RESET); + printf(KGRN "MC Reset Alarm\n" RESET); #endif status = Crypto_MC_resetalarm(); break; default: - OS_printf(KRED "Error: Crypto_PDU failed interpreting MC Procedure Identification Field! \n" RESET); + printf(KRED "Error: Crypto_PDU failed interpreting MC Procedure Identification Field! \n" RESET); break; } break; default: // ERROR - OS_printf(KRED "Error: Crypto_PDU failed interpreting Service Group! \n" RESET); + printf(KRED "Error: Crypto_PDU failed interpreting Service Group! \n" RESET); break; } break; @@ -2452,54 +2452,54 @@ static int32 Crypto_PDU(char* ingest,TC_t* tc_frame) { case 0: // Idle Frame Trigger #ifdef PDU_DEBUG - OS_printf(KMAG "User Idle Trigger\n" RESET); + printf(KMAG "User Idle Trigger\n" RESET); #endif status = Crypto_User_IdleTrigger(ingest); break; case 1: // Toggle Bad SPI #ifdef PDU_DEBUG - OS_printf(KMAG "User Toggle Bad SPI\n" RESET); + printf(KMAG "User Toggle Bad SPI\n" RESET); #endif status = Crypto_User_BadSPI(); break; case 2: // Toggle Bad IV #ifdef PDU_DEBUG - OS_printf(KMAG "User Toggle Bad IV\n" RESET); + printf(KMAG "User Toggle Bad IV\n" RESET); #endif status = Crypto_User_BadIV();\ break; case 3: // Toggle Bad MAC #ifdef PDU_DEBUG - OS_printf(KMAG "User Toggle Bad MAC\n" RESET); + printf(KMAG "User Toggle Bad MAC\n" RESET); #endif status = Crypto_User_BadMAC(); break; case 4: // Toggle Bad FECF #ifdef PDU_DEBUG - OS_printf(KMAG "User Toggle Bad FECF\n" RESET); + printf(KMAG "User Toggle Bad FECF\n" RESET); #endif status = Crypto_User_BadFECF(); break; case 5: // Modify Key #ifdef PDU_DEBUG - OS_printf(KMAG "User Modify Key\n" RESET); + printf(KMAG "User Modify Key\n" RESET); #endif status = Crypto_User_ModifyKey(); break; case 6: // Modify ActiveTM #ifdef PDU_DEBUG - OS_printf(KMAG "User Modify Active TM\n" RESET); + printf(KMAG "User Modify Active TM\n" RESET); #endif status = Crypto_User_ModifyActiveTM(); break; case 7: // Modify TM VCID #ifdef PDU_DEBUG - OS_printf(KMAG "User Modify VCID\n" RESET); + printf(KMAG "User Modify VCID\n" RESET); #endif status = Crypto_User_ModifyVCID(); break; default: - OS_printf(KRED "Error: Crypto_PDU received user defined command! \n" RESET); + printf(KRED "Error: Crypto_PDU received user defined command! \n" RESET); break; } } @@ -2508,19 +2508,19 @@ static int32 Crypto_PDU(char* ingest,TC_t* tc_frame) break; case 1: // Reply - OS_printf(KRED "Error: Crypto_PDU failed interpreting PDU Type! Received a Reply!?! \n" RESET); + printf(KRED "Error: Crypto_PDU failed interpreting PDU Type! Received a Reply!?! \n" RESET); break; } #ifdef CCSDS_DEBUG if (status > 0) { - OS_printf(KMAG "CCSDS message put on software bus: 0x" RESET); + printf(KMAG "CCSDS message put on software bus: 0x" RESET); for (int x = 0; x < status; x++) { - OS_printf(KMAG "%02x" RESET, (uint8) ingest[x]); + printf(KMAG "%02x" RESET, (uint8) ingest[x]); } - OS_printf("\n"); + printf("\n"); } #endif @@ -2553,7 +2553,7 @@ static int32 Crypto_Get_Managed_Parameters_For_Gvcid(uint8 tfvn,uint16 scid,uint } else { - OS_printf(KRED "Error: Managed Parameters for GVCID(TFVN: %d, SCID: %d, VCID: %d) not found. \n" RESET,tfvn,scid,vcid); + printf(KRED "Error: Managed Parameters for GVCID(TFVN: %d, SCID: %d, VCID: %d) not found. \n" RESET,tfvn,scid,vcid); return status; } } @@ -2603,29 +2603,29 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len uint8 ecs_is_aead_algorithm; #ifdef DEBUG - OS_printf(KYEL "\n----- Crypto_TC_ApplySecurity START -----\n" RESET); + printf(KYEL "\n----- Crypto_TC_ApplySecurity START -----\n" RESET); #endif if (p_in_frame == NULL) { status = CRYPTO_LIB_ERR_NULL_BUFFER; - OS_printf(KRED "Error: Input Buffer NULL! \n" RESET); + printf(KRED "Error: Input Buffer NULL! \n" RESET); return status; // Just return here, nothing can be done. } #ifdef DEBUG - OS_printf("%d TF Bytes received\n", in_frame_length); - OS_printf("DEBUG - "); + printf("%d TF Bytes received\n", in_frame_length); + printf("DEBUG - "); for(int i=0; i < in_frame_length; i++) { - OS_printf("%02X", ((uint8 *)&*p_in_frame)[i]); + printf("%02X", ((uint8 *)&*p_in_frame)[i]); } - OS_printf("\nPrinted %d bytes\n", in_frame_length); + printf("\nPrinted %d bytes\n", in_frame_length); #endif if(crypto_config == NULL) { - OS_printf(KRED "ERROR: CryptoLib Configuration Not Set! -- CRYPTO_LIB_ERR_NO_CONFIG, Will Exit\n" RESET); + printf(KRED "ERROR: CryptoLib Configuration Not Set! -- CRYPTO_LIB_ERR_NO_CONFIG, Will Exit\n" RESET); status = CRYPTO_LIB_ERR_NO_CONFIG; } @@ -2661,7 +2661,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len ** "Type-C frames do not have the Security Header and Security Trailer." */ #ifdef TC_DEBUG - OS_printf(KYEL "DEBUG - Received Control/Command frame - nothing to do.\n" RESET); + printf(KYEL "DEBUG - Received Control/Command frame - nothing to do.\n" RESET); #endif status = CRYPTO_LIB_ERR_INVALID_CC_FLAG; } @@ -2671,7 +2671,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len // Query SA DB for active SA / SDLS parameters if(sadb_routine == NULL) //This should not happen, but tested here for safety { - OS_printf(KRED "ERROR: SA DB Not initalized! -- CRYPTO_LIB_ERR_NO_INIT, Will Exit\n" RESET); + printf(KRED "ERROR: SA DB Not initalized! -- CRYPTO_LIB_ERR_NO_INIT, Will Exit\n" RESET); status = CRYPTO_LIB_ERR_NO_INIT; } else @@ -2686,7 +2686,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len } #ifdef SA_DEBUG - OS_printf(KYEL "DEBUG - Printing SA Entry for current frame.\n" RESET); + printf(KYEL "DEBUG - Printing SA Entry for current frame.\n" RESET); Crypto_saPrint(sa_ptr); #endif @@ -2711,7 +2711,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len { // Probably unnecessary check // Leaving for now as it would be cleaner in SA to have an association enum returned I believe - OS_printf(KRED "Error: SA Service Type is not defined! \n" RESET); + printf(KRED "Error: SA Service Type is not defined! \n" RESET); status = OS_ERROR; return status; } @@ -2727,16 +2727,16 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len switch(sa_service_type) { case SA_PLAINTEXT: - OS_printf(KBLU "Creating a TC - CLEAR!\n" RESET); + printf(KBLU "Creating a TC - CLEAR!\n" RESET); break; case SA_AUTHENTICATION: - OS_printf(KBLU "Creating a TC - AUTHENTICATED!\n" RESET); + printf(KBLU "Creating a TC - AUTHENTICATED!\n" RESET); break; case SA_ENCRYPTION: - OS_printf(KBLU "Creating a TC - ENCRYPTED!\n" RESET); + printf(KBLU "Creating a TC - ENCRYPTED!\n" RESET); break; case SA_AUTHENTICATED_ENCRYPTION: - OS_printf(KBLU "Creating a TC - AUTHENTICATED ENCRYPTION!\n" RESET); + printf(KBLU "Creating a TC - AUTHENTICATED ENCRYPTION!\n" RESET); break; } #endif @@ -2771,23 +2771,23 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len } #ifdef TC_DEBUG - OS_printf(KYEL "DEBUG - Total TC Buffer to be malloced is: %d bytes\n" RESET, *p_enc_frame_len); - OS_printf(KYEL "\tlen of TF\t = %d\n" RESET, temp_tc_header.fl); - //OS_printf(KYEL "\tsegment hdr\t = 1\n" RESET); // TODO: Determine presence of this so not hard-coded - OS_printf(KYEL "\tspi len\t\t = 2\n" RESET); - OS_printf(KYEL "\tshivf_len\t = %d\n" RESET, sa_ptr->shivf_len); - OS_printf(KYEL "\tshsnf_len\t = %d\n" RESET, sa_ptr->shsnf_len); - OS_printf(KYEL "\tshplf len\t = %d\n" RESET, sa_ptr->shplf_len); - OS_printf(KYEL "\tarc_len\t\t = %d\n" RESET, sa_ptr->arc_len); - OS_printf(KYEL "\tpad_size\t = %d\n" RESET, TC_PAD_SIZE); - OS_printf(KYEL "\tstmacf_len\t = %d\n" RESET, sa_ptr->stmacf_len); + printf(KYEL "DEBUG - Total TC Buffer to be malloced is: %d bytes\n" RESET, *p_enc_frame_len); + printf(KYEL "\tlen of TF\t = %d\n" RESET, temp_tc_header.fl); + //printf(KYEL "\tsegment hdr\t = 1\n" RESET); // TODO: Determine presence of this so not hard-coded + printf(KYEL "\tspi len\t\t = 2\n" RESET); + printf(KYEL "\tshivf_len\t = %d\n" RESET, sa_ptr->shivf_len); + printf(KYEL "\tshsnf_len\t = %d\n" RESET, sa_ptr->shsnf_len); + printf(KYEL "\tshplf len\t = %d\n" RESET, sa_ptr->shplf_len); + printf(KYEL "\tarc_len\t\t = %d\n" RESET, sa_ptr->arc_len); + printf(KYEL "\tpad_size\t = %d\n" RESET, TC_PAD_SIZE); + printf(KYEL "\tstmacf_len\t = %d\n" RESET, sa_ptr->stmacf_len); #endif // Accio buffer p_new_enc_frame = (uint8 *)malloc((*p_enc_frame_len) * sizeof (unsigned char)); if(!p_new_enc_frame) { - OS_printf(KRED "Error: Malloc for encrypted output buffer failed! \n" RESET); + printf(KRED "Error: Malloc for encrypted output buffer failed! \n" RESET); status = OS_ERROR; return status; } @@ -2802,13 +2802,13 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len *(p_new_enc_frame+3) = ((new_enc_frame_header_field_length) & (0x00FF)); #ifdef TC_DEBUG - OS_printf(KYEL "Printing updated TF Header:\n\t"); + printf(KYEL "Printing updated TF Header:\n\t"); for (int i=0; ishivf_len; i++) {OS_printf("%02x", *(sa_ptr->iv + i));} - OS_printf("\n" RESET); + printf(KYEL "Using IV value:\n\t"); + for(int i=0; ishivf_len; i++) {printf("%02x", *(sa_ptr->iv + i));} + printf("\n" RESET); #endif for (int i=0; i < sa_ptr->shivf_len; i++) @@ -2942,7 +2942,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -2953,7 +2953,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -2964,7 +2964,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -2975,14 +2975,14 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len // TODO: More robust calculation of this location // uint16 output_loc = TC_FRAME_PRIMARYHEADER_STRUCT_SIZE + 1 + 2 + temp_SA.shivf_len + temp_SA.shsnf_len + temp_SA.shplf_len; #ifdef TC_DEBUG - OS_printf("Encrypted bytes output_loc is %d\n", index); - OS_printf("tf_payload_len is %d\n", tf_payload_len); - OS_printf(KYEL "Printing TC Frame prior to encryption:\n\t"); + printf("Encrypted bytes output_loc is %d\n", index); + printf("tf_payload_len is %d\n", tf_payload_len); + printf(KYEL "Printing TC Frame prior to encryption:\n\t"); for(int i=0; i < *p_enc_frame_len; i++) { - OS_printf("%02X", *(p_new_enc_frame + i)); + printf("%02X", *(p_new_enc_frame + i)); } - OS_printf("\n"); + printf("\n"); #endif if(sa_service_type == SA_AUTHENTICATED_ENCRYPTION && ecs_is_aead_algorithm==CRYPTO_TRUE) // Algorithm is AEAD algorithm, Add AAD before encrypt! @@ -3000,8 +3000,8 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - OS_printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error),gcry_strerror (gcry_error)); + printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error),gcry_strerror (gcry_error)); status = CRYPTO_LIB_ERR_AUTHENTICATION_ERROR; return status; } @@ -3019,20 +3019,20 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_encrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_encrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } #ifdef TC_DEBUG - OS_printf("Encrypted bytes output_loc is %d\n", index); - OS_printf("tf_payload_len is %d\n", tf_payload_len); - OS_printf(KYEL "Printing TC Frame after encryption:\n\t"); + printf("Encrypted bytes output_loc is %d\n", index); + printf("tf_payload_len is %d\n", tf_payload_len); + printf(KYEL "Printing TC Frame after encryption:\n\t"); for(int i=0; i < *p_enc_frame_len; i++) { - OS_printf("%02X", *(p_new_enc_frame + i)); + printf("%02X", *(p_new_enc_frame + i)); } - OS_printf("\n"); + printf("\n"); #endif //Get MAC & insert into p_new_enc_frame @@ -3040,8 +3040,8 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len { mac_loc = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + tf_payload_len; #ifdef MAC_DEBUG - OS_printf(KYEL "MAC location is: %d\n" RESET, mac_loc); - OS_printf(KYEL "MAC size is: %d\n" RESET, MAC_SIZE); + printf(KYEL "MAC location is: %d\n" RESET, mac_loc); + printf(KYEL "MAC size is: %d\n" RESET, MAC_SIZE); #endif gcry_error = gcry_cipher_gettag( tmp_hd, @@ -3050,7 +3050,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERR_MAC_RETRIEVAL_ERROR; return status; } @@ -3072,7 +3072,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -3083,7 +3083,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -3094,7 +3094,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -3110,16 +3110,16 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - OS_printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error),gcry_strerror (gcry_error)); + printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error),gcry_strerror (gcry_error)); status = OS_ERROR; return status; } mac_loc = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + tf_payload_len; #ifdef MAC_DEBUG - OS_printf(KYEL "MAC location is: %d\n" RESET, mac_loc); - OS_printf(KYEL "MAC size is: %d\n" RESET, MAC_SIZE); + printf(KYEL "MAC location is: %d\n" RESET, mac_loc); + printf(KYEL "MAC size is: %d\n" RESET, MAC_SIZE); #endif gcry_error = gcry_cipher_gettag( tmp_hd, @@ -3128,7 +3128,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERR_MAC_RETRIEVAL_ERROR; return status; } @@ -3143,9 +3143,9 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len if(sa_ptr->iv == NULL) { printf("\n\nNULL\n\n");} Crypto_increment(sa_ptr->iv, sa_ptr->shivf_len); #ifdef SA_DEBUG - OS_printf(KYEL "Next IV value is:\n\t"); - for(int i=0; ishivf_len; i++) {OS_printf("%02x", *(sa_ptr->iv + i));} - OS_printf("\n" RESET); + printf(KYEL "Next IV value is:\n\t"); + for(int i=0; ishivf_len; i++) {printf("%02x", *(sa_ptr->iv + i));} + printf("\n" RESET); #endif #endif } @@ -3158,7 +3158,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len { // Set FECF Field if present #ifdef FECF_DEBUG - OS_printf(KCYN "Calcing FECF over %d bytes\n" RESET, new_enc_frame_header_field_length - 1); + printf(KCYN "Calcing FECF over %d bytes\n" RESET, new_enc_frame_header_field_length - 1); #endif if ( crypto_config->crypto_create_fecf==CRYPTO_TC_CREATE_FECF_TRUE ) { @@ -3176,12 +3176,12 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len } #ifdef TC_DEBUG - OS_printf(KYEL "Printing new TC Frame:\n\t"); + printf(KYEL "Printing new TC Frame:\n\t"); for(int i=0; i < *p_enc_frame_len; i++) { - OS_printf("%02X", *(p_new_enc_frame + i)); + printf("%02X", *(p_new_enc_frame + i)); } - OS_printf("\n\tThe returned length is: %d\n" RESET, new_enc_frame_header_field_length); + printf("\n\tThe returned length is: %d\n" RESET, new_enc_frame_header_field_length); #endif *pp_in_frame = p_new_enc_frame; @@ -3190,7 +3190,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len status = sadb_routine->sadb_save_sa(sa_ptr); #ifdef DEBUG - OS_printf(KYEL "----- Crypto_TC_ApplySecurity END -----\n" RESET); + printf(KYEL "----- Crypto_TC_ApplySecurity END -----\n" RESET); #endif return status; @@ -3221,13 +3221,13 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro if(crypto_config == NULL) { - OS_printf(KRED "ERROR: CryptoLib Configuration Not Set! -- CRYPTO_LIB_ERR_NO_CONFIG, Will Exit\n" RESET); + printf(KRED "ERROR: CryptoLib Configuration Not Set! -- CRYPTO_LIB_ERR_NO_CONFIG, Will Exit\n" RESET); status = CRYPTO_LIB_ERR_NO_CONFIG; return status; } #ifdef DEBUG - OS_printf(KYEL "\n----- Crypto_TC_ProcessSecurity START -----\n" RESET); + printf(KYEL "\n----- Crypto_TC_ProcessSecurity START -----\n" RESET); #endif int byte_idx = 0; @@ -3263,8 +3263,8 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro tc_sdls_processed_frame->tc_sec_header.spi = ((uint8)ingest[byte_idx] << 8) | (uint8)ingest[byte_idx+1]; byte_idx+=2; #ifdef TC_DEBUG - OS_printf("vcid = %d \n", tc_sdls_processed_frame->tc_header.vcid ); - OS_printf("spi = %d \n", tc_sdls_processed_frame->tc_sec_header.spi); + printf("vcid = %d \n", tc_sdls_processed_frame->tc_header.vcid ); + printf("spi = %d \n", tc_sdls_processed_frame->tc_sec_header.spi); #endif status = sadb_routine->sadb_get_sa_from_spi(tc_sdls_processed_frame->tc_sec_header.spi,&sa_ptr); @@ -3297,7 +3297,7 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro { // Probably unnecessary check // Leaving for now as it would be cleaner in SA to have an association enum returned I believe - OS_printf(KRED "Error: SA Service Type is not defined! \n" RESET); + printf(KRED "Error: SA Service Type is not defined! \n" RESET); status = OS_ERROR; return status; } @@ -3313,16 +3313,16 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro switch(sa_service_type) { case SA_PLAINTEXT: - OS_printf(KBLU "Processing a TC - CLEAR!\n" RESET); + printf(KBLU "Processing a TC - CLEAR!\n" RESET); break; case SA_AUTHENTICATION: - OS_printf(KBLU "Processing a TC - AUTHENTICATED!\n" RESET); + printf(KBLU "Processing a TC - AUTHENTICATED!\n" RESET); break; case SA_ENCRYPTION: - OS_printf(KBLU "Processing a TC - ENCRYPTED!\n" RESET); + printf(KBLU "Processing a TC - ENCRYPTED!\n" RESET); break; case SA_AUTHENTICATED_ENCRYPTION: - OS_printf(KBLU "Processing a TC - AUTHENTICATED ENCRYPTION!\n" RESET); + printf(KBLU "Processing a TC - AUTHENTICATED ENCRYPTION!\n" RESET); break; } #endif @@ -3375,7 +3375,7 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERR_LIBGCRYPT_ERROR; return status; } @@ -3386,7 +3386,7 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERR_LIBGCRYPT_ERROR; return status; } @@ -3397,7 +3397,7 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERR_LIBGCRYPT_ERROR; return status; } @@ -3457,8 +3457,8 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - OS_printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error),gcry_strerror (gcry_error)); + printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error),gcry_strerror (gcry_error)); status = CRYPTO_LIB_ERR_AUTHENTICATION_ERROR; return status; } @@ -3495,7 +3495,7 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro } if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERR_DECRYPT_ERROR; return status; } @@ -3511,7 +3511,7 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); fprintf(stderr,"gcry_cipher_decrypt failed: %s\n", gpg_strerror (gcry_error)); status = CRYPTO_LIB_ERR_MAC_VALIDATION_ERROR; return status; @@ -3558,7 +3558,7 @@ static int32 Crypto_Process_Extended_Procedure_Pdu(TC_t* tc_sdls_processed_frame // Crypto Lib Application ID { #ifdef DEBUG - OS_printf(KGRN "Received SDLS command: " RESET); + printf(KGRN "Received SDLS command: " RESET); #endif // CCSDS Header sdls_frame.hdr.pvn = (tc_sdls_processed_frame->tc_pdu[0] & 0xE0) >> 5; @@ -3601,7 +3601,7 @@ static int32 Crypto_Process_Extended_Procedure_Pdu(TC_t* tc_sdls_processed_frame else if (tc_sdls_processed_frame->tc_header.vcid == TC_SDLS_EP_VCID) //TC SDLS PDU with no packet layer { #ifdef DEBUG - OS_printf(KGRN "Received SDLS command: " RESET); + printf(KGRN "Received SDLS command: " RESET); #endif // No Packet HDR or PUS in these frames // SDLS TLV PDU @@ -3660,7 +3660,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) CFE_PSP_MemSet(&tempTM, 0, TM_SIZE); #ifdef DEBUG - OS_printf(KYEL "\n----- Crypto_TM_ApplySecurity START -----\n" RESET); + printf(KYEL "\n----- Crypto_TM_ApplySecurity START -----\n" RESET); #endif // Check for idle frame trigger @@ -3690,7 +3690,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) // Update TM First Header Pointer tm_frame.tm_header.fhp = tm_offset; #ifdef TM_DEBUG - OS_printf("tm_offset = %d \n", tm_offset); + printf("tm_offset = %d \n", tm_offset); #endif } @@ -3793,7 +3793,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) (sa_ptr->ast == 0)) { #ifdef DEBUG - OS_printf(KBLU "Creating a TM - CLEAR! \n" RESET); + printf(KBLU "Creating a TM - CLEAR! \n" RESET); #endif // Copy temporary frame to ingest CFE_PSP_MemCpy(ingest, tempTM, count); @@ -3803,25 +3803,25 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) (sa_ptr->ast == 1)) { #ifdef DEBUG - OS_printf(KBLU "Creating a TM - AUTHENTICATED ENCRYPTION! \n" RESET); + printf(KBLU "Creating a TM - AUTHENTICATED ENCRYPTION! \n" RESET); #endif // Copy TM to ingest CFE_PSP_MemCpy(ingest, tempTM, pdu_loc); #ifdef MAC_DEBUG - OS_printf("AAD = 0x"); + printf("AAD = 0x"); #endif // Prepare additional authenticated data for (y = 0; y < sa_ptr->abm_len; y++) { aad[y] = ingest[y] & *(sa_ptr->abm + y); #ifdef MAC_DEBUG - OS_printf("%02x", aad[y]); + printf("%02x", aad[y]); #endif } #ifdef MAC_DEBUG - OS_printf("\n"); + printf("\n"); #endif gcry_error = gcry_cipher_open( @@ -3832,7 +3832,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -3843,7 +3843,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -3854,7 +3854,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -3867,7 +3867,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -3878,7 +3878,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } @@ -3889,18 +3889,18 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) ); if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - OS_printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); status = OS_ERROR; return status; } #ifdef MAC_DEBUG - OS_printf("MAC = 0x"); + printf("MAC = 0x"); for(x = 0; x < MAC_SIZE; x++) { - OS_printf("%02x", (uint8) ingest[x + mac_loc]); + printf("%02x", (uint8) ingest[x + mac_loc]); } - OS_printf("\n"); + printf("\n"); #endif // Update OCF @@ -3920,7 +3920,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) (sa_ptr->ast == 1)) { #ifdef DEBUG - OS_printf(KBLU "Creating a TM - AUTHENTICATED! \n" RESET); + printf(KBLU "Creating a TM - AUTHENTICATED! \n" RESET); #endif // TODO: Future work. Operationally same as clear. CFE_PSP_MemCpy(ingest, tempTM, count); @@ -3930,7 +3930,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) (sa_ptr->ast == 0)) { #ifdef DEBUG - OS_printf(KBLU "Creating a TM - ENCRYPTED! \n" RESET); + printf(KBLU "Creating a TM - ENCRYPTED! \n" RESET); #endif // TODO: Future work. Operationally same as clear. CFE_PSP_MemCpy(ingest, tempTM, count); @@ -3941,7 +3941,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) #endif #ifdef DEBUG - OS_printf(KYEL "----- Crypto_TM_ApplySecurity END -----\n" RESET); + printf(KYEL "----- Crypto_TM_ApplySecurity END -----\n" RESET); #endif *len_ingest = count; @@ -3960,7 +3960,7 @@ int32 Crypto_TM_ProcessSecurity(char* ingest, int* len_ingest) int32 status = OS_SUCCESS; #ifdef DEBUG - OS_printf(KYEL "\n----- Crypto_TM_ProcessSecurity START -----\n" RESET); + printf(KYEL "\n----- Crypto_TM_ProcessSecurity START -----\n" RESET); #endif // TODO: This whole function! @@ -3968,7 +3968,7 @@ int32 Crypto_TM_ProcessSecurity(char* ingest, int* len_ingest) ingest[0] = ingest[0]; #ifdef DEBUG - OS_printf(KYEL "----- Crypto_TM_ProcessSecurity END -----\n" RESET); + printf(KYEL "----- Crypto_TM_ProcessSecurity END -----\n" RESET); #endif return status; @@ -3986,7 +3986,7 @@ int32 Crypto_AOS_ApplySecurity(char* ingest, int* len_ingest) int32 status = OS_SUCCESS; #ifdef DEBUG - OS_printf(KYEL "\n----- Crypto_AOS_ApplySecurity START -----\n" RESET); + printf(KYEL "\n----- Crypto_AOS_ApplySecurity START -----\n" RESET); #endif // TODO: This whole function! @@ -3994,7 +3994,7 @@ int32 Crypto_AOS_ApplySecurity(char* ingest, int* len_ingest) ingest[0] = ingest[0]; #ifdef DEBUG - OS_printf(KYEL "----- Crypto_AOS_ApplySecurity END -----\n" RESET); + printf(KYEL "----- Crypto_AOS_ApplySecurity END -----\n" RESET); #endif return status; @@ -4012,7 +4012,7 @@ int32 Crypto_AOS_ProcessSecurity(char* ingest, int* len_ingest) int32 status = OS_SUCCESS; #ifdef DEBUG - OS_printf(KYEL "\n----- Crypto_AOS_ProcessSecurity START -----\n" RESET); + printf(KYEL "\n----- Crypto_AOS_ProcessSecurity START -----\n" RESET); #endif // TODO: This whole function! @@ -4020,7 +4020,7 @@ int32 Crypto_AOS_ProcessSecurity(char* ingest, int* len_ingest) ingest[0] = ingest[0]; #ifdef DEBUG - OS_printf(KYEL "----- Crypto_AOS_ProcessSecurity END -----\n" RESET); + printf(KYEL "----- Crypto_AOS_ProcessSecurity END -----\n" RESET); #endif return status; @@ -4038,7 +4038,7 @@ int32 Crypto_ApplySecurity(char* ingest, int* len_ingest) int32 status = OS_SUCCESS; #ifdef DEBUG - OS_printf(KYEL "\n----- Crypto_ApplySecurity START -----\n" RESET); + printf(KYEL "\n----- Crypto_ApplySecurity START -----\n" RESET); #endif // TODO: This whole function! @@ -4046,7 +4046,7 @@ int32 Crypto_ApplySecurity(char* ingest, int* len_ingest) ingest[0] = ingest[0]; #ifdef DEBUG - OS_printf(KYEL "----- Crypto_ApplySecurity END -----\n" RESET); + printf(KYEL "----- Crypto_ApplySecurity END -----\n" RESET); #endif return status; @@ -4064,7 +4064,7 @@ int32 Crypto_ProcessSecurity(char* ingest, int* len_ingest) int32 status = OS_SUCCESS; #ifdef DEBUG - OS_printf(KYEL "\n----- Crypto_ProcessSecurity START -----\n" RESET); + printf(KYEL "\n----- Crypto_ProcessSecurity START -----\n" RESET); #endif // TODO: This whole function! @@ -4072,7 +4072,7 @@ int32 Crypto_ProcessSecurity(char* ingest, int* len_ingest) ingest[0] = ingest[0]; #ifdef DEBUG - OS_printf(KYEL "----- Crypto_ProcessSecurity END -----\n" RESET); + printf(KYEL "----- Crypto_ProcessSecurity END -----\n" RESET); #endif return status; diff --git a/src/src_main/crypto_print.c b/src/src_main/crypto_print.c index 723285a9..08f5eebd 100644 --- a/src/src_main/crypto_print.c +++ b/src/src_main/crypto_print.c @@ -32,27 +32,27 @@ **/ void Crypto_tcPrint(TC_t* tc_frame) { - OS_printf("Current TC in memory is: \n"); - OS_printf("\t Header\n"); - OS_printf("\t\t tfvn = 0x%01x \n", tc_frame->tc_header.tfvn); - OS_printf("\t\t bypass = 0x%01x \n", tc_frame->tc_header.bypass); - OS_printf("\t\t cc = 0x%01x \n", tc_frame->tc_header.cc); - OS_printf("\t\t spare = 0x%02x \n", tc_frame->tc_header.spare); - OS_printf("\t\t scid = 0x%03x \n", tc_frame->tc_header.scid); - OS_printf("\t\t vcid = 0x%02x \n", tc_frame->tc_header.vcid); - OS_printf("\t\t fl = 0x%03x \n", tc_frame->tc_header.fl); - OS_printf("\t\t fsn = 0x%02x \n", tc_frame->tc_header.fsn); - OS_printf("\t SDLS Header\n"); - OS_printf("\t\t sh = 0x%02x \n", tc_frame->tc_sec_header.sh); - OS_printf("\t\t spi = 0x%04x \n", tc_frame->tc_sec_header.spi); - OS_printf("\t\t iv[0] = 0x%02x \n", tc_frame->tc_sec_header.iv[0]); - OS_printf("\t Payload \n"); - OS_printf("\t\t data[0]= 0x%02x \n", tc_frame->tc_pdu[0]); - OS_printf("\t\t data[1]= 0x%02x \n", tc_frame->tc_pdu[1]); - OS_printf("\t\t data[2]= 0x%02x \n", tc_frame->tc_pdu[2]); - OS_printf("\t SDLS Trailer\n"); - OS_printf("\t\t FECF = 0x%04x \n", tc_frame->tc_sec_trailer.fecf); - OS_printf("\n"); + printf("Current TC in memory is: \n"); + printf("\t Header\n"); + printf("\t\t tfvn = 0x%01x \n", tc_frame->tc_header.tfvn); + printf("\t\t bypass = 0x%01x \n", tc_frame->tc_header.bypass); + printf("\t\t cc = 0x%01x \n", tc_frame->tc_header.cc); + printf("\t\t spare = 0x%02x \n", tc_frame->tc_header.spare); + printf("\t\t scid = 0x%03x \n", tc_frame->tc_header.scid); + printf("\t\t vcid = 0x%02x \n", tc_frame->tc_header.vcid); + printf("\t\t fl = 0x%03x \n", tc_frame->tc_header.fl); + printf("\t\t fsn = 0x%02x \n", tc_frame->tc_header.fsn); + printf("\t SDLS Header\n"); + printf("\t\t sh = 0x%02x \n", tc_frame->tc_sec_header.sh); + printf("\t\t spi = 0x%04x \n", tc_frame->tc_sec_header.spi); + printf("\t\t iv[0] = 0x%02x \n", tc_frame->tc_sec_header.iv[0]); + printf("\t Payload \n"); + printf("\t\t data[0]= 0x%02x \n", tc_frame->tc_pdu[0]); + printf("\t\t data[1]= 0x%02x \n", tc_frame->tc_pdu[1]); + printf("\t\t data[2]= 0x%02x \n", tc_frame->tc_pdu[2]); + printf("\t SDLS Trailer\n"); + printf("\t\t FECF = 0x%04x \n", tc_frame->tc_sec_trailer.fecf); + printf("\n"); } /** @@ -62,37 +62,37 @@ void Crypto_tcPrint(TC_t* tc_frame) **/ void Crypto_tmPrint(TM_t* tm_frame) { - OS_printf("Current TM in memory is: \n"); - OS_printf("\t Header\n"); - OS_printf("\t\t tfvn = 0x%01x \n", tm_frame->tm_header.tfvn); - OS_printf("\t\t scid = 0x%02x \n", tm_frame->tm_header.scid); - OS_printf("\t\t vcid = 0x%01x \n", tm_frame->tm_header.vcid); - OS_printf("\t\t ocff = 0x%01x \n", tm_frame->tm_header.ocff); - OS_printf("\t\t mcfc = 0x%02x \n", tm_frame->tm_header.mcfc); - OS_printf("\t\t vcfc = 0x%02x \n", tm_frame->tm_header.vcfc); - OS_printf("\t\t tfsh = 0x%01x \n", tm_frame->tm_header.tfsh); - OS_printf("\t\t sf = 0x%01x \n", tm_frame->tm_header.sf); - OS_printf("\t\t pof = 0x%01x \n", tm_frame->tm_header.pof); - OS_printf("\t\t slid = 0x%01x \n", tm_frame->tm_header.slid); - OS_printf("\t\t fhp = 0x%03x \n", tm_frame->tm_header.fhp); - //OS_printf("\t\t tfshvn = 0x%01x \n", tm_frame.tm_header.tfshvn); - //OS_printf("\t\t tfshlen= 0x%02x \n", tm_frame.tm_header.tfshlen); - OS_printf("\t SDLS Header\n"); - OS_printf("\t\t spi = 0x%04x \n", tm_frame->tm_sec_header.spi); - OS_printf("\t\t iv[%d] = 0x%02x \n", (IV_SIZE - 1), tm_frame->tm_sec_header.iv[IV_SIZE - 1]); - OS_printf("\t Payload \n"); - OS_printf("\t\t data[0]= 0x%02x \n", tm_frame->tm_pdu[0]); - OS_printf("\t\t data[1]= 0x%02x \n", tm_frame->tm_pdu[1]); - OS_printf("\t\t data[2]= 0x%02x \n", tm_frame->tm_pdu[2]); - OS_printf("\t\t data[3]= 0x%02x \n", tm_frame->tm_pdu[3]); - OS_printf("\t\t data[4]= 0x%02x \n", tm_frame->tm_pdu[4]); - OS_printf("\t SDLS Trailer\n"); - OS_printf("\t\t OCF[0] = 0x%02x \n", tm_frame->tm_sec_trailer.ocf[0]); - OS_printf("\t\t OCF[1] = 0x%02x \n", tm_frame->tm_sec_trailer.ocf[1]); - OS_printf("\t\t OCF[2] = 0x%02x \n", tm_frame->tm_sec_trailer.ocf[2]); - OS_printf("\t\t OCF[3] = 0x%02x \n", tm_frame->tm_sec_trailer.ocf[3]); - OS_printf("\t\t FECF = 0x%02x \n", tm_frame->tm_sec_trailer.fecf); - OS_printf("\n"); + printf("Current TM in memory is: \n"); + printf("\t Header\n"); + printf("\t\t tfvn = 0x%01x \n", tm_frame->tm_header.tfvn); + printf("\t\t scid = 0x%02x \n", tm_frame->tm_header.scid); + printf("\t\t vcid = 0x%01x \n", tm_frame->tm_header.vcid); + printf("\t\t ocff = 0x%01x \n", tm_frame->tm_header.ocff); + printf("\t\t mcfc = 0x%02x \n", tm_frame->tm_header.mcfc); + printf("\t\t vcfc = 0x%02x \n", tm_frame->tm_header.vcfc); + printf("\t\t tfsh = 0x%01x \n", tm_frame->tm_header.tfsh); + printf("\t\t sf = 0x%01x \n", tm_frame->tm_header.sf); + printf("\t\t pof = 0x%01x \n", tm_frame->tm_header.pof); + printf("\t\t slid = 0x%01x \n", tm_frame->tm_header.slid); + printf("\t\t fhp = 0x%03x \n", tm_frame->tm_header.fhp); + //printf("\t\t tfshvn = 0x%01x \n", tm_frame.tm_header.tfshvn); + //printf("\t\t tfshlen= 0x%02x \n", tm_frame.tm_header.tfshlen); + printf("\t SDLS Header\n"); + printf("\t\t spi = 0x%04x \n", tm_frame->tm_sec_header.spi); + printf("\t\t iv[%d] = 0x%02x \n", (IV_SIZE - 1), tm_frame->tm_sec_header.iv[IV_SIZE - 1]); + printf("\t Payload \n"); + printf("\t\t data[0]= 0x%02x \n", tm_frame->tm_pdu[0]); + printf("\t\t data[1]= 0x%02x \n", tm_frame->tm_pdu[1]); + printf("\t\t data[2]= 0x%02x \n", tm_frame->tm_pdu[2]); + printf("\t\t data[3]= 0x%02x \n", tm_frame->tm_pdu[3]); + printf("\t\t data[4]= 0x%02x \n", tm_frame->tm_pdu[4]); + printf("\t SDLS Trailer\n"); + printf("\t\t OCF[0] = 0x%02x \n", tm_frame->tm_sec_trailer.ocf[0]); + printf("\t\t OCF[1] = 0x%02x \n", tm_frame->tm_sec_trailer.ocf[1]); + printf("\t\t OCF[2] = 0x%02x \n", tm_frame->tm_sec_trailer.ocf[2]); + printf("\t\t OCF[3] = 0x%02x \n", tm_frame->tm_sec_trailer.ocf[3]); + printf("\t\t FECF = 0x%02x \n", tm_frame->tm_sec_trailer.fecf); + printf("\n"); } /** @@ -102,22 +102,22 @@ void Crypto_tmPrint(TM_t* tm_frame) **/ void Crypto_clcwPrint(TM_FrameCLCW_t* clcw) { - OS_printf("Current CLCW in memory is: \n"); - OS_printf("\t cwt = 0x%01x \n", clcw->cwt); - OS_printf("\t cvn = 0x%01x \n", clcw->cvn); - OS_printf("\t sf = 0x%01x \n", clcw->sf); - OS_printf("\t cie = 0x%01x \n", clcw->cie); - OS_printf("\t vci = 0x%02x \n", clcw->vci); - OS_printf("\t spare0 = 0x%01x \n", clcw->spare0); - OS_printf("\t nrfa = 0x%01x \n", clcw->nrfa); - OS_printf("\t nbl = 0x%01x \n", clcw->nbl); - OS_printf("\t lo = 0x%01x \n", clcw->lo); - OS_printf("\t wait = 0x%01x \n", clcw->wait); - OS_printf("\t rt = 0x%01x \n", clcw->rt); - OS_printf("\t fbc = 0x%01x \n", clcw->fbc); - OS_printf("\t spare1 = 0x%01x \n", clcw->spare1); - OS_printf("\t rv = 0x%02x \n", clcw->rv); - OS_printf("\n"); + printf("Current CLCW in memory is: \n"); + printf("\t cwt = 0x%01x \n", clcw->cwt); + printf("\t cvn = 0x%01x \n", clcw->cvn); + printf("\t sf = 0x%01x \n", clcw->sf); + printf("\t cie = 0x%01x \n", clcw->cie); + printf("\t vci = 0x%02x \n", clcw->vci); + printf("\t spare0 = 0x%01x \n", clcw->spare0); + printf("\t nrfa = 0x%01x \n", clcw->nrfa); + printf("\t nbl = 0x%01x \n", clcw->nbl); + printf("\t lo = 0x%01x \n", clcw->lo); + printf("\t wait = 0x%01x \n", clcw->wait); + printf("\t rt = 0x%01x \n", clcw->rt); + printf("\t fbc = 0x%01x \n", clcw->fbc); + printf("\t spare1 = 0x%01x \n", clcw->spare1); + printf("\t rv = 0x%02x \n", clcw->rv); + printf("\n"); } /** @@ -127,16 +127,16 @@ void Crypto_clcwPrint(TM_FrameCLCW_t* clcw) **/ void Crypto_fsrPrint(SDLS_FSR_t* report) { - OS_printf("Current FSR in memory is: \n"); - OS_printf("\t cwt = 0x%01x \n", report->cwt); - OS_printf("\t vnum = 0x%01x \n", report->vnum); - OS_printf("\t af = 0x%01x \n", report->af); - OS_printf("\t bsnf = 0x%01x \n", report->bsnf); - OS_printf("\t bmacf = 0x%01x \n", report->bmacf); - OS_printf("\t ispif = 0x%01x \n", report->ispif); - OS_printf("\t lspiu = 0x%01x \n", report->lspiu); - OS_printf("\t snval = 0x%01x \n", report->snval); - OS_printf("\n"); + printf("Current FSR in memory is: \n"); + printf("\t cwt = 0x%01x \n", report->cwt); + printf("\t vnum = 0x%01x \n", report->vnum); + printf("\t af = 0x%01x \n", report->af); + printf("\t bsnf = 0x%01x \n", report->bsnf); + printf("\t bmacf = 0x%01x \n", report->bmacf); + printf("\t ispif = 0x%01x \n", report->ispif); + printf("\t lspiu = 0x%01x \n", report->lspiu); + printf("\t snval = 0x%01x \n", report->snval); + printf("\n"); } /** @@ -146,33 +146,33 @@ void Crypto_fsrPrint(SDLS_FSR_t* report) **/ void Crypto_ccsdsPrint(CCSDS_t* sdls_frame) { - OS_printf("Current CCSDS in memory is: \n"); - OS_printf("\t Primary Header\n"); - OS_printf("\t\t pvn = 0x%01x \n", sdls_frame->hdr.pvn); - OS_printf("\t\t type = 0x%01x \n", sdls_frame->hdr.type); - OS_printf("\t\t shdr = 0x%01x \n", sdls_frame->hdr.shdr); - OS_printf("\t\t appID = 0x%03x \n", sdls_frame->hdr.appID); - OS_printf("\t\t seq = 0x%01x \n", sdls_frame->hdr.seq); - OS_printf("\t\t pktid = 0x%04x \n", sdls_frame->hdr.pktid); - OS_printf("\t\t pkt_length = 0x%04x \n", sdls_frame->hdr.pkt_length); - OS_printf("\t PUS Header\n"); - OS_printf("\t\t shf = 0x%01x \n", sdls_frame->pus.shf); - OS_printf("\t\t pusv = 0x%01x \n", sdls_frame->pus.pusv); - OS_printf("\t\t ack = 0x%01x \n", sdls_frame->pus.ack); - OS_printf("\t\t st = 0x%02x \n", sdls_frame->pus.st); - OS_printf("\t\t sst = 0x%02x \n", sdls_frame->pus.sst); - OS_printf("\t\t sid = 0x%01x \n", sdls_frame->pus.sid); - OS_printf("\t\t spare = 0x%01x \n", sdls_frame->pus.spare); - OS_printf("\t PDU \n"); - OS_printf("\t\t type = 0x%01x \n", sdls_frame->pdu.type); - OS_printf("\t\t uf = 0x%01x \n", sdls_frame->pdu.uf); - OS_printf("\t\t sg = 0x%01x \n", sdls_frame->pdu.sg); - OS_printf("\t\t pid = 0x%01x \n", sdls_frame->pdu.pid); - OS_printf("\t\t pdu_len = 0x%04x \n", sdls_frame->pdu.pdu_len); - OS_printf("\t\t data[0] = 0x%02x \n", sdls_frame->pdu.data[0]); - OS_printf("\t\t data[1] = 0x%02x \n", sdls_frame->pdu.data[1]); - OS_printf("\t\t data[2] = 0x%02x \n", sdls_frame->pdu.data[2]); - OS_printf("\n"); + printf("Current CCSDS in memory is: \n"); + printf("\t Primary Header\n"); + printf("\t\t pvn = 0x%01x \n", sdls_frame->hdr.pvn); + printf("\t\t type = 0x%01x \n", sdls_frame->hdr.type); + printf("\t\t shdr = 0x%01x \n", sdls_frame->hdr.shdr); + printf("\t\t appID = 0x%03x \n", sdls_frame->hdr.appID); + printf("\t\t seq = 0x%01x \n", sdls_frame->hdr.seq); + printf("\t\t pktid = 0x%04x \n", sdls_frame->hdr.pktid); + printf("\t\t pkt_length = 0x%04x \n", sdls_frame->hdr.pkt_length); + printf("\t PUS Header\n"); + printf("\t\t shf = 0x%01x \n", sdls_frame->pus.shf); + printf("\t\t pusv = 0x%01x \n", sdls_frame->pus.pusv); + printf("\t\t ack = 0x%01x \n", sdls_frame->pus.ack); + printf("\t\t st = 0x%02x \n", sdls_frame->pus.st); + printf("\t\t sst = 0x%02x \n", sdls_frame->pus.sst); + printf("\t\t sid = 0x%01x \n", sdls_frame->pus.sid); + printf("\t\t spare = 0x%01x \n", sdls_frame->pus.spare); + printf("\t PDU \n"); + printf("\t\t type = 0x%01x \n", sdls_frame->pdu.type); + printf("\t\t uf = 0x%01x \n", sdls_frame->pdu.uf); + printf("\t\t sg = 0x%01x \n", sdls_frame->pdu.sg); + printf("\t\t pid = 0x%01x \n", sdls_frame->pdu.pid); + printf("\t\t pdu_len = 0x%04x \n", sdls_frame->pdu.pdu_len); + printf("\t\t data[0] = 0x%02x \n", sdls_frame->pdu.data[0]); + printf("\t\t data[1] = 0x%02x \n", sdls_frame->pdu.data[1]); + printf("\t\t data[2] = 0x%02x \n", sdls_frame->pdu.data[2]); + printf("\n"); } /** @@ -182,57 +182,57 @@ void Crypto_ccsdsPrint(CCSDS_t* sdls_frame) **/ void Crypto_saPrint(SecurityAssociation_t* sa) { - OS_printf("SA status: \n"); - OS_printf("\t spi = 0x%01x \n", sa->spi); - OS_printf("\t sa_state = 0x%01x \n", sa->sa_state); - //OS_printf("\t gvcid[0] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[0]); - //OS_printf("\t gvcid[1] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[1]); - //OS_printf("\t gvcid[2] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[2]); - //OS_printf("\t gvcid[3] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[3]); - OS_printf("\t est = 0x%01x \n", sa->est); - OS_printf("\t ast = 0x%01x \n", sa->ast); - OS_printf("\t shivf_len = 0x%02x \n", sa->shivf_len); - OS_printf("\t shsnf_len = 0x%02x \n", sa->shsnf_len); - OS_printf("\t shplf_len = 0x%01x \n", sa->shplf_len); - OS_printf("\t stmacf_len = 0x%02x \n", sa->stmacf_len); - OS_printf("\t ecs_len = 0x%02x \n", sa->ecs_len); - OS_printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE-4, sa->ecs[ECS_SIZE - 4]); - OS_printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE-3, sa->ecs[ECS_SIZE - 3]); - OS_printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE-2, sa->ecs[ECS_SIZE - 2]); - OS_printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE-1, sa->ecs[ECS_SIZE - 1]); - OS_printf("\t iv_len = 0x%02x \n", sa->shivf_len); + printf("SA status: \n"); + printf("\t spi = 0x%01x \n", sa->spi); + printf("\t sa_state = 0x%01x \n", sa->sa_state); + //printf("\t gvcid[0] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[0]); + //printf("\t gvcid[1] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[1]); + //printf("\t gvcid[2] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[2]); + //printf("\t gvcid[3] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[3]); + printf("\t est = 0x%01x \n", sa->est); + printf("\t ast = 0x%01x \n", sa->ast); + printf("\t shivf_len = 0x%02x \n", sa->shivf_len); + printf("\t shsnf_len = 0x%02x \n", sa->shsnf_len); + printf("\t shplf_len = 0x%01x \n", sa->shplf_len); + printf("\t stmacf_len = 0x%02x \n", sa->stmacf_len); + printf("\t ecs_len = 0x%02x \n", sa->ecs_len); + printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE-4, sa->ecs[ECS_SIZE - 4]); + printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE-3, sa->ecs[ECS_SIZE - 3]); + printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE-2, sa->ecs[ECS_SIZE - 2]); + printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE-1, sa->ecs[ECS_SIZE - 1]); + printf("\t iv_len = 0x%02x \n", sa->shivf_len); if(sa->iv != NULL) { for(int i = 0; i < sa->shivf_len; i++) { - OS_printf("\t iv[%d] = 0x%02x \n", i, *(sa->iv + i)); + printf("\t iv[%d] = 0x%02x \n", i, *(sa->iv + i)); } } - OS_printf("\t acs_len = 0x%02x \n", sa->acs_len); - OS_printf("\t acs = 0x%02x \n", sa->acs); - OS_printf("\t abm_len = 0x%04x \n", sa->abm_len); + printf("\t acs_len = 0x%02x \n", sa->acs_len); + printf("\t acs = 0x%02x \n", sa->acs); + printf("\t abm_len = 0x%04x \n", sa->abm_len); if(sa->abm != NULL) { - OS_printf("\t abm: \n"); + printf("\t abm: \n"); for(int i = 0; i < sa->abm_len; i++) { - OS_printf("%02x", *(sa->abm + i)); + printf("%02x", *(sa->abm + i)); } - OS_printf("\n"); + printf("\n"); } - OS_printf("\t arc_len = 0x%02x \n", sa->arc_len); + printf("\t arc_len = 0x%02x \n", sa->arc_len); if(sa->arc != NULL) { - OS_printf("\t arc: \n"); + printf("\t arc: \n"); for(int i = 0; i < sa->arc_len; i++) { - OS_printf("%02x", *(sa->arc + i)); + printf("%02x", *(sa->arc + i)); } - OS_printf("\n"); + printf("\n"); } - OS_printf("\t arcw_len = 0x%02x \n", sa->arcw_len); - OS_printf("\t arcw = 0x%d \n", sa->arcw); + printf("\t arcw_len = 0x%02x \n", sa->arcw_len); + printf("\t arcw = 0x%d \n", sa->arcw); } /** @@ -277,12 +277,12 @@ void Crypto_mpPrint(GvcidManagedParameters_t* managed_parameters, uint8 print_ch //Prints the currently configured Managed Parameters { if(managed_parameters != NULL){ - OS_printf("Managed Parameter: \n"); - OS_printf("\t tfvn: %d", managed_parameters->tfvn); - OS_printf("\t scid: %d", managed_parameters->scid); - OS_printf("\t vcid: %d", managed_parameters->vcid); - OS_printf("\t has_fecf: %d", managed_parameters->has_fecf); - OS_printf("\t has_segmentation_headers: %d\n", managed_parameters->has_segmentation_hdr); + printf("Managed Parameter: \n"); + printf("\t tfvn: %d", managed_parameters->tfvn); + printf("\t scid: %d", managed_parameters->scid); + printf("\t vcid: %d", managed_parameters->vcid); + printf("\t has_fecf: %d", managed_parameters->has_fecf); + printf("\t has_segmentation_headers: %d\n", managed_parameters->has_segmentation_hdr); } if(managed_parameters->next!=NULL && print_children!=0){ Crypto_mpPrint(managed_parameters->next,print_children); diff --git a/src/src_main/sadb_routine_inmemory.template.c b/src/src_main/sadb_routine_inmemory.template.c index 686f1ab9..738c626e 100644 --- a/src/src_main/sadb_routine_inmemory.template.c +++ b/src/src_main/sadb_routine_inmemory.template.c @@ -281,7 +281,7 @@ static int32 sadb_get_sa_from_spi(uint16 spi,SecurityAssociation_t** security_as if(sa[spi].iv == NULL && ( sa[spi].ast == 1 || sa[spi].est == 1 )) { return CRYPTO_LIB_ERR_NULL_IV; } //Must have IV if doing encryption or authentication if(sa[spi].abm == NULL && sa[spi].ast) { return CRYPTO_LIB_ERR_NULL_ABM; } //Must have IV if doing encryption or authentication #ifdef SA_DEBUG - OS_printf(KYEL "DEBUG - Printing local copy of SA Entry for current SPI.\n" RESET); + printf(KYEL "DEBUG - Printing local copy of SA Entry for current SPI.\n" RESET); Crypto_saPrint(*security_association); #endif return status; @@ -311,7 +311,7 @@ static int32 sadb_get_operational_sa_from_gvcid(uint8 tfvn,uint16 scid,uint16 vc if(sa[i].abm == NULL && sa[i].ast) { return CRYPTO_LIB_ERR_NULL_ABM; } //Must have IV if doing encryption or authentication #ifdef SA_DEBUG - OS_printf("Valid operational SA found at index %d.\n", i); + printf("Valid operational SA found at index %d.\n", i); #endif status = CRYPTO_LIB_SUCCESS; @@ -323,7 +323,7 @@ static int32 sadb_get_operational_sa_from_gvcid(uint8 tfvn,uint16 scid,uint16 vc if (status != CRYPTO_LIB_SUCCESS) { #ifdef SA_DEBUG - OS_printf(KRED "Error - Making best attempt at a useful error code:\n\t" RESET); + printf(KRED "Error - Making best attempt at a useful error code:\n\t" RESET); #endif for (int i=0; i 0) { // Set IV - authenticated encryption @@ -620,7 +620,7 @@ static int32 sadb_sa_rekey(void) // TODO: Assuming this was fixed... *(sa[spi].iv + x - count) = (uint8) sdls_frame.pdu.data[x]; #ifdef PDU_DEBUG - OS_printf("%02x", sdls_frame.pdu.data[x]); + printf("%02x", sdls_frame.pdu.data[x]); #endif } } @@ -629,29 +629,29 @@ static int32 sadb_sa_rekey(void) // TODO } #ifdef PDU_DEBUG - OS_printf("\n"); + printf("\n"); #endif // Change to keyed state sa[spi].sa_state = SA_KEYED; #ifdef PDU_DEBUG - OS_printf("SPI %d changed to KEYED state with encrypted Key ID %d. \n", spi, sa[spi].ekid); + printf("SPI %d changed to KEYED state with encrypted Key ID %d. \n", spi, sa[spi].ekid); #endif } else { - OS_printf(KRED "ERROR: SPI %d is not in the UNKEYED state.\n" RESET, spi); + printf(KRED "ERROR: SPI %d is not in the UNKEYED state.\n" RESET, spi); } } else { - OS_printf(KRED "ERROR: SPI %d does not exist.\n" RESET, spi); + printf(KRED "ERROR: SPI %d does not exist.\n" RESET, spi); } #ifdef DEBUG - OS_printf("\t spi = %d \n", spi); - OS_printf("\t ekid = %d \n", sa[spi].ekid); - //OS_printf("\t akid = %d \n", sa[spi].akid); + printf("\t spi = %d \n", spi); + printf("\t ekid = %d \n", sa[spi].ekid); + //printf("\t akid = %d \n", sa[spi].akid); #endif return OS_SUCCESS; @@ -668,7 +668,7 @@ static int32 sadb_sa_expire(void) // Read ingest spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; - OS_printf("spi = %d \n", spi); + printf("spi = %d \n", spi); // Overwrite last PID sa[spi].lpid = (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; @@ -680,17 +680,17 @@ static int32 sadb_sa_expire(void) { // Change to 'Unkeyed' state sa[spi].sa_state = SA_UNKEYED; #ifdef PDU_DEBUG - OS_printf("SPI %d changed to UNKEYED state. \n", spi); + printf("SPI %d changed to UNKEYED state. \n", spi); #endif } else { - OS_printf(KRED "ERROR: SPI %d is not in the KEYED state.\n" RESET, spi); + printf(KRED "ERROR: SPI %d is not in the KEYED state.\n" RESET, spi); } } else { - OS_printf(KRED "ERROR: SPI %d does not exist.\n" RESET, spi); + printf(KRED "ERROR: SPI %d does not exist.\n" RESET, spi); } return OS_SUCCESS; @@ -708,7 +708,7 @@ static int32 sadb_sa_create(void) // Read sdls_frame.pdu.data spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; - OS_printf("spi = %d \n", spi); + printf("spi = %d \n", spi); // Overwrite last PID sa[spi].lpid = (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; @@ -779,7 +779,7 @@ static int32 sadb_sa_delete(void) // Read ingest spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; - OS_printf("spi = %d \n", spi); + printf("spi = %d \n", spi); // Overwrite last PID sa[spi].lpid = (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; @@ -791,19 +791,19 @@ static int32 sadb_sa_delete(void) { // Change to 'None' state sa[spi].sa_state = SA_NONE; #ifdef PDU_DEBUG - OS_printf("SPI %d changed to NONE state. \n", spi); + printf("SPI %d changed to NONE state. \n", spi); #endif // TODO: Zero entire SA } else { - OS_printf(KRED "ERROR: SPI %d is not in the UNKEYED state.\n" RESET, spi); + printf(KRED "ERROR: SPI %d is not in the UNKEYED state.\n" RESET, spi); } } else { - OS_printf(KRED "ERROR: SPI %d does not exist.\n" RESET, spi); + printf(KRED "ERROR: SPI %d does not exist.\n" RESET, spi); } return OS_SUCCESS; @@ -820,7 +820,7 @@ static int32 sadb_sa_setARSN(void) // Read ingest spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; - OS_printf("spi = %d \n", spi); + printf("spi = %d \n", spi); // TODO: Check SA type (authenticated, encrypted, both) and set appropriately // TODO: Add more checks on bounds @@ -829,7 +829,7 @@ static int32 sadb_sa_setARSN(void) if (spi < NUM_SA) { #ifdef PDU_DEBUG - OS_printf("SPI %d IV updated to: 0x", spi); + printf("SPI %d IV updated to: 0x", spi); #endif if (sa[spi].shivf_len > 0) { // Set IV - authenticated encryption @@ -837,7 +837,7 @@ static int32 sadb_sa_setARSN(void) { *(sa[spi].iv + x) = (uint8) sdls_frame.pdu.data[x + 2]; #ifdef PDU_DEBUG - OS_printf("%02x", *(sa[spi].iv + x)); + printf("%02x", *(sa[spi].iv + x)); #endif } Crypto_increment(sa[spi].iv, sa[spi].shivf_len); @@ -847,12 +847,12 @@ static int32 sadb_sa_setARSN(void) // TODO } #ifdef PDU_DEBUG - OS_printf("\n"); + printf("\n"); #endif } else { - OS_printf("sadb_sa_setARSN ERROR: SPI %d does not exist.\n", spi); + printf("sadb_sa_setARSN ERROR: SPI %d does not exist.\n", spi); } return OS_SUCCESS; @@ -869,7 +869,7 @@ static int32 sadb_sa_setARSNW(void) // Read ingest spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; - OS_printf("spi = %d \n", spi); + printf("spi = %d \n", spi); // Check SPI exists if (spi < NUM_SA) @@ -889,7 +889,7 @@ static int32 sadb_sa_setARSNW(void) } else { - OS_printf("sadb_sa_setARSNW ERROR: SPI %d does not exist.\n", spi); + printf("sadb_sa_setARSNW ERROR: SPI %d does not exist.\n", spi); } return OS_SUCCESS; @@ -908,7 +908,7 @@ static int32 sadb_sa_status(char* ingest) // Read ingest spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; - OS_printf("spi = %d \n", spi); + printf("spi = %d \n", spi); // Check SPI exists if (spi < NUM_SA) @@ -924,7 +924,7 @@ static int32 sadb_sa_status(char* ingest) } else { - OS_printf("sadb_sa_status ERROR: SPI %d does not exist.\n", spi); + printf("sadb_sa_status ERROR: SPI %d does not exist.\n", spi); } #ifdef SA_DEBUG From e2be3464d88d5bac65083434857e676b862ad906 Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 07:50:30 -0500 Subject: [PATCH 08/18] #1 - Replace CFE_PSP_* with standard calls; --- include/cfe_minimum.h | 50 ------------------------------------------- include/crypto.h | 3 ++- src/src_main/crypto.c | 20 ++++++++--------- 3 files changed, 12 insertions(+), 61 deletions(-) delete mode 100644 include/cfe_minimum.h diff --git a/include/cfe_minimum.h b/include/cfe_minimum.h deleted file mode 100644 index 20b2d001..00000000 --- a/include/cfe_minimum.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -** Minimal port of https://github.com/nasa-itc/cFE/blob/master/fsw/cfe-core/src/inc/cfe.h -** needed to build standalone crypto library. -** -** Copyright (c) 2006-2019 United States Government as represented by -** the Administrator of the National Aeronautics and Space Administration. -** 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. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License 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. -*/ - -/* -** File: cfe.h -** -** Purpose: cFE header file -** -** Author: David Kobe, the Hammers Company, Inc. -** -** Notes: This header file centralizes the includes for all cFE -** Applications. It includes all header files necessary -** to completely define the cFE interface. -** -*/ - -/*************************************************************************/ - -/* -** Ensure that header is included only once... -*/ -#ifndef _cfe_minimum_ -#define _cfe_minimum_ - -#include "common_types_minimum.h" -#include "osapi_minimum.h" - -#define CFE_PSP_MemCpy memcpy -#define CFE_PSP_MemSet memset -#define printf printf - -#endif /* _cfe_ */ diff --git a/include/crypto.h b/include/crypto.h index bf749055..3ef36033 100644 --- a/include/crypto.h +++ b/include/crypto.h @@ -25,7 +25,8 @@ #ifdef NOS3 //NOS3/cFS build is ready #include "cfe.h" #else //Assume build outside of NOS3/cFS infrastructure -#include "cfe_minimum.h" +#include "common_types_minimum.h" +#include "osapi_minimum.h" #endif #include "crypto_structs.h" diff --git a/src/src_main/crypto.c b/src/src_main/crypto.c index 9684a044..0ed473f4 100644 --- a/src/src_main/crypto.c +++ b/src/src_main/crypto.c @@ -1221,7 +1221,7 @@ static int32 Crypto_window(uint8 *actual, uint8 *expected, int length, int windo int result = 0; uint8 temp[length]; - CFE_PSP_MemCpy(temp, expected, length); + memcpy(temp, expected, length); for (int i = 0; i < window; i++) { @@ -2791,10 +2791,10 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len status = OS_ERROR; return status; } - CFE_PSP_MemSet(p_new_enc_frame, 0, *p_enc_frame_len); + memset(p_new_enc_frame, 0, *p_enc_frame_len); // Copy original TF header - CFE_PSP_MemCpy(p_new_enc_frame, p_in_frame, TC_FRAME_PRIMARYHEADER_STRUCT_SIZE); + memcpy(p_new_enc_frame, p_in_frame, TC_FRAME_PRIMARYHEADER_STRUCT_SIZE); // Set new TF Header length // Recall: Length field is one minus total length per spec @@ -2904,7 +2904,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len tf_payload_len = temp_tc_header.fl - TC_FRAME_HEADER_SIZE - segment_hdr_len - fecf_len + 1; //if no FECF //tf_payload_len = temp_tc_header.fl - TC_FRAME_PRIMARYHEADER_STRUCT_SIZE; - CFE_PSP_MemCpy((p_new_enc_frame+index), (p_in_frame+TC_FRAME_PRIMARYHEADER_STRUCT_SIZE), tf_payload_len); + memcpy((p_new_enc_frame+index), (p_in_frame+TC_FRAME_PRIMARYHEADER_STRUCT_SIZE), tf_payload_len); //index += tf_payload_len; /* @@ -3657,7 +3657,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) gcry_cipher_hd_t tmp_hd; gcry_error_t gcry_error = GPG_ERR_NO_ERROR; - CFE_PSP_MemSet(&tempTM, 0, TM_SIZE); + memset(&tempTM, 0, TM_SIZE); #ifdef DEBUG printf(KYEL "\n----- Crypto_TM_ApplySecurity START -----\n" RESET); @@ -3735,7 +3735,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) // Security Header tempTM[count++] = (uint8) ((spi & 0xFF00) >> 8); tempTM[count++] = (uint8) ((spi & 0x00FF)); - CFE_PSP_MemCpy(tm_frame.tm_sec_header.iv, sa_ptr->iv, sa_ptr->shivf_len); + memcpy(tm_frame.tm_sec_header.iv, sa_ptr->iv, sa_ptr->shivf_len); // Padding Length pad_len = Crypto_Get_tmLength(*len_ingest) - TM_MIN_SIZE + IV_SIZE + TM_PAD_SIZE - *len_ingest; @@ -3796,7 +3796,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) printf(KBLU "Creating a TM - CLEAR! \n" RESET); #endif // Copy temporary frame to ingest - CFE_PSP_MemCpy(ingest, tempTM, count); + memcpy(ingest, tempTM, count); } // Authenticated Encryption else if ((sa_ptr->est == 1) && @@ -3807,7 +3807,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) #endif // Copy TM to ingest - CFE_PSP_MemCpy(ingest, tempTM, pdu_loc); + memcpy(ingest, tempTM, pdu_loc); #ifdef MAC_DEBUG printf("AAD = 0x"); @@ -3923,7 +3923,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) printf(KBLU "Creating a TM - AUTHENTICATED! \n" RESET); #endif // TODO: Future work. Operationally same as clear. - CFE_PSP_MemCpy(ingest, tempTM, count); + memcpy(ingest, tempTM, count); } // Encryption else if ((sa_ptr->est == 1) && @@ -3933,7 +3933,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) printf(KBLU "Creating a TM - ENCRYPTED! \n" RESET); #endif // TODO: Future work. Operationally same as clear. - CFE_PSP_MemCpy(ingest, tempTM, count); + memcpy(ingest, tempTM, count); } #ifdef TM_DEBUG From f62a087916ca4a632d42dc7e529a616f88fd9ff5 Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 08:09:14 -0500 Subject: [PATCH 09/18] #1 - Replaced with standard types; --- include/common_types_minimum.h | 66 --- include/crypto.h | 38 +- include/crypto_config_structs.h | 20 +- include/crypto_print.h | 2 +- include/crypto_structs.h | 280 ++++----- include/itc_common_types_minimum.h | 41 -- include/osapi_minimum.h | 3 +- include/sadb_routine.h | 34 +- src/crypto_util/include/shared_util.h | 10 +- src/crypto_util/src/shared_util.c | 44 +- src/crypto_util/util/apply_security.c | 14 +- src/crypto_util/util/crypto_sequence.c | 12 +- src/crypto_util/util/et_dt_validation.c | 344 +++++------ src/crypto_util/util/process_security.c | 8 +- src/crypto_util/util/ut_tc_apply.c | 74 +-- src/src_main/crypto.c | 538 +++++++++--------- src/src_main/crypto_print.c | 6 +- src/src_main/sadb_routine.c | 4 +- src/src_main/sadb_routine_inmemory.template.c | 192 +++---- src/src_mysql/sadb_routine_mariadb.template.c | 128 ++--- 20 files changed, 875 insertions(+), 983 deletions(-) delete mode 100644 include/common_types_minimum.h delete mode 100644 include/itc_common_types_minimum.h diff --git a/include/common_types_minimum.h b/include/common_types_minimum.h deleted file mode 100644 index 7d0c28dc..00000000 --- a/include/common_types_minimum.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Minimal port of https://github.com/nasa-itc/osal/blob/master/src/os/inc/common_types.h - * needed to build standalone crypto library. - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License 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. - */ - -/* - * Filename: common_types.h - * - * Purpose: - * Unit specification for common types. - * - * Design Notes: - * Assumes make file has defined processor family - * - * References: - * Flight Software Branch C Coding Standard Version 1.0a - * - * Notes: - */ - -#ifndef _common_types_minimum_ -#define _common_types_minimum_ - -#ifdef __cplusplus - extern "C" { -#endif - -#include - -/* - * NOTE - NOT DEFINING STRUCT_LOW_BIT_FIRST or STRUCT_HIGH_BIT_FIRST - * We should not make assumptions about the bit order here - */ - - typedef int8_t int8; - typedef int16_t int16; - typedef int32_t int32; - typedef int64_t int64; - typedef uint8_t uint8; - typedef uint16_t uint16; - typedef uint32_t uint32; - typedef uint64_t uint64; - typedef intptr_t intptr; - - -#ifdef __cplusplus - } -#endif - -#endif /* _common_types_ */ diff --git a/include/crypto.h b/include/crypto.h index 3ef36033..7870034e 100644 --- a/include/crypto.h +++ b/include/crypto.h @@ -25,7 +25,7 @@ #ifdef NOS3 //NOS3/cFS build is ready #include "cfe.h" #else //Assume build outside of NOS3/cFS infrastructure -#include "common_types_minimum.h" +#include #include "osapi_minimum.h" #endif @@ -42,39 +42,39 @@ */ // Crypto Library Configuration functions -extern int32 Crypto_Config_CryptoLib(uint8 sadb_type, uint8 crypto_create_fecf, uint8 process_sdls_pdus, uint8 has_pus_hdr, uint8 ignore_sa_state, uint8 ignore_anti_replay, uint8 unique_sa_per_mapid, uint8 crypto_check_fecf, uint8 vcid_bitmask); -extern int32 Crypto_Config_MariaDB(char* mysql_username, char* mysql_password, char* mysql_hostname, char* mysql_database, uint16 mysql_port); -extern int32 Crypto_Config_Add_Gvcid_Managed_Parameter(uint8 tfvn, uint16 scid, uint8 vcid, uint8 has_fecf, uint8 has_segmentation_hdr); +extern int32_t Crypto_Config_CryptoLib(uint8_t sadb_type, uint8_t crypto_create_fecf, uint8_t process_sdls_pdus, uint8_t has_pus_hdr, uint8_t ignore_sa_state, uint8_t ignore_anti_replay, uint8_t unique_sa_per_mapid, uint8_t crypto_check_fecf, uint8_t vcid_bitmask); +extern int32_t Crypto_Config_MariaDB(uint8_t* mysql_username, uint8_t* mysql_password, uint8_t* mysql_hostname, uint8_t* mysql_database, uint16_t mysql_port); +extern int32_t Crypto_Config_Add_Gvcid_Managed_Parameter(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, uint8_t has_segmentation_hdr); // Initialization -extern int32 Crypto_Init(void); // Initialize CryptoLib After Configuration Calls -extern int32 Crypto_Init_With_Configs(CryptoConfig_t* crypto_config_p,GvcidManagedParameters_t* gvcid_managed_parameters_p,SadbMariaDBConfig_t* sadb_mariadb_config_p); // Initialize CryptoLib With Application Defined Configuration -extern int32 Crypto_Init_Unit_Test(void); // Initialize CryptoLib with unit test default Configurations +extern int32_t Crypto_Init(void); // Initialize CryptoLib After Configuration Calls +extern int32_t Crypto_Init_With_Configs(CryptoConfig_t* crypto_config_p,GvcidManagedParameters_t* gvcid_managed_parameters_p,SadbMariaDBConfig_t* sadb_mariadb_config_p); // Initialize CryptoLib With Application Defined Configuration +extern int32_t Crypto_Init_Unit_Test(void); // Initialize CryptoLib with unit test default Configurations // Cleanup -extern int32 Crypto_Shutdown(void); // Free all allocated memory +extern int32_t Crypto_Shutdown(void); // Free all allocated memory // Telecommand (TC) -extern int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_length, \ - uint8 **pp_enc_frame, uint16 *p_enc_frame_len); -extern int32 Crypto_TC_ProcessSecurity(char* ingest, int* len_ingest, TC_t* tc_sdls_processed_frame); +extern int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_frame_length, \ + uint8_t **pp_enc_frame, uint16_t *p_enc_frame_len); +extern int32_t Crypto_TC_ProcessSecurity(uint8_t* ingest, int* len_ingest, TC_t* tc_sdls_processed_frame); // Telemetry (TM) -extern int32 Crypto_TM_ApplySecurity(char* ingest, int* len_ingest); -extern int32 Crypto_TM_ProcessSecurity(char* ingest, int* len_ingest); +extern int32_t Crypto_TM_ApplySecurity(uint8_t* ingest, int* len_ingest); +extern int32_t Crypto_TM_ProcessSecurity(uint8_t* ingest, int* len_ingest); // Advanced Orbiting Systems (AOS) -extern int32 Crypto_AOS_ApplySecurity(char* ingest, int* len_ingest); -extern int32 Crypto_AOS_ProcessSecurity(char* ingest, int* len_ingest); +extern int32_t Crypto_AOS_ApplySecurity(uint8_t* ingest, int* len_ingest); +extern int32_t Crypto_AOS_ProcessSecurity(uint8_t* ingest, int* len_ingest); // Security Functions -extern int32 Crypto_ApplySecurity(char* ingest, int* len_ingest); -extern int32 Crypto_ProcessSecurity(char* ingest, int* len_ingest); +extern int32_t Crypto_ApplySecurity(uint8_t* ingest, int* len_ingest); +extern int32_t Crypto_ProcessSecurity(uint8_t* ingest, int* len_ingest); // Data stores used in multiple components extern CCSDS_t sdls_frame; extern TM_t tm_frame; extern crypto_key_t ek_ring[NUM_KEYS]; // Assisting functions used in multiple components -extern uint8 Crypto_Prep_Reply(char* ingest, uint8 appID); -extern int32 Crypto_increment(uint8 *num, int length); +extern uint8_t Crypto_Prep_Reply(uint8_t* ingest, uint8_t appID); +extern int32_t Crypto_increment(uint8_t *num, int length); //Global configuration structs extern CryptoConfig_t* crypto_config; diff --git a/include/crypto_config_structs.h b/include/crypto_config_structs.h index e6474ff8..86ea749e 100644 --- a/include/crypto_config_structs.h +++ b/include/crypto_config_structs.h @@ -22,7 +22,7 @@ ivv-itc@lists.nasa.gov #ifdef NOS3 //NOS3/cFS build is ready #include "common_types.h" #else //Assume build outside of NOS3/cFS infrastructure -#include "common_types_minimum.h" +#include #endif //main config enums @@ -51,15 +51,15 @@ typedef struct TcIgnoreAntiReplay ignore_anti_replay; TcUniqueSaPerMapId unique_sa_per_mapid; TcCheckFecfBool crypto_check_fecf; - uint8 vcid_bitmask; + uint8_t vcid_bitmask; } CryptoConfig_t; #define CRYPTO_CONFIG_SIZE (sizeof(CryptoConfig_t)) typedef struct _GvcidManagedParameters_t GvcidManagedParameters_t; struct _GvcidManagedParameters_t{ - uint8 tfvn :4; // Transfer Frame Version Number - uint16 scid :10; //SpacecraftID - uint8 vcid :6; //Virtual Channel ID + uint8_t tfvn :4; // Transfer Frame Version Number + uint16_t scid :10; //SpacecraftID + uint8_t vcid :6; //Virtual Channel ID TcFecfPresent has_fecf; TcSegmentHdrsPresent has_segmentation_hdr; GvcidManagedParameters_t* next; //Will be a list of managed parameters! @@ -71,11 +71,11 @@ struct _GvcidManagedParameters_t{ */ typedef struct { - char* mysql_username; - char* mysql_password; - char* mysql_hostname; - char* mysql_database; - uint16 mysql_port; + uint8_t* mysql_username; + uint8_t* mysql_password; + uint8_t* mysql_hostname; + uint8_t* mysql_database; + uint16_t mysql_port; } SadbMariaDBConfig_t; #define SADB_MARIADB_CONFIG_SIZE (sizeof(SadbMariaDBConfig_t)) diff --git a/include/crypto_print.h b/include/crypto_print.h index 01bcc607..3e5e2ba0 100644 --- a/include/crypto_print.h +++ b/include/crypto_print.h @@ -36,5 +36,5 @@ void Crypto_ccsdsPrint(CCSDS_t* sdls_frame); void Crypto_saPrint(SecurityAssociation_t* sa); void Crypto_hexprint(void *c, size_t n); void Crypto_binprint(void *c, size_t n); -void Crypto_mpPrint(GvcidManagedParameters_t* managed_parameters,uint8 print_children); +void Crypto_mpPrint(GvcidManagedParameters_t* managed_parameters,uint8_t print_children); #endif diff --git a/include/crypto_structs.h b/include/crypto_structs.h index eeaacd81..4fbca9ed 100644 --- a/include/crypto_structs.h +++ b/include/crypto_structs.h @@ -23,7 +23,7 @@ #ifdef NOS3 //NOS3/cFS build is ready #include "common_types.h" #else //Assume build outside of NOS3/cFS infrastructure -#include "common_types_minimum.h" +#include #endif /* @@ -31,17 +31,17 @@ */ typedef struct { - uint8 value[KEY_SIZE]; - uint8 key_state:4; + uint8_t value[KEY_SIZE]; + uint8_t key_state:4; } crypto_key_t; #define CRYPTO_KEY_SIZE (sizeof(crypto_key_t)) typedef struct { // Global Virtual Channel ID / Global MAP ID - uint8 tfvn : 4; // Transfer Frame Version Number - uint16 scid : 16; // Spacecraft ID - uint16 vcid : 6; // Virtual Channel ID - uint8 mapid : 6; // Multiplexer Access Point ID + uint8_t tfvn : 4; // Transfer Frame Version Number + uint16_t scid : 16; // Spacecraft ID + uint16_t vcid : 6; // Virtual Channel ID + uint8_t mapid : 6; // Multiplexer Access Point ID } crypto_gvcid_t; #define CRYPTO_GVCID_SIZE (sizeof(crypto_gvcid_t)) @@ -51,32 +51,32 @@ typedef struct typedef struct { // Status - uint16 spi; //Security Parameter Index - uint16 ekid; // Encryption Key ID - uint16 akid; // Authentication Key ID - uint8 sa_state:2; + uint16_t spi; //Security Parameter Index + uint16_t ekid; // Encryption Key ID + uint16_t akid; // Authentication Key ID + uint8_t sa_state:2; crypto_gvcid_t gvcid_tc_blk; crypto_gvcid_t gvcid_tm_blk[NUM_GVCID]; - uint8 lpid; + uint8_t lpid; // Configuration - uint8 est :1; // Encryption Service Type - uint8 ast :1; // Authentication Service Type - uint8 shivf_len:6; // Sec. Header IV Field Length - uint8 shsnf_len:6; // Sec. Header SN Field Length - uint8 shplf_len:2; // Sec. Header PL Field Length - uint8 stmacf_len:8; // Sec. Trailer MAC Field Length - uint8 ecs_len :8; // Encryption Cipher Suite Length - uint8 ecs[ECS_SIZE]; // Encryption Cipher Suite (algorithm / mode ID) - uint8* iv; // Initialization Vector - uint8 acs_len :8; // Authentication Cipher Suite Length - uint8 acs :8; // Authentication Cipher Suite (algorithm / mode ID) - uint16 abm_len :16; // Authentication Bit Mask Length - uint8* abm; // Authentication Bit Mask (Primary Hdr. through Security Hdr.) - uint8 arc_len :8; // Anti-Replay Counter Length - uint8* arc; // Anti-Replay Counter - uint8 arcw_len:8; // Anti-Replay Counter Window Length - uint16 arcw; // Anti-Replay Counter Window + uint8_t est :1; // Encryption Service Type + uint8_t ast :1; // Authentication Service Type + uint8_t shivf_len:6; // Sec. Header IV Field Length + uint8_t shsnf_len:6; // Sec. Header SN Field Length + uint8_t shplf_len:2; // Sec. Header PL Field Length + uint8_t stmacf_len:8; // Sec. Trailer MAC Field Length + uint8_t ecs_len :8; // Encryption Cipher Suite Length + uint8_t ecs[ECS_SIZE]; // Encryption Cipher Suite (algorithm / mode ID) + uint8_t* iv; // Initialization Vector + uint8_t acs_len :8; // Authentication Cipher Suite Length + uint8_t acs :8; // Authentication Cipher Suite (algorithm / mode ID) + uint16_t abm_len :16; // Authentication Bit Mask Length + uint8_t* abm; // Authentication Bit Mask (Primary Hdr. through Security Hdr.) + uint8_t arc_len :8; // Anti-Replay Counter Length + uint8_t* arc; // Anti-Replay Counter + uint8_t arcw_len:8; // Anti-Replay Counter Window Length + uint16_t arcw; // Anti-Replay Counter Window } SecurityAssociation_t; #define SA_SIZE (sizeof(SecurityAssociation_t)) @@ -86,48 +86,48 @@ typedef struct */ typedef struct { - uint8 cwt :1; // Control Word Type - uint8 vnum :3; // FSR Version Number - uint8 af :1; // Alarm Field - uint8 bsnf :1; // Bad SN Flag - uint8 bmacf :1; // Bad MAC Flag - uint8 ispif :1; // Invalid SPI Flag - uint16 lspiu :16; // Last SPI Used - uint8 snval :8; // SN Value (LSB) + uint8_t cwt :1; // Control Word Type + uint8_t vnum :3; // FSR Version Number + uint8_t af :1; // Alarm Field + uint8_t bsnf :1; // Bad SN Flag + uint8_t bmacf :1; // Bad MAC Flag + uint8_t ispif :1; // Invalid SPI Flag + uint16_t lspiu :16; // Last SPI Used + uint8_t snval :8; // SN Value (LSB) } SDLS_FSR_t; #define SDLS_FSR_SIZE (sizeof(SDLS_FSR_t)) typedef struct { - uint8 type :1; // Procedure Type Flag - uint8 uf :1; // User Flag - uint8 sg :2; // Service Group Field - uint8 pid :4; // Procedure Identification Field - uint16 pdu_len :16; // EP Data Field Length - BITS - uint8 data[TLV_DATA_SIZE]; + uint8_t type :1; // Procedure Type Flag + uint8_t uf :1; // User Flag + uint8_t sg :2; // Service Group Field + uint8_t pid :4; // Procedure Identification Field + uint16_t pdu_len :16; // EP Data Field Length - BITS + uint8_t data[TLV_DATA_SIZE]; } SDLS_TLV_t; #define SDLS_TLV_SIZE (sizeof(SDLS_TLV_t)) typedef struct { - uint16 ekid; // Encrypted Key ID - uint8 ek[KEY_SIZE]; // Encrypted Key - //uint8 ekcrc[4]; // Encrypted Key CRC + uint16_t ekid; // Encrypted Key ID + uint8_t ek[KEY_SIZE]; // Encrypted Key + //uint8_t ekcrc[4]; // Encrypted Key CRC } SDLS_EKB_t; #define SDLS_EKB_SIZE (sizeof(SDLS_EKB_t)) typedef struct { - uint16 mkid; // Master Key ID - uint8 iv[IV_SIZE]; // Initialization Vector + uint16_t mkid; // Master Key ID + uint8_t iv[IV_SIZE]; // Initialization Vector SDLS_EKB_t EKB[30]; // Encrypted Key Block - uint8 mac[MAC_SIZE]; // Message Authentication Code + uint8_t mac[MAC_SIZE]; // Message Authentication Code } SDLS_OTAR_t; #define SDLS_OTAR_SIZE (sizeof(SDLS_OTAR_t)) typedef struct { - uint16 kid :16; // Key ID + uint16_t kid :16; // Key ID } SDLS_KEY_t; #define SDLS_KEY_SIZE (sizeof(SDLS_KEY_t)) @@ -139,15 +139,15 @@ typedef struct typedef struct { - uint16 kid_first :16; // First Key ID - uint16 kid_last :16; // Last Key ID + uint16_t kid_first :16; // First Key ID + uint16_t kid_last :16; // Last Key ID } SDLS_KEY_INVENTORY_t; #define SDLS_KEY_INVENTORY_SIZE (sizeof(SDLS_KEY_INVENTORY_t)) typedef struct { - uint16 kid :16; // Key ID - uint8 challenge[CHALLENGE_SIZE]; // Key Challenge + uint16_t kid :16; // Key ID + uint8_t challenge[CHALLENGE_SIZE]; // Key Challenge } SDLS_KEYV_CMD_BLK_t; #define SDLS_KEYV_CMD_BLK_SIZE (sizeof(SDLS_KEYV_CMD_BLK_t)) @@ -159,10 +159,10 @@ typedef struct typedef struct { - uint16 kid :16; // Key ID - uint8 iv[IV_SIZE]; // Key Initialization Vector - uint8 challenged[CHALLENGE_SIZE]; // Encrypted Challenge - uint8 cmac[CHALLENGE_MAC_SIZE]; // Challenge Message Authentication Code + uint16_t kid :16; // Key ID + uint8_t iv[IV_SIZE]; // Key Initialization Vector + uint8_t challenged[CHALLENGE_SIZE]; // Encrypted Challenge + uint8_t cmac[CHALLENGE_MAC_SIZE]; // Challenge Message Authentication Code } SDLS_KEYV_RPLY_BLK_t; #define SDLS_KEYV_RPLY_BLK_SIZE (sizeof(SDLS_KEYV_RPLY_BLK_t)) @@ -174,39 +174,39 @@ typedef struct typedef struct { - uint16 kid :16; // Key ID - uint8 challenged[10]; + uint16_t kid :16; // Key ID + uint8_t challenged[10]; } SDLS_KEYDB_CMD_t; #define SDLS_KEYDB_CMD_SIZE (sizeof(SDLS_KEYDB_CMD_t)) typedef struct { - uint16 kid :16; // Key ID - uint8 iv[IV_SIZE]; // Initialization Vector - uint8 challenged[10]; // Encrypted Challenge - uint8 cmac[4]; // Challenge Message Authentication Code + uint16_t kid :16; // Key ID + uint8_t iv[IV_SIZE]; // Initialization Vector + uint8_t challenged[10]; // Encrypted Challenge + uint8_t cmac[4]; // Challenge Message Authentication Code } SDLS_KEYDB_RPLY_t; #define SDLS_KEYDB_RPLY_SIZE (sizeof(SDLS_KEYDB_RPLY_t)) typedef struct { - uint16 spi :16; // Security Parameter Index - uint8 lpid :8; // Procedure ID from Last State Transition + uint16_t spi :16; // Security Parameter Index + uint8_t lpid :8; // Procedure ID from Last State Transition } SDLS_SA_STATUS_RPLY_t; #define SDLS_SA_STATUS_RPLY_SIZE (sizeof(SDLS_SA_STATUS_RPLY_t)) typedef struct { - uint16 num_se; // Number of Security Events - uint16 rs; // Remaining Space + uint16_t num_se; // Number of Security Events + uint16_t rs; // Remaining Space } SDLS_MC_LOG_RPLY_t; #define SDLS_MC_LOG_RPLY_SIZE (sizeof(SDLS_MC_LOG_RPLY_t)) typedef struct { - uint8 emt :8; // Event Message Tag - uint16 em_len :16; // Event Message Length - uint8 emv[EMV_SIZE]; // Event Message Value + uint8_t emt :8; // Event Message Tag + uint16_t em_len :16; // Event Message Length + uint8_t emv[EMV_SIZE]; // Event Message Value } SDLS_MC_DUMP_RPLY_t; #define SDLS_MC_DUMP_RPLY_SIZE (sizeof(SDLS_MC_DUMP_RPLY_t)) @@ -218,13 +218,13 @@ typedef struct typedef struct { - uint8 str :8; // Self-Test Result + uint8_t str :8; // Self-Test Result } SDLS_MC_ST_RPLY_t; #define SDLS_MC_ST_RPLY_SIZE (sizeof(SDLS_MC_ST_RPLY_t)) typedef struct { - uint8 snv[SN_SIZE]; // Sequence Number Value + uint8_t snv[SN_SIZE]; // Sequence Number Value } SDLS_MC_SN_RPLY_t; #define SDLS_MC_SN_RPLY_SIZE (sizeof(SDLS_MC_SN_RPLY_t)) @@ -235,37 +235,37 @@ typedef struct //typedef struct __attribute__ ((packed)) //__attribute__ ((packed)) is not easily supported in CFFI python. Only add when CFFI properly supports packed & nonpacked structs. typedef struct { - uint8 tfvn :2; // Transfer Frame Version Number - uint8 bypass :1; // Bypass + uint8_t tfvn :2; // Transfer Frame Version Number + uint8_t bypass :1; // Bypass // 0 = Type A: Sequence Check, Acknowledgement // 1 = Type B: Checks are bypassed - uint8 cc :1; // Control Command + uint8_t cc :1; // Control Command // 0 = Type D: Transfer Frame is Data Unit // 1 = Type C: Contron Command (for COP) - uint8 spare :2; // Reserved Spare - Shall be 00 - uint16 scid :10; // Spacecraft ID + uint8_t spare :2; // Reserved Spare - Shall be 00 + uint16_t scid :10; // Spacecraft ID // Master Channel ID (MCID) = TFVN + SCID - uint8 vcid :6; // Virtual Channel ID - uint16 fl :10; // The whole transfer frame length (max 1024) - uint8 fsn :8; // Frame sequence number, also N(S), zeroed on Type-B frames + uint8_t vcid :6; // Virtual Channel ID + uint16_t fl :10; // The whole transfer frame length (max 1024) + uint8_t fsn :8; // Frame sequence number, also N(S), zeroed on Type-B frames } TC_FramePrimaryHeader_t; #define TC_FRAME_PRIMARYHEADER_STRUCT_SIZE (sizeof(TC_FramePrimaryHeader_t)) #define TC_FRAME_HEADER_SIZE 5 typedef struct { - uint8 sh:TC_SH_SIZE; // Segment Header - uint16 spi; // Security Parameter Index - uint8 iv[IV_SIZE]; // Initialization Vector for encryption - uint8 sn[TC_SN_SIZE]; // Sequence Number for anti-replay - uint8 pad[TC_PAD_SIZE]; // Count of the used fill Bytes + uint8_t sh:TC_SH_SIZE; // Segment Header + uint16_t spi; // Security Parameter Index + uint8_t iv[IV_SIZE]; // Initialization Vector for encryption + uint8_t sn[TC_SN_SIZE]; // Sequence Number for anti-replay + uint8_t pad[TC_PAD_SIZE]; // Count of the used fill Bytes } TC_FrameSecurityHeader_t; #define TC_FRAME_SECHEADER_SIZE (sizeof(TC_FrameSecurityHeader_t)) typedef struct { - uint8 mac[MAC_SIZE]; // Message Authentication Code - uint16 fecf; // Frame Error Control Field + uint8_t mac[MAC_SIZE]; // Message Authentication Code + uint16_t fecf; // Frame Error Control Field } TC_FrameSecurityTrailer_t; #define TC_FRAME_SECTRAILER_SIZE (sizeof(TC_FrameSecurityTrailer_t)) @@ -273,8 +273,8 @@ typedef struct { TC_FramePrimaryHeader_t tc_header; TC_FrameSecurityHeader_t tc_sec_header; - uint8 tc_pdu[TC_FRAME_DATA_SIZE]; - uint16 tc_pdu_len; + uint8_t tc_pdu[TC_FRAME_DATA_SIZE]; + uint16_t tc_pdu_len; TC_FrameSecurityTrailer_t tc_sec_trailer; } TC_t; #define TC_SIZE (sizeof(TC_t)) @@ -284,32 +284,32 @@ typedef struct */ typedef struct { - uint8 pvn :3; // Packet Version Number - uint8 type :1; // Type = 1 - uint8 shdr :1; // Data Field Header Flag - uint16 appID :11; // Application ID - uint8 seq :2; // Sequence Flags - uint16 pktid :14; // Sequence Count - uint16 pkt_length :16; // Packet Length + uint8_t pvn :3; // Packet Version Number + uint8_t type :1; // Type = 1 + uint8_t shdr :1; // Data Field Header Flag + uint16_t appID :11; // Application ID + uint8_t seq :2; // Sequence Flags + uint16_t pktid :14; // Sequence Count + uint16_t pkt_length :16; // Packet Length } CCSDS_HDR_t; #define CCSDS_HDR_SIZE (sizeof(CCSDS_HDR_t)) typedef struct { - uint8 shf :1; // Secondary Header Flag - uint8 pusv :3; // TC Packet PUS Version Number - uint8 ack :4; // Acknowledgement - uint8 st :8; // Service Type - uint8 sst :8; // Service Subtype - uint8 sid :4; // Source ID - uint8 spare :4; + uint8_t shf :1; // Secondary Header Flag + uint8_t pusv :3; // TC Packet PUS Version Number + uint8_t ack :4; // Acknowledgement + uint8_t st :8; // Service Type + uint8_t sst :8; // Service Subtype + uint8_t sid :4; // Source ID + uint8_t spare :4; } CCSDS_PUS_t; #define CCSDS_PUS_SIZE (sizeof(CCSDS_PUS_t)) /* unused? typedef struct { - uint8 CmdHeader[CFE_SB_CMD_HDR_SIZE]; + uint8_t CmdHeader[CFE_SB_CMD_HDR_SIZE]; } Crypto_NoArgsCmd_t; */ @@ -328,63 +328,63 @@ typedef struct */ typedef struct { - uint8 tfvn :2; // Transfer Frame Version Number - uint16 scid :10; // Spacecraft ID - uint8 vcid :3; // Virtual Channel ID - uint8 ocff :1; // Describes wether OCF is present or not - uint8 mcfc :8; // Master Channel Frame Count (modulo-256) - uint8 vcfc :8; // Virtual Channel Frame Count (modulo-256) - uint8 tfsh :1; // Transfer Frame Secondary Header - uint8 sf :1; // Sync Flag + uint8_t tfvn :2; // Transfer Frame Version Number + uint16_t scid :10; // Spacecraft ID + uint8_t vcid :3; // Virtual Channel ID + uint8_t ocff :1; // Describes wether OCF is present or not + uint8_t mcfc :8; // Master Channel Frame Count (modulo-256) + uint8_t vcfc :8; // Virtual Channel Frame Count (modulo-256) + uint8_t tfsh :1; // Transfer Frame Secondary Header + uint8_t sf :1; // Sync Flag // 0 = Payload is either idle data or octet synchronized forward-ordered packets // 1 = Data is a virtual channel access data unit - uint8 pof :1; // Packet Order Flag + uint8_t pof :1; // Packet Order Flag // 0 = Shall be set to 0 // Sync Flag 1 = Undefined - uint8 slid :2; // Segment Length ID + uint8_t slid :2; // Segment Length ID // Sync Flag 0 = Shall be 11 // Sync Flag 1 = Undefined - uint16 fhp :11; // First Header Pointer + uint16_t fhp :11; // First Header Pointer // Sync Flag 0 = Contains position of the first byte of the first packet in the data field // Sync Flag 1 = undefined - //uint8 tfshvn :2; // Transfer Frame Secondary Header Version Number - shall be 00 - //uint8 tfshlen :6; // TFSH Length (max 64 Bytes) + //uint8_t tfshvn :2; // Transfer Frame Secondary Header Version Number - shall be 00 + //uint8_t tfshlen :6; // TFSH Length (max 64 Bytes) } TM_FramePrimaryHeader_t; #define TM_FRAME_PRIMARYHEADER_SIZE (sizeof(TM_FramePrimaryHeader_t)) typedef struct { - uint16 spi; // Security Parameter Index - uint8 iv[IV_SIZE]; // Initialization Vector for encryption - //uint8 sn[TM_SN_SIZE]; // Sequence Number for anti-replay - //uint8 pad[TM_PAD_SIZE]; // Count of the used fill Bytes + uint16_t spi; // Security Parameter Index + uint8_t iv[IV_SIZE]; // Initialization Vector for encryption + //uint8_t sn[TM_SN_SIZE]; // Sequence Number for anti-replay + //uint8_t pad[TM_PAD_SIZE]; // Count of the used fill Bytes } TM_FrameSecurityHeader_t; #define TM_FRAME_SECHEADER_SIZE (sizeof(TM_FrameSecurityHeader_t)) typedef struct { - uint8 mac[MAC_SIZE]; // Message Authentication Code - uint8 ocf[OCF_SIZE]; // Operational Control Field - uint16 fecf; // Frame Error Control Field + uint8_t mac[MAC_SIZE]; // Message Authentication Code + uint8_t ocf[OCF_SIZE]; // Operational Control Field + uint16_t fecf; // Frame Error Control Field } TM_FrameSecurityTrailer_t; #define TM_FRAME_SECTRAILER_SIZE (sizeof(TM_FrameSecurityTrailer_t)) typedef struct { - uint8 cwt :1; // Control Word Type "0" - uint8 cvn :2; // CLCW Version Number "00" - uint8 sf :3; // Status Field - uint8 cie :2; // COP In Effect - uint8 vci :6; // Virtual Channel Identification - uint8 spare0 :2; // Reserved Spare - uint8 nrfa :1; // No RF Avaliable Flag - uint8 nbl :1; // No Bit Lock Flag - uint8 lo :1; // Lock-Out Flag - uint8 wait :1; // Wait Flag - uint8 rt :1; // Retransmit Flag - uint8 fbc :2; // FARM-B Counter - uint8 spare1 :1; // Reserved Spare - uint8 rv :8; // Report Value + uint8_t cwt :1; // Control Word Type "0" + uint8_t cvn :2; // CLCW Version Number "00" + uint8_t sf :3; // Status Field + uint8_t cie :2; // COP In Effect + uint8_t vci :6; // Virtual Channel Identification + uint8_t spare0 :2; // Reserved Spare + uint8_t nrfa :1; // No RF Avaliable Flag + uint8_t nbl :1; // No Bit Lock Flag + uint8_t lo :1; // Lock-Out Flag + uint8_t wait :1; // Wait Flag + uint8_t rt :1; // Retransmit Flag + uint8_t fbc :2; // FARM-B Counter + uint8_t spare1 :1; // Reserved Spare + uint8_t rv :8; // Report Value } TM_FrameCLCW_t; #define TM_FRAME_CLCW_SIZE (sizeof(TM_FrameCLCW_t)) @@ -392,7 +392,7 @@ typedef struct { TM_FramePrimaryHeader_t tm_header; TM_FrameSecurityHeader_t tm_sec_header; - uint8 tm_pdu[TM_FRAME_DATA_SIZE]; + uint8_t tm_pdu[TM_FRAME_DATA_SIZE]; TM_FrameSecurityTrailer_t tm_sec_trailer; } TM_t; #define TM_SIZE (sizeof(TM_t)) diff --git a/include/itc_common_types_minimum.h b/include/itc_common_types_minimum.h deleted file mode 100644 index 77793147..00000000 --- a/include/itc_common_types_minimum.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Minimal port of https://github.com/nasa-itc/osal/blob/master/src/os/inc/common_types.h - * needed to build standalone crypto library. - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License 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. - */ -#ifndef _itc_common_types_minimum_ -#define _itc_common_types_minimum_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include - -typedef uintptr_t cpuaddr; -typedef size_t cpusize; -typedef ptrdiff_t cpudiff; - -#ifdef __cplusplus -} -#endif - - -#endif //itc_common_types_minimum_.h diff --git a/include/osapi_minimum.h b/include/osapi_minimum.h index 53ee60cb..de4bb39a 100644 --- a/include/osapi_minimum.h +++ b/include/osapi_minimum.h @@ -25,8 +25,7 @@ #include #include - -#include "common_types_minimum.h" +#include #ifdef __cplusplus extern "C" { diff --git a/include/sadb_routine.h b/include/sadb_routine.h index 838ecb04..f749bfd9 100644 --- a/include/sadb_routine.h +++ b/include/sadb_routine.h @@ -19,7 +19,7 @@ #include "common_types.h" #include "osapi.h" #else //Assume build outside of NOS3/cFS infrastructure -#include "common_types_minimum.h" +#include #include "osapi_minimum.h" #endif @@ -27,28 +27,28 @@ typedef struct { // Security Association Initialization & Management Functions - int32 (*sadb_config)(void); - int32 (*sadb_init)(void); - int32 (*sadb_close)(void); + int32_t (*sadb_config)(void); + int32_t (*sadb_init)(void); + int32_t (*sadb_close)(void); // Security Association Interaction Functions - int32 (*sadb_get_sa_from_spi)(uint16,SecurityAssociation_t**); - int32 (*sadb_get_operational_sa_from_gvcid)(uint8,uint16,uint16,uint8,SecurityAssociation_t**); - int32 (*sadb_save_sa)(SecurityAssociation_t*); + int32_t (*sadb_get_sa_from_spi)(uint16_t,SecurityAssociation_t**); + int32_t (*sadb_get_operational_sa_from_gvcid)(uint8_t,uint16_t,uint16_t,uint8_t,SecurityAssociation_t**); + int32_t (*sadb_save_sa)(SecurityAssociation_t*); // Security Association Utility Functions - int32 (*sadb_sa_stop)(void); - int32 (*sadb_sa_start)(TC_t* tc_frame); - int32 (*sadb_sa_expire)(void); - int32 (*sadb_sa_rekey)(void); - int32 (*sadb_sa_status)(char*); - int32 (*sadb_sa_create)(void); - int32 (*sadb_sa_setARSN)(void); - int32 (*sadb_sa_setARSNW)(void); - int32 (*sadb_sa_delete)(void); + int32_t (*sadb_sa_stop)(void); + int32_t (*sadb_sa_start)(TC_t* tc_frame); + int32_t (*sadb_sa_expire)(void); + int32_t (*sadb_sa_rekey)(void); + int32_t (*sadb_sa_status)(uint8_t*); + int32_t (*sadb_sa_create)(void); + int32_t (*sadb_sa_setARSN)(void); + int32_t (*sadb_sa_setARSNW)(void); + int32_t (*sadb_sa_delete)(void); } SadbRoutineStruct, *SadbRoutine; SadbRoutine get_sadb_routine_mariadb(void); SadbRoutine get_sadb_routine_inmemory(void); -SadbRoutine init_parse_sadb_routine(char *); +SadbRoutine init_parse_sadb_routine(uint8_t *); #endif //CRYPTOLIB_SADB_ROUTINE_H diff --git a/src/crypto_util/include/shared_util.h b/src/crypto_util/include/shared_util.h index 9137f55e..6841d21d 100644 --- a/src/crypto_util/include/shared_util.h +++ b/src/crypto_util/include/shared_util.h @@ -29,13 +29,13 @@ extern "C" { #include "osapi_minimum.h" -char * c_read_file(const char * f_name, long * f_size); +uint8_t * c_read_file(const uint8_t * f_name, long * f_size); -void debug_printf(const char* format, ...); -void debug_hexprintf(const char* bin_data,int size_bin_data); +void debug_printf(const uint8_t* format, ...); +void debug_hexprintf(const uint8_t* bin_data,int size_bin_data); -void hex_conversion(char *buffer_h, uint8 **buffer_b, int *buffer_b_length); -int convert_hexstring_to_byte_array(char* source_str, uint8* dest_buffer); +void hex_conversion(uint8_t *buffer_h, uint8_t **buffer_b, int *buffer_b_length); +int convert_hexstring_to_byte_array(uint8_t* source_str, uint8_t* dest_buffer); #ifdef __cplusplus } /* Close scope of 'extern "C"' declaration which encloses file. */ diff --git a/src/crypto_util/src/shared_util.c b/src/crypto_util/src/shared_util.c index a828162f..4ac1b3a1 100644 --- a/src/crypto_util/src/shared_util.c +++ b/src/crypto_util/src/shared_util.c @@ -23,14 +23,14 @@ /** * @brief Function: c_read_file - * Reads a file from disk into a char * buffer. - * @param f_name: const char*, file name & path to be read + * Reads a file from disk into a uint8_t * buffer. + * @param f_name: const uint8_t*, file name & path to be read * @param f_size: long* - * @return malloc'd char* containing the contents of the buffer. + * @return malloc'd uint8_t* containing the contents of the buffer. * @note This buffer is NOT null terminated and must be free()'d. **/ -char * c_read_file(const char * f_name, long * f_size) { - char* buffer=0; +uint8_t * c_read_file(const uint8_t * f_name, long * f_size) { + uint8_t* buffer=0; long length; FILE* f = fopen(f_name,"rb"); if (f){ @@ -56,14 +56,14 @@ char * c_read_file(const char * f_name, long * f_size) { /** * @brief Function: convert_hexstring_to_byte_array * Converts hexstring based character array to a byte array - * @param source_str: char*, The source character array in hex format to be converted - * @param dest_buffer: uint8*, The destination uint8 array from which the hex array will be converted to bytes + * @param source_str: uint8_t*, The source character array in hex format to be converted + * @param dest_buffer: uint8*, The destination uint8_t array from which the hex array will be converted to bytes * @return int length of dest_buffer **/ -int convert_hexstring_to_byte_array(char* source_str, uint8* dest_buffer) +int convert_hexstring_to_byte_array(uint8_t* source_str, uint8_t* dest_buffer) { - char *line = source_str; - char *data = line; + uint8_t *line = source_str; + uint8_t *data = line; int offset; int read_byte; int data_len = 0; @@ -78,17 +78,17 @@ int convert_hexstring_to_byte_array(char* source_str, uint8* dest_buffer) /** * @brief Function: hex_conversion - * Makes use of the convert_hexstring_to_byte_array(char* source_str, uint8* dest_buffer) function to malloc the approrpiate destination buffer + * Makes use of the convert_hexstring_to_byte_array(uint8_t* source_str, uint8_t* dest_buffer) function to malloc the approrpiate destination buffer * As well as to make the function call as well. - * @param buffer_h: char*, The incoming hexstyle character array. + * @param buffer_h: uint8_t*, The incoming hexstyle character array. * @param buffer_b: uint**, The resulting byte array. * @param buffer_b_length: int*, The resulting length of the new buffer_b array. * @note buffer_b is not null terminated, and must be free()'d by the user. **/ -void hex_conversion(char *buffer_h, uint8 **buffer_b, int *buffer_b_length) +void hex_conversion(uint8_t *buffer_h, uint8_t **buffer_b, int *buffer_b_length) { // Convert input plaintext - *buffer_b = (uint8*)malloc((strlen(buffer_h) / 2) * sizeof(uint8)); + *buffer_b = (uint8_t*)malloc((strlen(buffer_h) / 2) * sizeof(uint8_t)); *buffer_b_length = convert_hexstring_to_byte_array(buffer_h, *buffer_b); } @@ -97,7 +97,7 @@ void hex_conversion(char *buffer_h, uint8 **buffer_b, int *buffer_b_length) * @brief Function: debug_printf * Formatted debug print statement **/ -void debug_printf(const char *format, ...) +void debug_printf(const uint8_t *format, ...) { va_list args; fprintf(stderr, "DEBUG - "); @@ -106,7 +106,7 @@ void debug_printf(const char *format, ...) va_end(args); } #else -void debug_printf(const char* format, ...) { +void debug_printf(const uint8_t* format, ...) { //Do nothing, DEBUG preprocessor disabled. } #endif @@ -115,16 +115,16 @@ void debug_printf(const char* format, ...) { /** * @brief Function: debug_hexprintf * Used to print hexlike byte array. - * @param bin_data: char*, Incoming Binary data + * @param bin_data: uint8_t*, Incoming Binary data * @param size_bin_data: int, Size of bin_data **/ -void debug_hexprintf(const char *bin_data, int size_bin_data) +void debug_hexprintf(const uint8_t *bin_data, int size_bin_data) { //https://stackoverflow.com/questions/6357031/how-do-you-convert-a-byte-array-to-a-hexadecimal-string-in-c //https://stackoverflow.com/questions/5040920/converting-from-signed-char-to-unsigned-char-and-back-again - unsigned char* u_bin_data = (unsigned char*)bin_data; - unsigned char output[(size_bin_data*2)+1]; - char *ptr = &output[0]; + uint8_t* u_bin_data = (uint8_t*)bin_data; + uint8_t output[(size_bin_data*2)+1]; + uint8_t *ptr = &output[0]; int i; for(i=0; i < size_bin_data; i++){ ptr += sprintf(ptr,"%02X",u_bin_data[i]); @@ -132,7 +132,7 @@ void debug_hexprintf(const char *bin_data, int size_bin_data) debug_printf("%s\n",output); } #else -void debug_hexprintf(const char* bin_data, int size_bin_data) { +void debug_hexprintf(const uint8_t* bin_data, int size_bin_data) { //Do nothing, DEBUG preprocessor disabled. } #endif diff --git a/src/crypto_util/util/apply_security.c b/src/crypto_util/util/apply_security.c index 06206a16..fc12312a 100644 --- a/src/crypto_util/util/apply_security.c +++ b/src/crypto_util/util/apply_security.c @@ -21,11 +21,11 @@ #include "apply_security.h" -int main(int argc, char *argv[]) { - char *buffer; - char const *filename; +int main(int argc, uint8_t *argv[]) { + uint8_t *buffer; + uint8_t const *filename; long buffer_size; - char *security_type; + uint8_t *security_type; if (argc == 3) { security_type = argv[1]; @@ -40,7 +40,7 @@ int main(int argc, char *argv[]) { } buffer = c_read_file(filename,&buffer_size); debug_printf("File buffer size:%lu\n",buffer_size); - uint32 buffer_size_i = (uint32) buffer_size; + uint32_t buffer_size_i = (uint32_t) buffer_size; debug_printf("File buffer size int:%d\n",buffer_size_i); debug_printf("File content: \n"); debug_hexprintf(buffer,buffer_size_i); @@ -48,8 +48,8 @@ int main(int argc, char *argv[]) { //Setup & Initialize CryptoLib Crypto_Init(); - uint8 * ptr_enc_frame = NULL; - uint16 enc_frame_len; + uint8_t * ptr_enc_frame = NULL; + uint16_t enc_frame_len; //Call ApplySecurity on buffer contents depending on type. if (strcmp(security_type,"tc")==0){ diff --git a/src/crypto_util/util/crypto_sequence.c b/src/crypto_util/util/crypto_sequence.c index 0f86fe52..8c20d907 100644 --- a/src/crypto_util/util/crypto_sequence.c +++ b/src/crypto_util/util/crypto_sequence.c @@ -22,11 +22,11 @@ #include "crypto_sequence.h" -int main(int argc, char *argv[]) { - char *buffer; - char const *filename; +int main(int argc, uint8_t *argv[]) { + uint8_t *buffer; + uint8_t const *filename; long buffer_size; - char *security_type; + uint8_t *security_type; if (argc < 3 || argc % 2 == 0) { fprintf(stderr,"Command line usage: \n"\ @@ -42,8 +42,8 @@ int main(int argc, char *argv[]) { Crypto_Init(); int arg_index = 0; - uint8 * ptr_enc_frame = NULL; - uint16 enc_frame_len; + uint8_t * ptr_enc_frame = NULL; + uint16_t enc_frame_len; while(arg_index != argc-1){ security_type = argv[++arg_index]; diff --git a/src/crypto_util/util/et_dt_validation.c b/src/crypto_util/util/et_dt_validation.c index 44e38e6a..fbac5c59 100644 --- a/src/crypto_util/util/et_dt_validation.c +++ b/src/crypto_util/util/et_dt_validation.c @@ -56,9 +56,9 @@ int EndPython() * @param bitmask Hexstring of the bitmask that will be used on the header * @param expected Ouput character array that will be allocated within this function. Memory must be freed upon completion of test. * @param expected_length The length of the expected character array that is set within this function - * @note The uint8** expected that is passsed to this function must be freed by the user upon completion of unit test or other call. + * @note The uint8_t** expected that is passsed to this function must be freed by the user upon completion of unit test or other call. **/ -void python_auth_encryption(char* data, char* key, char* iv, char* header, char* bitmask, uint8** expected, long* expected_length) +void python_auth_encryption(uint8_t* data, uint8_t* key, uint8_t* iv, uint8_t* header, uint8_t* bitmask, uint8_t** expected, long* expected_length) { Py_Initialize(); PyRun_SimpleString("import sys\nsys.path.append('../../test')"); @@ -92,16 +92,16 @@ void python_auth_encryption(char* data, char* key, char* iv, char* header, char* long temp_length = PyLong_AsLong(pValue); *expected_length = temp_length; pValue = PyObject_CallMethod(pInstance, "get_results", NULL); - char* temp_expected = PyBytes_AsString(pValue); - *expected= (uint8*)malloc(sizeof(uint8) * (int)*expected_length); + uint8_t* temp_expected = PyBytes_AsString(pValue); + *expected= (uint8_t*)malloc(sizeof(uint8_t) * (int)*expected_length); memcpy(*expected, temp_expected, (int)*expected_length); return; } /** * @brief Validation Test: Authorized Encryption using Python Truth Data - * Utilizes the python_auth_encryption(char* data, char* key, char* iv, char* header, char* bitmask, uint8** expected, long* expected_length) function to create baseline truth data. This data is then compared against the - * generated tag and cipher text that is generated by the Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_length, uint8 **pp_in_frame, uint16 *p_enc_frame_len) function, as well as the FECF. + * Utilizes the python_auth_encryption(uint8_t* data, uint8_t* key, uint8_t* iv, uint8_t* header, uint8_t* bitmask, uint8_t** expected, long* expected_length) function to create baseline truth data. This data is then compared against the + * generated tag and cipher text that is generated by the Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_frame_length, uint8_t **pp_in_frame, uint16_t *p_enc_frame_len) function, as well as the FECF. **/ UTEST(ET_VALIDATION, AUTH_ENCRYPTION_TEST) { @@ -109,27 +109,27 @@ UTEST(ET_VALIDATION, AUTH_ENCRYPTION_TEST) Crypto_Init_Unit_Test(); SadbRoutine sadb_routine = get_sadb_routine_inmemory(); - uint8* expected = NULL; + uint8_t* expected = NULL; long expected_length = 0; - char *activate_sa4_h = "2003002000ff000100001880d2c9000e197f0b001b0004000400003040d95ea61a"; - char *enc_test_ping_h = "2003041600ff1880d2ca0008197f0b0031000039c5082d"; + uint8_t *activate_sa4_h = "2003002000ff000100001880d2c9000e197f0b001b0004000400003040d95ea61a"; + uint8_t *enc_test_ping_h = "2003041600ff1880d2ca0008197f0b0031000039c5082d"; - uint8 *activate_sa4_b, *enc_test_ping_b = NULL; + uint8_t *activate_sa4_b, *enc_test_ping_b = NULL; int activate_sa4_len, enc_test_ping_len = 0; hex_conversion(activate_sa4_h, &activate_sa4_b, &activate_sa4_len); hex_conversion(enc_test_ping_h, &enc_test_ping_b, &enc_test_ping_len); SecurityAssociation_t* test_association = NULL; - test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(unsigned char)); + test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); - uint8 *ptr_enc_frame = NULL; - uint16 enc_frame_len = 0; - int32 return_val = -1; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len = 0; + int32_t return_val = -1; TC_t *tc_sdls_processed_frame; - tc_sdls_processed_frame = malloc(sizeof(uint8) * TC_SIZE); - memset(tc_sdls_processed_frame, 0, (sizeof(uint8) * TC_SIZE)); + tc_sdls_processed_frame = malloc(sizeof(uint8_t) * TC_SIZE); + memset(tc_sdls_processed_frame, 0, (sizeof(uint8_t) * TC_SIZE)); // Ensure that Process Security can activate SA 4 return_val = Crypto_TC_ProcessSecurity(activate_sa4_b, &activate_sa4_len, tc_sdls_processed_frame); printf("Verifying TC_Process Return Value\n"); @@ -147,7 +147,7 @@ UTEST(ET_VALIDATION, AUTH_ENCRYPTION_TEST) test_association->est = 1; test_association->sa_state = SA_OPERATIONAL; - int32 ret_status = Crypto_TC_ApplySecurity(enc_test_ping_b, enc_test_ping_len, &ptr_enc_frame, &enc_frame_len); + int32_t ret_status = Crypto_TC_ApplySecurity(enc_test_ping_b, enc_test_ping_len, &ptr_enc_frame, &enc_frame_len); // Get Truth Baseline python_auth_encryption("1880d2ca0008197f0b0031000039c5", "FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210", "000000000000000000000001", "2003043400FF0004", "00", &expected, &expected_length); @@ -166,8 +166,8 @@ UTEST(ET_VALIDATION, AUTH_ENCRYPTION_TEST) /** * @brief Validation Test: Authorized Decryption - * Makes use of truth data created from the previous AUTH_ENCRYPTION_TEST, to validate that Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_processed_frame) - * properly decrypts data and returns it to the intial truth data created by the python_auth_encryption(char* data, char* key, char* iv, char* header, char* bitmask, uint8** expected, long* expected_length) function. + * Makes use of truth data created from the previous AUTH_ENCRYPTION_TEST, to validate that Crypto_TC_ProcessSecurity( uint8_t* ingest, int* len_ingest,TC_t* tc_sdls_processed_frame) + * properly decrypts data and returns it to the intial truth data created by the python_auth_encryption(uint8_t* data, uint8_t* key, uint8_t* iv, uint8_t* header, uint8_t* bitmask, uint8_t** expected, long* expected_length) function. **/ UTEST(DT_VALIDATION, AUTH_DECRYPTION_TEST) { @@ -175,11 +175,11 @@ UTEST(DT_VALIDATION, AUTH_DECRYPTION_TEST) Crypto_Init_Unit_Test(); SadbRoutine sadb_routine = get_sadb_routine_inmemory(); - char *activate_sa4_h = "2003002000ff000100001880d2c9000e197f0b001b0004000400003040d95ea61a"; - char *dec_test_ping_h = "2003043400FF00040000000000000000000000017E1D8EEA8D45CEBA17888E0CDCD747DC78E5F372F997F2A63AA5DFC168395DC987"; - char *enc_test_ping_h = "1880d2ca0008197f0b0031000039c5"; + uint8_t *activate_sa4_h = "2003002000ff000100001880d2c9000e197f0b001b0004000400003040d95ea61a"; + uint8_t *dec_test_ping_h = "2003043400FF00040000000000000000000000017E1D8EEA8D45CEBA17888E0CDCD747DC78E5F372F997F2A63AA5DFC168395DC987"; + uint8_t *enc_test_ping_h = "1880d2ca0008197f0b0031000039c5"; - uint8 *activate_sa4_b, *dec_test_ping_b, *enc_test_ping_b = NULL; + uint8_t *activate_sa4_b, *dec_test_ping_b, *enc_test_ping_b = NULL; int activate_sa4_len, dec_test_ping_len, enc_test_ping_len = 0; hex_conversion(activate_sa4_h, &activate_sa4_b, &activate_sa4_len); @@ -187,13 +187,13 @@ UTEST(DT_VALIDATION, AUTH_DECRYPTION_TEST) hex_conversion(enc_test_ping_h, &enc_test_ping_b, &enc_test_ping_len); SecurityAssociation_t* test_association = NULL; - test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(unsigned char)); + test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); - int32 return_val = -1; + int32_t return_val = -1; TC_t *tc_sdls_processed_frame; - tc_sdls_processed_frame = malloc(sizeof(uint8) * TC_SIZE); - memset(tc_sdls_processed_frame, 0, (sizeof(uint8) * TC_SIZE)); + tc_sdls_processed_frame = malloc(sizeof(uint8_t) * TC_SIZE); + memset(tc_sdls_processed_frame, 0, (sizeof(uint8_t) * TC_SIZE)); // Ensure that Process Security can activate SA 4 return_val = Crypto_TC_ProcessSecurity(activate_sa4_b, &activate_sa4_len, tc_sdls_processed_frame); @@ -246,8 +246,8 @@ UTEST(DT_VALIDATION, AUTH_DECRYPTION_TEST) **/ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) { - uint8 *ptr_enc_frame = NULL; - uint16 enc_frame_len = 0; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib //Crypto_Init_Unit_Test(); Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); @@ -258,16 +258,16 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - char *buffer_nist_key_h = "ef9f9284cf599eac3b119905a7d18851e7e374cf63aea04358586b0f757670f8"; - char *buffer_nist_pt_h = "2003001600722ee47da4b77424733546c2d400c4e567a8"; - char *buffer_nist_iv_h = "b6ac8e4963f49207ffd6374c"; - char *buffer_nist_ct_h = "1224dfefb72a20d49e09256908874979"; - uint8 *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; + uint8_t *buffer_nist_key_h = "ef9f9284cf599eac3b119905a7d18851e7e374cf63aea04358586b0f757670f8"; + uint8_t *buffer_nist_pt_h = "2003001600722ee47da4b77424733546c2d400c4e567a8"; + uint8_t *buffer_nist_iv_h = "b6ac8e4963f49207ffd6374c"; + uint8_t *buffer_nist_ct_h = "1224dfefb72a20d49e09256908874979"; + uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; // Expose/setup SAs for testing SecurityAssociation_t* test_association = NULL; - test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(unsigned char)); + test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 sadb_routine->sadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -292,7 +292,7 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) // Calc payload index: total length - pt length - uint16 enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; + uint16_t enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; Crypto_Shutdown(); for (int i=0; isadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -383,8 +383,8 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) **/ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) { - uint8 *ptr_enc_frame = NULL; - uint16 enc_frame_len = 0; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); @@ -394,16 +394,16 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - char *buffer_nist_key_h = "e9ccd6eef27f740d1d5c70b187734e11e76a8ac0ad1702ff02180c5c1c9e5399"; - char *buffer_nist_pt_h = "2003001600419635e6e12b257a8ecae411f94480ff56be"; - char *buffer_nist_iv_h = "1af2613c4184dbd101fcedce"; - char *buffer_nist_ct_h = "9cd21f414f1f54d5f6f58b1f2f77e5b6"; - uint8 *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; + uint8_t *buffer_nist_key_h = "e9ccd6eef27f740d1d5c70b187734e11e76a8ac0ad1702ff02180c5c1c9e5399"; + uint8_t *buffer_nist_pt_h = "2003001600419635e6e12b257a8ecae411f94480ff56be"; + uint8_t *buffer_nist_iv_h = "1af2613c4184dbd101fcedce"; + uint8_t *buffer_nist_ct_h = "9cd21f414f1f54d5f6f58b1f2f77e5b6"; + uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; // Expose/setup SAs for testing SecurityAssociation_t* test_association = NULL; - test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(unsigned char)); + test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 sadb_routine->sadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -428,7 +428,7 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) // Calc payload index: total length - pt length - uint16 enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; + uint16_t enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; Crypto_Shutdown(); for (int i=0; isadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -515,8 +515,8 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) **/ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_2) { - uint8 *ptr_enc_frame = NULL; - uint16 enc_frame_len = 0; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); @@ -526,16 +526,16 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_2) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - char *buffer_nist_key_h = "7ecc9dcb3d5b413cadc3af7b7812758bd869295f8aaf611ba9935de76bd87013"; - char *buffer_nist_pt_h = "200300160073d4d7984ce422ac983797c0526ac6f9446b"; - char *buffer_nist_iv_h = "6805be41e983717bf6781052"; - char *buffer_nist_ct_h = "487211dd440f4d09d00bc5c3158a822c"; - uint8 *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; + uint8_t *buffer_nist_key_h = "7ecc9dcb3d5b413cadc3af7b7812758bd869295f8aaf611ba9935de76bd87013"; + uint8_t *buffer_nist_pt_h = "200300160073d4d7984ce422ac983797c0526ac6f9446b"; + uint8_t *buffer_nist_iv_h = "6805be41e983717bf6781052"; + uint8_t *buffer_nist_ct_h = "487211dd440f4d09d00bc5c3158a822c"; + uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; // Expose/setup SAs for testing SecurityAssociation_t* test_association = NULL; - test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(unsigned char)); + test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 sadb_routine->sadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -560,7 +560,7 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_2) Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) // Calc payload index: total length - pt length - uint16 enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; + uint16_t enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; Crypto_Shutdown(); for (int i=0; isadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -647,8 +647,8 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_2) **/ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_3) { - uint8 *ptr_enc_frame = NULL; - uint16 enc_frame_len = 0; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); @@ -658,16 +658,16 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_3) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - char *buffer_nist_key_h = "a881373e248615e3d6576f5a5fb68883515ae72d6a2938e3a6f0b8dcb639c9c0"; - char *buffer_nist_pt_h = "200300160007d1dc9930e710b1ebe533c81f671101e43c"; - char *buffer_nist_iv_h = "f0b744f157087df4e41818a9"; - char *buffer_nist_ct_h = "b65a2878b9dddbd4a0204dae6a6a6fc0"; - uint8 *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; + uint8_t *buffer_nist_key_h = "a881373e248615e3d6576f5a5fb68883515ae72d6a2938e3a6f0b8dcb639c9c0"; + uint8_t *buffer_nist_pt_h = "200300160007d1dc9930e710b1ebe533c81f671101e43c"; + uint8_t *buffer_nist_iv_h = "f0b744f157087df4e41818a9"; + uint8_t *buffer_nist_ct_h = "b65a2878b9dddbd4a0204dae6a6a6fc0"; + uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; // Expose/setup SAs for testing SecurityAssociation_t* test_association = NULL; - test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(unsigned char)); + test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 sadb_routine->sadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -692,7 +692,7 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_3) Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) // Calc payload index: total length - pt length - uint16 enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; + uint16_t enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; Crypto_Shutdown(); for (int i=0; isadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -779,8 +779,8 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_3) **/ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_4) { - uint8 *ptr_enc_frame = NULL; - uint16 enc_frame_len = 0; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); @@ -790,16 +790,16 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_4) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - char *buffer_nist_key_h = "84c90349539c2a7989cb24dfae5e4182382ae94ba717d385977017f74f0d87d6"; - char *buffer_nist_pt_h = "200300160031c4e1d0ccece6b7a999bfc31f38559af5dd"; - char *buffer_nist_iv_h = "eeddeaf4355c826dfd153393"; - char *buffer_nist_ct_h = "5c6cfbdd06c19445ecf500c21aeca173"; - uint8 *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; + uint8_t *buffer_nist_key_h = "84c90349539c2a7989cb24dfae5e4182382ae94ba717d385977017f74f0d87d6"; + uint8_t *buffer_nist_pt_h = "200300160031c4e1d0ccece6b7a999bfc31f38559af5dd"; + uint8_t *buffer_nist_iv_h = "eeddeaf4355c826dfd153393"; + uint8_t *buffer_nist_ct_h = "5c6cfbdd06c19445ecf500c21aeca173"; + uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; // Expose/setup SAs for testing SecurityAssociation_t* test_association = NULL; - test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(unsigned char)); + test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 sadb_routine->sadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -824,7 +824,7 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_4) Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) // Calc payload index: total length - pt length - uint16 enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; + uint16_t enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; Crypto_Shutdown(); for (int i=0; isadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -921,8 +921,8 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_4) **/ UTEST(NIST_ENC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) { - uint8 *ptr_enc_frame = NULL; - uint16 enc_frame_len = 0; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); @@ -932,17 +932,17 @@ UTEST(NIST_ENC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - char *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; - char *buffer_nist_pt_h = "200300060028C2"; // Empty Transfer frame - char *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; - char *buffer_nist_aad_h = "b96baa8c1c75a671bfb2d08d06be5f36"; // Zeroed out by abm - char *buffer_cyber_chef_mac_h = "77e98911a1704df3d9745bc7b97cc66d"; - uint8 *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_key_b, *buffer_nist_aad_b, *buffer_cyber_chef_mac_b = NULL; + uint8_t *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; + uint8_t *buffer_nist_pt_h = "200300060028C2"; // Empty Transfer frame + uint8_t *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; + uint8_t *buffer_nist_aad_h = "b96baa8c1c75a671bfb2d08d06be5f36"; // Zeroed out by abm + uint8_t *buffer_cyber_chef_mac_h = "77e98911a1704df3d9745bc7b97cc66d"; + uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_key_b, *buffer_nist_aad_b, *buffer_cyber_chef_mac_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_key_len, buffer_nist_aad_len, buffer_cyber_chef_mac_len = 0; // Expose/setup SAs for testing SecurityAssociation_t* test_association = NULL; - test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(unsigned char)); + test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 sadb_routine->sadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -974,7 +974,7 @@ UTEST(NIST_ENC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) // Calc payload index: total length - pt length - uint16 enc_data_idx = enc_frame_len - buffer_cyber_chef_mac_len - 2; + uint16_t enc_data_idx = enc_frame_len - buffer_cyber_chef_mac_len - 2; Crypto_Shutdown(); for (int i=0; isadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -1030,7 +1030,7 @@ UTEST(NIST_ENC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) test_association->arc_len = 0; test_association->shivf_len = 12; test_association->abm_len = 1024; - memset(test_association->abm, 0xFF, (test_association->abm_len*sizeof(unsigned char))); // Bitmask + memset(test_association->abm, 0xFF, (test_association->abm_len*sizeof(uint8_t))); // Bitmask test_association->stmacf_len = 16; test_association->sa_state = SA_OPERATIONAL; @@ -1051,7 +1051,7 @@ UTEST(NIST_ENC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) // Note: For comparison, primarily interested in the MAC // Calc payload index: total length - pt length - uint16 enc_data_idx = enc_frame_len - buffer_cyber_chef_mac_len - 2; + uint16_t enc_data_idx = enc_frame_len - buffer_cyber_chef_mac_len - 2; Crypto_Shutdown(); for (int i=0; isadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -1113,7 +1113,7 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) test_association->est = 0; test_association->arc_len = 0; test_association->abm_len = 1024; - memset(test_association->abm, 0xFF, (test_association->abm_len*sizeof(unsigned char))); + memset(test_association->abm, 0xFF, (test_association->abm_len*sizeof(uint8_t))); test_association->shivf_len = 12; test_association->stmacf_len = 16; test_association->sa_state = SA_OPERATIONAL; @@ -1177,8 +1177,8 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_DATA) { // Setup & Initialize CryptoLib - uint16 enc_frame_len = 0; - int32 status; + uint16_t enc_frame_len = 0; + int32_t status; Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,1,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); @@ -1186,26 +1186,26 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_DATA) SadbRoutine sadb_routine = get_sadb_routine_inmemory(); // NIST supplied vectors - char *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; - char *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; - //char *buffer_cyber_chef_mac_h = "99eff39be8327e6950f03a329209d577"; - char *buffer_cyber_chef_mac_h = "34d0e323f5e4b80426401d4aa37930da"; - char *buffer_nist_pt_h = "722ee47da4b77424733546c2d400c4e5"; + uint8_t *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; + uint8_t *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; + //uint8_t *buffer_cyber_chef_mac_h = "99eff39be8327e6950f03a329209d577"; + uint8_t *buffer_cyber_chef_mac_h = "34d0e323f5e4b80426401d4aa37930da"; + uint8_t *buffer_nist_pt_h = "722ee47da4b77424733546c2d400c4e5"; // Create a MAC'd frame by adding our headers and a fecf // | Header | SPI | iv | plaintext | mac |fecf| - char *buffer_nist_mac_frame_h = "2003003500FF0009D79CF22D504CC793C3FB6C8A722ee47da4b77424733546c2d400c40034d0e323f5e4b80426401d4aa37930da123b"; + uint8_t *buffer_nist_mac_frame_h = "2003003500FF0009D79CF22D504CC793C3FB6C8A722ee47da4b77424733546c2d400c40034d0e323f5e4b80426401d4aa37930da123b"; - uint8 *buffer_nist_iv_b, *buffer_nist_pt_b, *buffer_nist_key_b, *buffer_cyber_chef_mac_b , *buffer_nist_mac_frame_b, *buffer_nist_cp_b = NULL; + uint8_t *buffer_nist_iv_b, *buffer_nist_pt_b, *buffer_nist_key_b, *buffer_cyber_chef_mac_b , *buffer_nist_mac_frame_b, *buffer_nist_cp_b = NULL; int buffer_nist_iv_len, buffer_nist_pt_len, buffer_nist_key_len, buffer_cyber_chef_mac_len , buffer_nist_mac_frame_len, buffer_nist_cp_len = 0; // Setup Processed Frame For Decryption TC_t *tc_nist_processed_frame; - tc_nist_processed_frame = malloc(sizeof(uint8) * TC_SIZE); + tc_nist_processed_frame = malloc(sizeof(uint8_t) * TC_SIZE); // Expose/setup SAs for testing SecurityAssociation_t* test_association = NULL; - test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(unsigned char)); + test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 sadb_routine->sadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -1215,7 +1215,7 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_DATA) test_association->est = 0; test_association->arc_len = 0; test_association->abm_len = 1024; - memset(test_association->abm, 0xFF, (test_association->abm_len*sizeof(unsigned char))); + memset(test_association->abm, 0xFF, (test_association->abm_len*sizeof(uint8_t))); test_association->shivf_len = 12; test_association->stmacf_len = 16; test_association->sa_state = SA_OPERATIONAL; @@ -1269,8 +1269,8 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_DATA) UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_MAC) { // Setup & Initialize CryptoLib - uint16 enc_frame_len = 0; - int32 status; + uint16_t enc_frame_len = 0; + int32_t status; Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,1,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); @@ -1278,26 +1278,26 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_MAC) SadbRoutine sadb_routine = get_sadb_routine_inmemory(); // NIST supplied vectors - char *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; - char *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; - //char *buffer_cyber_chef_mac_h = "99eff39be8327e6950f03a329209d577"; - char *buffer_cyber_chef_mac_h = "34d0e323f5e4b80426401d4aa37930da"; - char *buffer_nist_pt_h = "722ee47da4b77424733546c2d400c4e5"; + uint8_t *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; + uint8_t *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; + //uint8_t *buffer_cyber_chef_mac_h = "99eff39be8327e6950f03a329209d577"; + uint8_t *buffer_cyber_chef_mac_h = "34d0e323f5e4b80426401d4aa37930da"; + uint8_t *buffer_nist_pt_h = "722ee47da4b77424733546c2d400c4e5"; // Create a MAC'd frame by adding our headers and a fecf // | Header | SPI | iv | plaintext | mac |fecf| - char *buffer_nist_mac_frame_h = "2003003500FF0009D79CF22D504CC793C3FB6C8A722ee47da4b77424733546c2d400c4e534d0e323f5e4b80426401d4aa37930009f68"; + uint8_t *buffer_nist_mac_frame_h = "2003003500FF0009D79CF22D504CC793C3FB6C8A722ee47da4b77424733546c2d400c4e534d0e323f5e4b80426401d4aa37930009f68"; - uint8 *buffer_nist_iv_b, *buffer_nist_pt_b, *buffer_nist_key_b, *buffer_cyber_chef_mac_b , *buffer_nist_mac_frame_b, *buffer_nist_cp_b = NULL; + uint8_t *buffer_nist_iv_b, *buffer_nist_pt_b, *buffer_nist_key_b, *buffer_cyber_chef_mac_b , *buffer_nist_mac_frame_b, *buffer_nist_cp_b = NULL; int buffer_nist_iv_len, buffer_nist_pt_len, buffer_nist_key_len, buffer_cyber_chef_mac_len , buffer_nist_mac_frame_len, buffer_nist_cp_len = 0; // Setup Processed Frame For Decryption TC_t *tc_nist_processed_frame; - tc_nist_processed_frame = malloc(sizeof(uint8) * TC_SIZE); + tc_nist_processed_frame = malloc(sizeof(uint8_t) * TC_SIZE); // Expose/setup SAs for testing SecurityAssociation_t* test_association = NULL; - test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(unsigned char)); + test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 sadb_routine->sadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -1307,7 +1307,7 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_MAC) test_association->est = 0; test_association->arc_len = 0; test_association->abm_len = 1024; - memset(test_association->abm, 0xFF, (test_association->abm_len*sizeof(unsigned char))); + memset(test_association->abm, 0xFF, (test_association->abm_len*sizeof(uint8_t))); test_association->shivf_len = 12; test_association->stmacf_len = 16; test_association->sa_state = SA_OPERATIONAL; diff --git a/src/crypto_util/util/process_security.c b/src/crypto_util/util/process_security.c index 39a46dd5..c1c40b21 100644 --- a/src/crypto_util/util/process_security.c +++ b/src/crypto_util/util/process_security.c @@ -22,11 +22,11 @@ #include "process_security.h" -int main(int argc, char *argv[]) { - char *buffer; - char const *filename; +int main(int argc, uint8_t *argv[]) { + uint8_t *buffer; + uint8_t const *filename; long buffer_size; - char *security_type; + uint8_t *security_type; if (argc == 3) { security_type = argv[1]; diff --git a/src/crypto_util/util/ut_tc_apply.c b/src/crypto_util/util/ut_tc_apply.c index 47f4329d..706383db 100644 --- a/src/crypto_util/util/ut_tc_apply.c +++ b/src/crypto_util/util/ut_tc_apply.c @@ -34,17 +34,17 @@ UTEST(TC_APPLY_SECURITY, NO_CRYPTO_INIT) { // No Crypto_Init(), but we still Configure It; long buffer_size = 0; - char *raw_tc_sdls_ping_h = "20030015001880d2c70008197f0b00310000b1fe3128"; - uint8 *raw_tc_sdls_ping_b = NULL; + uint8_t *raw_tc_sdls_ping_h = "20030015001880d2c70008197f0b00310000b1fe3128"; + uint8_t *raw_tc_sdls_ping_b = NULL; int raw_tc_sdls_ping_len = 0; hex_conversion(raw_tc_sdls_ping_h, &raw_tc_sdls_ping_b, &raw_tc_sdls_ping_len); Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_TRUE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); - uint8 *ptr_enc_frame = NULL; - uint16 enc_frame_len = 0; - int32 return_val = CRYPTO_LIB_ERROR; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len = 0; + int32_t return_val = CRYPTO_LIB_ERROR; return_val = Crypto_TC_ApplySecurity(raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); ASSERT_EQ(CRYPTO_LIB_ERR_NO_INIT, return_val); @@ -60,16 +60,16 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_CLEAR) { //Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); - char *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; - uint8 *raw_tc_sdls_ping_b = NULL; + uint8_t *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; + uint8_t *raw_tc_sdls_ping_b = NULL; int raw_tc_sdls_ping_len = 0; hex_conversion(raw_tc_sdls_ping_h, &raw_tc_sdls_ping_b, &raw_tc_sdls_ping_len); - uint8 *ptr_enc_frame = NULL; - uint16 enc_frame_len = 0; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len = 0; - int32 return_val = CRYPTO_LIB_ERROR; + int32_t return_val = CRYPTO_LIB_ERROR; return_val = Crypto_TC_ApplySecurity(raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); Crypto_Shutdown(); @@ -85,19 +85,19 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_ENC) { //Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); - char *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; - uint8 *raw_tc_sdls_ping_b = NULL; + uint8_t *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; + uint8_t *raw_tc_sdls_ping_b = NULL; int raw_tc_sdls_ping_len = 0; SadbRoutine sadb_routine = get_sadb_routine_inmemory(); hex_conversion(raw_tc_sdls_ping_h, &raw_tc_sdls_ping_b, &raw_tc_sdls_ping_len); - uint8 *ptr_enc_frame = NULL; - uint16 enc_frame_len = 0; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len = 0; - int32 return_val = CRYPTO_LIB_ERROR; + int32_t return_val = CRYPTO_LIB_ERROR; - SecurityAssociation_t* test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(unsigned char)); + SecurityAssociation_t* test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); //Expose the SADB Security Association for test edits. sadb_routine->sadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -119,19 +119,19 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_AUTH_ENC) { //Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); - char *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; - uint8 *raw_tc_sdls_ping_b = NULL; + uint8_t *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; + uint8_t *raw_tc_sdls_ping_b = NULL; int raw_tc_sdls_ping_len = 0; SadbRoutine sadb_routine = get_sadb_routine_inmemory(); hex_conversion(raw_tc_sdls_ping_h, &raw_tc_sdls_ping_b, &raw_tc_sdls_ping_len); - uint8 *ptr_enc_frame = NULL; - uint16 enc_frame_len = 0; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len = 0; - int32 return_val = CRYPTO_LIB_ERROR; + int32_t return_val = CRYPTO_LIB_ERROR; - SecurityAssociation_t* test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(unsigned char)); + SecurityAssociation_t* test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); //Expose the SADB Security Association for test edits. sadb_routine->sadb_get_sa_from_spi(1,&test_association); test_association->sa_state = SA_NONE; @@ -154,16 +154,16 @@ UTEST(TC_APPLY_SECURITY, BAD_SPACE_CRAFT_ID) { //Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); - char *raw_tc_sdls_ping_bad_scid_h = "20010015000080d2c70008197f0b00310000b1fe3128"; - uint8 *raw_tc_sdls_ping_bad_scid_b = NULL; + uint8_t *raw_tc_sdls_ping_bad_scid_h = "20010015000080d2c70008197f0b00310000b1fe3128"; + uint8_t *raw_tc_sdls_ping_bad_scid_b = NULL; int raw_tc_sdls_ping_bad_scid_len = 0; hex_conversion(raw_tc_sdls_ping_bad_scid_h, &raw_tc_sdls_ping_bad_scid_b, &raw_tc_sdls_ping_bad_scid_len); - uint8 *ptr_enc_frame = NULL; - uint16 enc_frame_len = 0; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len = 0; - uint32 return_val = Crypto_TC_ApplySecurity(raw_tc_sdls_ping_bad_scid_b, raw_tc_sdls_ping_bad_scid_len, &ptr_enc_frame, &enc_frame_len); + uint32_t return_val = Crypto_TC_ApplySecurity(raw_tc_sdls_ping_bad_scid_b, raw_tc_sdls_ping_bad_scid_len, &ptr_enc_frame, &enc_frame_len); free(raw_tc_sdls_ping_bad_scid_b); free(ptr_enc_frame); Crypto_Shutdown(); @@ -178,15 +178,15 @@ UTEST(TC_APPLY_SECURITY, BAD_VIRTUAL_CHANNEL_ID) { //Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); - char *raw_tc_sdls_ping_bad_vcid_h = "20032015000080d2c70008197f0b00310000b1fe3128"; - uint8 *raw_tc_sdls_ping_bad_vcid_b = NULL; + uint8_t *raw_tc_sdls_ping_bad_vcid_h = "20032015000080d2c70008197f0b00310000b1fe3128"; + uint8_t *raw_tc_sdls_ping_bad_vcid_b = NULL; int raw_tc_sdls_ping_bad_vcid_len = 0; hex_conversion(raw_tc_sdls_ping_bad_vcid_h, &raw_tc_sdls_ping_bad_vcid_b, &raw_tc_sdls_ping_bad_vcid_len); - uint8 *ptr_enc_frame = NULL; - uint16 enc_frame_len = 0; - int32 return_val = CRYPTO_LIB_ERROR; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len = 0; + int32_t return_val = CRYPTO_LIB_ERROR; return_val = Crypto_TC_ApplySecurity(raw_tc_sdls_ping_bad_vcid_b, raw_tc_sdls_ping_bad_vcid_len, &ptr_enc_frame, &enc_frame_len); free(raw_tc_sdls_ping_bad_vcid_b); @@ -204,12 +204,12 @@ UTEST(TC_APPLY_SECURITY, NULL_BUFFER) //Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); long buffer_size = 0; - char *buffer = NULL; - uint16 buffer_size_i = (uint16) buffer_size; + uint8_t *buffer = NULL; + uint16_t buffer_size_i = (uint16_t) buffer_size; - uint8 *ptr_enc_frame = NULL; - uint16 enc_frame_len = 0; - int32 return_val = -1; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len = 0; + int32_t return_val = -1; return_val = Crypto_TC_ApplySecurity(buffer, buffer_size_i, &ptr_enc_frame, &enc_frame_len); diff --git a/src/src_main/crypto.c b/src/src_main/crypto.c index 0ed473f4..f3031fd7 100644 --- a/src/src_main/crypto.c +++ b/src/src_main/crypto.c @@ -46,50 +46,50 @@ static SadbRoutine sadb_routine = NULL; ** Static Prototypes */ // Assisting Functions -static int32 Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr); -static int32 Crypto_Get_tmLength(int len); -static uint8 Crypto_Is_AEAD_Algorithm(uint32 cipher_suite_id); -static uint8* Crypto_Prepare_TC_AAD(uint8* buffer, uint16 len_aad, uint8* abm_buffer); -static void Crypto_TM_updatePDU(char* ingest, int len_ingest); +static int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr); +static int32_t Crypto_Get_tmLength(int len); +static uint8_t Crypto_Is_AEAD_Algorithm(uint32_t cipher_suite_id); +static uint8_t* Crypto_Prepare_TC_AAD(uint8_t* buffer, uint16_t len_aad, uint8_t* abm_buffer); +static void Crypto_TM_updatePDU(uint8_t* ingest, int len_ingest); static void Crypto_TM_updateOCF(void); static void Crypto_Local_Config(void); static void Crypto_Local_Init(void); -//static int32 Crypto_gcm_err(int gcm_err); -static int32 Crypto_window(uint8 *actual, uint8 *expected, int length, int window); -static int32 Crypto_compare_less_equal(uint8 *actual, uint8 *expected, int length); -static int32 Crypto_FECF(int fecf, char* ingest, int len_ingest,TC_t* tc_frame); -static uint16 Crypto_Calc_FECF(char* ingest, int len_ingest); +//static int32_t Crypto_gcm_err(int gcm_err); +static int32_t Crypto_window(uint8_t *actual, uint8_t *expected, int length, int window); +static int32_t Crypto_compare_less_equal(uint8_t *actual, uint8_t *expected, int length); +static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_frame); +static uint16_t Crypto_Calc_FECF(uint8_t* ingest, int len_ingest); static void Crypto_Calc_CRC_Init_Table(void); -static uint16 Crypto_Calc_CRC16(char* data, int size); +static uint16_t Crypto_Calc_CRC16(uint8_t* data, int size); // Key Management Functions -static int32 Crypto_Key_OTAR(void); -static int32 Crypto_Key_update(uint8 state); -static int32 Crypto_Key_inventory(char*); -static int32 Crypto_Key_verify(char*,TC_t* tc_frame); +static int32_t Crypto_Key_OTAR(void); +static int32_t Crypto_Key_update(uint8_t state); +static int32_t Crypto_Key_inventory(uint8_t*); +static int32_t Crypto_Key_verify(uint8_t*,TC_t* tc_frame); // Security Monitoring & Control Procedure -static int32 Crypto_MC_ping(char* ingest); -static int32 Crypto_MC_status(char* ingest); -static int32 Crypto_MC_dump(char* ingest); -static int32 Crypto_MC_erase(char* ingest); -static int32 Crypto_MC_selftest(char* ingest); -static int32 Crypto_SA_readARSN(char* ingest); -static int32 Crypto_MC_resetalarm(void); +static int32_t Crypto_MC_ping(uint8_t* ingest); +static int32_t Crypto_MC_status(uint8_t* ingest); +static int32_t Crypto_MC_dump(uint8_t* ingest); +static int32_t Crypto_MC_erase(uint8_t* ingest); +static int32_t Crypto_MC_selftest(uint8_t* ingest); +static int32_t Crypto_SA_readARSN(uint8_t* ingest); +static int32_t Crypto_MC_resetalarm(void); // User Functions -static int32 Crypto_User_IdleTrigger(char* ingest); -static int32 Crypto_User_BadSPI(void); -static int32 Crypto_User_BadIV(void); -static int32 Crypto_User_BadMAC(void); -static int32 Crypto_User_BadFECF(void); -static int32 Crypto_User_ModifyKey(void); -static int32 Crypto_User_ModifyActiveTM(void); -static int32 Crypto_User_ModifyVCID(void); +static int32_t Crypto_User_IdleTrigger(uint8_t* ingest); +static int32_t Crypto_User_BadSPI(void); +static int32_t Crypto_User_BadIV(void); +static int32_t Crypto_User_BadMAC(void); +static int32_t Crypto_User_BadFECF(void); +static int32_t Crypto_User_ModifyKey(void); +static int32_t Crypto_User_ModifyActiveTM(void); +static int32_t Crypto_User_ModifyVCID(void); // Determine Payload Data Unit -static int32 Crypto_Process_Extended_Procedure_Pdu(TC_t* tc_sdls_processed_frame, char* ingest); -static int32 Crypto_PDU(char* ingest, TC_t* tc_frame); +static int32_t Crypto_Process_Extended_Procedure_Pdu(TC_t* tc_sdls_processed_frame, uint8_t* ingest); +static int32_t Crypto_PDU(uint8_t* ingest, TC_t* tc_frame); // Managed Parameter Functions -static int32 Crypto_Get_Managed_Parameters_For_Gvcid(uint8 tfvn,uint16 scid,uint8 vcid,GvcidManagedParameters_t* managed_parameters_in, +static int32_t Crypto_Get_Managed_Parameters_For_Gvcid(uint8_t tfvn,uint16_t scid,uint8_t vcid,GvcidManagedParameters_t* managed_parameters_in, GvcidManagedParameters_t** managed_parameters_out); -static int32 crypto_config_add_gvcid_managed_parameter_recursion(uint8 tfvn, uint16 scid, uint8 vcid, uint8 has_fecf, uint8 has_segmentation_hdr,GvcidManagedParameters_t* managed_parameter); +static int32_t crypto_config_add_gvcid_managed_parameter_recursion(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, uint8_t has_segmentation_hdr,GvcidManagedParameters_t* managed_parameter); static void Crypto_Free_Managed_Parameters(GvcidManagedParameters_t* managed_parameters); /* @@ -105,22 +105,22 @@ SadbMariaDBConfig_t* sadb_mariadb_config = NULL; GvcidManagedParameters_t* gvcid_managed_parameters = NULL; GvcidManagedParameters_t* current_managed_parameters = NULL; // OCF -static uint8 ocf = 0; +static uint8_t ocf = 0; static SDLS_FSR_t report; static TM_FrameCLCW_t clcw; // Flags static SDLS_MC_LOG_RPLY_t log_summary; static SDLS_MC_DUMP_BLK_RPLY_t log; -static uint8 log_count = 0; -static uint16 tm_offset = 0; +static uint8_t log_count = 0; +static uint16_t tm_offset = 0; // ESA Testing - 0 = disabled, 1 = enabled -static uint8 badSPI = 0; -static uint8 badIV = 0; -static uint8 badMAC = 0; -static uint8 badFECF = 0; +static uint8_t badSPI = 0; +static uint8_t badIV = 0; +static uint8_t badMAC = 0; +static uint8_t badFECF = 0; // CRC -static uint32 crc32Table[256]; -static uint16 crc16Table[256]; +static uint32_t crc32Table[256]; +static uint16_t crc16Table[256]; /* ** Initialization Functions */ @@ -129,9 +129,9 @@ static uint16 crc16Table[256]; * @brief Function: Crypto_Init_Unit_test * @return int32: status **/ -int32 Crypto_Init_Unit_Test(void) +int32_t Crypto_Init_Unit_Test(void) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,1,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); @@ -146,9 +146,9 @@ int32 Crypto_Init_Unit_Test(void) * @param sadb_mariadb_config_p: SadbMariaDBConfig_t* * @return int32: Success/Failure **/ -int32 Crypto_Init_With_Configs(CryptoConfig_t* crypto_config_p,GvcidManagedParameters_t* gvcid_managed_parameters_p,SadbMariaDBConfig_t* sadb_mariadb_config_p) +int32_t Crypto_Init_With_Configs(CryptoConfig_t* crypto_config_p,GvcidManagedParameters_t* gvcid_managed_parameters_p,SadbMariaDBConfig_t* sadb_mariadb_config_p) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; crypto_config = crypto_config_p; gvcid_managed_parameters = gvcid_managed_parameters_p; sadb_mariadb_config = sadb_mariadb_config_p; @@ -160,9 +160,9 @@ int32 Crypto_Init_With_Configs(CryptoConfig_t* crypto_config_p,GvcidManagedParam * @brief Function Crypto_Init * Initializes libgcrypt, Security Associations **/ -int32 Crypto_Init(void) +int32_t Crypto_Init(void) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; if(crypto_config==NULL){ status = CRYPTO_CONFIGURATION_NOT_COMPLETE; @@ -230,9 +230,9 @@ int32 Crypto_Init(void) * Free memory objects & restore pointers to NULL for re-initialization * @return int32: Success/Failure **/ -int32 Crypto_Shutdown(void) +int32_t Crypto_Shutdown(void) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; if(crypto_config!=NULL){ free(crypto_config); @@ -265,9 +265,9 @@ int32 Crypto_Shutdown(void) * @param vcid_bitmask: uint8 * @return int32: Success/Failure **/ -int32 Crypto_Config_CryptoLib(uint8 sadb_type, uint8 crypto_create_fecf, uint8 process_sdls_pdus, uint8 has_pus_hdr, uint8 ignore_sa_state, uint8 ignore_anti_replay, uint8 unique_sa_per_mapid,uint8 crypto_check_fecf, uint8 vcid_bitmask) +int32_t Crypto_Config_CryptoLib(uint8_t sadb_type, uint8_t crypto_create_fecf, uint8_t process_sdls_pdus, uint8_t has_pus_hdr, uint8_t ignore_sa_state, uint8_t ignore_anti_replay, uint8_t unique_sa_per_mapid,uint8_t crypto_check_fecf, uint8_t vcid_bitmask) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; crypto_config = (CryptoConfig_t*) calloc(1, CRYPTO_CONFIG_SIZE); crypto_config->sadb_type=sadb_type; crypto_config->crypto_create_fecf=crypto_create_fecf; @@ -283,16 +283,16 @@ int32 Crypto_Config_CryptoLib(uint8 sadb_type, uint8 crypto_create_fecf, uint8 p /** * @brief Function: Crypto_Config_MariaDB -* @param mysql_username: char* -* @param mysql_password: char* -* @param mysql_hostname: char* -* @param mysql_database: char* +* @param mysql_username: uint8_t* +* @param mysql_password: uint8_t* +* @param mysql_hostname: uint8_t* +* @param mysql_database: uint8_t* * @param mysql_port: uint16 * @return int32: Success/Failure **/ -int32 Crypto_Config_MariaDB(char* mysql_username, char* mysql_password, char* mysql_hostname, char* mysql_database, uint16 mysql_port) +int32_t Crypto_Config_MariaDB(uint8_t* mysql_username, uint8_t* mysql_password, uint8_t* mysql_hostname, uint8_t* mysql_database, uint16_t mysql_port) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; sadb_mariadb_config = (SadbMariaDBConfig_t*)calloc(1, SADB_MARIADB_CONFIG_SIZE); sadb_mariadb_config->mysql_username=mysql_username; sadb_mariadb_config->mysql_password=mysql_password; @@ -311,9 +311,9 @@ int32 Crypto_Config_MariaDB(char* mysql_username, char* mysql_password, char* my * @param has_segmentation_hdr: uint8 * @return int32: Success/Failure **/ -int32 Crypto_Config_Add_Gvcid_Managed_Parameter(uint8 tfvn, uint16 scid, uint8 vcid, uint8 has_fecf, uint8 has_segmentation_hdr) +int32_t Crypto_Config_Add_Gvcid_Managed_Parameter(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, uint8_t has_segmentation_hdr) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; if(gvcid_managed_parameters==NULL){//case: Global Root Node not Set gvcid_managed_parameters = (GvcidManagedParameters_t*) calloc(1,GVCID_MANAGED_PARAMETERS_SIZE); @@ -340,7 +340,7 @@ int32 Crypto_Config_Add_Gvcid_Managed_Parameter(uint8 tfvn, uint16 scid, uint8 v * @param managed_parameter: GvcidManagedParameters_t* * @return int32: Success/Failure **/ -static int32 crypto_config_add_gvcid_managed_parameter_recursion(uint8 tfvn, uint16 scid, uint8 vcid, uint8 has_fecf, uint8 has_segmentation_hdr,GvcidManagedParameters_t* managed_parameter) +static int32_t crypto_config_add_gvcid_managed_parameter_recursion(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, uint8_t has_segmentation_hdr,GvcidManagedParameters_t* managed_parameter) { if(managed_parameter->next!=NULL){ return crypto_config_add_gvcid_managed_parameter_recursion(tfvn, scid, vcid, has_fecf, has_segmentation_hdr,managed_parameter->next); @@ -876,9 +876,9 @@ static void Crypto_Local_Init(void) **/ static void Crypto_Calc_CRC_Init_Table(void) { - uint16 val; - uint32 poly = 0xEDB88320; - uint32 crc; + uint16_t val; + uint32_t poly = 0xEDB88320; + uint32_t crc; // http://create.stephan-brumme.com/crc32/ for (unsigned int i = 0; i <= 0xFF; i++) @@ -919,7 +919,7 @@ static void Crypto_Calc_CRC_Init_Table(void) * @param sa_ptr: SecurityAssociation_t * @return int32, Length of TCPayload **/ -static int32 Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr) +static int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr) { int tf_hdr = 5; int seg_hdr = 0;if(current_managed_parameters->has_segmentation_hdr==TC_HAS_SEGMENT_HDRS){seg_hdr=1;} @@ -947,9 +947,9 @@ static int32 Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *s * @brief Function: Crypto_Get_tmLength * Returns the total length of the current tm_frame in BYTES! * @param len: int - * @return int32 Length of TM + * @return int32_t Length of TM **/ -static int32 Crypto_Get_tmLength(int len) +static int32_t Crypto_Get_tmLength(int len) { #ifdef FILL len = TM_FILL_SIZE; @@ -965,7 +965,7 @@ static int32 Crypto_Get_tmLength(int len) * Looks up cipher suite ID and determines if it's an AEAD algorithm. Returns 1 if true, 0 if false; * @param cipher_suite_id: uint32 **/ -static uint8 Crypto_Is_AEAD_Algorithm(uint32 cipher_suite_id) +static uint8_t Crypto_Is_AEAD_Algorithm(uint32_t cipher_suite_id) { //CryptoLib only supports AES-GCM, which is an AEAD (Authenticated Encryption with Associated Data) algorithm, so return true/1. //TODO - Add cipher suite mapping to which algorithms are AEAD and which are not. @@ -976,13 +976,13 @@ static uint8 Crypto_Is_AEAD_Algorithm(uint32 cipher_suite_id) * @brief Function: Crypto_Prepare_TC_AAD * Callocs and returns pointer to buffer where AAD is created & bitwise-anded with bitmask! * Note: Function caller is responsible for freeing the returned buffer! - * @param buffer: uint8* - * @param len_aad: uint16 - * @param abm_buffer: uint8* + * @param buffer: uint8_t* + * @param len_aad: uint16_t + * @param abm_buffer: uint8_t* **/ -static uint8* Crypto_Prepare_TC_AAD(uint8* buffer, uint16 len_aad, uint8* abm_buffer) +static uint8_t* Crypto_Prepare_TC_AAD(uint8_t* buffer, uint16_t len_aad, uint8_t* abm_buffer) { - uint8* aad = (uint8*) calloc(1,len_aad*sizeof(uint8)); + uint8_t* aad = (uint8_t*) calloc(1,len_aad*sizeof(uint8_t)); for (int i = 0; i < len_aad; i++) { @@ -1005,10 +1005,10 @@ static uint8* Crypto_Prepare_TC_AAD(uint8* buffer, uint16 len_aad, uint8* abm_bu /** * @brief Function: Crypto_TM_updatePDU * Update the Telemetry Payload Data Unit - * @param ingest: char* + * @param ingest: uint8_t* * @param len_ingest: int **/ -static void Crypto_TM_updatePDU(char* ingest, int len_ingest) +static void Crypto_TM_updatePDU(uint8_t* ingest, int len_ingest) { // Copy ingest to PDU int x = 0; int fill_size = 0; @@ -1033,7 +1033,7 @@ static void Crypto_TM_updatePDU(char* ingest, int len_ingest) { if (x < len_ingest) { // Fill - tm_frame.tm_pdu[x] = (uint8)ingest[x]; + tm_frame.tm_pdu[x] = (uint8_t)ingest[x]; } else { // Zero @@ -1075,13 +1075,13 @@ static void Crypto_TM_updatePDU(char* ingest, int len_ingest) // Copy actual packet while (x < len_ingest + tm_offset) { - //printf("ingest[x - tm_offset] = 0x%02x \n", (uint8)ingest[x - tm_offset]); - tm_frame.tm_pdu[x] = (uint8)ingest[x - tm_offset]; + //printf("ingest[x - tm_offset] = 0x%02x \n", (uint8_t)ingest[x - tm_offset]); + tm_frame.tm_pdu[x] = (uint8_t)ingest[x - tm_offset]; x++; } #ifdef TM_IDLE_FILL // Check for idle frame trigger - if (((uint8)ingest[0] == 0x08) && ((uint8)ingest[1] == 0x90)) + if (((uint8_t)ingest[0] == 0x08) && ((uint8_t)ingest[1] == 0x90)) { // Don't fill idle frames } @@ -1183,12 +1183,12 @@ static void Crypto_TM_updateOCF(void) //TODO - Review this. Not sure it quite works how we think /** * @brief Function: Crypto_increment - * Increments the bytes within a uint8 array + * Increments the bytes within a uint8_t array * @param num: uint8* * @param length: int * @return int32: Success/Failure **/ -int32 Crypto_increment(uint8 *num, int length) +int32_t Crypto_increment(uint8_t *num, int length) { int i; /* go from right (least significant) to left (most signifcant) */ @@ -1215,11 +1215,11 @@ int32 Crypto_increment(uint8 *num, int length) * @param window: int * @return int32: Success/Failure **/ -static int32 Crypto_window(uint8 *actual, uint8 *expected, int length, int window) +static int32_t Crypto_window(uint8_t *actual, uint8_t *expected, int length, int window) { int status = CRYPTO_LIB_ERR_BAD_ANTIREPLAY_WINDOW; int result = 0; - uint8 temp[length]; + uint8_t temp[length]; memcpy(temp, expected, length); @@ -1251,7 +1251,7 @@ static int32 Crypto_window(uint8 *actual, uint8 *expected, int length, int windo * @param length: int * @return int32: Success/Failure **/ -static int32 Crypto_compare_less_equal(uint8 *actual, uint8 *expected, int length) +static int32_t Crypto_compare_less_equal(uint8_t *actual, uint8_t *expected, int length) { int status = OS_ERROR; @@ -1274,13 +1274,13 @@ static int32 Crypto_compare_less_equal(uint8 *actual, uint8 *expected, int lengt /** * @brief Function: Crypto_Prep_Reply * Assumes that both the pkt_length and pdu_len are set properly - * @param ingest: char* + * @param ingest: uint8_t* * @param appID: uint8 * @return uint8: Count **/ -uint8 Crypto_Prep_Reply(char* ingest, uint8 appID) +uint8_t Crypto_Prep_Reply(uint8_t* ingest, uint8_t appID) { - uint8 count = 0; + uint8_t count = 0; // Prepare CCSDS for reply sdls_frame.hdr.pvn = 0; @@ -1316,19 +1316,19 @@ uint8 Crypto_Prep_Reply(char* ingest, uint8 appID) * @brief Function Crypto_FECF * Calculate the Frame Error Control Field (FECF), also known as a cyclic redundancy check (CRC) * @param fecf: int - * @param ingest: char* + * @param ingest: uint8_t* * @param len_ingest: int * @param tc_frame: TC_t* * @return int32: Success/Failure **/ -static int32 Crypto_FECF(int fecf, char* ingest, int len_ingest,TC_t* tc_frame) +static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_frame) { - int32 result = OS_SUCCESS; - uint16 calc_fecf = Crypto_Calc_FECF(ingest, len_ingest); + int32_t result = OS_SUCCESS; + uint16_t calc_fecf = Crypto_Calc_FECF(ingest, len_ingest); if ( (fecf & 0xFFFF) != calc_fecf ) { - if (((uint8)ingest[18] == 0x0B) && ((uint8)ingest[19] == 0x00) && (((uint8)ingest[20] & 0xF0) == 0x40)) + if (((uint8_t)ingest[18] == 0x0B) && ((uint8_t)ingest[19] == 0x00) && (((uint8_t)ingest[20] & 0xF0) == 0x40)) { // User packet check only used for ESA Testing! } @@ -1337,7 +1337,7 @@ static int32 Crypto_FECF(int fecf, char* ingest, int len_ingest,TC_t* tc_frame) printf(KRED "Error: FECF incorrect!\n" RESET); if (log_summary.rs > 0) { - Crypto_increment((uint8*)&log_summary.num_se, 4); + Crypto_increment((uint8_t*)&log_summary.num_se, 4); log_summary.rs--; log.blk[log_count].emt = FECF_ERR_EID; log.blk[log_count].emv[0] = 0x4E; @@ -1359,16 +1359,16 @@ static int32 Crypto_FECF(int fecf, char* ingest, int len_ingest,TC_t* tc_frame) /** * @brief Function Crypto_Calc_FECF * Calculate the Frame Error Control Field (FECF), also known as a cyclic redundancy check (CRC) - * @param ingest: char* + * @param ingest: uint8_t* * @param len_ingest: int * @return uint16: FECF **/ -static uint16 Crypto_Calc_FECF(char* ingest, int len_ingest) +static uint16_t Crypto_Calc_FECF(uint8_t* ingest, int len_ingest) { - uint16 fecf = 0xFFFF; - uint16 poly = 0x1021; // TODO: This polynomial is (CRC-CCITT) for ESA testing, may not match standard protocol - uint8 bit; - uint8 c15; + uint16_t fecf = 0xFFFF; + uint16_t poly = 0x1021; // TODO: This polynomial is (CRC-CCITT) for ESA testing, may not match standard protocol + uint8_t bit; + uint8_t c15; for (int i = 0; i < len_ingest; i++) { // Byte Logic @@ -1394,7 +1394,7 @@ static uint16 Crypto_Calc_FECF(char* ingest, int len_ingest) printf(KCYN "0x" RESET); for (int x = 0; x < len_ingest; x++) { - printf(KCYN "%02x" RESET, (uint8)*(ingest+x)); + printf(KCYN "%02x" RESET, (uint8_t)*(ingest+x)); } printf(KCYN "\n" RESET); printf(KCYN "In Crypto_Calc_FECF! fecf = 0x%04x\n" RESET, fecf); @@ -1406,17 +1406,17 @@ static uint16 Crypto_Calc_FECF(char* ingest, int len_ingest) /** * @brief Function: Crypto_Calc_CRC16 * Calculates CRC16 - * @param data: char* + * @param data: uint8_t* * @param size: int * @return uint16: CRC **/ -static uint16 Crypto_Calc_CRC16(char* data, int size) +static uint16_t Crypto_Calc_CRC16(uint8_t* data, int size) { // Code provided by ESA - uint16 crc = 0xFFFF; + uint16_t crc = 0xFFFF; for ( ; size > 0; size--) { - //printf("*data = 0x%02x \n", (uint8) *data); + //printf("*data = 0x%02x \n", (uint8_t) *data); crc = ((crc << 8) & 0xFF00) ^ crc16Table[(crc >> 8) ^ *data++]; } @@ -1438,14 +1438,14 @@ static uint16 Crypto_Calc_CRC16(char* data, int size) * c- Agreed Cryptographic Algorithm (managed) * @return int32: Success/Failure **/ -static int32 Crypto_Key_OTAR(void) +static int32_t Crypto_Key_OTAR(void) { // Local variables SDLS_OTAR_t packet; int count = 0; int x = 0; - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; int pdu_keys = (sdls_frame.pdu.pdu_len - 30) / (2 + KEY_SIZE); gcry_cipher_hd_t tmp_hd; @@ -1459,7 +1459,7 @@ static int32 Crypto_Key_OTAR(void) report.af = 1; if (log_summary.rs > 0) { - Crypto_increment((uint8*)&log_summary.num_se, 4); + Crypto_increment((uint8_t*)&log_summary.num_se, 4); log_summary.rs--; log.blk[log_count].emt = MKID_INVALID_EID; log.blk[log_count].emv[0] = 0x4E; @@ -1555,7 +1555,7 @@ static int32 Crypto_Key_OTAR(void) report.af = 1; if (log_summary.rs > 0) { - Crypto_increment((uint8*)&log_summary.num_se, 4); + Crypto_increment((uint8_t*)&log_summary.num_se, 4); log_summary.rs--; log.blk[log_count].emt = OTAR_MK_ERR_EID; log.blk[log_count].emv[0] = 0x4E; // N @@ -1609,7 +1609,7 @@ static int32 Crypto_Key_OTAR(void) * @param state: uint8 * @return uint32: Success/Failure **/ -static int32 Crypto_Key_update(uint8 state) +static int32_t Crypto_Key_update(uint8_t state) { // Local variables SDLS_KEY_BLK_t packet; int count = 0; @@ -1665,7 +1665,7 @@ static int32 Crypto_Key_update(uint8 state) report.af = 1; if (log_summary.rs > 0) { - Crypto_increment((uint8*)&log_summary.num_se, 4); + Crypto_increment((uint8_t*)&log_summary.num_se, 4); log_summary.rs--; log.blk[log_count].emt = MKID_STATE_ERR_EID; log.blk[log_count].emv[0] = 0x4E; @@ -1689,7 +1689,7 @@ static int32 Crypto_Key_update(uint8 state) { if (log_summary.rs > 0) { - Crypto_increment((uint8*)&log_summary.num_se, 4); + Crypto_increment((uint8_t*)&log_summary.num_se, 4); log_summary.rs--; log.blk[log_count].emt = KEY_TRANSITION_ERR_EID; log.blk[log_count].emv[0] = 0x4E; @@ -1706,10 +1706,10 @@ static int32 Crypto_Key_update(uint8 state) /** * @brief Function: Crypto_Key_inventory - * @param ingest: char* + * @param ingest: uint8_t* * @return int32: count **/ -static int32 Crypto_Key_inventory(char* ingest) +static int32_t Crypto_Key_inventory(uint8_t* ingest) { // Local variables SDLS_KEY_INVENTORY_t packet; @@ -1717,9 +1717,9 @@ static int32 Crypto_Key_inventory(char* ingest) uint16_t range = 0; // Read in PDU - packet.kid_first = ((uint8)sdls_frame.pdu.data[count] << 8) | ((uint8)sdls_frame.pdu.data[count+1]); + packet.kid_first = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count+1]); count = count + 2; - packet.kid_last = ((uint8)sdls_frame.pdu.data[count] << 8) | ((uint8)sdls_frame.pdu.data[count+1]); + packet.kid_last = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count+1]); count = count + 2; // Prepare for Reply @@ -1741,11 +1741,11 @@ static int32 Crypto_Key_inventory(char* ingest) /** * @brief Function: Crypto_Key_verify - * @param ingest: char* + * @param ingest: uint8_t* * @param tc_frame: TC_t* * @return int32: count **/ -static int32 Crypto_Key_verify(char* ingest,TC_t* tc_frame) +static int32_t Crypto_Key_verify(uint8_t* ingest,TC_t* tc_frame) { // Local variables SDLS_KEYV_CMD_t packet; @@ -1754,9 +1754,9 @@ static int32 Crypto_Key_verify(char* ingest,TC_t* tc_frame) gcry_error_t gcry_error = GPG_ERR_NO_ERROR; gcry_cipher_hd_t tmp_hd; - uint8 iv_loc; + uint8_t iv_loc; - //uint8 tmp_mac[MAC_SIZE]; + //uint8_t tmp_mac[MAC_SIZE]; #ifdef PDU_DEBUG printf("Crypto_Key_verify: Requested %d key(s) to verify \n", pdu_keys); @@ -1766,7 +1766,7 @@ static int32 Crypto_Key_verify(char* ingest,TC_t* tc_frame) for (int x = 0; x < pdu_keys; x++) { // Key ID - packet.blk[x].kid = ((uint8)sdls_frame.pdu.data[count] << 8) | ((uint8)sdls_frame.pdu.data[count+1]); + packet.blk[x].kid = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count+1]); count = count + 2; #ifdef PDU_DEBUG printf("Crypto_Key_verify: Block %d Key ID is %d \n", x, packet.blk[x].kid); @@ -1874,10 +1874,10 @@ static int32 Crypto_Key_verify(char* ingest,TC_t* tc_frame) */ /** * @brief Function: Crypto_MC_ping - * @param ingest: char* + * @param ingest: uint8_t* * return int32: count **/ -static int32 Crypto_MC_ping(char* ingest) +static int32_t Crypto_MC_ping(uint8_t* ingest) { int count = 0; @@ -1891,10 +1891,10 @@ static int32 Crypto_MC_ping(char* ingest) /** * @brief Function: Crypto_MC_status - * @param ingest: char* + * @param ingest: uint8_t* * @return int32: count **/ -static int32 Crypto_MC_status(char* ingest) +static int32_t Crypto_MC_status(uint8_t* ingest) { int count = 0; @@ -1921,10 +1921,10 @@ static int32 Crypto_MC_status(char* ingest) /** * @brief Function: Crypto_MC_dump - * @param ingest: char* + * @param ingest: uint8_t* * @return int32: Count **/ -static int32 Crypto_MC_dump(char* ingest) +static int32_t Crypto_MC_dump(uint8_t* ingest) { int count = 0; @@ -1956,10 +1956,10 @@ static int32 Crypto_MC_dump(char* ingest) /** * @brief Function: Crypto_MC_erase - * @param ingest: char* + * @param ingest: uint8_t* * @return int32: count **/ -static int32 Crypto_MC_erase(char* ingest) +static int32_t Crypto_MC_erase(uint8_t* ingest) { int count = 0; @@ -1995,13 +1995,13 @@ static int32 Crypto_MC_erase(char* ingest) /** * @brief Function: Crypto_MC_selftest - * @param ingest: char* + * @param ingest: uint8_t* * @return int32: Count **/ -static int32 Crypto_MC_selftest(char* ingest) +static int32_t Crypto_MC_selftest(uint8_t* ingest) { - uint8 count = 0; - uint8 result = ST_OK; + uint8_t count = 0; + uint8_t result = ST_OK; // TODO: Perform test @@ -2017,17 +2017,17 @@ static int32 Crypto_MC_selftest(char* ingest) /** * @brief Function: Crypto_SA_readASRN - * @param ingest: char* + * @param ingest: uint8_t* * @return int32: Count **/ -static int32 Crypto_SA_readARSN(char* ingest) +static int32_t Crypto_SA_readARSN(uint8_t* ingest) { - uint8 count = 0; - uint16 spi = 0x0000; + uint8_t count = 0; + uint16_t spi = 0x0000; SecurityAssociation_t* sa_ptr; // Read ingest - spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; + spi = ((uint8_t)sdls_frame.pdu.data[0] << 8) | (uint8_t)sdls_frame.pdu.data[1]; // Prepare for Reply sdls_frame.pdu.pdu_len = 2 + IV_SIZE; @@ -2087,7 +2087,7 @@ static int32 Crypto_SA_readARSN(char* ingest) * @brief Function: Crypto_MC_resetalarm * @return int32: Success/Failure **/ -static int32 Crypto_MC_resetalarm(void) +static int32_t Crypto_MC_resetalarm(void) { // Reset all alarm flags report.af = 0; report.bsnf = 0; @@ -2098,12 +2098,12 @@ static int32 Crypto_MC_resetalarm(void) /** * @brief Function: Crypto_User_IdleTrigger - * @param ingest: char* + * @param ingest: uint8_t* * @return int32: count **/ -static int32 Crypto_User_IdleTrigger(char* ingest) +static int32_t Crypto_User_IdleTrigger(uint8_t* ingest) { - uint8 count = 0; + uint8_t count = 0; // Prepare for Reply sdls_frame.pdu.pdu_len = 0; @@ -2117,7 +2117,7 @@ static int32 Crypto_User_IdleTrigger(char* ingest) * @brief Function: Crypto_User_BadSPI * @return int32: Success/Failure **/ -static int32 Crypto_User_BadSPI(void) +static int32_t Crypto_User_BadSPI(void) { // Toggle Bad Sequence Number if (badSPI == 0) @@ -2136,7 +2136,7 @@ static int32 Crypto_User_BadSPI(void) * @brief Function: Crypto_User_BadMAC * @return int32: Success/Failure **/ -static int32 Crypto_User_BadMAC(void) +static int32_t Crypto_User_BadMAC(void) { // Toggle Bad MAC if (badMAC == 0) @@ -2155,7 +2155,7 @@ static int32 Crypto_User_BadMAC(void) * @brief Function: Crypto_User_BadIV * @return int32: Success/Failure **/ -static int32 Crypto_User_BadIV(void) +static int32_t Crypto_User_BadIV(void) { // Toggle Bad MAC if (badIV == 0) @@ -2174,7 +2174,7 @@ static int32 Crypto_User_BadIV(void) * @brief Function: Crypto_User_BadFECF * @return int32: Success/Failure **/ -static int32 Crypto_User_BadFECF(void) +static int32_t Crypto_User_BadFECF(void) { // Toggle Bad FECF if (badFECF == 0) @@ -2193,11 +2193,11 @@ static int32 Crypto_User_BadFECF(void) * @brief Function: Crypto_User_ModifyKey * @return int32: Success/Failure **/ -static int32 Crypto_User_ModifyKey(void) +static int32_t Crypto_User_ModifyKey(void) { // Local variables - uint16 kid = ((uint8)sdls_frame.pdu.data[0] << 8) | ((uint8)sdls_frame.pdu.data[1]); - uint8 mod = (uint8)sdls_frame.pdu.data[2]; + uint16_t kid = ((uint8_t)sdls_frame.pdu.data[0] << 8) | ((uint8_t)sdls_frame.pdu.data[1]); + uint8_t mod = (uint8_t)sdls_frame.pdu.data[2]; switch (mod) { @@ -2206,7 +2206,7 @@ static int32 Crypto_User_ModifyKey(void) printf("Key %d value invalidated! \n", kid); break; case 2: // Modify key state - ek_ring[kid].key_state = (uint8)sdls_frame.pdu.data[3] & 0x0F; + ek_ring[kid].key_state = (uint8_t)sdls_frame.pdu.data[3] & 0x0F; printf("Key %d state changed to %d! \n", kid, mod); break; default: @@ -2222,9 +2222,9 @@ static int32 Crypto_User_ModifyKey(void) * Modifies tm_sec_header.spi based on sdls_frame.pdu.data[0] * @return int32: Success/Failure **/ -static int32 Crypto_User_ModifyActiveTM(void) +static int32_t Crypto_User_ModifyActiveTM(void) { - tm_frame.tm_sec_header.spi = (uint8)sdls_frame.pdu.data[0]; + tm_frame.tm_sec_header.spi = (uint8_t)sdls_frame.pdu.data[0]; return OS_SUCCESS; } @@ -2232,9 +2232,9 @@ static int32 Crypto_User_ModifyActiveTM(void) * @brief Function: Crypto_User_ModifyVCID * @return int32: Success/Failure **/ -static int32 Crypto_User_ModifyVCID(void) +static int32_t Crypto_User_ModifyVCID(void) { - tm_frame.tm_header.vcid = (uint8)sdls_frame.pdu.data[0]; + tm_frame.tm_header.vcid = (uint8_t)sdls_frame.pdu.data[0]; SecurityAssociation_t* sa_ptr; for (int i = 0; i < NUM_GVCID; i++) @@ -2266,13 +2266,13 @@ static int32 Crypto_User_ModifyVCID(void) */ /** * @brief Function: Crypto_PDU - * @param ingest: char* + * @param ingest: uint8_t* * @param tc_frame: TC_t* * @return int32: Success/Failure **/ -static int32 Crypto_PDU(char* ingest,TC_t* tc_frame) +static int32_t Crypto_PDU(uint8_t* ingest,TC_t* tc_frame) { - int32 status = CRYPTO_LIB_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; switch (sdls_frame.pdu.type) { @@ -2518,7 +2518,7 @@ static int32 Crypto_PDU(char* ingest,TC_t* tc_frame) printf(KMAG "CCSDS message put on software bus: 0x" RESET); for (int x = 0; x < status; x++) { - printf(KMAG "%02x" RESET, (uint8) ingest[x]); + printf(KMAG "%02x" RESET, (uint8_t) ingest[x]); } printf("\n"); } @@ -2536,10 +2536,10 @@ static int32 Crypto_PDU(char* ingest,TC_t* tc_frame) * @param managed_parameters_out: GvcidManagedParameters_t** * @return int32: Success/Failure **/ -static int32 Crypto_Get_Managed_Parameters_For_Gvcid(uint8 tfvn,uint16 scid,uint8 vcid,GvcidManagedParameters_t* managed_parameters_in, +static int32_t Crypto_Get_Managed_Parameters_For_Gvcid(uint8_t tfvn,uint16_t scid,uint8_t vcid,GvcidManagedParameters_t* managed_parameters_in, GvcidManagedParameters_t** managed_parameters_out) { - int32 status = MANAGED_PARAMETERS_FOR_GVCID_NOT_FOUND; + int32_t status = MANAGED_PARAMETERS_FOR_GVCID_NOT_FOUND; if(managed_parameters_in != NULL) { @@ -2579,28 +2579,28 @@ static void Crypto_Free_Managed_Parameters(GvcidManagedParameters_t* managed_par * Applies Security to incoming frame. Encryption, Authentication, and Authenticated Encryption * @param p_in_frame: uint8* * @param in_frame_length: uint16 - * @param pp_in_frame: uint8** + * @param pp_in_frame: uint8_t** * @param p_enc_frame_len: uint16 * @return int32: Success/Failure **/ -int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_length, \ - uint8 **pp_in_frame, uint16 *p_enc_frame_len) +int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_frame_length, \ + uint8_t **pp_in_frame, uint16_t *p_enc_frame_len) { // Local Variables - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; TC_FramePrimaryHeader_t temp_tc_header; SecurityAssociation_t* sa_ptr = NULL; - uint8 *p_new_enc_frame = NULL; - uint8 sa_service_type = -1; - uint16 mac_loc = 0; - uint16 tf_payload_len = 0x0000; - uint16 new_fecf = 0x0000; - uint8* aad; + uint8_t *p_new_enc_frame = NULL; + uint8_t sa_service_type = -1; + uint16_t mac_loc = 0; + uint16_t tf_payload_len = 0x0000; + uint16_t new_fecf = 0x0000; + uint8_t* aad; gcry_cipher_hd_t tmp_hd; gcry_error_t gcry_error = GPG_ERR_NO_ERROR; - uint16 new_enc_frame_header_field_length = 0; - uint32 encryption_cipher; - uint8 ecs_is_aead_algorithm; + uint16_t new_enc_frame_header_field_length = 0; + uint32_t encryption_cipher; + uint8_t ecs_is_aead_algorithm; #ifdef DEBUG printf(KYEL "\n----- Crypto_TC_ApplySecurity START -----\n" RESET); @@ -2618,7 +2618,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len printf("DEBUG - "); for(int i=0; i < in_frame_length; i++) { - printf("%02X", ((uint8 *)&*p_in_frame)[i]); + printf("%02X", ((uint8_t *)&*p_in_frame)[i]); } printf("\nPrinted %d bytes\n", in_frame_length); #endif @@ -2630,23 +2630,23 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len } // Primary Header - temp_tc_header.tfvn = ((uint8)p_in_frame[0] & 0xC0) >> 6; - temp_tc_header.bypass = ((uint8)p_in_frame[0] & 0x20) >> 5; - temp_tc_header.cc = ((uint8)p_in_frame[0] & 0x10) >> 4; - temp_tc_header.spare = ((uint8)p_in_frame[0] & 0x0C) >> 2; - temp_tc_header.scid = ((uint8)p_in_frame[0] & 0x03) << 8; - temp_tc_header.scid = temp_tc_header.scid | (uint8)p_in_frame[1]; - temp_tc_header.vcid = ((uint8)p_in_frame[2] & 0xFC) >> 2 & crypto_config->vcid_bitmask; - temp_tc_header.fl = ((uint8)p_in_frame[2] & 0x03) << 8; - temp_tc_header.fl = temp_tc_header.fl | (uint8)p_in_frame[3]; - temp_tc_header.fsn = (uint8)p_in_frame[4]; + temp_tc_header.tfvn = ((uint8_t)p_in_frame[0] & 0xC0) >> 6; + temp_tc_header.bypass = ((uint8_t)p_in_frame[0] & 0x20) >> 5; + temp_tc_header.cc = ((uint8_t)p_in_frame[0] & 0x10) >> 4; + temp_tc_header.spare = ((uint8_t)p_in_frame[0] & 0x0C) >> 2; + temp_tc_header.scid = ((uint8_t)p_in_frame[0] & 0x03) << 8; + temp_tc_header.scid = temp_tc_header.scid | (uint8_t)p_in_frame[1]; + temp_tc_header.vcid = ((uint8_t)p_in_frame[2] & 0xFC) >> 2 & crypto_config->vcid_bitmask; + temp_tc_header.fl = ((uint8_t)p_in_frame[2] & 0x03) << 8; + temp_tc_header.fl = temp_tc_header.fl | (uint8_t)p_in_frame[3]; + temp_tc_header.fsn = (uint8_t)p_in_frame[4]; //Lookup-retrieve managed parameters for frame via gvcid: status = Crypto_Get_Managed_Parameters_For_Gvcid(temp_tc_header.tfvn,temp_tc_header.scid,temp_tc_header.vcid,gvcid_managed_parameters,¤t_managed_parameters); if(status != OS_SUCCESS) {return status;} //Unable to get necessary Managed Parameters for TC TF -- return with error. - uint8 segmentation_hdr = 0x00; - uint8 map_id = 0; + uint8_t segmentation_hdr = 0x00; + uint8_t map_id = 0; if(current_managed_parameters->has_segmentation_hdr==TC_HAS_SEGMENT_HDRS){ segmentation_hdr = p_in_frame[5]; map_id = segmentation_hdr & 0x3F; @@ -2784,7 +2784,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len #endif // Accio buffer - p_new_enc_frame = (uint8 *)malloc((*p_enc_frame_len) * sizeof (unsigned char)); + p_new_enc_frame = (uint8_t *)malloc((*p_enc_frame_len) * sizeof (uint8_t)); if(!p_new_enc_frame) { printf(KRED "Error: Malloc for encrypted output buffer failed! \n" RESET); @@ -2892,9 +2892,9 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len ** End Security Header Fields */ - uint8 fecf_len = FECF_SIZE; + uint8_t fecf_len = FECF_SIZE; if(current_managed_parameters->has_fecf==TC_NO_FECF) { fecf_len = 0; } - uint8 segment_hdr_len = SEGMENT_HDR_SIZE; + uint8_t segment_hdr_len = SEGMENT_HDR_SIZE; if(current_managed_parameters->has_segmentation_hdr==TC_NO_SEGMENT_HDRS) { segment_hdr_len = 0; } // Copy in original TF data - except FECF // Will be over-written if using encryption later @@ -2973,7 +2973,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len (sa_service_type == SA_AUTHENTICATED_ENCRYPTION)) { // TODO: More robust calculation of this location - // uint16 output_loc = TC_FRAME_PRIMARYHEADER_STRUCT_SIZE + 1 + 2 + temp_SA.shivf_len + temp_SA.shsnf_len + temp_SA.shplf_len; + // uint16_t output_loc = TC_FRAME_PRIMARYHEADER_STRUCT_SIZE + 1 + 2 + temp_SA.shivf_len + temp_SA.shsnf_len + temp_SA.shplf_len; #ifdef TC_DEBUG printf("Encrypted bytes output_loc is %d\n", index); printf("tf_payload_len is %d\n", tf_payload_len); @@ -2988,7 +2988,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len if(sa_service_type == SA_AUTHENTICATED_ENCRYPTION && ecs_is_aead_algorithm==CRYPTO_TRUE) // Algorithm is AEAD algorithm, Add AAD before encrypt! { //Prepare the Header AAD (CCSDS 335.0-B-1 4.2.3.2.2.3) - uint16 aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len; + uint16_t aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len; if(sa_ptr->abm_len < aad_len) { return CRYPTO_LIB_ERR_ABM_TOO_SHORT_FOR_AAD; } aad = Crypto_Prepare_TC_AAD(p_new_enc_frame, aad_len, sa_ptr->abm); @@ -3099,7 +3099,7 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len return status; } - uint16 aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + tf_payload_len; + uint16_t aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + tf_payload_len; if(sa_ptr->abm_len < aad_len) { return CRYPTO_LIB_ERR_ABM_TOO_SHORT_FOR_AAD; } aad = Crypto_Prepare_TC_AAD(p_new_enc_frame, aad_len, sa_ptr->abm); @@ -3163,13 +3163,13 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len if ( crypto_config->crypto_create_fecf==CRYPTO_TC_CREATE_FECF_TRUE ) { new_fecf = Crypto_Calc_FECF(p_new_enc_frame, new_enc_frame_header_field_length - 1); - *(p_new_enc_frame + new_enc_frame_header_field_length - 1) = (uint8) ((new_fecf & 0xFF00) >> 8); - *(p_new_enc_frame + new_enc_frame_header_field_length ) = (uint8) (new_fecf & 0x00FF); + *(p_new_enc_frame + new_enc_frame_header_field_length - 1) = (uint8_t) ((new_fecf & 0xFF00) >> 8); + *(p_new_enc_frame + new_enc_frame_header_field_length ) = (uint8_t) (new_fecf & 0x00FF); } else // CRYPTO_TC_CREATE_FECF_FALSE { - *(p_new_enc_frame + new_enc_frame_header_field_length - 1) = (uint8) 0x00; - *(p_new_enc_frame + new_enc_frame_header_field_length ) = (uint8) 0x00; + *(p_new_enc_frame + new_enc_frame_header_field_length - 1) = (uint8_t) 0x00; + *(p_new_enc_frame + new_enc_frame_header_field_length ) = (uint8_t) 0x00; } index += 2; @@ -3199,25 +3199,25 @@ int32 Crypto_TC_ApplySecurity(const uint8* p_in_frame, const uint16 in_frame_len /** * @brief Function: Crypto_TC_ProcessSecurity * Performs Authenticated decryption, decryption, and authentication - * @param ingest: char* + * @param ingest: uint8_t* * @param len_ingest: int* * @param tc_sdls_processed_frame: TC_t* * @return int32: Success/Failure **/ -int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_processed_frame) +int32_t Crypto_TC_ProcessSecurity( uint8_t* ingest, int* len_ingest,TC_t* tc_sdls_processed_frame) // Loads the ingest frame into the global tc_frame while performing decryption { // Local Variables - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; int x = 0; int y = 0; gcry_cipher_hd_t tmp_hd; gcry_error_t gcry_error = GPG_ERR_NO_ERROR; SecurityAssociation_t* sa_ptr = NULL; - uint8 sa_service_type = -1; - uint8* aad; - uint32 encryption_cipher; - uint8 ecs_is_aead_algorithm; + uint8_t sa_service_type = -1; + uint8_t* aad; + uint32_t encryption_cipher; + uint8_t ecs_is_aead_algorithm; if(crypto_config == NULL) { @@ -3232,20 +3232,20 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro int byte_idx = 0; // Primary Header - tc_sdls_processed_frame->tc_header.tfvn = ((uint8)ingest[byte_idx] & 0xC0) >> 6; - tc_sdls_processed_frame->tc_header.bypass = ((uint8)ingest[byte_idx] & 0x20) >> 5; - tc_sdls_processed_frame->tc_header.cc = ((uint8)ingest[byte_idx] & 0x10) >> 4; - tc_sdls_processed_frame->tc_header.spare = ((uint8)ingest[byte_idx] & 0x0C) >> 2; - tc_sdls_processed_frame->tc_header.scid = ((uint8)ingest[byte_idx] & 0x03) << 8; + tc_sdls_processed_frame->tc_header.tfvn = ((uint8_t)ingest[byte_idx] & 0xC0) >> 6; + tc_sdls_processed_frame->tc_header.bypass = ((uint8_t)ingest[byte_idx] & 0x20) >> 5; + tc_sdls_processed_frame->tc_header.cc = ((uint8_t)ingest[byte_idx] & 0x10) >> 4; + tc_sdls_processed_frame->tc_header.spare = ((uint8_t)ingest[byte_idx] & 0x0C) >> 2; + tc_sdls_processed_frame->tc_header.scid = ((uint8_t)ingest[byte_idx] & 0x03) << 8; byte_idx++; - tc_sdls_processed_frame->tc_header.scid = tc_sdls_processed_frame->tc_header.scid | (uint8)ingest[byte_idx]; + tc_sdls_processed_frame->tc_header.scid = tc_sdls_processed_frame->tc_header.scid | (uint8_t)ingest[byte_idx]; byte_idx++; - tc_sdls_processed_frame->tc_header.vcid = (((uint8)ingest[byte_idx] & 0xFC) >> 2) & crypto_config->vcid_bitmask; - tc_sdls_processed_frame->tc_header.fl = ((uint8)ingest[byte_idx] & 0x03) << 8; + tc_sdls_processed_frame->tc_header.vcid = (((uint8_t)ingest[byte_idx] & 0xFC) >> 2) & crypto_config->vcid_bitmask; + tc_sdls_processed_frame->tc_header.fl = ((uint8_t)ingest[byte_idx] & 0x03) << 8; byte_idx++; - tc_sdls_processed_frame->tc_header.fl = tc_sdls_processed_frame->tc_header.fl | (uint8)ingest[byte_idx]; + tc_sdls_processed_frame->tc_header.fl = tc_sdls_processed_frame->tc_header.fl | (uint8_t)ingest[byte_idx]; byte_idx++; - tc_sdls_processed_frame->tc_header.fsn = (uint8)ingest[byte_idx]; + tc_sdls_processed_frame->tc_header.fsn = (uint8_t)ingest[byte_idx]; byte_idx++; //Lookup-retrieve managed parameters for frame via gvcid: @@ -3256,11 +3256,11 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro // Segment Header if(current_managed_parameters->has_segmentation_hdr==TC_HAS_SEGMENT_HDRS){ - tc_sdls_processed_frame->tc_sec_header.sh = (uint8)ingest[byte_idx]; + tc_sdls_processed_frame->tc_sec_header.sh = (uint8_t)ingest[byte_idx]; byte_idx++; } // Security Header - tc_sdls_processed_frame->tc_sec_header.spi = ((uint8)ingest[byte_idx] << 8) | (uint8)ingest[byte_idx+1]; + tc_sdls_processed_frame->tc_sec_header.spi = ((uint8_t)ingest[byte_idx] << 8) | (uint8_t)ingest[byte_idx+1]; byte_idx+=2; #ifdef TC_DEBUG printf("vcid = %d \n", tc_sdls_processed_frame->tc_header.vcid ); @@ -3328,10 +3328,10 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro #endif // TODO: Calculate lengths when needed - uint8 fecf_len = FECF_SIZE; + uint8_t fecf_len = FECF_SIZE; if(current_managed_parameters->has_fecf==TC_NO_FECF) { fecf_len = 0; } - uint8 segment_hdr_len = SEGMENT_HDR_SIZE; + uint8_t segment_hdr_len = SEGMENT_HDR_SIZE; if(current_managed_parameters->has_segmentation_hdr==TC_NO_SEGMENT_HDRS) { segment_hdr_len = 0; } // Check FECF @@ -3339,9 +3339,9 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro { if(crypto_config->crypto_check_fecf == TC_CHECK_FECF_TRUE) { - uint16 received_fecf = (((ingest[tc_sdls_processed_frame->tc_header.fl - 1] << 8) & 0xFF00) | (ingest[tc_sdls_processed_frame->tc_header.fl] & 0x00FF)); + uint16_t received_fecf = (((ingest[tc_sdls_processed_frame->tc_header.fl - 1] << 8) & 0xFF00) | (ingest[tc_sdls_processed_frame->tc_header.fl] & 0x00FF)); // Calculate our own - uint16 calculated_fecf = Crypto_Calc_FECF(ingest, *len_ingest-2); + uint16_t calculated_fecf = Crypto_Calc_FECF(ingest, *len_ingest-2); // Compare if (received_fecf != calculated_fecf) { @@ -3352,7 +3352,7 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro } // Parse the security header - tc_sdls_processed_frame->tc_sec_header.spi = (uint16)((uint8)ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len] | (uint8)ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + 1]); + tc_sdls_processed_frame->tc_sec_header.spi = (uint16_t)((uint8_t)ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len] | (uint8_t)ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + 1]); // Get SA via SPI status = sadb_routine->sadb_get_sa_from_spi(tc_sdls_processed_frame->tc_sec_header.spi, &sa_ptr); if(status != CRYPTO_LIB_SUCCESS){ return status; } @@ -3407,7 +3407,7 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro if((sa_service_type == SA_AUTHENTICATION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION)) { - uint16 tc_mac_start_index = tc_sdls_processed_frame->tc_header.fl + 1 - fecf_len - sa_ptr->stmacf_len; + uint16_t tc_mac_start_index = tc_sdls_processed_frame->tc_header.fl + 1 - fecf_len - sa_ptr->stmacf_len; // Parse the received MAC memcpy((tc_sdls_processed_frame->tc_sec_trailer.mac)+(MAC_SIZE-sa_ptr->stmacf_len), &(ingest[tc_mac_start_index]) , sa_ptr->stmacf_len); if (crypto_config->ignore_anti_replay==TC_IGNORE_ANTI_REPLAY_FALSE ) @@ -3446,7 +3446,7 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro } - uint16 aad_len = tc_mac_start_index; + uint16_t aad_len = tc_mac_start_index; if((sa_service_type == SA_AUTHENTICATED_ENCRYPTION) && (ecs_is_aead_algorithm == CRYPTO_TRUE)) { aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len; } aad = Crypto_Prepare_TC_AAD(ingest, aad_len, sa_ptr->abm); @@ -3469,7 +3469,7 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro (sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || (sa_service_type == SA_AUTHENTICATION)) { - uint16 tc_enc_payload_start_index = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len; + uint16_t tc_enc_payload_start_index = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len; tc_sdls_processed_frame->tc_pdu_len = tc_sdls_processed_frame->tc_header.fl + 1 - tc_enc_payload_start_index - sa_ptr->stmacf_len - fecf_len; if(sa_service_type == SA_AUTHENTICATION) @@ -3529,7 +3529,7 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro { // TODO: Plaintext ARSN - uint16 tc_enc_payload_start_index = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len; + uint16_t tc_enc_payload_start_index = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len; tc_sdls_processed_frame->tc_pdu_len = tc_sdls_processed_frame->tc_header.fl + 1 - tc_enc_payload_start_index - sa_ptr->stmacf_len - fecf_len; memcpy(tc_sdls_processed_frame->tc_pdu, &(ingest[tc_enc_payload_start_index]), tc_sdls_processed_frame->tc_pdu_len); } @@ -3546,12 +3546,12 @@ int32 Crypto_TC_ProcessSecurity( char* ingest, int* len_ingest,TC_t* tc_sdls_pro /** * @brief Function: Crypto_Process_Extended_Procedure_Pdu * @param tc_sdls_processed_frame: TC_t* - * @param ingest: char* + * @param ingest: uint8_t* * @note TODO - Actually update based on variable config * */ -static int32 Crypto_Process_Extended_Procedure_Pdu(TC_t* tc_sdls_processed_frame, char* ingest) +static int32_t Crypto_Process_Extended_Procedure_Pdu(TC_t* tc_sdls_processed_frame, uint8_t* ingest) { - int32 status = CRYPTO_LIB_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; if (crypto_config->has_pus_hdr==TC_HAS_PUS_HDR) { if ((tc_sdls_processed_frame->tc_pdu[0] == 0x18) && (tc_sdls_processed_frame->tc_pdu[1] == 0x80)) @@ -3632,26 +3632,26 @@ static int32 Crypto_Process_Extended_Procedure_Pdu(TC_t* tc_sdls_processed_frame /** * @brief Function: Crypto_TM_ApplySecurity - * @param ingest: char* + * @param ingest: uint8_t* * @param len_ingest: int* * @return int32: Success/Failure **/ -int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) +int32_t Crypto_TM_ApplySecurity( uint8_t* ingest, int* len_ingest) // Accepts CCSDS message in ingest, and packs into TM before encryption { - int32 status = CRYPTO_LIB_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; int count = 0; int pdu_loc = 0; int pdu_len = *len_ingest - TM_MIN_SIZE; int pad_len = 0; int mac_loc = 0; int fecf_loc = 0; - uint8 tempTM[TM_SIZE]; + uint8_t tempTM[TM_SIZE]; int x = 0; int y = 0; - uint8 aad[20]; - uint16 spi = tm_frame.tm_sec_header.spi; - uint16 spp_crc = 0x0000; + uint8_t aad[20]; + uint16_t spi = tm_frame.tm_sec_header.spi; + uint16_t spp_crc = 0x0000; SecurityAssociation_t* sa_ptr; SecurityAssociation_t sa; @@ -3664,7 +3664,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) #endif // Check for idle frame trigger - if (((uint8)ingest[0] == 0x08) && ((uint8)ingest[1] == 0x90)) + if (((uint8_t)ingest[0] == 0x08) && ((uint8_t)ingest[1] == 0x90)) { // Zero ingest for (x = 0; x < *len_ingest; x++) { @@ -3683,7 +3683,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) ingest[2] = 0xFF; ingest[3] = 0xFF; // Add 2 bytes of CRC to space packet - spp_crc = Crypto_Calc_CRC16((char*) ingest, *len_ingest); + spp_crc = Crypto_Calc_CRC16((uint8_t*) ingest, *len_ingest); ingest[*len_ingest] = (spp_crc & 0xFF00) >> 8; ingest[*len_ingest+1] = (spp_crc & 0x00FF); *len_ingest = *len_ingest + 2; @@ -3725,16 +3725,16 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) // Initialize the temporary TM frame // Header - tempTM[count++] = (uint8) ((tm_frame.tm_header.tfvn << 6) | ((tm_frame.tm_header.scid & 0x3F0) >> 4)); - tempTM[count++] = (uint8) (((tm_frame.tm_header.scid & 0x00F) << 4) | (tm_frame.tm_header.vcid << 1) | (tm_frame.tm_header.ocff)); - tempTM[count++] = (uint8) (tm_frame.tm_header.mcfc); - tempTM[count++] = (uint8) (tm_frame.tm_header.vcfc); - tempTM[count++] = (uint8) ((tm_frame.tm_header.tfsh << 7) | (tm_frame.tm_header.sf << 6) | (tm_frame.tm_header.pof << 5) | (tm_frame.tm_header.slid << 3) | ((tm_frame.tm_header.fhp & 0x700) >> 8)); - tempTM[count++] = (uint8) (tm_frame.tm_header.fhp & 0x0FF); - // tempTM[count++] = (uint8) ((tm_frame.tm_header.tfshvn << 6) | tm_frame.tm_header.tfshlen); + tempTM[count++] = (uint8_t) ((tm_frame.tm_header.tfvn << 6) | ((tm_frame.tm_header.scid & 0x3F0) >> 4)); + tempTM[count++] = (uint8_t) (((tm_frame.tm_header.scid & 0x00F) << 4) | (tm_frame.tm_header.vcid << 1) | (tm_frame.tm_header.ocff)); + tempTM[count++] = (uint8_t) (tm_frame.tm_header.mcfc); + tempTM[count++] = (uint8_t) (tm_frame.tm_header.vcfc); + tempTM[count++] = (uint8_t) ((tm_frame.tm_header.tfsh << 7) | (tm_frame.tm_header.sf << 6) | (tm_frame.tm_header.pof << 5) | (tm_frame.tm_header.slid << 3) | ((tm_frame.tm_header.fhp & 0x700) >> 8)); + tempTM[count++] = (uint8_t) (tm_frame.tm_header.fhp & 0x0FF); + // tempTM[count++] = (uint8_t) ((tm_frame.tm_header.tfshvn << 6) | tm_frame.tm_header.tfshlen); // Security Header - tempTM[count++] = (uint8) ((spi & 0xFF00) >> 8); - tempTM[count++] = (uint8) ((spi & 0x00FF)); + tempTM[count++] = (uint8_t) ((spi & 0xFF00) >> 8); + tempTM[count++] = (uint8_t) ((spi & 0x00FF)); memcpy(tm_frame.tm_sec_header.iv, sa_ptr->iv, sa_ptr->shivf_len); // Padding Length @@ -3768,7 +3768,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) // Payload Data Unit for (x = 0; x < (pdu_len); x++) { - tempTM[count++] = (uint8) tm_frame.tm_pdu[x]; + tempTM[count++] = (uint8_t) tm_frame.tm_pdu[x]; } // Message Authentication Code mac_loc = count; @@ -3779,13 +3779,13 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) // Operational Control Field for (x = 0; x < OCF_SIZE; x++) { - tempTM[count++] = (uint8) tm_frame.tm_sec_trailer.ocf[x]; + tempTM[count++] = (uint8_t) tm_frame.tm_sec_trailer.ocf[x]; } // Frame Error Control Field fecf_loc = count; - tm_frame.tm_sec_trailer.fecf = Crypto_Calc_FECF((char*) tempTM, count); - tempTM[count++] = (uint8) ((tm_frame.tm_sec_trailer.fecf & 0xFF00) >> 8); - tempTM[count++] = (uint8) (tm_frame.tm_sec_trailer.fecf & 0x00FF); + tm_frame.tm_sec_trailer.fecf = Crypto_Calc_FECF((uint8_t*) tempTM, count); + tempTM[count++] = (uint8_t) ((tm_frame.tm_sec_trailer.fecf & 0xFF00) >> 8); + tempTM[count++] = (uint8_t) (tm_frame.tm_sec_trailer.fecf & 0x00FF); // Determine Mode // Clear @@ -3898,7 +3898,7 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) printf("MAC = 0x"); for(x = 0; x < MAC_SIZE; x++) { - printf("%02x", (uint8) ingest[x + mac_loc]); + printf("%02x", (uint8_t) ingest[x + mac_loc]); } printf("\n"); #endif @@ -3911,9 +3911,9 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) } // Update FECF - tm_frame.tm_sec_trailer.fecf = Crypto_Calc_FECF((char*) ingest, fecf_loc - 1); - ingest[fecf_loc] = (uint8) ((tm_frame.tm_sec_trailer.fecf & 0xFF00) >> 8); - ingest[fecf_loc + 1] = (uint8) (tm_frame.tm_sec_trailer.fecf & 0x00FF); + tm_frame.tm_sec_trailer.fecf = Crypto_Calc_FECF((uint8_t*) ingest, fecf_loc - 1); + ingest[fecf_loc] = (uint8_t) ((tm_frame.tm_sec_trailer.fecf & 0xFF00) >> 8); + ingest[fecf_loc + 1] = (uint8_t) (tm_frame.tm_sec_trailer.fecf & 0x00FF); } // Authentication else if ((sa_ptr->est == 0) && @@ -3950,14 +3950,14 @@ int32 Crypto_TM_ApplySecurity( char* ingest, int* len_ingest) /** * @brief Function: Crypto_TM_ProcessSecurity - * @param ingest: char* + * @param ingest: uint8_t* * @param len_ingest: int* * @return int32: Success/Failure **/ -int32 Crypto_TM_ProcessSecurity(char* ingest, int* len_ingest) +int32_t Crypto_TM_ProcessSecurity(uint8_t* ingest, int* len_ingest) { // Local Variables - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; #ifdef DEBUG printf(KYEL "\n----- Crypto_TM_ProcessSecurity START -----\n" RESET); @@ -3976,14 +3976,14 @@ int32 Crypto_TM_ProcessSecurity(char* ingest, int* len_ingest) /** * @brief Function: Crypto_AOS_ApplySecurity - * @param ingest: char* + * @param ingest: uint8_t* * @param len_ingest: int* * @return int32: Success/Failure **/ -int32 Crypto_AOS_ApplySecurity(char* ingest, int* len_ingest) +int32_t Crypto_AOS_ApplySecurity(uint8_t* ingest, int* len_ingest) { // Local Variables - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; #ifdef DEBUG printf(KYEL "\n----- Crypto_AOS_ApplySecurity START -----\n" RESET); @@ -4002,14 +4002,14 @@ int32 Crypto_AOS_ApplySecurity(char* ingest, int* len_ingest) /** * @brief Function: Crypto_AOS_ProcessSecurity - * @param ingest: char* + * @param ingest: uint8_t* * @param len_ingest: int* * @return int32: Success/Failure **/ -int32 Crypto_AOS_ProcessSecurity(char* ingest, int* len_ingest) +int32_t Crypto_AOS_ProcessSecurity(uint8_t* ingest, int* len_ingest) { // Local Variables - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; #ifdef DEBUG printf(KYEL "\n----- Crypto_AOS_ProcessSecurity START -----\n" RESET); @@ -4028,14 +4028,14 @@ int32 Crypto_AOS_ProcessSecurity(char* ingest, int* len_ingest) /** * @brief Function: Crypto_ApplySecurity - * @param ingest: char* + * @param ingest: uint8_t* * @param len_ingest: int* * @return int32: Success/Failure **/ -int32 Crypto_ApplySecurity(char* ingest, int* len_ingest) +int32_t Crypto_ApplySecurity(uint8_t* ingest, int* len_ingest) { // Local Variables - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; #ifdef DEBUG printf(KYEL "\n----- Crypto_ApplySecurity START -----\n" RESET); @@ -4054,14 +4054,14 @@ int32 Crypto_ApplySecurity(char* ingest, int* len_ingest) /** * @brief Function: Crypto_ProcessSecurity - * @param ingest: char* + * @param ingest: uint8_t* * @param len_ingest: int* * @return int32: Success/Failure **/ -int32 Crypto_ProcessSecurity(char* ingest, int* len_ingest) +int32_t Crypto_ProcessSecurity(uint8_t* ingest, int* len_ingest) { // Local Variables - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; #ifdef DEBUG printf(KYEL "\n----- Crypto_ProcessSecurity START -----\n" RESET); diff --git a/src/src_main/crypto_print.c b/src/src_main/crypto_print.c index 08f5eebd..2d2d99b4 100644 --- a/src/src_main/crypto_print.c +++ b/src/src_main/crypto_print.c @@ -243,7 +243,7 @@ void Crypto_saPrint(SecurityAssociation_t* sa) **/ void Crypto_hexprint(void *c, size_t n) { - unsigned char *t = c; + uint8_t *t = c; if (c == NULL) return; while (n > 0) { @@ -261,7 +261,7 @@ void Crypto_hexprint(void *c, size_t n) **/ void Crypto_binprint(void *c, size_t n) { - unsigned char *t = c; + uint8_t *t = c; if (c == NULL) return; while (n > 0) { @@ -273,7 +273,7 @@ void Crypto_binprint(void *c, size_t n) printf("\n"); } -void Crypto_mpPrint(GvcidManagedParameters_t* managed_parameters, uint8 print_children) +void Crypto_mpPrint(GvcidManagedParameters_t* managed_parameters, uint8_t print_children) //Prints the currently configured Managed Parameters { if(managed_parameters != NULL){ diff --git a/src/src_main/sadb_routine.c b/src/src_main/sadb_routine.c index 3f411ded..ac69ab01 100644 --- a/src/src_main/sadb_routine.c +++ b/src/src_main/sadb_routine.c @@ -15,10 +15,10 @@ #include "sadb_routine.h" /** * @brief Function: init_parse_sadb_routine - * @param config: char* + * @param config: uint8_t* * @return SadbRoutine **/ -SadbRoutine init_parse_sadb_routine(char* config) +SadbRoutine init_parse_sadb_routine(uint8_t* config) { SadbRoutine sadb_routine; return sadb_routine; diff --git a/src/src_main/sadb_routine_inmemory.template.c b/src/src_main/sadb_routine_inmemory.template.c index 738c626e..e3e1d6bf 100644 --- a/src/src_main/sadb_routine_inmemory.template.c +++ b/src/src_main/sadb_routine_inmemory.template.c @@ -19,22 +19,22 @@ #include "crypto_error.h" // Security Association Initialization Functions -static int32 sadb_config(void); -static int32 sadb_init(void); -static int32 sadb_close(void); +static int32_t sadb_config(void); +static int32_t sadb_init(void); +static int32_t sadb_close(void); // Security Association Interaction Functions -static int32 sadb_get_sa_from_spi(uint16,SecurityAssociation_t**); -static int32 sadb_get_operational_sa_from_gvcid(uint8,uint16,uint16,uint8,SecurityAssociation_t**); -static int32 sadb_save_sa(SecurityAssociation_t* sa); +static int32_t sadb_get_sa_from_spi(uint16_t,SecurityAssociation_t**); +static int32_t sadb_get_operational_sa_from_gvcid(uint8_t,uint16_t,uint16_t,uint8_t,SecurityAssociation_t**); +static int32_t sadb_save_sa(SecurityAssociation_t* sa); // Security Association Utility Functions -static int32 sadb_sa_start(TC_t* tc_frame); -static int32 sadb_sa_expire(void); -static int32 sadb_sa_rekey(void); -static int32 sadb_sa_status(char*); -static int32 sadb_sa_create(void); -static int32 sadb_sa_setARSN(void); -static int32 sadb_sa_setARSNW(void); -static int32 sadb_sa_delete(void); +static int32_t sadb_sa_start(TC_t* tc_frame); +static int32_t sadb_sa_expire(void); +static int32_t sadb_sa_rekey(void); +static int32_t sadb_sa_status(uint8_t*); +static int32_t sadb_sa_create(void); +static int32_t sadb_sa_setARSN(void); +static int32_t sadb_sa_setARSNW(void); +static int32_t sadb_sa_delete(void); /* @@ -71,9 +71,9 @@ SadbRoutine get_sadb_routine_inmemory(void) * @brief Function; sadb_config * @return int32: Success/Failure **/ -static int32 sadb_config(void) +static int32_t sadb_config(void) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; // Security Associations // SA 1 - CLEAR MODE @@ -83,7 +83,7 @@ static int32 sadb_config(void) sa[1].est = 0; sa[1].ast = 0; //sa[1].shivf_len = 12; - //sa[1].iv = (uint8*) calloc(1, sa[1].shivf_len * sizeof(uint8)); + //sa[1].iv = (uint8_t*) calloc(1, sa[1].shivf_len * sizeof(uint8_t)); sa[1].arc_len = 1; sa[1].arcw_len = 1; sa[1].arcw = 5; @@ -99,10 +99,10 @@ static int32 sadb_config(void) sa[2].est = 1; sa[2].ast = 1; sa[2].shivf_len = 12; - sa[2].iv = (uint8*) calloc(1, sa[2].shivf_len * sizeof(uint8)); + sa[2].iv = (uint8_t*) calloc(1, sa[2].shivf_len * sizeof(uint8_t)); *(sa[2].iv + sa[2].shivf_len - 1) = 0; sa[2].abm_len = ABM_SIZE; // 20 - sa[2].abm = (uint8*) calloc(1, sa[2].abm_len * sizeof(uint8)); + sa[2].abm = (uint8_t*) calloc(1, sa[2].abm_len * sizeof(uint8_t)); sa[2].arcw_len = 1; sa[2].arcw = 5; sa[2].arc_len = (sa[2].arcw * 2) + 1; @@ -114,10 +114,10 @@ static int32 sadb_config(void) sa[3].est = 1; sa[3].ast = 1; sa[3].shivf_len = 12; - sa[3].iv = (uint8*) calloc(1, sa[3].shivf_len * sizeof(uint8)); + sa[3].iv = (uint8_t*) calloc(1, sa[3].shivf_len * sizeof(uint8_t)); *(sa[3].iv + sa[3].shivf_len - 1) = 0; sa[3].abm_len = ABM_SIZE; // 20 - sa[3].abm = (uint8*) calloc(1, sa[3].abm_len * sizeof(uint8)); + sa[3].abm = (uint8_t*) calloc(1, sa[3].abm_len * sizeof(uint8_t)); sa[3].arcw_len = 1; sa[3].arcw = 5; sa[3].arc_len = (sa[3].arcw * 2) + 1; @@ -131,10 +131,10 @@ static int32 sadb_config(void) sa[4].ast = 1; sa[4].shivf_len = 12; sa[4].stmacf_len = 16; - sa[4].iv = (uint8*) calloc(1, sa[4].shivf_len * sizeof(uint8)); + sa[4].iv = (uint8_t*) calloc(1, sa[4].shivf_len * sizeof(uint8_t)); *(sa[4].iv + 11) = 0; sa[4].abm_len = ABM_SIZE; // 20 - sa[4].abm = (uint8*) calloc(1, sa[4].abm_len * sizeof(uint8)); + sa[4].abm = (uint8_t*) calloc(1, sa[4].abm_len * sizeof(uint8_t)); sa[4].arcw_len = 1; sa[4].arcw = 5; sa[4].arc_len = (sa[4].arcw * 2) + 1; @@ -150,10 +150,10 @@ static int32 sadb_config(void) sa[5].est = 1; sa[5].ast = 1; sa[5].shivf_len = 12; - sa[5].iv = (uint8*) calloc(1, sa[5].shivf_len * sizeof(uint8)); + sa[5].iv = (uint8_t*) calloc(1, sa[5].shivf_len * sizeof(uint8_t)); *(sa[5].iv + sa[5].shivf_len - 1) = 0; sa[5].abm_len = ABM_SIZE; // 20 - sa[5].abm = (uint8*) calloc(1, sa[5].abm_len * sizeof(uint8)); + sa[5].abm = (uint8_t*) calloc(1, sa[5].abm_len * sizeof(uint8_t)); sa[5].arcw_len = 1; sa[5].arcw = 5; sa[5].arc_len = (sa[5].arcw * 2) + 1; @@ -164,10 +164,10 @@ static int32 sadb_config(void) sa[6].est = 1; sa[6].ast = 1; sa[6].shivf_len = 12; - sa[6].iv = (uint8*) calloc(1, sa[6].shivf_len * sizeof(uint8)); + sa[6].iv = (uint8_t*) calloc(1, sa[6].shivf_len * sizeof(uint8_t)); *(sa[6].iv + sa[6].shivf_len - 1) = 0; sa[6].abm_len = ABM_SIZE; // 20 - sa[6].abm = (uint8*) calloc(1, sa[6].abm_len * sizeof(uint8)); + sa[6].abm = (uint8_t*) calloc(1, sa[6].abm_len * sizeof(uint8_t)); sa[6].arcw_len = 1; sa[6].arcw = 5; sa[6].arc_len = (sa[6].arcw * 2) + 1; @@ -179,10 +179,10 @@ static int32 sadb_config(void) sa[7].est = 1; sa[7].ast = 1; sa[7].shivf_len = 12; - sa[7].iv = (uint8*) calloc(1, sa[7].shivf_len * sizeof(uint8)); + sa[7].iv = (uint8_t*) calloc(1, sa[7].shivf_len * sizeof(uint8_t)); *(sa[7].iv + sa[7].shivf_len - 1) = 0; sa[7].abm_len = ABM_SIZE; // 20 - sa[7].abm = (uint8*) calloc(1, sa[7].abm_len * sizeof(uint8)); + sa[7].abm = (uint8_t*) calloc(1, sa[7].abm_len * sizeof(uint8_t)); sa[7].arcw_len = 1; sa[7].arcw = 5; sa[7].arc_len = (sa[7].arcw * 2) + 1; @@ -211,10 +211,10 @@ static int32 sadb_config(void) sa[9].est = 1; sa[9].ast = 0; sa[9].shivf_len = 12; - sa[9].iv = (uint8*) calloc(1, sa[9].shivf_len * sizeof(uint8)); + sa[9].iv = (uint8_t*) calloc(1, sa[9].shivf_len * sizeof(uint8_t)); *(sa[9].iv + 11) = 0; sa[9].abm_len = ABM_SIZE; // 20 - sa[9].abm = (uint8*) calloc(1, sa[9].abm_len * sizeof(uint8)); + sa[9].abm = (uint8_t*) calloc(1, sa[9].abm_len * sizeof(uint8_t)); sa[9].arcw_len = 1; sa[9].arcw = 5; sa[9].arc_len = (sa[9].arcw * 2) + 1; @@ -230,9 +230,9 @@ static int32 sadb_config(void) * @brief Function: sadb_init * @return int32: Success/Failure **/ -static int32 sadb_init(void) +static int32_t sadb_init(void) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; for (int x = 0; x < NUM_SA; x++) { @@ -258,7 +258,7 @@ static int32 sadb_init(void) * @brief Function: sadb_close * @return int32: Success/Failure **/ -static int32 sadb_close(void) +static int32_t sadb_close(void) { //closing not necessary for inmemory DB. return OS_SUCCESS; @@ -273,9 +273,9 @@ static int32 sadb_close(void) * @param security_association: SecurityAssociation_t** * @return int32: Success/Failure **/ -static int32 sadb_get_sa_from_spi(uint16 spi,SecurityAssociation_t** security_association) +static int32_t sadb_get_sa_from_spi(uint16_t spi,SecurityAssociation_t** security_association) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; if(sa == NULL) { return CRYPTO_LIB_ERR_NO_INIT; } *security_association = &sa[spi]; if(sa[spi].iv == NULL && ( sa[spi].ast == 1 || sa[spi].est == 1 )) { return CRYPTO_LIB_ERR_NULL_IV; } //Must have IV if doing encryption or authentication @@ -296,9 +296,9 @@ static int32 sadb_get_sa_from_spi(uint16 spi,SecurityAssociation_t** security_as * @param security_association: SecurityAssociation_t** * @return int32: Success/Failure **/ -static int32 sadb_get_operational_sa_from_gvcid(uint8 tfvn,uint16 scid,uint16 vcid,uint8 mapid,SecurityAssociation_t** security_association) +static int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn,uint16_t scid,uint16_t vcid,uint8_t mapid,SecurityAssociation_t** security_association) { - int32 status = CRYPTO_LIB_ERR_NO_OPERATIONAL_SA; + int32_t status = CRYPTO_LIB_ERR_NO_OPERATIONAL_SA; if(sa == NULL) { return CRYPTO_LIB_ERR_NO_INIT; } for (int i=0; i<10; i++) @@ -384,9 +384,9 @@ static int32 sadb_get_operational_sa_from_gvcid(uint8 tfvn,uint16 scid,uint16 vc * @return int32: Success/Failure * @note Nothing currently actually happens in this function **/ -static int32 sadb_save_sa(SecurityAssociation_t* sa) +static int32_t sadb_save_sa(SecurityAssociation_t* sa) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; //We could do a memory copy of the SA into the sa[NUM_SA] array at the given SPI, however, the inmemory code currently updates in place so no need for that. // If we change the in-place update logic, we should update this function to actually update the SA. return status; @@ -400,15 +400,15 @@ static int32 sadb_save_sa(SecurityAssociation_t* sa) * @param tc_frame: TC_t * @return int32: Success/Failure **/ -static int32 sadb_sa_start(TC_t* tc_frame) +static int32_t sadb_sa_start(TC_t* tc_frame) { // Local variables - uint8 count = 0; - uint16 spi = 0x0000; + uint8_t count = 0; + uint16_t spi = 0x0000; crypto_gvcid_t gvcid; // Read ingest - spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; + spi = ((uint8_t)sdls_frame.pdu.data[0] << 8) | (uint8_t)sdls_frame.pdu.data[1]; // Overwrite last PID sa[spi].lpid = (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; @@ -524,13 +524,13 @@ static int32 sadb_sa_start(TC_t* tc_frame) * @brief Function: sadb_sa_stop * @return int32: Success/Failure **/ -static int32 sadb_sa_stop(void) +static int32_t sadb_sa_stop(void) { // Local variables - uint16 spi = 0x0000; + uint16_t spi = 0x0000; // Read ingest - spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; + spi = ((uint8_t)sdls_frame.pdu.data[0] << 8) | (uint8_t)sdls_frame.pdu.data[1]; printf("spi = %d \n", spi); // Overwrite last PID @@ -582,15 +582,15 @@ static int32 sadb_sa_stop(void) * @brief Function: sadb_sa_rekey * @return int32: Success/Failure **/ -static int32 sadb_sa_rekey(void) +static int32_t sadb_sa_rekey(void) { // Local variables - uint16 spi = 0x0000; + uint16_t spi = 0x0000; int count = 0; int x = 0; // Read ingest - spi = ((uint8)sdls_frame.pdu.data[count] << 8) | (uint8)sdls_frame.pdu.data[count+1]; + spi = ((uint8_t)sdls_frame.pdu.data[count] << 8) | (uint8_t)sdls_frame.pdu.data[count+1]; count = count + 2; // Overwrite last PID @@ -601,11 +601,11 @@ static int32 sadb_sa_rekey(void) { if (sa[spi].sa_state == SA_UNKEYED) { // Encryption Key - sa[spi].ekid = ((uint8)sdls_frame.pdu.data[count] << 8) | (uint8)sdls_frame.pdu.data[count+1]; + sa[spi].ekid = ((uint8_t)sdls_frame.pdu.data[count] << 8) | (uint8_t)sdls_frame.pdu.data[count+1]; count = count + 2; // Authentication Key - //sa[spi].akid = ((uint8)sdls_frame.pdu.data[count] << 8) | (uint8)sdls_frame.pdu.data[count+1]; + //sa[spi].akid = ((uint8_t)sdls_frame.pdu.data[count] << 8) | (uint8_t)sdls_frame.pdu.data[count+1]; //count = count + 2; // Anti-Replay Counter @@ -618,7 +618,7 @@ static int32 sadb_sa_rekey(void) { // TODO: Uncomment once fixed in ESA implementation // TODO: Assuming this was fixed... - *(sa[spi].iv + x - count) = (uint8) sdls_frame.pdu.data[x]; + *(sa[spi].iv + x - count) = (uint8_t) sdls_frame.pdu.data[x]; #ifdef PDU_DEBUG printf("%02x", sdls_frame.pdu.data[x]); #endif @@ -661,13 +661,13 @@ static int32 sadb_sa_rekey(void) * @brief Function: sadb_sa_expire * @return int32: Success/Failure **/ -static int32 sadb_sa_expire(void) +static int32_t sadb_sa_expire(void) { // Local variables - uint16 spi = 0x0000; + uint16_t spi = 0x0000; // Read ingest - spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; + spi = ((uint8_t)sdls_frame.pdu.data[0] << 8) | (uint8_t)sdls_frame.pdu.data[1]; printf("spi = %d \n", spi); // Overwrite last PID @@ -700,60 +700,60 @@ static int32 sadb_sa_expire(void) * @brief Function: sadb_sa_create * @return int32: Success/Failure **/ -static int32 sadb_sa_create(void) +static int32_t sadb_sa_create(void) { // Local variables - uint8 count = 6; - uint16 spi = 0x0000; + uint8_t count = 6; + uint16_t spi = 0x0000; // Read sdls_frame.pdu.data - spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; + spi = ((uint8_t)sdls_frame.pdu.data[0] << 8) | (uint8_t)sdls_frame.pdu.data[1]; printf("spi = %d \n", spi); // Overwrite last PID sa[spi].lpid = (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; // Write SA Configuration - sa[spi].est = ((uint8)sdls_frame.pdu.data[2] & 0x80) >> 7; - sa[spi].ast = ((uint8)sdls_frame.pdu.data[2] & 0x40) >> 6; - sa[spi].shivf_len = ((uint8)sdls_frame.pdu.data[2] & 0x3F); + sa[spi].est = ((uint8_t)sdls_frame.pdu.data[2] & 0x80) >> 7; + sa[spi].ast = ((uint8_t)sdls_frame.pdu.data[2] & 0x40) >> 6; + sa[spi].shivf_len = ((uint8_t)sdls_frame.pdu.data[2] & 0x3F); if(sa[spi].iv != NULL) { free(sa[spi].iv); } - sa[spi].iv = (uint8*) calloc(1, sa[spi].shivf_len * sizeof(uint8)); - sa[spi].shsnf_len = ((uint8)sdls_frame.pdu.data[3] & 0xFC) >> 2; - sa[spi].shplf_len = ((uint8)sdls_frame.pdu.data[3] & 0x03); - sa[spi].stmacf_len = ((uint8)sdls_frame.pdu.data[4]); - sa[spi].ecs_len = ((uint8)sdls_frame.pdu.data[5]); + sa[spi].iv = (uint8_t*) calloc(1, sa[spi].shivf_len * sizeof(uint8_t)); + sa[spi].shsnf_len = ((uint8_t)sdls_frame.pdu.data[3] & 0xFC) >> 2; + sa[spi].shplf_len = ((uint8_t)sdls_frame.pdu.data[3] & 0x03); + sa[spi].stmacf_len = ((uint8_t)sdls_frame.pdu.data[4]); + sa[spi].ecs_len = ((uint8_t)sdls_frame.pdu.data[5]); for (int x = 0; x < sa[spi].ecs_len; x++) { - sa[spi].ecs[x] = ((uint8)sdls_frame.pdu.data[count++]); + sa[spi].ecs[x] = ((uint8_t)sdls_frame.pdu.data[count++]); } - sa[spi].shivf_len = ((uint8)sdls_frame.pdu.data[count++]); + sa[spi].shivf_len = ((uint8_t)sdls_frame.pdu.data[count++]); for (int x = 0; x < sa[spi].shivf_len; x++) { - *(sa[spi].iv + x) = ((uint8)sdls_frame.pdu.data[count++]); + *(sa[spi].iv + x) = ((uint8_t)sdls_frame.pdu.data[count++]); } - sa[spi].acs_len = ((uint8)sdls_frame.pdu.data[count++]); + sa[spi].acs_len = ((uint8_t)sdls_frame.pdu.data[count++]); for (int x = 0; x < sa[spi].acs_len; x++) { - sa[spi].acs = ((uint8)sdls_frame.pdu.data[count++]); + sa[spi].acs = ((uint8_t)sdls_frame.pdu.data[count++]); } - sa[spi].abm_len = (uint8)((sdls_frame.pdu.data[count] << 8) | (sdls_frame.pdu.data[count+1])); + sa[spi].abm_len = (uint8_t)((sdls_frame.pdu.data[count] << 8) | (sdls_frame.pdu.data[count+1])); count = count + 2; for (int x = 0; x < sa[spi].abm_len; x++) { - sa[spi].abm[x] = ((uint8)sdls_frame.pdu.data[count++]); + sa[spi].abm[x] = ((uint8_t)sdls_frame.pdu.data[count++]); } - sa[spi].arc_len = ((uint8)sdls_frame.pdu.data[count++]); + sa[spi].arc_len = ((uint8_t)sdls_frame.pdu.data[count++]); if(sa[spi].arc != NULL) { free(sa[spi].arc); } - sa[spi].arc = (uint8*) calloc(1, sa[spi].arc_len * sizeof(uint8)); + sa[spi].arc = (uint8_t*) calloc(1, sa[spi].arc_len * sizeof(uint8_t)); for (int x = 0; x < sa[spi].arc_len; x++) { - *(sa[spi].arc + x) = ((uint8)sdls_frame.pdu.data[count++]); + *(sa[spi].arc + x) = ((uint8_t)sdls_frame.pdu.data[count++]); } - sa[spi].arcw_len = ((uint8)sdls_frame.pdu.data[count++]); + sa[spi].arcw_len = ((uint8_t)sdls_frame.pdu.data[count++]); for (int x = 0; x < sa[spi].arcw_len; x++) { - sa[spi].arcw = sa[spi].arcw | ( ((uint8)sdls_frame.pdu.data[count++]) << (sa[spi].arcw_len - x) ); + sa[spi].arcw = sa[spi].arcw | ( ((uint8_t)sdls_frame.pdu.data[count++]) << (sa[spi].arcw_len - x) ); } // TODO: Checks for valid data @@ -772,13 +772,13 @@ static int32 sadb_sa_create(void) * @brief Function: sadb_sa_delete * @return int32: Success/Failure **/ -static int32 sadb_sa_delete(void) +static int32_t sadb_sa_delete(void) { // Local variables - uint16 spi = 0x0000; + uint16_t spi = 0x0000; // Read ingest - spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; + spi = ((uint8_t)sdls_frame.pdu.data[0] << 8) | (uint8_t)sdls_frame.pdu.data[1]; printf("spi = %d \n", spi); // Overwrite last PID @@ -813,13 +813,13 @@ static int32 sadb_sa_delete(void) * @brief Function: sadb_sa_setASRN * @return int32: Success/Failure **/ -static int32 sadb_sa_setARSN(void) +static int32_t sadb_sa_setARSN(void) { // Local variables - uint16 spi = 0x0000; + uint16_t spi = 0x0000; // Read ingest - spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; + spi = ((uint8_t)sdls_frame.pdu.data[0] << 8) | (uint8_t)sdls_frame.pdu.data[1]; printf("spi = %d \n", spi); // TODO: Check SA type (authenticated, encrypted, both) and set appropriately @@ -835,7 +835,7 @@ static int32 sadb_sa_setARSN(void) { // Set IV - authenticated encryption for (int x = 0; x < IV_SIZE; x++) { - *(sa[spi].iv + x) = (uint8) sdls_frame.pdu.data[x + 2]; + *(sa[spi].iv + x) = (uint8_t) sdls_frame.pdu.data[x + 2]; #ifdef PDU_DEBUG printf("%02x", *(sa[spi].iv + x)); #endif @@ -862,19 +862,19 @@ static int32 sadb_sa_setARSN(void) * @brief Function: sadb_sa_setARSNW * @return int32: Success/Failure **/ -static int32 sadb_sa_setARSNW(void) +static int32_t sadb_sa_setARSNW(void) { // Local variables - uint16 spi = 0x0000; + uint16_t spi = 0x0000; // Read ingest - spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; + spi = ((uint8_t)sdls_frame.pdu.data[0] << 8) | (uint8_t)sdls_frame.pdu.data[1]; printf("spi = %d \n", spi); // Check SPI exists if (spi < NUM_SA) { - sa[spi].arcw_len = (uint8) sdls_frame.pdu.data[2]; + sa[spi].arcw_len = (uint8_t) sdls_frame.pdu.data[2]; // Check for out of bounds if (sa[spi].arcw_len > (ARC_SIZE)) @@ -884,7 +884,7 @@ static int32 sadb_sa_setARSNW(void) for(int x = 0; x < sa[spi].arcw_len; x++) { - sa[spi].arcw = (((uint8) sdls_frame.pdu.data[x+3]) << (sa[spi].arcw_len - x) ); + sa[spi].arcw = (((uint8_t) sdls_frame.pdu.data[x+3]) << (sa[spi].arcw_len - x) ); } } else @@ -897,17 +897,17 @@ static int32 sadb_sa_setARSNW(void) /** * @brief Function: sadb_sa_status - * @param ingest: char* + * @param ingest: uint8_t* * @return int32: count **/ -static int32 sadb_sa_status(char* ingest) +static int32_t sadb_sa_status(uint8_t* ingest) { // Local variables int count = 0; - uint16 spi = 0x0000; + uint16_t spi = 0x0000; // Read ingest - spi = ((uint8)sdls_frame.pdu.data[0] << 8) | (uint8)sdls_frame.pdu.data[1]; + spi = ((uint8_t)sdls_frame.pdu.data[0] << 8) | (uint8_t)sdls_frame.pdu.data[1]; printf("spi = %d \n", spi); // Check SPI exists diff --git a/src/src_mysql/sadb_routine_mariadb.template.c b/src/src_mysql/sadb_routine_mariadb.template.c index 13acbec5..45167913 100644 --- a/src/src_mysql/sadb_routine_mariadb.template.c +++ b/src/src_mysql/sadb_routine_mariadb.template.c @@ -24,37 +24,37 @@ #include // Security Association Initialization Functions -static int32 sadb_config(void); -static int32 sadb_init(void); -static int32 sadb_close(void); +static int32_t sadb_config(void); +static int32_t sadb_init(void); +static int32_t sadb_close(void); // Security Association Interaction Functions -static int32 sadb_get_sa_from_spi(uint16,SecurityAssociation_t**); -static int32 sadb_get_operational_sa_from_gvcid(uint8,uint16,uint16,uint8,SecurityAssociation_t**); -static int32 sadb_save_sa(SecurityAssociation_t* sa); +static int32_t sadb_get_sa_from_spi(uint16,SecurityAssociation_t**); +static int32_t sadb_get_operational_sa_from_gvcid(uint8,uint16,uint16,uint8,SecurityAssociation_t**); +static int32_t sadb_save_sa(SecurityAssociation_t* sa); // Security Association Utility Functions -static int32 sadb_sa_start(TC_t* tc_frame); -static int32 sadb_sa_expire(void); -static int32 sadb_sa_rekey(void); -static int32 sadb_sa_status(char*); -static int32 sadb_sa_create(void); -static int32 sadb_sa_setARSN(void); -static int32 sadb_sa_setARSNW(void); -static int32 sadb_sa_delete(void); +static int32_t sadb_sa_start(TC_t* tc_frame); +static int32_t sadb_sa_expire(void); +static int32_t sadb_sa_rekey(void); +static int32_t sadb_sa_status(uint8_t*); +static int32_t sadb_sa_create(void); +static int32_t sadb_sa_setARSN(void); +static int32_t sadb_sa_setARSNW(void); +static int32_t sadb_sa_delete(void); //MySQL local functions -static int32 finish_with_error(MYSQL *con,int err); +static int32_t finish_with_error(MYSQL *con,int err); //MySQL Queries -const static char* SQL_SADB_GET_SA_BY_SPI = "SELECT spi,ekid,akid,sa_state,tfvn,scid,vcid,mapid,lpid,est,ast,shivf_len,shsnf_len,shplf_len,stmacf_len,ecs_len,HEX(ecs),iv_len,HEX(iv),acs_len,acs,abm_len,HEX(abm),arc_len,HEX(arc),arcw_len,HEX(arcw)" +const static uint8_t* SQL_SADB_GET_SA_BY_SPI = "SELECT spi,ekid,akid,sa_state,tfvn,scid,vcid,mapid,lpid,est,ast,shivf_len,shsnf_len,shplf_len,stmacf_len,ecs_len,HEX(ecs),iv_len,HEX(iv),acs_len,acs,abm_len,HEX(abm),arc_len,HEX(arc),arcw_len,HEX(arcw)" " FROM security_associations WHERE spi='%d'"; -const static char* SQL_SADB_GET_SA_BY_GVCID = "SELECT spi,ekid,akid,sa_state,tfvn,scid,vcid,mapid,lpid,est,ast,shivf_len,shsnf_len,shplf_len,stmacf_len,ecs_len,HEX(ecs),iv_len,HEX(iv),acs_len,acs,abm_len,HEX(abm),arc_len,HEX(arc),arcw_len,HEX(arcw)" +const static uint8_t* SQL_SADB_GET_SA_BY_GVCID = "SELECT spi,ekid,akid,sa_state,tfvn,scid,vcid,mapid,lpid,est,ast,shivf_len,shsnf_len,shplf_len,stmacf_len,ecs_len,HEX(ecs),iv_len,HEX(iv),acs_len,acs,abm_len,HEX(abm),arc_len,HEX(arc),arcw_len,HEX(arcw)" " FROM security_associations WHERE tfvn='%d' AND scid='%d' AND vcid='%d' AND mapid='%d' AND sa_state='%d'"; -const static char* SQL_SADB_UPDATE_IV_ARC_BY_SPI = "UPDATE security_associations" +const static uint8_t* SQL_SADB_UPDATE_IV_ARC_BY_SPI = "UPDATE security_associations" " SET iv=X'%s', arc=X'%s'" " WHERE spi='%d' AND tfvn='%d' AND scid='%d' AND vcid='%d' AND mapid='%d'"; // sadb_routine mariaDB private helper functions -static int32 parse_sa_from_mysql_query(char* query, SecurityAssociation_t** security_association); -static int32 convert_hexstring_to_byte_array(char* hexstr, uint8* byte_array); -static char* convert_byte_array_to_hexstring(void* src_buffer, size_t buffer_length); +static int32_t parse_sa_from_mysql_query(uint8_t* query, SecurityAssociation_t** security_association); +static int32_t convert_hexstring_to_byte_array(uint8_t* hexstr, uint8_t* byte_array); +static uint8_t* convert_byte_array_to_hexstring(void* src_buffer, size_t buffer_length); /* ** Global Variables @@ -82,14 +82,14 @@ SadbRoutine get_sadb_routine_mariadb(void) return &sadb_routine; } -static int32 sadb_config(void) +static int32_t sadb_config(void) { return OS_SUCCESS; } -static int32 sadb_init(void) +static int32_t sadb_init(void) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; con = mysql_init(NULL); //TODO - add mysql_options/mysql_get_ssl_cipher logic for mTLS connections. @@ -104,41 +104,41 @@ static int32 sadb_init(void) return status; } -static int32 sadb_close(void) +static int32_t sadb_close(void) { mysql_close(con); return OS_SUCCESS; } // Security Association Interaction Functions -static int32 sadb_get_sa_from_spi(uint16 spi,SecurityAssociation_t** security_association) +static int32_t sadb_get_sa_from_spi(uint16_t spi,SecurityAssociation_t** security_association) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; - char spi_query[2048]; + uint8_t spi_query[2048]; snprintf(spi_query, sizeof(spi_query),SQL_SADB_GET_SA_BY_SPI,spi); status = parse_sa_from_mysql_query(&spi_query[0],security_association); return status; } -static int32 sadb_get_operational_sa_from_gvcid(uint8 tfvn,uint16 scid,uint16 vcid,uint8 mapid,SecurityAssociation_t** security_association) +static int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn,uint16_t scid,uint16_t vcid,uint8_t mapid,SecurityAssociation_t** security_association) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; - char gvcid_query[2048]; + uint8_t gvcid_query[2048]; snprintf(gvcid_query, sizeof(gvcid_query),SQL_SADB_GET_SA_BY_GVCID,tfvn,scid,vcid,mapid,SA_OPERATIONAL); status = parse_sa_from_mysql_query(&gvcid_query[0],security_association); return status; } -static int32 sadb_save_sa(SecurityAssociation_t* sa) +static int32_t sadb_save_sa(SecurityAssociation_t* sa) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; if(sa==NULL) {return SADB_NULL_SA_USED;} - char update_sa_query[2048]; + uint8_t update_sa_query[2048]; snprintf(update_sa_query, sizeof(update_sa_query),SQL_SADB_UPDATE_IV_ARC_BY_SPI,convert_byte_array_to_hexstring(sa->iv,sa->shivf_len),convert_byte_array_to_hexstring(sa->arc,sa->shsnf_len),sa->spi,sa->gvcid_tc_blk.tfvn,sa->gvcid_tc_blk.scid,sa->gvcid_tc_blk.vcid,sa->gvcid_tc_blk.mapid); #ifdef SA_DEBUG @@ -159,19 +159,19 @@ static int32 sadb_save_sa(SecurityAssociation_t* sa) return status; } // Security Association Utility Functions -static int32 sadb_sa_start(TC_t* tc_frame){return OS_SUCCESS;} -static int32 sadb_sa_expire(void){return OS_SUCCESS;} -static int32 sadb_sa_rekey(void){return OS_SUCCESS;} -static int32 sadb_sa_status(char* ingest){return OS_SUCCESS;} -static int32 sadb_sa_create(void){return OS_SUCCESS;} -static int32 sadb_sa_setARSN(void){return OS_SUCCESS;} -static int32 sadb_sa_setARSNW(void){return OS_SUCCESS;} -static int32 sadb_sa_delete(void){return OS_SUCCESS;} +static int32_t sadb_sa_start(TC_t* tc_frame){return OS_SUCCESS;} +static int32_t sadb_sa_expire(void){return OS_SUCCESS;} +static int32_t sadb_sa_rekey(void){return OS_SUCCESS;} +static int32_t sadb_sa_status(uint8_t* ingest){return OS_SUCCESS;} +static int32_t sadb_sa_create(void){return OS_SUCCESS;} +static int32_t sadb_sa_setARSN(void){return OS_SUCCESS;} +static int32_t sadb_sa_setARSNW(void){return OS_SUCCESS;} +static int32_t sadb_sa_delete(void){return OS_SUCCESS;} // sadb_routine private helper functions -static int32 parse_sa_from_mysql_query(char* query, SecurityAssociation_t** security_association) +static int32_t parse_sa_from_mysql_query(uint8_t* query, SecurityAssociation_t** security_association) { - int32 status = OS_SUCCESS; + int32_t status = OS_SUCCESS; SecurityAssociation_t* sa = malloc(sizeof(SecurityAssociation_t)); #ifdef SA_DEBUG @@ -193,14 +193,14 @@ static int32 parse_sa_from_mysql_query(char* query, SecurityAssociation_t** secu MYSQL_ROW row; MYSQL_FIELD *field; - char *field_names[num_fields]; //[64]; 64 == max length of column name in MySQL + uint8_t *field_names[num_fields]; //[64]; 64 == max length of column name in MySQL //TODO -- Need to store mysql query hex string and then malloc sa->iv according to size. - //TODO -- IV && arc && abm as uint8* instead of uint8[]!!! - char* iv_byte_str; - char* arc_byte_str; - char* abm_byte_str; + //TODO -- IV && arc && abm as uint8_t* instead of uint8[]!!! + uint8_t* iv_byte_str; + uint8_t* arc_byte_str; + uint8_t* abm_byte_str; while((row = mysql_fetch_row(result))){ for(int i=0; i < num_fields; i++) { @@ -214,7 +214,7 @@ static int32 parse_sa_from_mysql_query(char* query, SecurityAssociation_t** secu } //Handle query results int spi; - uint8 tmp_uint8; + uint8_t tmp_uint8; if(row[i]==NULL){continue;} //Don't do anything with NULL fields from MySQL query. if(strcmp(field_names[i],"spi")==0){sa->spi = atoi(row[i]);continue;} if(strcmp(field_names[i],"ekid")==0){sa->ekid=atoi(row[i]);continue;} @@ -249,9 +249,9 @@ static int32 parse_sa_from_mysql_query(char* query, SecurityAssociation_t** secu } //printf("\n"); } - sa->iv = (uint8*) calloc(1, sa->shivf_len * sizeof(uint8)); - sa->arc = (uint8*) calloc(1, sa->arc_len * sizeof(uint8)); - sa->abm = (uint8*) calloc(1, sa->abm_len * sizeof(uint8)); + sa->iv = (uint8_t*) calloc(1, sa->shivf_len * sizeof(uint8_t)); + sa->arc = (uint8_t*) calloc(1, sa->arc_len * sizeof(uint8_t)); + sa->abm = (uint8_t*) calloc(1, sa->abm_len * sizeof(uint8_t)); convert_hexstring_to_byte_array(iv_byte_str,sa->iv); convert_hexstring_to_byte_array(arc_byte_str,sa->arc); convert_hexstring_to_byte_array(abm_byte_str,sa->abm); @@ -261,13 +261,13 @@ static int32 parse_sa_from_mysql_query(char* query, SecurityAssociation_t** secu return status; } -static int32 convert_hexstring_to_byte_array(char* source_str, uint8* dest_buffer) +static int32_t convert_hexstring_to_byte_array(uint8_t* source_str, uint8_t* dest_buffer) { // https://stackoverflow.com/questions/3408706/hexadecimal-string-to-byte-array-in-c/56247335#56247335 - char *line = source_str; - char *data = line; + uint8_t *line = source_str; + uint8_t *data = line; int offset; - uint8 read_byte; - uint8 data_len = 0; + uint8_t read_byte; + uint8_t data_len = 0; while (sscanf(data, " %02x%n", &read_byte, &offset) == 1) { dest_buffer[data_len++] = read_byte; @@ -276,20 +276,20 @@ static int32 convert_hexstring_to_byte_array(char* source_str, uint8* dest_buffe return data_len; } -static char* convert_byte_array_to_hexstring(void* src_buffer, size_t buffer_length) +static uint8_t* convert_byte_array_to_hexstring(void* src_buffer, size_t buffer_length) { if(buffer_length==0){ //Return empty string (with null char!) if buffer is empty return ""; } - unsigned char* bytes = src_buffer; - unsigned char* hexstr = malloc(buffer_length*2+1); + unsigned uint8_t* bytes = src_buffer; + unsigned uint8_t* hexstr = malloc(buffer_length*2+1); if(src_buffer == NULL) return NULL; for(size_t i = 0; i < buffer_length; i++){ - uint8 nib1 = (bytes[i] >> 4) & 0x0F; - uint8 nib2 = (bytes[i]) & 0x0F; + uint8_t nib1 = (bytes[i] >> 4) & 0x0F; + uint8_t nib2 = (bytes[i]) & 0x0F; hexstr[i*2+0] = nib1 < 0xA ? '0' + nib1 : 'A' + nib1 - 0xA; hexstr[i*2+1] = nib2 < 0xA ? '0' + nib2 : 'A' + nib2 - 0xA; } @@ -298,7 +298,7 @@ static char* convert_byte_array_to_hexstring(void* src_buffer, size_t buffer_len } -static int32 finish_with_error(MYSQL *con, int err) +static int32_t finish_with_error(MYSQL *con, int err) { fprintf(stderr, "%s\n", mysql_error(con)); // todo - if query fails, need to push failure message to error stack mysql_close(con); From 48501c0ff88f8adbca05ff53a6c7967a9eaa8364 Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 08:14:05 -0500 Subject: [PATCH 10/18] #1 - Removed include/osapi_minimum.h; --- include/crypto.h | 3 +- include/osapi_minimum.h | 79 ---------- include/sadb_routine.h | 3 +- src/crypto_util/include/shared_util.h | 6 +- src/crypto_util/util/apply_security.c | 2 +- src/crypto_util/util/crypto_sequence.c | 2 +- src/crypto_util/util/process_security.c | 2 +- src/src_main/crypto.c | 136 +++++++++--------- src/src_main/sadb_routine_inmemory.template.c | 26 ++-- src/src_mysql/sadb_routine_mariadb.template.c | 30 ++-- 10 files changed, 107 insertions(+), 182 deletions(-) delete mode 100644 include/osapi_minimum.h diff --git a/include/crypto.h b/include/crypto.h index 7870034e..53a63bd5 100644 --- a/include/crypto.h +++ b/include/crypto.h @@ -26,7 +26,8 @@ #include "cfe.h" #else //Assume build outside of NOS3/cFS infrastructure #include -#include "osapi_minimum.h" +#include +#include #endif #include "crypto_structs.h" diff --git a/include/osapi_minimum.h b/include/osapi_minimum.h deleted file mode 100644 index de4bb39a..00000000 --- a/include/osapi_minimum.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Minimal port of https://github.com/nasa-itc/osal/blob/master/src/os/inc/osapi.h - * needed to build standalone crypto library. - * - * Copyright (c) 2019 United States Government as represented by - * the Administrator of the National Aeronautics and Space Administration. - * 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License 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. - */ - - -#ifndef _osapi_minimum_ -#define _osapi_minimum_ - -#include -#include -#include - -#ifdef __cplusplus - extern "C" { -#endif - -#define OS_SUCCESS (0) -#define OS_ERROR (-1) -#define OS_INVALID_POINTER (-2) -#define OS_ERROR_ADDRESS_MISALIGNED (-3) -#define OS_ERROR_TIMEOUT (-4) -#define OS_INVALID_INT_NUM (-5) -#define OS_SEM_FAILURE (-6) -#define OS_SEM_TIMEOUT (-7) -#define OS_QUEUE_EMPTY (-8) -#define OS_QUEUE_FULL (-9) -#define OS_QUEUE_TIMEOUT (-10) -#define OS_QUEUE_INVALID_SIZE (-11) -#define OS_QUEUE_ID_ERROR (-12) -#define OS_ERR_NAME_TOO_LONG (-13) -#define OS_ERR_NO_FREE_IDS (-14) -#define OS_ERR_NAME_TAKEN (-15) -#define OS_ERR_INVALID_ID (-16) -#define OS_ERR_NAME_NOT_FOUND (-17) -#define OS_ERR_SEM_NOT_FULL (-18) -#define OS_ERR_INVALID_PRIORITY (-19) -#define OS_INVALID_SEM_VALUE (-20) -#define OS_ERR_FILE (-27) -#define OS_ERR_NOT_IMPLEMENTED (-28) -#define OS_TIMER_ERR_INVALID_ARGS (-29) -#define OS_TIMER_ERR_TIMER_ID (-30) -#define OS_TIMER_ERR_UNAVAILABLE (-31) -#define OS_TIMER_ERR_INTERNAL (-32) -#define OS_ERR_OBJECT_IN_USE (-33) -#define OS_ERR_BAD_ADDRESS (-34) -#define OS_ERR_INCORRECT_OBJ_STATE (-35) -#define OS_ERR_INCORRECT_OBJ_TYPE (-36) -#define OS_ERR_STREAM_DISCONNECTED (-37) - -/* -** Defines for Queue Timeout parameters -*/ -#define OS_PEND (-1) -#define OS_CHECK (0) - - -#ifdef __cplusplus - } -#endif - -#endif - diff --git a/include/sadb_routine.h b/include/sadb_routine.h index f749bfd9..d2d3b9e6 100644 --- a/include/sadb_routine.h +++ b/include/sadb_routine.h @@ -19,8 +19,9 @@ #include "common_types.h" #include "osapi.h" #else //Assume build outside of NOS3/cFS infrastructure +#include +#include #include -#include "osapi_minimum.h" #endif #include "crypto_structs.h" diff --git a/src/crypto_util/include/shared_util.h b/src/crypto_util/include/shared_util.h index 6841d21d..0845cb18 100644 --- a/src/crypto_util/include/shared_util.h +++ b/src/crypto_util/include/shared_util.h @@ -22,12 +22,14 @@ extern "C" { #endif -#include #include #include +#include +#include +#include #include -#include "osapi_minimum.h" +#include "crypto_error.h" uint8_t * c_read_file(const uint8_t * f_name, long * f_size); diff --git a/src/crypto_util/util/apply_security.c b/src/crypto_util/util/apply_security.c index fc12312a..173a4458 100644 --- a/src/crypto_util/util/apply_security.c +++ b/src/crypto_util/util/apply_security.c @@ -36,7 +36,7 @@ int main(int argc, uint8_t *argv[]) { " : Apply TeleCommand (tc) | Telemetry (tm) | Advanced Orbiting Systems (aos) Security T\n"\ " : binary file with telecommand transfer frame bits\n",argv[0]); - return OS_ERROR; + return CRYPTO_LIB_ERROR; } buffer = c_read_file(filename,&buffer_size); debug_printf("File buffer size:%lu\n",buffer_size); diff --git a/src/crypto_util/util/crypto_sequence.c b/src/crypto_util/util/crypto_sequence.c index 8c20d907..b3295add 100644 --- a/src/crypto_util/util/crypto_sequence.c +++ b/src/crypto_util/util/crypto_sequence.c @@ -36,7 +36,7 @@ int main(int argc, uint8_t *argv[]) { " : Process TeleCommand (tc_p) | Telemetry (tm_p) | Advanced Orbiting Systems (aos_p) Security T\n"\ " : binary file with telecommand transfer frame bits\n",argv[0]); - return OS_ERROR; + return CRYPTO_LIB_ERROR; } //Setup & Initialize CryptoLib Crypto_Init(); diff --git a/src/crypto_util/util/process_security.c b/src/crypto_util/util/process_security.c index c1c40b21..17c3e842 100644 --- a/src/crypto_util/util/process_security.c +++ b/src/crypto_util/util/process_security.c @@ -37,7 +37,7 @@ int main(int argc, uint8_t *argv[]) { " : Process TeleCommand (tc) | Telemetry (tm) | Advanced Orbiting Systems (aos) Security T\n"\ " : binary file with telecommand transfer frame bits\n",argv[0]); - return OS_ERROR; + return CRYPTO_LIB_ERROR; } buffer = c_read_file(filename,&buffer_size); debug_printf("File buffer size:%lu\n",buffer_size); diff --git a/src/src_main/crypto.c b/src/src_main/crypto.c index f3031fd7..8bb43946 100644 --- a/src/src_main/crypto.c +++ b/src/src_main/crypto.c @@ -131,7 +131,7 @@ static uint16_t crc16Table[256]; **/ int32_t Crypto_Init_Unit_Test(void) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,1,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); @@ -148,7 +148,7 @@ int32_t Crypto_Init_Unit_Test(void) **/ int32_t Crypto_Init_With_Configs(CryptoConfig_t* crypto_config_p,GvcidManagedParameters_t* gvcid_managed_parameters_p,SadbMariaDBConfig_t* sadb_mariadb_config_p) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; crypto_config = crypto_config_p; gvcid_managed_parameters = gvcid_managed_parameters_p; sadb_mariadb_config = sadb_mariadb_config_p; @@ -162,7 +162,7 @@ int32_t Crypto_Init_With_Configs(CryptoConfig_t* crypto_config_p,GvcidManagedPar **/ int32_t Crypto_Init(void) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; if(crypto_config==NULL){ status = CRYPTO_CONFIGURATION_NOT_COMPLETE; @@ -232,7 +232,7 @@ int32_t Crypto_Init(void) **/ int32_t Crypto_Shutdown(void) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; if(crypto_config!=NULL){ free(crypto_config); @@ -267,7 +267,7 @@ int32_t Crypto_Shutdown(void) **/ int32_t Crypto_Config_CryptoLib(uint8_t sadb_type, uint8_t crypto_create_fecf, uint8_t process_sdls_pdus, uint8_t has_pus_hdr, uint8_t ignore_sa_state, uint8_t ignore_anti_replay, uint8_t unique_sa_per_mapid,uint8_t crypto_check_fecf, uint8_t vcid_bitmask) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; crypto_config = (CryptoConfig_t*) calloc(1, CRYPTO_CONFIG_SIZE); crypto_config->sadb_type=sadb_type; crypto_config->crypto_create_fecf=crypto_create_fecf; @@ -292,7 +292,7 @@ int32_t Crypto_Config_CryptoLib(uint8_t sadb_type, uint8_t crypto_create_fecf, u **/ int32_t Crypto_Config_MariaDB(uint8_t* mysql_username, uint8_t* mysql_password, uint8_t* mysql_hostname, uint8_t* mysql_database, uint16_t mysql_port) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; sadb_mariadb_config = (SadbMariaDBConfig_t*)calloc(1, SADB_MARIADB_CONFIG_SIZE); sadb_mariadb_config->mysql_username=mysql_username; sadb_mariadb_config->mysql_password=mysql_password; @@ -313,7 +313,7 @@ int32_t Crypto_Config_MariaDB(uint8_t* mysql_username, uint8_t* mysql_password, **/ int32_t Crypto_Config_Add_Gvcid_Managed_Parameter(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, uint8_t has_segmentation_hdr) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; if(gvcid_managed_parameters==NULL){//case: Global Root Node not Set gvcid_managed_parameters = (GvcidManagedParameters_t*) calloc(1,GVCID_MANAGED_PARAMETERS_SIZE); @@ -352,7 +352,7 @@ static int32_t crypto_config_add_gvcid_managed_parameter_recursion(uint8_t tfvn, managed_parameter->next->has_fecf = has_fecf; managed_parameter->next->has_segmentation_hdr = has_segmentation_hdr; managed_parameter->next->next = NULL; - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } } @@ -1014,7 +1014,7 @@ static void Crypto_TM_updatePDU(uint8_t* ingest, int len_ingest) int fill_size = 0; SecurityAssociation_t* sa_ptr; - if(sadb_routine->sadb_get_sa_from_spi(tm_frame.tm_sec_header.spi,&sa_ptr) != OS_SUCCESS){ + if(sadb_routine->sadb_get_sa_from_spi(tm_frame.tm_sec_header.spi,&sa_ptr) != CRYPTO_LIB_SUCCESS){ //TODO - Error handling return; //Error -- unable to get SA from SPI. } @@ -1201,9 +1201,9 @@ int32_t Crypto_increment(uint8_t *num, int length) } if(i < 0) /* this means num[0] was incremented and overflowed */ - return OS_ERROR; + return CRYPTO_LIB_ERROR; else - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -1253,18 +1253,18 @@ static int32_t Crypto_window(uint8_t *actual, uint8_t *expected, int length, int **/ static int32_t Crypto_compare_less_equal(uint8_t *actual, uint8_t *expected, int length) { - int status = OS_ERROR; + int status = CRYPTO_LIB_ERROR; for(int i = 0; i < length - 1; i++) { if (actual[i] > expected[i]) { - status = OS_SUCCESS; + status = CRYPTO_LIB_SUCCESS; break; } else if (actual[i] < expected[i]) { - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; break; } } @@ -1323,7 +1323,7 @@ uint8_t Crypto_Prep_Reply(uint8_t* ingest, uint8_t appID) **/ static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_frame) { - int32_t result = OS_SUCCESS; + int32_t result = CRYPTO_LIB_SUCCESS; uint16_t calc_fecf = Crypto_Calc_FECF(ingest, len_ingest); if ( (fecf & 0xFFFF) != calc_fecf ) @@ -1349,7 +1349,7 @@ static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_fr #ifdef FECF_DEBUG printf("\t Calculated = 0x%04x \n\t Received = 0x%04x \n", calc_fecf, tc_frame->tc_sec_trailer.fecf); #endif - result = OS_ERROR; + result = CRYPTO_LIB_ERROR; } } @@ -1445,7 +1445,7 @@ static int32_t Crypto_Key_OTAR(void) SDLS_OTAR_t packet; int count = 0; int x = 0; - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; int pdu_keys = (sdls_frame.pdu.pdu_len - 30) / (2 + KEY_SIZE); gcry_cipher_hd_t tmp_hd; @@ -1469,7 +1469,7 @@ static int32_t Crypto_Key_OTAR(void) log.blk[log_count++].em_len = 4; } printf(KRED "Error: MKID is not valid! \n" RESET); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } @@ -1495,7 +1495,7 @@ static int32_t Crypto_Key_OTAR(void) if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } gcry_error = gcry_cipher_setkey( @@ -1506,7 +1506,7 @@ static int32_t Crypto_Key_OTAR(void) if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } gcry_error = gcry_cipher_setiv( @@ -1517,7 +1517,7 @@ static int32_t Crypto_Key_OTAR(void) if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } gcry_error = gcry_cipher_decrypt( @@ -1530,7 +1530,7 @@ static int32_t Crypto_Key_OTAR(void) if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } gcry_error = gcry_cipher_checktag( @@ -1541,7 +1541,7 @@ static int32_t Crypto_Key_OTAR(void) if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } gcry_cipher_close(tmp_hd); @@ -1565,7 +1565,7 @@ static int32_t Crypto_Key_OTAR(void) log.blk[log_count++].em_len = 4; } printf(KRED "Error: Cannot OTAR master key! \n" RESET); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } else @@ -1601,7 +1601,7 @@ static int32_t Crypto_Key_OTAR(void) } #endif - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** * @brief Function: Crypto_Key_update @@ -1701,7 +1701,7 @@ static int32_t Crypto_Key_update(uint8_t state) printf(KRED "Error: Key %d cannot transition to desired state! \n" RESET, packet.kblk[x].kid); } } - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -2039,9 +2039,9 @@ static int32_t Crypto_SA_readARSN(uint8_t* ingest) ingest[count++] = (spi & 0x00FF); - if(sadb_routine->sadb_get_sa_from_spi(spi,&sa_ptr) != OS_SUCCESS){ + if(sadb_routine->sadb_get_sa_from_spi(spi,&sa_ptr) != CRYPTO_LIB_SUCCESS){ //TODO - Error handling - return OS_ERROR; //Error -- unable to get SA from SPI. + return CRYPTO_LIB_ERROR; //Error -- unable to get SA from SPI. } @@ -2093,7 +2093,7 @@ static int32_t Crypto_MC_resetalarm(void) report.bsnf = 0; report.bmacf = 0; report.ispif = 0; - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -2129,7 +2129,7 @@ static int32_t Crypto_User_BadSPI(void) badSPI = 0; } - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -2148,7 +2148,7 @@ static int32_t Crypto_User_BadMAC(void) badMAC = 0; } - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -2167,7 +2167,7 @@ static int32_t Crypto_User_BadIV(void) badIV = 0; } - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -2186,7 +2186,7 @@ static int32_t Crypto_User_BadFECF(void) badFECF = 0; } - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -2214,7 +2214,7 @@ static int32_t Crypto_User_ModifyKey(void) break; } - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -2225,7 +2225,7 @@ static int32_t Crypto_User_ModifyKey(void) static int32_t Crypto_User_ModifyActiveTM(void) { tm_frame.tm_sec_header.spi = (uint8_t)sdls_frame.pdu.data[0]; - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -2239,9 +2239,9 @@ static int32_t Crypto_User_ModifyVCID(void) for (int i = 0; i < NUM_GVCID; i++) { - if(sadb_routine->sadb_get_sa_from_spi(i,&sa_ptr) != OS_SUCCESS){ + if(sadb_routine->sadb_get_sa_from_spi(i,&sa_ptr) != CRYPTO_LIB_SUCCESS){ //TODO - Error handling - return OS_ERROR; //Error -- unable to get SA from SPI. + return CRYPTO_LIB_ERROR; //Error -- unable to get SA from SPI. } for (int j = 0; j < NUM_SA; j++) { @@ -2258,7 +2258,7 @@ static int32_t Crypto_User_ModifyVCID(void) } } - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /* @@ -2545,7 +2545,7 @@ static int32_t Crypto_Get_Managed_Parameters_For_Gvcid(uint8_t tfvn,uint16_t sci { if(managed_parameters_in->tfvn==tfvn && managed_parameters_in->scid==scid && managed_parameters_in->vcid==vcid) { *managed_parameters_out = managed_parameters_in; - status = OS_SUCCESS; + status = CRYPTO_LIB_SUCCESS; return status; }else { return Crypto_Get_Managed_Parameters_For_Gvcid(tfvn,scid,vcid,managed_parameters_in->next,managed_parameters_out); @@ -2587,7 +2587,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra uint8_t **pp_in_frame, uint16_t *p_enc_frame_len) { // Local Variables - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; TC_FramePrimaryHeader_t temp_tc_header; SecurityAssociation_t* sa_ptr = NULL; uint8_t *p_new_enc_frame = NULL; @@ -2643,7 +2643,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra //Lookup-retrieve managed parameters for frame via gvcid: status = Crypto_Get_Managed_Parameters_For_Gvcid(temp_tc_header.tfvn,temp_tc_header.scid,temp_tc_header.vcid,gvcid_managed_parameters,¤t_managed_parameters); - if(status != OS_SUCCESS) {return status;} //Unable to get necessary Managed Parameters for TC TF -- return with error. + if(status != CRYPTO_LIB_SUCCESS) {return status;} //Unable to get necessary Managed Parameters for TC TF -- return with error. uint8_t segmentation_hdr = 0x00; uint8_t map_id = 0; @@ -2653,7 +2653,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra } // Check if command frame flag set - if ((temp_tc_header.cc == 1) && (status == OS_SUCCESS)) + if ((temp_tc_header.cc == 1) && (status == CRYPTO_LIB_SUCCESS)) { /* ** CCSDS 232.0-B-3 @@ -2712,7 +2712,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra // Probably unnecessary check // Leaving for now as it would be cleaner in SA to have an association enum returned I believe printf(KRED "Error: SA Service Type is not defined! \n" RESET); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } @@ -2788,7 +2788,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra if(!p_new_enc_frame) { printf(KRED "Error: Malloc for encrypted output buffer failed! \n" RESET); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } memset(p_new_enc_frame, 0, *p_enc_frame_len); @@ -2943,7 +2943,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } gcry_error = gcry_cipher_setkey( @@ -2954,7 +2954,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } gcry_error = gcry_cipher_setiv( @@ -2965,7 +2965,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } @@ -3020,7 +3020,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_encrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } @@ -3073,7 +3073,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } gcry_error = gcry_cipher_setkey( @@ -3084,7 +3084,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } gcry_error = gcry_cipher_setiv( @@ -3095,7 +3095,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } @@ -3112,7 +3112,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra { printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error),gcry_strerror (gcry_error)); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } @@ -3208,7 +3208,7 @@ int32_t Crypto_TC_ProcessSecurity( uint8_t* ingest, int* len_ingest,TC_t* tc_sdl // Loads the ingest frame into the global tc_frame while performing decryption { // Local Variables - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; int x = 0; int y = 0; gcry_cipher_hd_t tmp_hd; @@ -3252,7 +3252,7 @@ int32_t Crypto_TC_ProcessSecurity( uint8_t* ingest, int* len_ingest,TC_t* tc_sdl status = Crypto_Get_Managed_Parameters_For_Gvcid(tc_sdls_processed_frame->tc_header.tfvn,tc_sdls_processed_frame->tc_header.scid, tc_sdls_processed_frame->tc_header.vcid,gvcid_managed_parameters,¤t_managed_parameters); - if(status != OS_SUCCESS) {return status;} //Unable to get necessary Managed Parameters for TC TF -- return with error. + if(status != CRYPTO_LIB_SUCCESS) {return status;} //Unable to get necessary Managed Parameters for TC TF -- return with error. // Segment Header if(current_managed_parameters->has_segmentation_hdr==TC_HAS_SEGMENT_HDRS){ @@ -3298,7 +3298,7 @@ int32_t Crypto_TC_ProcessSecurity( uint8_t* ingest, int* len_ingest,TC_t* tc_sdl // Probably unnecessary check // Leaving for now as it would be cleaner in SA to have an association enum returned I believe printf(KRED "Error: SA Service Type is not defined! \n" RESET); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } @@ -3703,9 +3703,9 @@ int32_t Crypto_TM_ApplySecurity( uint8_t* ingest, int* len_ingest) // Payload Data Unit Crypto_TM_updatePDU(ingest, *len_ingest); - if(sadb_routine->sadb_get_sa_from_spi(spi,&sa_ptr) != OS_SUCCESS){ + if(sadb_routine->sadb_get_sa_from_spi(spi,&sa_ptr) != CRYPTO_LIB_SUCCESS){ //TODO - Error handling - return OS_ERROR; //Error -- unable to get SA from SPI. + return CRYPTO_LIB_ERROR; //Error -- unable to get SA from SPI. } @@ -3833,7 +3833,7 @@ int32_t Crypto_TM_ApplySecurity( uint8_t* ingest, int* len_ingest) if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } gcry_error = gcry_cipher_setkey( @@ -3844,7 +3844,7 @@ int32_t Crypto_TM_ApplySecurity( uint8_t* ingest, int* len_ingest) if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } gcry_error = gcry_cipher_setiv( @@ -3855,7 +3855,7 @@ int32_t Crypto_TM_ApplySecurity( uint8_t* ingest, int* len_ingest) if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } gcry_error = gcry_cipher_encrypt( @@ -3868,7 +3868,7 @@ int32_t Crypto_TM_ApplySecurity( uint8_t* ingest, int* len_ingest) if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } gcry_error = gcry_cipher_authenticate( @@ -3879,7 +3879,7 @@ int32_t Crypto_TM_ApplySecurity( uint8_t* ingest, int* len_ingest) if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } gcry_error = gcry_cipher_gettag( @@ -3890,7 +3890,7 @@ int32_t Crypto_TM_ApplySecurity( uint8_t* ingest, int* len_ingest) if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = OS_ERROR; + status = CRYPTO_LIB_ERROR; return status; } @@ -3957,7 +3957,7 @@ int32_t Crypto_TM_ApplySecurity( uint8_t* ingest, int* len_ingest) int32_t Crypto_TM_ProcessSecurity(uint8_t* ingest, int* len_ingest) { // Local Variables - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; #ifdef DEBUG printf(KYEL "\n----- Crypto_TM_ProcessSecurity START -----\n" RESET); @@ -3983,7 +3983,7 @@ int32_t Crypto_TM_ProcessSecurity(uint8_t* ingest, int* len_ingest) int32_t Crypto_AOS_ApplySecurity(uint8_t* ingest, int* len_ingest) { // Local Variables - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; #ifdef DEBUG printf(KYEL "\n----- Crypto_AOS_ApplySecurity START -----\n" RESET); @@ -4009,7 +4009,7 @@ int32_t Crypto_AOS_ApplySecurity(uint8_t* ingest, int* len_ingest) int32_t Crypto_AOS_ProcessSecurity(uint8_t* ingest, int* len_ingest) { // Local Variables - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; #ifdef DEBUG printf(KYEL "\n----- Crypto_AOS_ProcessSecurity START -----\n" RESET); @@ -4035,7 +4035,7 @@ int32_t Crypto_AOS_ProcessSecurity(uint8_t* ingest, int* len_ingest) int32_t Crypto_ApplySecurity(uint8_t* ingest, int* len_ingest) { // Local Variables - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; #ifdef DEBUG printf(KYEL "\n----- Crypto_ApplySecurity START -----\n" RESET); @@ -4061,7 +4061,7 @@ int32_t Crypto_ApplySecurity(uint8_t* ingest, int* len_ingest) int32_t Crypto_ProcessSecurity(uint8_t* ingest, int* len_ingest) { // Local Variables - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; #ifdef DEBUG printf(KYEL "\n----- Crypto_ProcessSecurity START -----\n" RESET); diff --git a/src/src_main/sadb_routine_inmemory.template.c b/src/src_main/sadb_routine_inmemory.template.c index e3e1d6bf..8dea3cb4 100644 --- a/src/src_main/sadb_routine_inmemory.template.c +++ b/src/src_main/sadb_routine_inmemory.template.c @@ -73,7 +73,7 @@ SadbRoutine get_sadb_routine_inmemory(void) **/ static int32_t sadb_config(void) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; // Security Associations // SA 1 - CLEAR MODE @@ -232,7 +232,7 @@ static int32_t sadb_config(void) **/ static int32_t sadb_init(void) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; for (int x = 0; x < NUM_SA; x++) { @@ -261,7 +261,7 @@ static int32_t sadb_init(void) static int32_t sadb_close(void) { //closing not necessary for inmemory DB. - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /* @@ -275,7 +275,7 @@ static int32_t sadb_close(void) **/ static int32_t sadb_get_sa_from_spi(uint16_t spi,SecurityAssociation_t** security_association) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; if(sa == NULL) { return CRYPTO_LIB_ERR_NO_INIT; } *security_association = &sa[spi]; if(sa[spi].iv == NULL && ( sa[spi].ast == 1 || sa[spi].est == 1 )) { return CRYPTO_LIB_ERR_NULL_IV; } //Must have IV if doing encryption or authentication @@ -386,7 +386,7 @@ static int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn,uint16_t scid,uin **/ static int32_t sadb_save_sa(SecurityAssociation_t* sa) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; //We could do a memory copy of the SA into the sa[NUM_SA] array at the given SPI, however, the inmemory code currently updates in place so no need for that. // If we change the in-place update logic, we should update this function to actually update the SA. return status; @@ -517,7 +517,7 @@ static int32_t sadb_sa_start(TC_t* tc_frame) printf("\t spi = %d \n", spi); #endif - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -575,7 +575,7 @@ static int32_t sadb_sa_stop(void) printf("\t spi = %d \n", spi); #endif - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -654,7 +654,7 @@ static int32_t sadb_sa_rekey(void) //printf("\t akid = %d \n", sa[spi].akid); #endif - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -693,7 +693,7 @@ static int32_t sadb_sa_expire(void) printf(KRED "ERROR: SPI %d does not exist.\n" RESET, spi); } - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -765,7 +765,7 @@ static int32_t sadb_sa_create(void) Crypto_saPrint(&sa[spi]); #endif - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -806,7 +806,7 @@ static int32_t sadb_sa_delete(void) printf(KRED "ERROR: SPI %d does not exist.\n" RESET, spi); } - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -855,7 +855,7 @@ static int32_t sadb_sa_setARSN(void) printf("sadb_sa_setARSN ERROR: SPI %d does not exist.\n", spi); } - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -892,7 +892,7 @@ static int32_t sadb_sa_setARSNW(void) printf("sadb_sa_setARSNW ERROR: SPI %d does not exist.\n", spi); } - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** diff --git a/src/src_mysql/sadb_routine_mariadb.template.c b/src/src_mysql/sadb_routine_mariadb.template.c index 45167913..21029f80 100644 --- a/src/src_mysql/sadb_routine_mariadb.template.c +++ b/src/src_mysql/sadb_routine_mariadb.template.c @@ -84,12 +84,12 @@ SadbRoutine get_sadb_routine_mariadb(void) static int32_t sadb_config(void) { - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } static int32_t sadb_init(void) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; con = mysql_init(NULL); //TODO - add mysql_options/mysql_get_ssl_cipher logic for mTLS connections. @@ -107,13 +107,13 @@ static int32_t sadb_init(void) static int32_t sadb_close(void) { mysql_close(con); - return OS_SUCCESS; + return CRYPTO_LIB_SUCCESS; } // Security Association Interaction Functions static int32_t sadb_get_sa_from_spi(uint16_t spi,SecurityAssociation_t** security_association) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; uint8_t spi_query[2048]; snprintf(spi_query, sizeof(spi_query),SQL_SADB_GET_SA_BY_SPI,spi); @@ -124,7 +124,7 @@ static int32_t sadb_get_sa_from_spi(uint16_t spi,SecurityAssociation_t** securit } static int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn,uint16_t scid,uint16_t vcid,uint8_t mapid,SecurityAssociation_t** security_association) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; uint8_t gvcid_query[2048]; snprintf(gvcid_query, sizeof(gvcid_query),SQL_SADB_GET_SA_BY_GVCID,tfvn,scid,vcid,mapid,SA_OPERATIONAL); @@ -135,7 +135,7 @@ static int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn,uint16_t scid,uin } static int32_t sadb_save_sa(SecurityAssociation_t* sa) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; if(sa==NULL) {return SADB_NULL_SA_USED;} uint8_t update_sa_query[2048]; @@ -159,19 +159,19 @@ static int32_t sadb_save_sa(SecurityAssociation_t* sa) return status; } // Security Association Utility Functions -static int32_t sadb_sa_start(TC_t* tc_frame){return OS_SUCCESS;} -static int32_t sadb_sa_expire(void){return OS_SUCCESS;} -static int32_t sadb_sa_rekey(void){return OS_SUCCESS;} -static int32_t sadb_sa_status(uint8_t* ingest){return OS_SUCCESS;} -static int32_t sadb_sa_create(void){return OS_SUCCESS;} -static int32_t sadb_sa_setARSN(void){return OS_SUCCESS;} -static int32_t sadb_sa_setARSNW(void){return OS_SUCCESS;} -static int32_t sadb_sa_delete(void){return OS_SUCCESS;} +static int32_t sadb_sa_start(TC_t* tc_frame){return CRYPTO_LIB_SUCCESS;} +static int32_t sadb_sa_expire(void){return CRYPTO_LIB_SUCCESS;} +static int32_t sadb_sa_rekey(void){return CRYPTO_LIB_SUCCESS;} +static int32_t sadb_sa_status(uint8_t* ingest){return CRYPTO_LIB_SUCCESS;} +static int32_t sadb_sa_create(void){return CRYPTO_LIB_SUCCESS;} +static int32_t sadb_sa_setARSN(void){return CRYPTO_LIB_SUCCESS;} +static int32_t sadb_sa_setARSNW(void){return CRYPTO_LIB_SUCCESS;} +static int32_t sadb_sa_delete(void){return CRYPTO_LIB_SUCCESS;} // sadb_routine private helper functions static int32_t parse_sa_from_mysql_query(uint8_t* query, SecurityAssociation_t** security_association) { - int32_t status = OS_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; SecurityAssociation_t* sa = malloc(sizeof(SecurityAssociation_t)); #ifdef SA_DEBUG From 2a070e5cb621e4e8818bd02bb1d92d9be8acdaba Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 10:16:10 -0500 Subject: [PATCH 11/18] #1 - Wall, Wextra, Werror C flags added; --- CMakeLists.txt | 2 + include/sadb_routine.h | 2 +- src/crypto_util/include/shared_util.h | 10 +- src/crypto_util/src/shared_util.c | 44 +-- src/crypto_util/util/apply_security.c | 17 +- src/crypto_util/util/crypto_sequence.c | 20 +- src/crypto_util/util/et_dt_validation.c | 304 +++++++++--------- src/crypto_util/util/process_security.c | 14 +- src/crypto_util/util/ut_tc_apply.c | 37 ++- src/src_main/crypto.c | 32 +- src/src_main/sadb_routine.c | 4 +- src/src_main/sadb_routine_inmemory.template.c | 59 ++-- 12 files changed, 278 insertions(+), 267 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bae9fe42..fabfe193 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,8 @@ if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) enable_testing() endif() +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror") + include_directories(include) # The shared OSAL and cFE include directories should always be used diff --git a/include/sadb_routine.h b/include/sadb_routine.h index d2d3b9e6..c68e28c0 100644 --- a/include/sadb_routine.h +++ b/include/sadb_routine.h @@ -50,6 +50,6 @@ typedef struct { SadbRoutine get_sadb_routine_mariadb(void); SadbRoutine get_sadb_routine_inmemory(void); -SadbRoutine init_parse_sadb_routine(uint8_t *); +//SadbRoutine init_parse_sadb_routine(uint8_t *); #endif //CRYPTOLIB_SADB_ROUTINE_H diff --git a/src/crypto_util/include/shared_util.h b/src/crypto_util/include/shared_util.h index 0845cb18..56e9a19d 100644 --- a/src/crypto_util/include/shared_util.h +++ b/src/crypto_util/include/shared_util.h @@ -31,13 +31,13 @@ extern "C" { #include "crypto_error.h" -uint8_t * c_read_file(const uint8_t * f_name, long * f_size); +char * c_read_file(const char * f_name, long * f_size); -void debug_printf(const uint8_t* format, ...); -void debug_hexprintf(const uint8_t* bin_data,int size_bin_data); +void debug_printf(const char* format, ...); +void debug_hexprintf(const char* bin_data,int size_bin_data); -void hex_conversion(uint8_t *buffer_h, uint8_t **buffer_b, int *buffer_b_length); -int convert_hexstring_to_byte_array(uint8_t* source_str, uint8_t* dest_buffer); +void hex_conversion(char *buffer_h, char **buffer_b, int *buffer_b_length); +int convert_hexstring_to_byte_array(char* source_str, char* dest_buffer); #ifdef __cplusplus } /* Close scope of 'extern "C"' declaration which encloses file. */ diff --git a/src/crypto_util/src/shared_util.c b/src/crypto_util/src/shared_util.c index 4ac1b3a1..07583dcf 100644 --- a/src/crypto_util/src/shared_util.c +++ b/src/crypto_util/src/shared_util.c @@ -23,14 +23,14 @@ /** * @brief Function: c_read_file - * Reads a file from disk into a uint8_t * buffer. - * @param f_name: const uint8_t*, file name & path to be read + * Reads a file from disk into a char * buffer. + * @param f_name: const char*, file name & path to be read * @param f_size: long* - * @return malloc'd uint8_t* containing the contents of the buffer. + * @return malloc'd char* containing the contents of the buffer. * @note This buffer is NOT null terminated and must be free()'d. **/ -uint8_t * c_read_file(const uint8_t * f_name, long * f_size) { - uint8_t* buffer=0; +char* c_read_file(const char* f_name, long* f_size) { + char* buffer=0; long length; FILE* f = fopen(f_name,"rb"); if (f){ @@ -56,14 +56,14 @@ uint8_t * c_read_file(const uint8_t * f_name, long * f_size) { /** * @brief Function: convert_hexstring_to_byte_array * Converts hexstring based character array to a byte array - * @param source_str: uint8_t*, The source character array in hex format to be converted - * @param dest_buffer: uint8*, The destination uint8_t array from which the hex array will be converted to bytes + * @param source_str: char*, The source character array in hex format to be converted + * @param dest_buffer: uint8*, The destination char array from which the hex array will be converted to bytes * @return int length of dest_buffer **/ -int convert_hexstring_to_byte_array(uint8_t* source_str, uint8_t* dest_buffer) +int convert_hexstring_to_byte_array(char* source_str, char* dest_buffer) { - uint8_t *line = source_str; - uint8_t *data = line; + char *line = source_str; + char *data = line; int offset; int read_byte; int data_len = 0; @@ -78,17 +78,17 @@ int convert_hexstring_to_byte_array(uint8_t* source_str, uint8_t* dest_buffer) /** * @brief Function: hex_conversion - * Makes use of the convert_hexstring_to_byte_array(uint8_t* source_str, uint8_t* dest_buffer) function to malloc the approrpiate destination buffer + * Makes use of the convert_hexstring_to_byte_array(char* source_str, char* dest_buffer) function to malloc the appropiate destination buffer * As well as to make the function call as well. - * @param buffer_h: uint8_t*, The incoming hexstyle character array. + * @param buffer_h: char*, The incoming hexstyle character array. * @param buffer_b: uint**, The resulting byte array. * @param buffer_b_length: int*, The resulting length of the new buffer_b array. * @note buffer_b is not null terminated, and must be free()'d by the user. **/ -void hex_conversion(uint8_t *buffer_h, uint8_t **buffer_b, int *buffer_b_length) +void hex_conversion(char *buffer_h, char **buffer_b, int *buffer_b_length) { // Convert input plaintext - *buffer_b = (uint8_t*)malloc((strlen(buffer_h) / 2) * sizeof(uint8_t)); + *buffer_b = (char*)malloc((strlen(buffer_h) / 2) * sizeof(char)); *buffer_b_length = convert_hexstring_to_byte_array(buffer_h, *buffer_b); } @@ -97,7 +97,7 @@ void hex_conversion(uint8_t *buffer_h, uint8_t **buffer_b, int *buffer_b_length) * @brief Function: debug_printf * Formatted debug print statement **/ -void debug_printf(const uint8_t *format, ...) +void debug_printf(const char *format, ...) { va_list args; fprintf(stderr, "DEBUG - "); @@ -106,7 +106,7 @@ void debug_printf(const uint8_t *format, ...) va_end(args); } #else -void debug_printf(const uint8_t* format, ...) { +void debug_printf(const char* format, ...) { //Do nothing, DEBUG preprocessor disabled. } #endif @@ -115,16 +115,16 @@ void debug_printf(const uint8_t* format, ...) { /** * @brief Function: debug_hexprintf * Used to print hexlike byte array. - * @param bin_data: uint8_t*, Incoming Binary data + * @param bin_data: char*, Incoming Binary data * @param size_bin_data: int, Size of bin_data **/ -void debug_hexprintf(const uint8_t *bin_data, int size_bin_data) +void debug_hexprintf(const char *bin_data, int size_bin_data) { //https://stackoverflow.com/questions/6357031/how-do-you-convert-a-byte-array-to-a-hexadecimal-string-in-c //https://stackoverflow.com/questions/5040920/converting-from-signed-char-to-unsigned-char-and-back-again - uint8_t* u_bin_data = (uint8_t*)bin_data; - uint8_t output[(size_bin_data*2)+1]; - uint8_t *ptr = &output[0]; + char* u_bin_data = (char*)bin_data; + char output[(size_bin_data*2)+1]; + char *ptr = &output[0]; int i; for(i=0; i < size_bin_data; i++){ ptr += sprintf(ptr,"%02X",u_bin_data[i]); @@ -132,7 +132,7 @@ void debug_hexprintf(const uint8_t *bin_data, int size_bin_data) debug_printf("%s\n",output); } #else -void debug_hexprintf(const uint8_t* bin_data, int size_bin_data) { +void debug_hexprintf(const char* bin_data, int size_bin_data) { //Do nothing, DEBUG preprocessor disabled. } #endif diff --git a/src/crypto_util/util/apply_security.c b/src/crypto_util/util/apply_security.c index 173a4458..58f94702 100644 --- a/src/crypto_util/util/apply_security.c +++ b/src/crypto_util/util/apply_security.c @@ -21,11 +21,12 @@ #include "apply_security.h" -int main(int argc, uint8_t *argv[]) { - uint8_t *buffer; - uint8_t const *filename; +int main(int argc, char *argv[]) { + char *buffer; + const char *filename; long buffer_size; - uint8_t *security_type; + char st[64]; + char *security_type = st; if (argc == 3) { security_type = argv[1]; @@ -48,16 +49,16 @@ int main(int argc, uint8_t *argv[]) { //Setup & Initialize CryptoLib Crypto_Init(); - uint8_t * ptr_enc_frame = NULL; + uint8_t* ptr_enc_frame = NULL; uint16_t enc_frame_len; //Call ApplySecurity on buffer contents depending on type. if (strcmp(security_type,"tc")==0){ - Crypto_TC_ApplySecurity(buffer, buffer_size_i, &ptr_enc_frame, &enc_frame_len); + Crypto_TC_ApplySecurity((uint8_t*) buffer, (const uint16_t) buffer_size_i, &ptr_enc_frame, &enc_frame_len); } else if (strcmp(security_type,"tm")==0){ - Crypto_TM_ApplySecurity(buffer, &buffer_size_i); + Crypto_TM_ApplySecurity((uint8_t*) buffer, (int*) &buffer_size_i); } else if (strcmp(security_type,"aos")==0){ - Crypto_AOS_ApplySecurity(buffer, &buffer_size_i); + Crypto_AOS_ApplySecurity((uint8_t*) buffer, (int*) &buffer_size_i); } #ifdef TC_DEBUG diff --git a/src/crypto_util/util/crypto_sequence.c b/src/crypto_util/util/crypto_sequence.c index b3295add..d55543a2 100644 --- a/src/crypto_util/util/crypto_sequence.c +++ b/src/crypto_util/util/crypto_sequence.c @@ -22,11 +22,11 @@ #include "crypto_sequence.h" -int main(int argc, uint8_t *argv[]) { - uint8_t *buffer; - uint8_t const *filename; +int main(int argc, char *argv[]) { + char *buffer; + const char *filename; long buffer_size; - uint8_t *security_type; + char *security_type; if (argc < 3 || argc % 2 == 0) { fprintf(stderr,"Command line usage: \n"\ @@ -60,19 +60,19 @@ int main(int argc, uint8_t *argv[]) { //Call Apply/ProcessSecurity on buffer contents depending on type. if (strcmp(security_type,"tc_a")==0){ - Crypto_TC_ApplySecurity(buffer, buffer_size_i, &ptr_enc_frame, &enc_frame_len);} + Crypto_TC_ApplySecurity((const uint8_t*) buffer, (const uint16_t) buffer_size_i, &ptr_enc_frame, &enc_frame_len);} else if (strcmp(security_type,"tm_a")==0){ - Crypto_TM_ApplySecurity(buffer, &buffer_size_i); + Crypto_TM_ApplySecurity((uint8_t*) buffer, (int*) &buffer_size_i); } else if (strcmp(security_type,"aos_a")==0){ - Crypto_AOS_ApplySecurity(buffer, &buffer_size_i); + Crypto_AOS_ApplySecurity((uint8_t*) buffer, (int*) &buffer_size_i); } else if (strcmp(security_type,"tc_p")==0){ TC_t* tc_sdls_processed_frame = malloc(sizeof(TC_t)); - Crypto_TC_ProcessSecurity(buffer, &buffer_size_i,tc_sdls_processed_frame); + Crypto_TC_ProcessSecurity((uint8_t*) buffer, (int*) &buffer_size_i, tc_sdls_processed_frame); free(tc_sdls_processed_frame); } else if (strcmp(security_type,"tm_p")==0){ - Crypto_TM_ProcessSecurity(buffer, &buffer_size_i); + Crypto_TM_ProcessSecurity((uint8_t*) buffer, (int*) &buffer_size_i); } else if (strcmp(security_type,"aos_p")==0){ - Crypto_AOS_ProcessSecurity(buffer, &buffer_size_i); + Crypto_AOS_ProcessSecurity((uint8_t*) buffer, (int*) &buffer_size_i); } free(buffer); } diff --git a/src/crypto_util/util/et_dt_validation.c b/src/crypto_util/util/et_dt_validation.c index fbac5c59..1aae760d 100644 --- a/src/crypto_util/util/et_dt_validation.c +++ b/src/crypto_util/util/et_dt_validation.c @@ -43,6 +43,7 @@ int EndPython() Py_XDECREF(pModule); Py_XDECREF(pName); Py_Finalize(); + return CRYPTO_LIB_SUCCESS; } /** @@ -56,9 +57,9 @@ int EndPython() * @param bitmask Hexstring of the bitmask that will be used on the header * @param expected Ouput character array that will be allocated within this function. Memory must be freed upon completion of test. * @param expected_length The length of the expected character array that is set within this function - * @note The uint8_t** expected that is passsed to this function must be freed by the user upon completion of unit test or other call. + * @note The char** expected that is passsed to this function must be freed by the user upon completion of unit test or other call. **/ -void python_auth_encryption(uint8_t* data, uint8_t* key, uint8_t* iv, uint8_t* header, uint8_t* bitmask, uint8_t** expected, long* expected_length) +void python_auth_encryption(char* data, char* key, char* iv, char* header, char* bitmask, uint8_t** expected, long* expected_length) { Py_Initialize(); PyRun_SimpleString("import sys\nsys.path.append('../../test')"); @@ -92,7 +93,7 @@ void python_auth_encryption(uint8_t* data, uint8_t* key, uint8_t* iv, uint8_t* h long temp_length = PyLong_AsLong(pValue); *expected_length = temp_length; pValue = PyObject_CallMethod(pInstance, "get_results", NULL); - uint8_t* temp_expected = PyBytes_AsString(pValue); + char* temp_expected = PyBytes_AsString(pValue); *expected= (uint8_t*)malloc(sizeof(uint8_t) * (int)*expected_length); memcpy(*expected, temp_expected, (int)*expected_length); return; @@ -112,14 +113,14 @@ UTEST(ET_VALIDATION, AUTH_ENCRYPTION_TEST) uint8_t* expected = NULL; long expected_length = 0; - uint8_t *activate_sa4_h = "2003002000ff000100001880d2c9000e197f0b001b0004000400003040d95ea61a"; - uint8_t *enc_test_ping_h = "2003041600ff1880d2ca0008197f0b0031000039c5082d"; + char *activate_sa4_h = "2003002000ff000100001880d2c9000e197f0b001b0004000400003040d95ea61a"; + char *enc_test_ping_h = "2003041600ff1880d2ca0008197f0b0031000039c5082d"; uint8_t *activate_sa4_b, *enc_test_ping_b = NULL; int activate_sa4_len, enc_test_ping_len = 0; - hex_conversion(activate_sa4_h, &activate_sa4_b, &activate_sa4_len); - hex_conversion(enc_test_ping_h, &enc_test_ping_b, &enc_test_ping_len); + hex_conversion(activate_sa4_h, (char**) &activate_sa4_b, &activate_sa4_len); + hex_conversion(enc_test_ping_h, (char**) &enc_test_ping_b, &enc_test_ping_len); SecurityAssociation_t* test_association = NULL; test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); @@ -147,7 +148,8 @@ UTEST(ET_VALIDATION, AUTH_ENCRYPTION_TEST) test_association->est = 1; test_association->sa_state = SA_OPERATIONAL; - int32_t ret_status = Crypto_TC_ApplySecurity(enc_test_ping_b, enc_test_ping_len, &ptr_enc_frame, &enc_frame_len); + return_val = Crypto_TC_ApplySecurity(enc_test_ping_b, enc_test_ping_len, &ptr_enc_frame, &enc_frame_len); + ASSERT_EQ(CRYPTO_LIB_SUCCESS, return_val); // Get Truth Baseline python_auth_encryption("1880d2ca0008197f0b0031000039c5", "FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210", "000000000000000000000001", "2003043400FF0004", "00", &expected, &expected_length); @@ -175,16 +177,16 @@ UTEST(DT_VALIDATION, AUTH_DECRYPTION_TEST) Crypto_Init_Unit_Test(); SadbRoutine sadb_routine = get_sadb_routine_inmemory(); - uint8_t *activate_sa4_h = "2003002000ff000100001880d2c9000e197f0b001b0004000400003040d95ea61a"; - uint8_t *dec_test_ping_h = "2003043400FF00040000000000000000000000017E1D8EEA8D45CEBA17888E0CDCD747DC78E5F372F997F2A63AA5DFC168395DC987"; - uint8_t *enc_test_ping_h = "1880d2ca0008197f0b0031000039c5"; + char *activate_sa4_h = "2003002000ff000100001880d2c9000e197f0b001b0004000400003040d95ea61a"; + char *dec_test_ping_h = "2003043400FF00040000000000000000000000017E1D8EEA8D45CEBA17888E0CDCD747DC78E5F372F997F2A63AA5DFC168395DC987"; + char *enc_test_ping_h = "1880d2ca0008197f0b0031000039c5"; uint8_t *activate_sa4_b, *dec_test_ping_b, *enc_test_ping_b = NULL; int activate_sa4_len, dec_test_ping_len, enc_test_ping_len = 0; - hex_conversion(activate_sa4_h, &activate_sa4_b, &activate_sa4_len); - hex_conversion(dec_test_ping_h, &dec_test_ping_b, &dec_test_ping_len); - hex_conversion(enc_test_ping_h, &enc_test_ping_b, &enc_test_ping_len); + hex_conversion(activate_sa4_h, (char**) &activate_sa4_b, &activate_sa4_len); + hex_conversion(dec_test_ping_h, (char**) &dec_test_ping_b, &dec_test_ping_len); + hex_conversion(enc_test_ping_h, (char**) &enc_test_ping_b, &enc_test_ping_len); SecurityAssociation_t* test_association = NULL; test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); @@ -258,10 +260,10 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - uint8_t *buffer_nist_key_h = "ef9f9284cf599eac3b119905a7d18851e7e374cf63aea04358586b0f757670f8"; - uint8_t *buffer_nist_pt_h = "2003001600722ee47da4b77424733546c2d400c4e567a8"; - uint8_t *buffer_nist_iv_h = "b6ac8e4963f49207ffd6374c"; - uint8_t *buffer_nist_ct_h = "1224dfefb72a20d49e09256908874979"; + char *buffer_nist_key_h = "ef9f9284cf599eac3b119905a7d18851e7e374cf63aea04358586b0f757670f8"; + char *buffer_nist_pt_h = "2003001600722ee47da4b77424733546c2d400c4e567a8"; + char *buffer_nist_iv_h = "b6ac8e4963f49207ffd6374c"; + char *buffer_nist_ct_h = "1224dfefb72a20d49e09256908874979"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; @@ -277,17 +279,17 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_ct_h, &buffer_nist_ct_b, &buffer_nist_ct_len); + hex_conversion(buffer_nist_ct_h, (char**) &buffer_nist_ct_b, &buffer_nist_ct_len); Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) @@ -314,7 +316,6 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) { uint8_t *ptr_enc_frame = NULL; - uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); @@ -324,10 +325,10 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - uint8_t *buffer_nist_key_h = "ef9f9284cf599eac3b119905a7d18851e7e374cf63aea04358586b0f757670f8"; - uint8_t *buffer_nist_pt_h = "2003001600722ee47da4b77424733546c2d400c4e567a8"; - uint8_t *buffer_nist_iv_h = "b6ac8e4963f49207ffd6374c"; - uint8_t *buffer_nist_et_h = "2003002500FF0009B6AC8E4963F49207FFD6374C1224DFEFB72A20D49E09256908874979AD6F"; + char *buffer_nist_key_h = "ef9f9284cf599eac3b119905a7d18851e7e374cf63aea04358586b0f757670f8"; + char *buffer_nist_pt_h = "2003001600722ee47da4b77424733546c2d400c4e567a8"; + char *buffer_nist_iv_h = "b6ac8e4963f49207ffd6374c"; + char *buffer_nist_et_h = "2003002500FF0009B6AC8E4963F49207FFD6374C1224DFEFB72A20D49E09256908874979AD6F"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_et_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_et_len, buffer_nist_key_len = 0; @@ -347,18 +348,18 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) test_association->sa_state = SA_OPERATIONAL; sadb_routine->sadb_get_sa_from_spi(9,&test_association); // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); printf("NIST IV LEN: %d\n", buffer_nist_iv_len); // Convert input encryptedtext - hex_conversion(buffer_nist_et_h, &buffer_nist_et_b, &buffer_nist_et_len); + hex_conversion(buffer_nist_et_h, (char**) &buffer_nist_et_b, &buffer_nist_et_len); Crypto_TC_ProcessSecurity(buffer_nist_et_b, &buffer_nist_et_len, tc_nist_processed_frame); @@ -394,10 +395,10 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - uint8_t *buffer_nist_key_h = "e9ccd6eef27f740d1d5c70b187734e11e76a8ac0ad1702ff02180c5c1c9e5399"; - uint8_t *buffer_nist_pt_h = "2003001600419635e6e12b257a8ecae411f94480ff56be"; - uint8_t *buffer_nist_iv_h = "1af2613c4184dbd101fcedce"; - uint8_t *buffer_nist_ct_h = "9cd21f414f1f54d5f6f58b1f2f77e5b6"; + char *buffer_nist_key_h = "e9ccd6eef27f740d1d5c70b187734e11e76a8ac0ad1702ff02180c5c1c9e5399"; + char *buffer_nist_pt_h = "2003001600419635e6e12b257a8ecae411f94480ff56be"; + char *buffer_nist_iv_h = "1af2613c4184dbd101fcedce"; + char *buffer_nist_ct_h = "9cd21f414f1f54d5f6f58b1f2f77e5b6"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; @@ -413,17 +414,17 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_ct_h, &buffer_nist_ct_b, &buffer_nist_ct_len); + hex_conversion(buffer_nist_ct_h, (char**) &buffer_nist_ct_b, &buffer_nist_ct_len); Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) @@ -449,7 +450,6 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) { uint8_t *ptr_enc_frame = NULL; - uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); @@ -459,10 +459,10 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - uint8_t *buffer_nist_key_h = "e9ccd6eef27f740d1d5c70b187734e11e76a8ac0ad1702ff02180c5c1c9e5399"; - uint8_t *buffer_nist_pt_h = "2003001600419635e6e12b257a8ecae411f94480ff56be"; - uint8_t *buffer_nist_iv_h = "1af2613c4184dbd101fcedce"; - uint8_t *buffer_nist_et_h = "2003002500FF00091AF2613C4184DBD101FCEDCE9CD21F414F1F54D5F6F58B1F2F77E5B66987"; + char *buffer_nist_key_h = "e9ccd6eef27f740d1d5c70b187734e11e76a8ac0ad1702ff02180c5c1c9e5399"; + char *buffer_nist_pt_h = "2003001600419635e6e12b257a8ecae411f94480ff56be"; + char *buffer_nist_iv_h = "1af2613c4184dbd101fcedce"; + char *buffer_nist_et_h = "2003002500FF00091AF2613C4184DBD101FCEDCE9CD21F414F1F54D5F6F58B1F2F77E5B66987"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_et_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_et_len, buffer_nist_key_len = 0; @@ -482,17 +482,17 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_et_h, &buffer_nist_et_b, &buffer_nist_et_len); + hex_conversion(buffer_nist_et_h, (char**) &buffer_nist_et_b, &buffer_nist_et_len); Crypto_TC_ProcessSecurity(buffer_nist_et_b, &buffer_nist_et_len, tc_nist_processed_frame); @@ -526,10 +526,10 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_2) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - uint8_t *buffer_nist_key_h = "7ecc9dcb3d5b413cadc3af7b7812758bd869295f8aaf611ba9935de76bd87013"; - uint8_t *buffer_nist_pt_h = "200300160073d4d7984ce422ac983797c0526ac6f9446b"; - uint8_t *buffer_nist_iv_h = "6805be41e983717bf6781052"; - uint8_t *buffer_nist_ct_h = "487211dd440f4d09d00bc5c3158a822c"; + char *buffer_nist_key_h = "7ecc9dcb3d5b413cadc3af7b7812758bd869295f8aaf611ba9935de76bd87013"; + char *buffer_nist_pt_h = "200300160073d4d7984ce422ac983797c0526ac6f9446b"; + char *buffer_nist_iv_h = "6805be41e983717bf6781052"; + char *buffer_nist_ct_h = "487211dd440f4d09d00bc5c3158a822c"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; @@ -545,17 +545,17 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_2) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_ct_h, &buffer_nist_ct_b, &buffer_nist_ct_len); + hex_conversion(buffer_nist_ct_h, (char**) &buffer_nist_ct_b, &buffer_nist_ct_len); Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) @@ -581,7 +581,6 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_2) UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_2) { uint8_t *ptr_enc_frame = NULL; - uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); @@ -591,10 +590,10 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_2) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - uint8_t *buffer_nist_key_h = "7ecc9dcb3d5b413cadc3af7b7812758bd869295f8aaf611ba9935de76bd87013"; - uint8_t *buffer_nist_pt_h = "200300160073d4d7984ce422ac983797c0526ac6f9446b"; - uint8_t *buffer_nist_iv_h = "6805be41e983717bf6781052"; - uint8_t *buffer_nist_et_h = "2003002500FF00096805BE41E983717BF6781052487211DD440F4D09D00BC5C3158A822C46E3"; + char *buffer_nist_key_h = "7ecc9dcb3d5b413cadc3af7b7812758bd869295f8aaf611ba9935de76bd87013"; + char *buffer_nist_pt_h = "200300160073d4d7984ce422ac983797c0526ac6f9446b"; + char *buffer_nist_iv_h = "6805be41e983717bf6781052"; + char *buffer_nist_et_h = "2003002500FF00096805BE41E983717BF6781052487211DD440F4D09D00BC5C3158A822C46E3"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_et_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_et_len, buffer_nist_key_len = 0; @@ -614,17 +613,17 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_2) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_et_h, &buffer_nist_et_b, &buffer_nist_et_len); + hex_conversion(buffer_nist_et_h, (char**) &buffer_nist_et_b, &buffer_nist_et_len); Crypto_TC_ProcessSecurity(buffer_nist_et_b, &buffer_nist_et_len, tc_nist_processed_frame); @@ -658,10 +657,10 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_3) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - uint8_t *buffer_nist_key_h = "a881373e248615e3d6576f5a5fb68883515ae72d6a2938e3a6f0b8dcb639c9c0"; - uint8_t *buffer_nist_pt_h = "200300160007d1dc9930e710b1ebe533c81f671101e43c"; - uint8_t *buffer_nist_iv_h = "f0b744f157087df4e41818a9"; - uint8_t *buffer_nist_ct_h = "b65a2878b9dddbd4a0204dae6a6a6fc0"; + char *buffer_nist_key_h = "a881373e248615e3d6576f5a5fb68883515ae72d6a2938e3a6f0b8dcb639c9c0"; + char *buffer_nist_pt_h = "200300160007d1dc9930e710b1ebe533c81f671101e43c"; + char *buffer_nist_iv_h = "f0b744f157087df4e41818a9"; + char *buffer_nist_ct_h = "b65a2878b9dddbd4a0204dae6a6a6fc0"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; @@ -677,17 +676,17 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_3) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_ct_h, &buffer_nist_ct_b, &buffer_nist_ct_len); + hex_conversion(buffer_nist_ct_h, (char**) &buffer_nist_ct_b, &buffer_nist_ct_len); Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) @@ -713,7 +712,6 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_3) UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_3) { uint8_t *ptr_enc_frame = NULL; - uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); @@ -723,10 +721,10 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_3) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - uint8_t *buffer_nist_key_h = "a881373e248615e3d6576f5a5fb68883515ae72d6a2938e3a6f0b8dcb639c9c0"; - uint8_t *buffer_nist_pt_h = "200300160007d1dc9930e710b1ebe533c81f671101e43c"; - uint8_t *buffer_nist_iv_h = "f0b744f157087df4e41818a9"; - uint8_t *buffer_nist_et_h = "2003002500FF0009F0B744F157087DF4E41818A9B65A2878B9DDDBD4A0204DAE6A6A6FC0C327"; + char *buffer_nist_key_h = "a881373e248615e3d6576f5a5fb68883515ae72d6a2938e3a6f0b8dcb639c9c0"; + char *buffer_nist_pt_h = "200300160007d1dc9930e710b1ebe533c81f671101e43c"; + char *buffer_nist_iv_h = "f0b744f157087df4e41818a9"; + char *buffer_nist_et_h = "2003002500FF0009F0B744F157087DF4E41818A9B65A2878B9DDDBD4A0204DAE6A6A6FC0C327"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_et_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_et_len, buffer_nist_key_len = 0; @@ -746,17 +744,17 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_3) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_et_h, &buffer_nist_et_b, &buffer_nist_et_len); + hex_conversion(buffer_nist_et_h, (char**) &buffer_nist_et_b, &buffer_nist_et_len); Crypto_TC_ProcessSecurity(buffer_nist_et_b, &buffer_nist_et_len, tc_nist_processed_frame); @@ -790,10 +788,10 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_4) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - uint8_t *buffer_nist_key_h = "84c90349539c2a7989cb24dfae5e4182382ae94ba717d385977017f74f0d87d6"; - uint8_t *buffer_nist_pt_h = "200300160031c4e1d0ccece6b7a999bfc31f38559af5dd"; - uint8_t *buffer_nist_iv_h = "eeddeaf4355c826dfd153393"; - uint8_t *buffer_nist_ct_h = "5c6cfbdd06c19445ecf500c21aeca173"; + char *buffer_nist_key_h = "84c90349539c2a7989cb24dfae5e4182382ae94ba717d385977017f74f0d87d6"; + char *buffer_nist_pt_h = "200300160031c4e1d0ccece6b7a999bfc31f38559af5dd"; + char *buffer_nist_iv_h = "eeddeaf4355c826dfd153393"; + char *buffer_nist_ct_h = "5c6cfbdd06c19445ecf500c21aeca173"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; @@ -809,17 +807,17 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_4) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_ct_h, &buffer_nist_ct_b, &buffer_nist_ct_len); + hex_conversion(buffer_nist_ct_h, (char**) &buffer_nist_ct_b, &buffer_nist_ct_len); Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) @@ -845,7 +843,6 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_4) UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_4) { uint8_t *ptr_enc_frame = NULL; - uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); @@ -855,10 +852,10 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_4) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - uint8_t *buffer_nist_key_h = "84c90349539c2a7989cb24dfae5e4182382ae94ba717d385977017f74f0d87d6"; - uint8_t *buffer_nist_pt_h = "200300160031c4e1d0ccece6b7a999bfc31f38559af5dd"; - uint8_t *buffer_nist_iv_h = "eeddeaf4355c826dfd153393"; - uint8_t *buffer_nist_et_h = "2003002500FF0009EEDDEAF4355C826DFD1533935C6CFBDD06C19445ECF500C21AECA1738A7D"; + char *buffer_nist_key_h = "84c90349539c2a7989cb24dfae5e4182382ae94ba717d385977017f74f0d87d6"; + char *buffer_nist_pt_h = "200300160031c4e1d0ccece6b7a999bfc31f38559af5dd"; + char *buffer_nist_iv_h = "eeddeaf4355c826dfd153393"; + char *buffer_nist_et_h = "2003002500FF0009EEDDEAF4355C826DFD1533935C6CFBDD06C19445ECF500C21AECA1738A7D"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_et_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_et_len, buffer_nist_key_len = 0; @@ -878,17 +875,17 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_4) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_et_h, &buffer_nist_et_b, &buffer_nist_et_len); + hex_conversion(buffer_nist_et_h, (char**) &buffer_nist_et_b, &buffer_nist_et_len); Crypto_TC_ProcessSecurity(buffer_nist_et_b, &buffer_nist_et_len, tc_nist_processed_frame); @@ -932,11 +929,11 @@ UTEST(NIST_ENC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - uint8_t *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; - uint8_t *buffer_nist_pt_h = "200300060028C2"; // Empty Transfer frame - uint8_t *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; - uint8_t *buffer_nist_aad_h = "b96baa8c1c75a671bfb2d08d06be5f36"; // Zeroed out by abm - uint8_t *buffer_cyber_chef_mac_h = "77e98911a1704df3d9745bc7b97cc66d"; + char *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; + char *buffer_nist_pt_h = "200300060028C2"; // Empty Transfer frame + char *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; + char *buffer_nist_aad_h = "b96baa8c1c75a671bfb2d08d06be5f36"; // Zeroed out by abm + char *buffer_cyber_chef_mac_h = "77e98911a1704df3d9745bc7b97cc66d"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_key_b, *buffer_nist_aad_b, *buffer_cyber_chef_mac_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_key_len, buffer_nist_aad_len, buffer_cyber_chef_mac_len = 0; @@ -957,19 +954,19 @@ UTEST(NIST_ENC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input aad - hex_conversion(buffer_nist_aad_h, &buffer_nist_aad_b, &buffer_nist_aad_len); + hex_conversion(buffer_nist_aad_h, (char**) &buffer_nist_aad_b, &buffer_nist_aad_len); // Convert input mac - hex_conversion(buffer_cyber_chef_mac_h, &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); + hex_conversion(buffer_cyber_chef_mac_h, (char**) &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) @@ -1010,10 +1007,10 @@ UTEST(NIST_ENC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext - uint8_t *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; - uint8_t *buffer_nist_pt_h = "200300060028C2"; // Empty Transfer frame - uint8_t *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; - uint8_t *buffer_cyber_chef_mac_h = "629c2143c30e2f8450b059cd559a7102"; + char *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; + char *buffer_nist_pt_h = "200300060028C2"; // Empty Transfer frame + char *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; + char *buffer_cyber_chef_mac_h = "629c2143c30e2f8450b059cd559a7102"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_key_b, *buffer_cyber_chef_mac_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_key_len, buffer_cyber_chef_mac_len = 0; @@ -1035,17 +1032,17 @@ UTEST(NIST_ENC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input mac - hex_conversion(buffer_cyber_chef_mac_h, &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); + hex_conversion(buffer_cyber_chef_mac_h, (char**) &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); @@ -1075,7 +1072,6 @@ UTEST(NIST_ENC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) { // Setup & Initialize CryptoLib - uint16_t enc_frame_len = 0; int32_t status; Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); @@ -1084,18 +1080,18 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) SadbRoutine sadb_routine = get_sadb_routine_inmemory(); // NIST supplied vectors - uint8_t *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; - uint8_t *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; - uint8_t *buffer_cyber_chef_mac_h = "34d0e323f5e4b80426401d4aa37930da"; - uint8_t *buffer_nist_pt_h = "722ee47da4b77424733546c2d400c4e5"; + char *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; + char *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; + char *buffer_cyber_chef_mac_h = "34d0e323f5e4b80426401d4aa37930da"; + char *buffer_nist_pt_h = "722ee47da4b77424733546c2d400c4e5"; // Create a MAC'd frame by adding our headers and a fecf // | Header | SPI | iv | plaintext | mac |fecf| - uint8_t *buffer_nist_mac_frame_h = "2003003500FF0009D79CF22D504CC793C3FB6C8A722ee47da4b77424733546c2d400c4e534d0e323f5e4b80426401d4aa37930daf55f"; + char *buffer_nist_mac_frame_h = "2003003500FF0009D79CF22D504CC793C3FB6C8A722ee47da4b77424733546c2d400c4e534d0e323f5e4b80426401d4aa37930daf55f"; uint8_t *buffer_nist_iv_b, *buffer_nist_pt_b, *buffer_nist_key_b, *buffer_cyber_chef_mac_b , *buffer_nist_mac_frame_b, *buffer_nist_cp_b = NULL; - int buffer_nist_iv_len, buffer_nist_pt_len, buffer_nist_key_len, buffer_cyber_chef_mac_len , buffer_nist_mac_frame_len, buffer_nist_cp_len = 0; + int buffer_nist_iv_len, buffer_nist_pt_len, buffer_nist_key_len, buffer_cyber_chef_mac_len , buffer_nist_mac_frame_len= 0; // Setup Processed Frame For Decryption TC_t *tc_nist_processed_frame; @@ -1119,19 +1115,19 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input mac - hex_conversion(buffer_cyber_chef_mac_h, &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); + hex_conversion(buffer_cyber_chef_mac_h, (char**) &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); // Convert mac frame - hex_conversion(buffer_nist_mac_frame_h, &buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len); + hex_conversion(buffer_nist_mac_frame_h, (char**) &buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len); status = Crypto_TC_ProcessSecurity(buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len, tc_nist_processed_frame); printf("TC_Process returned status %d\n", status); @@ -1177,7 +1173,6 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_DATA) { // Setup & Initialize CryptoLib - uint16_t enc_frame_len = 0; int32_t status; Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); @@ -1186,18 +1181,18 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_DATA) SadbRoutine sadb_routine = get_sadb_routine_inmemory(); // NIST supplied vectors - uint8_t *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; - uint8_t *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; - //uint8_t *buffer_cyber_chef_mac_h = "99eff39be8327e6950f03a329209d577"; - uint8_t *buffer_cyber_chef_mac_h = "34d0e323f5e4b80426401d4aa37930da"; - uint8_t *buffer_nist_pt_h = "722ee47da4b77424733546c2d400c4e5"; + char *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; + char *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; + //char *buffer_cyber_chef_mac_h = "99eff39be8327e6950f03a329209d577"; + char *buffer_cyber_chef_mac_h = "34d0e323f5e4b80426401d4aa37930da"; + char *buffer_nist_pt_h = "722ee47da4b77424733546c2d400c4e5"; // Create a MAC'd frame by adding our headers and a fecf // | Header | SPI | iv | plaintext | mac |fecf| - uint8_t *buffer_nist_mac_frame_h = "2003003500FF0009D79CF22D504CC793C3FB6C8A722ee47da4b77424733546c2d400c40034d0e323f5e4b80426401d4aa37930da123b"; + char *buffer_nist_mac_frame_h = "2003003500FF0009D79CF22D504CC793C3FB6C8A722ee47da4b77424733546c2d400c40034d0e323f5e4b80426401d4aa37930da123b"; uint8_t *buffer_nist_iv_b, *buffer_nist_pt_b, *buffer_nist_key_b, *buffer_cyber_chef_mac_b , *buffer_nist_mac_frame_b, *buffer_nist_cp_b = NULL; - int buffer_nist_iv_len, buffer_nist_pt_len, buffer_nist_key_len, buffer_cyber_chef_mac_len , buffer_nist_mac_frame_len, buffer_nist_cp_len = 0; + int buffer_nist_iv_len, buffer_nist_pt_len, buffer_nist_key_len, buffer_cyber_chef_mac_len , buffer_nist_mac_frame_len= 0; // Setup Processed Frame For Decryption TC_t *tc_nist_processed_frame; @@ -1221,19 +1216,19 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_DATA) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input mac - hex_conversion(buffer_cyber_chef_mac_h, &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); + hex_conversion(buffer_cyber_chef_mac_h, (char**) &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); // Convert mac frame - hex_conversion(buffer_nist_mac_frame_h, &buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len); + hex_conversion(buffer_nist_mac_frame_h, (char**) &buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len); status = Crypto_TC_ProcessSecurity(buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len, tc_nist_processed_frame); printf("TC_Process returned status %d\n", status); @@ -1269,7 +1264,6 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_DATA) UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_MAC) { // Setup & Initialize CryptoLib - uint16_t enc_frame_len = 0; int32_t status; Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); @@ -1278,18 +1272,18 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_MAC) SadbRoutine sadb_routine = get_sadb_routine_inmemory(); // NIST supplied vectors - uint8_t *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; - uint8_t *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; - //uint8_t *buffer_cyber_chef_mac_h = "99eff39be8327e6950f03a329209d577"; - uint8_t *buffer_cyber_chef_mac_h = "34d0e323f5e4b80426401d4aa37930da"; - uint8_t *buffer_nist_pt_h = "722ee47da4b77424733546c2d400c4e5"; + char *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; + char *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; + //char *buffer_cyber_chef_mac_h = "99eff39be8327e6950f03a329209d577"; + char *buffer_cyber_chef_mac_h = "34d0e323f5e4b80426401d4aa37930da"; + char *buffer_nist_pt_h = "722ee47da4b77424733546c2d400c4e5"; // Create a MAC'd frame by adding our headers and a fecf // | Header | SPI | iv | plaintext | mac |fecf| - uint8_t *buffer_nist_mac_frame_h = "2003003500FF0009D79CF22D504CC793C3FB6C8A722ee47da4b77424733546c2d400c4e534d0e323f5e4b80426401d4aa37930009f68"; + char *buffer_nist_mac_frame_h = "2003003500FF0009D79CF22D504CC793C3FB6C8A722ee47da4b77424733546c2d400c4e534d0e323f5e4b80426401d4aa37930009f68"; uint8_t *buffer_nist_iv_b, *buffer_nist_pt_b, *buffer_nist_key_b, *buffer_cyber_chef_mac_b , *buffer_nist_mac_frame_b, *buffer_nist_cp_b = NULL; - int buffer_nist_iv_len, buffer_nist_pt_len, buffer_nist_key_len, buffer_cyber_chef_mac_len , buffer_nist_mac_frame_len, buffer_nist_cp_len = 0; + int buffer_nist_iv_len, buffer_nist_pt_len, buffer_nist_key_len, buffer_cyber_chef_mac_len , buffer_nist_mac_frame_len= 0; // Setup Processed Frame For Decryption TC_t *tc_nist_processed_frame; @@ -1313,19 +1307,19 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_MAC) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input mac - hex_conversion(buffer_cyber_chef_mac_h, &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); + hex_conversion(buffer_cyber_chef_mac_h, (char**) &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); // Convert mac frame - hex_conversion(buffer_nist_mac_frame_h, &buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len); + hex_conversion(buffer_nist_mac_frame_h, (char**) &buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len); status = Crypto_TC_ProcessSecurity(buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len, tc_nist_processed_frame); printf("TC_Process returned status %d\n", status); diff --git a/src/crypto_util/util/process_security.c b/src/crypto_util/util/process_security.c index 17c3e842..b997ec41 100644 --- a/src/crypto_util/util/process_security.c +++ b/src/crypto_util/util/process_security.c @@ -22,11 +22,11 @@ #include "process_security.h" -int main(int argc, uint8_t *argv[]) { - uint8_t *buffer; - uint8_t const *filename; +int main(int argc, char *argv[]) { + char *buffer; + const char *filename; long buffer_size; - uint8_t *security_type; + char *security_type; if (argc == 3) { security_type = argv[1]; @@ -53,12 +53,12 @@ int main(int argc, uint8_t *argv[]) { //Call ProcessSecurity on buffer contents depending on type. if (strcmp(security_type,"tc")==0){ TC_t* tc_sdls_processed_frame = malloc(sizeof(TC_t)); - Crypto_TC_ProcessSecurity(buffer, &buffer_size_i,tc_sdls_processed_frame); + Crypto_TC_ProcessSecurity((uint8_t*) buffer, &buffer_size_i,tc_sdls_processed_frame); free(tc_sdls_processed_frame); } else if (strcmp(security_type,"tm")==0){ - Crypto_TM_ProcessSecurity(buffer, &buffer_size_i); + Crypto_TM_ProcessSecurity((uint8_t*) buffer, &buffer_size_i); } else if (strcmp(security_type,"aos")==0){ - Crypto_AOS_ProcessSecurity(buffer, &buffer_size_i); + Crypto_AOS_ProcessSecurity((uint8_t*) buffer, &buffer_size_i); } free(buffer); diff --git a/src/crypto_util/util/ut_tc_apply.c b/src/crypto_util/util/ut_tc_apply.c index 706383db..4acb9313 100644 --- a/src/crypto_util/util/ut_tc_apply.c +++ b/src/crypto_util/util/ut_tc_apply.c @@ -33,9 +33,8 @@ UTEST(TC_APPLY_SECURITY, NO_CRYPTO_INIT) { // No Crypto_Init(), but we still Configure It; - long buffer_size = 0; - uint8_t *raw_tc_sdls_ping_h = "20030015001880d2c70008197f0b00310000b1fe3128"; - uint8_t *raw_tc_sdls_ping_b = NULL; + char *raw_tc_sdls_ping_h = "20030015001880d2c70008197f0b00310000b1fe3128"; + char *raw_tc_sdls_ping_b = NULL; int raw_tc_sdls_ping_len = 0; hex_conversion(raw_tc_sdls_ping_h, &raw_tc_sdls_ping_b, &raw_tc_sdls_ping_len); @@ -46,7 +45,7 @@ UTEST(TC_APPLY_SECURITY, NO_CRYPTO_INIT) uint16_t enc_frame_len = 0; int32_t return_val = CRYPTO_LIB_ERROR; - return_val = Crypto_TC_ApplySecurity(raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); + return_val = Crypto_TC_ApplySecurity((uint8_t*) raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); ASSERT_EQ(CRYPTO_LIB_ERR_NO_INIT, return_val); free(raw_tc_sdls_ping_b); Crypto_Shutdown(); @@ -60,8 +59,8 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_CLEAR) { //Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); - uint8_t *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; - uint8_t *raw_tc_sdls_ping_b = NULL; + char *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; + char *raw_tc_sdls_ping_b = NULL; int raw_tc_sdls_ping_len = 0; hex_conversion(raw_tc_sdls_ping_h, &raw_tc_sdls_ping_b, &raw_tc_sdls_ping_len); @@ -71,7 +70,7 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_CLEAR) int32_t return_val = CRYPTO_LIB_ERROR; - return_val = Crypto_TC_ApplySecurity(raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); + return_val = Crypto_TC_ApplySecurity((uint8_t*) raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); Crypto_Shutdown(); free(raw_tc_sdls_ping_b); free(ptr_enc_frame); @@ -85,8 +84,8 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_ENC) { //Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); - uint8_t *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; - uint8_t *raw_tc_sdls_ping_b = NULL; + char *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; + char *raw_tc_sdls_ping_b = NULL; int raw_tc_sdls_ping_len = 0; SadbRoutine sadb_routine = get_sadb_routine_inmemory(); @@ -105,7 +104,7 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_ENC) test_association->sa_state = SA_OPERATIONAL; test_association->ast=0; - return_val = Crypto_TC_ApplySecurity(raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); + return_val = Crypto_TC_ApplySecurity((uint8_t*) raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); Crypto_Shutdown(); free(raw_tc_sdls_ping_b); free(ptr_enc_frame); @@ -119,8 +118,8 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_AUTH_ENC) { //Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); - uint8_t *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; - uint8_t *raw_tc_sdls_ping_b = NULL; + char *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; + char *raw_tc_sdls_ping_b = NULL; int raw_tc_sdls_ping_len = 0; SadbRoutine sadb_routine = get_sadb_routine_inmemory(); @@ -138,7 +137,7 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_AUTH_ENC) sadb_routine->sadb_get_sa_from_spi(4,&test_association); test_association->sa_state = SA_OPERATIONAL; - return_val = Crypto_TC_ApplySecurity(raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); + return_val = Crypto_TC_ApplySecurity((uint8_t*) raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); Crypto_Shutdown(); free(raw_tc_sdls_ping_b); free(ptr_enc_frame); @@ -154,8 +153,8 @@ UTEST(TC_APPLY_SECURITY, BAD_SPACE_CRAFT_ID) { //Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); - uint8_t *raw_tc_sdls_ping_bad_scid_h = "20010015000080d2c70008197f0b00310000b1fe3128"; - uint8_t *raw_tc_sdls_ping_bad_scid_b = NULL; + char *raw_tc_sdls_ping_bad_scid_h = "20010015000080d2c70008197f0b00310000b1fe3128"; + char *raw_tc_sdls_ping_bad_scid_b = NULL; int raw_tc_sdls_ping_bad_scid_len = 0; hex_conversion(raw_tc_sdls_ping_bad_scid_h, &raw_tc_sdls_ping_bad_scid_b, &raw_tc_sdls_ping_bad_scid_len); @@ -163,7 +162,7 @@ UTEST(TC_APPLY_SECURITY, BAD_SPACE_CRAFT_ID) uint8_t *ptr_enc_frame = NULL; uint16_t enc_frame_len = 0; - uint32_t return_val = Crypto_TC_ApplySecurity(raw_tc_sdls_ping_bad_scid_b, raw_tc_sdls_ping_bad_scid_len, &ptr_enc_frame, &enc_frame_len); + int32_t return_val = Crypto_TC_ApplySecurity((uint8_t*) raw_tc_sdls_ping_bad_scid_b, raw_tc_sdls_ping_bad_scid_len, &ptr_enc_frame, &enc_frame_len); free(raw_tc_sdls_ping_bad_scid_b); free(ptr_enc_frame); Crypto_Shutdown(); @@ -178,8 +177,8 @@ UTEST(TC_APPLY_SECURITY, BAD_VIRTUAL_CHANNEL_ID) { //Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); - uint8_t *raw_tc_sdls_ping_bad_vcid_h = "20032015000080d2c70008197f0b00310000b1fe3128"; - uint8_t *raw_tc_sdls_ping_bad_vcid_b = NULL; + char *raw_tc_sdls_ping_bad_vcid_h = "20032015000080d2c70008197f0b00310000b1fe3128"; + char *raw_tc_sdls_ping_bad_vcid_b = NULL; int raw_tc_sdls_ping_bad_vcid_len = 0; hex_conversion(raw_tc_sdls_ping_bad_vcid_h, &raw_tc_sdls_ping_bad_vcid_b, &raw_tc_sdls_ping_bad_vcid_len); @@ -188,7 +187,7 @@ UTEST(TC_APPLY_SECURITY, BAD_VIRTUAL_CHANNEL_ID) uint16_t enc_frame_len = 0; int32_t return_val = CRYPTO_LIB_ERROR; - return_val = Crypto_TC_ApplySecurity(raw_tc_sdls_ping_bad_vcid_b, raw_tc_sdls_ping_bad_vcid_len, &ptr_enc_frame, &enc_frame_len); + return_val = Crypto_TC_ApplySecurity((uint8_t*) raw_tc_sdls_ping_bad_vcid_b, raw_tc_sdls_ping_bad_vcid_len, &ptr_enc_frame, &enc_frame_len); free(raw_tc_sdls_ping_bad_vcid_b); free(ptr_enc_frame); Crypto_Shutdown(); diff --git a/src/src_main/crypto.c b/src/src_main/crypto.c index 8bb43946..cb0ad920 100644 --- a/src/src_main/crypto.c +++ b/src/src_main/crypto.c @@ -46,7 +46,7 @@ static SadbRoutine sadb_routine = NULL; ** Static Prototypes */ // Assisting Functions -static int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr); +//static int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr); static int32_t Crypto_Get_tmLength(int len); static uint8_t Crypto_Is_AEAD_Algorithm(uint32_t cipher_suite_id); static uint8_t* Crypto_Prepare_TC_AAD(uint8_t* buffer, uint16_t len_aad, uint8_t* abm_buffer); @@ -56,8 +56,8 @@ static void Crypto_Local_Config(void); static void Crypto_Local_Init(void); //static int32_t Crypto_gcm_err(int gcm_err); static int32_t Crypto_window(uint8_t *actual, uint8_t *expected, int length, int window); -static int32_t Crypto_compare_less_equal(uint8_t *actual, uint8_t *expected, int length); -static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_frame); +//static int32_t Crypto_compare_less_equal(uint8_t *actual, uint8_t *expected, int length); +//static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_frame); static uint16_t Crypto_Calc_FECF(uint8_t* ingest, int len_ingest); static void Crypto_Calc_CRC_Init_Table(void); static uint16_t Crypto_Calc_CRC16(uint8_t* data, int size); @@ -919,6 +919,7 @@ static void Crypto_Calc_CRC_Init_Table(void) * @param sa_ptr: SecurityAssociation_t * @return int32, Length of TCPayload **/ +/* static int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr) { int tf_hdr = 5; @@ -942,6 +943,7 @@ static int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t return (tc_frame->tc_header.fl + 1 - (tf_hdr + seg_hdr + spi + iv_size ) - (mac_size + fecf) ); } +*/ /** * @brief Function: Crypto_Get_tmLength @@ -969,6 +971,8 @@ static uint8_t Crypto_Is_AEAD_Algorithm(uint32_t cipher_suite_id) { //CryptoLib only supports AES-GCM, which is an AEAD (Authenticated Encryption with Associated Data) algorithm, so return true/1. //TODO - Add cipher suite mapping to which algorithms are AEAD and which are not. + cipher_suite_id = cipher_suite_id; + return CRYPTO_TRUE; } @@ -1251,6 +1255,7 @@ static int32_t Crypto_window(uint8_t *actual, uint8_t *expected, int length, int * @param length: int * @return int32: Success/Failure **/ +/* static int32_t Crypto_compare_less_equal(uint8_t *actual, uint8_t *expected, int length) { int status = CRYPTO_LIB_ERROR; @@ -1270,6 +1275,7 @@ static int32_t Crypto_compare_less_equal(uint8_t *actual, uint8_t *expected, int } return status; } +*/ /** * @brief Function: Crypto_Prep_Reply @@ -1321,6 +1327,7 @@ uint8_t Crypto_Prep_Reply(uint8_t* ingest, uint8_t appID) * @param tc_frame: TC_t* * @return int32: Success/Failure **/ +/* static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_frame) { int32_t result = CRYPTO_LIB_SUCCESS; @@ -1355,6 +1362,7 @@ static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_fr return result; } +*/ /** * @brief Function Crypto_Calc_FECF @@ -1867,7 +1875,6 @@ static int32_t Crypto_Key_verify(uint8_t* ingest,TC_t* tc_frame) return count; } -/* /* ** Security Association Monitoring and Control @@ -2750,24 +2757,31 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra // Ingest length + spi_index (2) + some variable length fields *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shplf_len; new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; + break; case SA_AUTHENTICATION: - // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) \ + // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) // + shplf_len + arc_len + pad_size + stmacf_len *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + \ sa_ptr->shplf_len + sa_ptr->arc_len + TC_PAD_SIZE + sa_ptr->stmacf_len; new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; + break; case SA_ENCRYPTION: - // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) \ + // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) // + shplf_len + arc_len + pad_size *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + \ sa_ptr->shplf_len + sa_ptr->arc_len + TC_PAD_SIZE; new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; + break; case SA_AUTHENTICATED_ENCRYPTION: - // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) \ + // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) // + shplf_len + arc_len + pad_size + stmacf_len *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + \ sa_ptr->shplf_len + sa_ptr->arc_len + TC_PAD_SIZE + sa_ptr->stmacf_len; new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; + break; + default: + printf(KRED "Unknown SA Service Type Detected!" RESET); + break; } #ifdef TC_DEBUG @@ -3209,8 +3223,6 @@ int32_t Crypto_TC_ProcessSecurity( uint8_t* ingest, int* len_ingest,TC_t* tc_sdl { // Local Variables int32_t status = CRYPTO_LIB_SUCCESS; - int x = 0; - int y = 0; gcry_cipher_hd_t tmp_hd; gcry_error_t gcry_error = GPG_ERR_NO_ERROR; SecurityAssociation_t* sa_ptr = NULL; @@ -3652,8 +3664,8 @@ int32_t Crypto_TM_ApplySecurity( uint8_t* ingest, int* len_ingest) uint8_t aad[20]; uint16_t spi = tm_frame.tm_sec_header.spi; uint16_t spp_crc = 0x0000; - SecurityAssociation_t* sa_ptr; SecurityAssociation_t sa; + SecurityAssociation_t* sa_ptr = &sa; gcry_cipher_hd_t tmp_hd; gcry_error_t gcry_error = GPG_ERR_NO_ERROR; diff --git a/src/src_main/sadb_routine.c b/src/src_main/sadb_routine.c index ac69ab01..9679c000 100644 --- a/src/src_main/sadb_routine.c +++ b/src/src_main/sadb_routine.c @@ -18,8 +18,10 @@ * @param config: uint8_t* * @return SadbRoutine **/ +/* SadbRoutine init_parse_sadb_routine(uint8_t* config) { SadbRoutine sadb_routine; return sadb_routine; -} \ No newline at end of file +} +*/ \ No newline at end of file diff --git a/src/src_main/sadb_routine_inmemory.template.c b/src/src_main/sadb_routine_inmemory.template.c index 8dea3cb4..fa638559 100644 --- a/src/src_main/sadb_routine_inmemory.template.c +++ b/src/src_main/sadb_routine_inmemory.template.c @@ -19,22 +19,22 @@ #include "crypto_error.h" // Security Association Initialization Functions -static int32_t sadb_config(void); -static int32_t sadb_init(void); -static int32_t sadb_close(void); +int32_t sadb_config(void); +int32_t sadb_init(void); +int32_t sadb_close(void); // Security Association Interaction Functions -static int32_t sadb_get_sa_from_spi(uint16_t,SecurityAssociation_t**); -static int32_t sadb_get_operational_sa_from_gvcid(uint8_t,uint16_t,uint16_t,uint8_t,SecurityAssociation_t**); -static int32_t sadb_save_sa(SecurityAssociation_t* sa); +int32_t sadb_get_sa_from_spi(uint16_t,SecurityAssociation_t**); +int32_t sadb_get_operational_sa_from_gvcid(uint8_t,uint16_t,uint16_t,uint8_t,SecurityAssociation_t**); +int32_t sadb_save_sa(SecurityAssociation_t* sa); // Security Association Utility Functions -static int32_t sadb_sa_start(TC_t* tc_frame); -static int32_t sadb_sa_expire(void); -static int32_t sadb_sa_rekey(void); -static int32_t sadb_sa_status(uint8_t*); -static int32_t sadb_sa_create(void); -static int32_t sadb_sa_setARSN(void); -static int32_t sadb_sa_setARSNW(void); -static int32_t sadb_sa_delete(void); +int32_t sadb_sa_start(TC_t* tc_frame); +int32_t sadb_sa_expire(void); +int32_t sadb_sa_rekey(void); +int32_t sadb_sa_status(uint8_t*); +int32_t sadb_sa_create(void); +int32_t sadb_sa_setARSN(void); +int32_t sadb_sa_setARSNW(void); +int32_t sadb_sa_delete(void); /* @@ -71,7 +71,7 @@ SadbRoutine get_sadb_routine_inmemory(void) * @brief Function; sadb_config * @return int32: Success/Failure **/ -static int32_t sadb_config(void) +int32_t sadb_config(void) { int32_t status = CRYPTO_LIB_SUCCESS; @@ -230,7 +230,7 @@ static int32_t sadb_config(void) * @brief Function: sadb_init * @return int32: Success/Failure **/ -static int32_t sadb_init(void) +int32_t sadb_init(void) { int32_t status = CRYPTO_LIB_SUCCESS; @@ -258,7 +258,7 @@ static int32_t sadb_init(void) * @brief Function: sadb_close * @return int32: Success/Failure **/ -static int32_t sadb_close(void) +int32_t sadb_close(void) { //closing not necessary for inmemory DB. return CRYPTO_LIB_SUCCESS; @@ -273,7 +273,7 @@ static int32_t sadb_close(void) * @param security_association: SecurityAssociation_t** * @return int32: Success/Failure **/ -static int32_t sadb_get_sa_from_spi(uint16_t spi,SecurityAssociation_t** security_association) +int32_t sadb_get_sa_from_spi(uint16_t spi,SecurityAssociation_t** security_association) { int32_t status = CRYPTO_LIB_SUCCESS; if(sa == NULL) { return CRYPTO_LIB_ERR_NO_INIT; } @@ -296,7 +296,7 @@ static int32_t sadb_get_sa_from_spi(uint16_t spi,SecurityAssociation_t** securit * @param security_association: SecurityAssociation_t** * @return int32: Success/Failure **/ -static int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn,uint16_t scid,uint16_t vcid,uint8_t mapid,SecurityAssociation_t** security_association) +int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn,uint16_t scid,uint16_t vcid,uint8_t mapid,SecurityAssociation_t** security_association) { int32_t status = CRYPTO_LIB_ERR_NO_OPERATIONAL_SA; if(sa == NULL) { return CRYPTO_LIB_ERR_NO_INIT; } @@ -384,9 +384,10 @@ static int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn,uint16_t scid,uin * @return int32: Success/Failure * @note Nothing currently actually happens in this function **/ -static int32_t sadb_save_sa(SecurityAssociation_t* sa) +int32_t sadb_save_sa(SecurityAssociation_t* sa) { int32_t status = CRYPTO_LIB_SUCCESS; + sa = sa; // TODO - use argument //We could do a memory copy of the SA into the sa[NUM_SA] array at the given SPI, however, the inmemory code currently updates in place so no need for that. // If we change the in-place update logic, we should update this function to actually update the SA. return status; @@ -400,7 +401,7 @@ static int32_t sadb_save_sa(SecurityAssociation_t* sa) * @param tc_frame: TC_t * @return int32: Success/Failure **/ -static int32_t sadb_sa_start(TC_t* tc_frame) +int32_t sadb_sa_start(TC_t* tc_frame) { // Local variables uint8_t count = 0; @@ -524,7 +525,7 @@ static int32_t sadb_sa_start(TC_t* tc_frame) * @brief Function: sadb_sa_stop * @return int32: Success/Failure **/ -static int32_t sadb_sa_stop(void) +int32_t sadb_sa_stop(void) { // Local variables uint16_t spi = 0x0000; @@ -582,7 +583,7 @@ static int32_t sadb_sa_stop(void) * @brief Function: sadb_sa_rekey * @return int32: Success/Failure **/ -static int32_t sadb_sa_rekey(void) +int32_t sadb_sa_rekey(void) { // Local variables uint16_t spi = 0x0000; @@ -661,7 +662,7 @@ static int32_t sadb_sa_rekey(void) * @brief Function: sadb_sa_expire * @return int32: Success/Failure **/ -static int32_t sadb_sa_expire(void) +int32_t sadb_sa_expire(void) { // Local variables uint16_t spi = 0x0000; @@ -700,7 +701,7 @@ static int32_t sadb_sa_expire(void) * @brief Function: sadb_sa_create * @return int32: Success/Failure **/ -static int32_t sadb_sa_create(void) +int32_t sadb_sa_create(void) { // Local variables uint8_t count = 6; @@ -772,7 +773,7 @@ static int32_t sadb_sa_create(void) * @brief Function: sadb_sa_delete * @return int32: Success/Failure **/ -static int32_t sadb_sa_delete(void) +int32_t sadb_sa_delete(void) { // Local variables uint16_t spi = 0x0000; @@ -813,7 +814,7 @@ static int32_t sadb_sa_delete(void) * @brief Function: sadb_sa_setASRN * @return int32: Success/Failure **/ -static int32_t sadb_sa_setARSN(void) +int32_t sadb_sa_setARSN(void) { // Local variables uint16_t spi = 0x0000; @@ -862,7 +863,7 @@ static int32_t sadb_sa_setARSN(void) * @brief Function: sadb_sa_setARSNW * @return int32: Success/Failure **/ -static int32_t sadb_sa_setARSNW(void) +int32_t sadb_sa_setARSNW(void) { // Local variables uint16_t spi = 0x0000; @@ -900,7 +901,7 @@ static int32_t sadb_sa_setARSNW(void) * @param ingest: uint8_t* * @return int32: count **/ -static int32_t sadb_sa_status(uint8_t* ingest) +int32_t sadb_sa_status(uint8_t* ingest) { // Local variables int count = 0; From d1271917f1b709016fb039a3be33f6518b6a6b1a Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 10:40:30 -0500 Subject: [PATCH 12/18] #1 - Moved crypto_util to top level; --- .gitignore | 1 - CMakeLists.txt | 2 ++ CryptoLib-Doxyfile | 4 ++-- src/CMakeLists.txt | 2 -- {src/crypto_util => util}/CMakeLists.txt | 8 ++++---- {src/crypto_util/src => util/core}/shared_util.c | 0 {src/crypto_util => util}/include/apply_security.h | 0 {src/crypto_util => util}/include/crypto_sequence.h | 0 {src/crypto_util => util}/include/et_dt_validation.h | 0 {src/crypto_util => util}/include/process_security.h | 0 {src/crypto_util => util}/include/shared_util.h | 0 {src/crypto_util => util}/include/ut_tc_apply.h | 0 {src/crypto_util => util}/include/utest.h | 0 {src/crypto_util/util => util/src_util}/apply_security.c | 0 {src/crypto_util/util => util/src_util}/crypto_sequence.c | 0 .../crypto_util/util => util/src_util}/et_dt_validation.c | 0 .../crypto_util/util => util/src_util}/process_security.c | 0 {src/crypto_util/util => util/src_util}/ut_tc_apply.c | 0 18 files changed, 8 insertions(+), 9 deletions(-) rename {src/crypto_util => util}/CMakeLists.txt (93%) rename {src/crypto_util/src => util/core}/shared_util.c (100%) rename {src/crypto_util => util}/include/apply_security.h (100%) rename {src/crypto_util => util}/include/crypto_sequence.h (100%) rename {src/crypto_util => util}/include/et_dt_validation.h (100%) rename {src/crypto_util => util}/include/process_security.h (100%) rename {src/crypto_util => util}/include/shared_util.h (100%) rename {src/crypto_util => util}/include/ut_tc_apply.h (100%) rename {src/crypto_util => util}/include/utest.h (100%) rename {src/crypto_util/util => util/src_util}/apply_security.c (100%) rename {src/crypto_util/util => util/src_util}/crypto_sequence.c (100%) rename {src/crypto_util/util => util/src_util}/et_dt_validation.c (100%) rename {src/crypto_util/util => util/src_util}/process_security.c (100%) rename {src/crypto_util/util => util/src_util}/ut_tc_apply.c (100%) diff --git a/.gitignore b/.gitignore index bf2d36d9..b7590dc8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ .idea vgcore* -core *.so build venv diff --git a/CMakeLists.txt b/CMakeLists.txt index fabfe193..8e57900d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,3 +63,5 @@ add_subdirectory(src) if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR MYPROJECT_BUILD_TESTING) AND BUILD_TESTING) add_subdirectory(test) endif() + +add_subdirectory(util) diff --git a/CryptoLib-Doxyfile b/CryptoLib-Doxyfile index 578a21e3..1f76bf22 100644 --- a/CryptoLib-Doxyfile +++ b/CryptoLib-Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "CryptoLib" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.0.0 +PROJECT_NUMBER = 1.0.1 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a @@ -829,7 +829,7 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = ./fsw ./fsw/crypto_util/ut_tc_apply.c +INPUT = ./src ./util/src_util/ut_tc_apply.c # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 87737e74..454869d2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -58,5 +58,3 @@ add_custom_command(TARGET Crypto POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ ${PROJECT_BINARY_DIR}/lib/libCrypto.so COMMENT "Created ${PROJECT_BINARY_DIR}/lib/libCrypto.so" ) - -add_subdirectory(crypto_util) diff --git a/src/crypto_util/CMakeLists.txt b/util/CMakeLists.txt similarity index 93% rename from src/crypto_util/CMakeLists.txt rename to util/CMakeLists.txt index cadd2a1d..1b0fc753 100644 --- a/src/crypto_util/CMakeLists.txt +++ b/util/CMakeLists.txt @@ -27,10 +27,10 @@ if(${ENCTEST}) endif() endif(${ENCTEST}) -aux_source_directory(src UTIL_SRC_FILES) -aux_source_directory(util APP_SRC_FILES) +aux_source_directory(core UTIL_SRC_FILES) +aux_source_directory(src_util APP_SRC_FILES) -file( GLOB SOURCE_FILES util/*.c ) +file( GLOB SOURCE_FILES src_util/*.c ) foreach(SOURCE_PATH ${SOURCE_FILES}) get_filename_component(EXECUTABLE_NAME ${SOURCE_PATH} NAME_WE) @@ -38,7 +38,7 @@ foreach(SOURCE_PATH ${SOURCE_FILES}) continue() else() add_executable(${EXECUTABLE_NAME} ${SOURCE_PATH}) - target_sources(${EXECUTABLE_NAME} PRIVATE src/shared_util.c) + target_sources(${EXECUTABLE_NAME} PRIVATE core/shared_util.c) target_link_libraries(${EXECUTABLE_NAME} LINK_PUBLIC Crypto) endif() diff --git a/src/crypto_util/src/shared_util.c b/util/core/shared_util.c similarity index 100% rename from src/crypto_util/src/shared_util.c rename to util/core/shared_util.c diff --git a/src/crypto_util/include/apply_security.h b/util/include/apply_security.h similarity index 100% rename from src/crypto_util/include/apply_security.h rename to util/include/apply_security.h diff --git a/src/crypto_util/include/crypto_sequence.h b/util/include/crypto_sequence.h similarity index 100% rename from src/crypto_util/include/crypto_sequence.h rename to util/include/crypto_sequence.h diff --git a/src/crypto_util/include/et_dt_validation.h b/util/include/et_dt_validation.h similarity index 100% rename from src/crypto_util/include/et_dt_validation.h rename to util/include/et_dt_validation.h diff --git a/src/crypto_util/include/process_security.h b/util/include/process_security.h similarity index 100% rename from src/crypto_util/include/process_security.h rename to util/include/process_security.h diff --git a/src/crypto_util/include/shared_util.h b/util/include/shared_util.h similarity index 100% rename from src/crypto_util/include/shared_util.h rename to util/include/shared_util.h diff --git a/src/crypto_util/include/ut_tc_apply.h b/util/include/ut_tc_apply.h similarity index 100% rename from src/crypto_util/include/ut_tc_apply.h rename to util/include/ut_tc_apply.h diff --git a/src/crypto_util/include/utest.h b/util/include/utest.h similarity index 100% rename from src/crypto_util/include/utest.h rename to util/include/utest.h diff --git a/src/crypto_util/util/apply_security.c b/util/src_util/apply_security.c similarity index 100% rename from src/crypto_util/util/apply_security.c rename to util/src_util/apply_security.c diff --git a/src/crypto_util/util/crypto_sequence.c b/util/src_util/crypto_sequence.c similarity index 100% rename from src/crypto_util/util/crypto_sequence.c rename to util/src_util/crypto_sequence.c diff --git a/src/crypto_util/util/et_dt_validation.c b/util/src_util/et_dt_validation.c similarity index 100% rename from src/crypto_util/util/et_dt_validation.c rename to util/src_util/et_dt_validation.c diff --git a/src/crypto_util/util/process_security.c b/util/src_util/process_security.c similarity index 100% rename from src/crypto_util/util/process_security.c rename to util/src_util/process_security.c diff --git a/src/crypto_util/util/ut_tc_apply.c b/util/src_util/ut_tc_apply.c similarity index 100% rename from src/crypto_util/util/ut_tc_apply.c rename to util/src_util/ut_tc_apply.c From 52ce00d1d96f779888092d303a74bd609f1b9339 Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 10:51:01 -0500 Subject: [PATCH 13/18] #1 - Formatting `clang-format -i --style=Microsoft`; --- CMakeLists.txt | 31 +- include/crypto.h | 79 +- include/crypto_config.h | 273 +- include/crypto_config_structs.h | 115 +- include/crypto_error.h | 79 +- include/crypto_events.h | 37 +- include/crypto_print.h | 38 +- include/crypto_structs.h | 430 +- include/sadb_mariadb_error.h | 19 +- include/sadb_routine.h | 35 +- src/CMakeLists.txt | 31 +- src/src_main/crypto.c | 3642 +++++++++-------- src/src_main/crypto_print.c | 84 +- src/src_main/sadb_routine_inmemory.template.c | 383 +- src/src_mysql/sadb_routine_mariadb.template.c | 403 +- test/CMakeLists.txt | 31 +- test/crypto_test.py | 31 +- util/CMakeLists.txt | 33 +- util/core/shared_util.c | 94 +- util/include/apply_security.h | 27 +- util/include/crypto_sequence.h | 27 +- util/include/et_dt_validation.h | 27 +- util/include/process_security.h | 27 +- util/include/shared_util.h | 40 +- util/include/ut_tc_apply.h | 27 +- util/src_util/apply_security.c | 101 +- util/src_util/crypto_sequence.c | 107 +- util/src_util/et_dt_validation.c | 693 ++-- util/src_util/process_security.c | 77 +- util/src_util/ut_tc_apply.c | 92 +- 30 files changed, 3777 insertions(+), 3336 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e57900d..0fe19e5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,18 +1,19 @@ -# Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. -# -# This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not -# limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness -# for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or -# any warranty that the software will be error free. -# -# In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, -# arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, -# contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, -# documentation or services provided hereunder. -# -# ITC Team -# NASA IV&V -# jstar-development-team@mail.nasa.gov +# Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. +# All Foreign Rights are Reserved to the U.S. Government. +# +# This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, +# including, but not limited to, any warranty that the software will conform to specifications, any implied warranties +# of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the +# documentation will conform to the program, or any warranty that the software will be error free. +# +# In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or +# consequential damages, arising out of, resulting from, or in any way connected with the software or its +# documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained +# from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. +# +# ITC Team +# NASA IV&V +# jstar-development-team@mail.nasa.gov #cmake_minimum_required(VERSION 2.6.4) diff --git a/include/crypto.h b/include/crypto.h index 53a63bd5..ec4bdd16 100644 --- a/include/crypto.h +++ b/include/crypto.h @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -22,65 +23,71 @@ ** Crypto Includes */ -#ifdef NOS3 //NOS3/cFS build is ready +#ifdef NOS3 // NOS3/cFS build is ready #include "cfe.h" -#else //Assume build outside of NOS3/cFS infrastructure +#else // Assume build outside of NOS3/cFS infrastructure #include #include #include #endif -#include "crypto_structs.h" #include "crypto_config_structs.h" +#include "crypto_structs.h" -#define CRYPTO_LIB_MAJOR_VERSION 1 -#define CRYPTO_LIB_MINOR_VERSION 2 -#define CRYPTO_LIB_REVISION 0 -#define CRYPTO_LIB_MISSION_REV 0 +#define CRYPTO_LIB_MAJOR_VERSION 1 +#define CRYPTO_LIB_MINOR_VERSION 0 +#define CRYPTO_LIB_REVISION 1 +#define CRYPTO_LIB_MISSION_REV 0 /* ** Prototypes */ // Crypto Library Configuration functions -extern int32_t Crypto_Config_CryptoLib(uint8_t sadb_type, uint8_t crypto_create_fecf, uint8_t process_sdls_pdus, uint8_t has_pus_hdr, uint8_t ignore_sa_state, uint8_t ignore_anti_replay, uint8_t unique_sa_per_mapid, uint8_t crypto_check_fecf, uint8_t vcid_bitmask); -extern int32_t Crypto_Config_MariaDB(uint8_t* mysql_username, uint8_t* mysql_password, uint8_t* mysql_hostname, uint8_t* mysql_database, uint16_t mysql_port); -extern int32_t Crypto_Config_Add_Gvcid_Managed_Parameter(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, uint8_t has_segmentation_hdr); +extern int32_t Crypto_Config_CryptoLib(uint8_t sadb_type, uint8_t crypto_create_fecf, uint8_t process_sdls_pdus, + uint8_t has_pus_hdr, uint8_t ignore_sa_state, uint8_t ignore_anti_replay, + uint8_t unique_sa_per_mapid, uint8_t crypto_check_fecf, uint8_t vcid_bitmask); +extern int32_t Crypto_Config_MariaDB(uint8_t *mysql_username, uint8_t *mysql_password, uint8_t *mysql_hostname, + uint8_t *mysql_database, uint16_t mysql_port); +extern int32_t Crypto_Config_Add_Gvcid_Managed_Parameter(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, + uint8_t has_segmentation_hdr); // Initialization extern int32_t Crypto_Init(void); // Initialize CryptoLib After Configuration Calls -extern int32_t Crypto_Init_With_Configs(CryptoConfig_t* crypto_config_p,GvcidManagedParameters_t* gvcid_managed_parameters_p,SadbMariaDBConfig_t* sadb_mariadb_config_p); // Initialize CryptoLib With Application Defined Configuration -extern int32_t Crypto_Init_Unit_Test(void); // Initialize CryptoLib with unit test default Configurations +extern int32_t Crypto_Init_With_Configs( + CryptoConfig_t *crypto_config_p, GvcidManagedParameters_t *gvcid_managed_parameters_p, + SadbMariaDBConfig_t *sadb_mariadb_config_p); // Initialize CryptoLib With Application Defined Configuration +extern int32_t Crypto_Init_Unit_Test(void); // Initialize CryptoLib with unit test default Configurations // Cleanup extern int32_t Crypto_Shutdown(void); // Free all allocated memory // Telecommand (TC) -extern int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_frame_length, \ - uint8_t **pp_enc_frame, uint16_t *p_enc_frame_len); -extern int32_t Crypto_TC_ProcessSecurity(uint8_t* ingest, int* len_ingest, TC_t* tc_sdls_processed_frame); +extern int32_t Crypto_TC_ApplySecurity(const uint8_t *p_in_frame, const uint16_t in_frame_length, + uint8_t **pp_enc_frame, uint16_t *p_enc_frame_len); +extern int32_t Crypto_TC_ProcessSecurity(uint8_t *ingest, int *len_ingest, TC_t *tc_sdls_processed_frame); // Telemetry (TM) -extern int32_t Crypto_TM_ApplySecurity(uint8_t* ingest, int* len_ingest); -extern int32_t Crypto_TM_ProcessSecurity(uint8_t* ingest, int* len_ingest); +extern int32_t Crypto_TM_ApplySecurity(uint8_t *ingest, int *len_ingest); +extern int32_t Crypto_TM_ProcessSecurity(uint8_t *ingest, int *len_ingest); // Advanced Orbiting Systems (AOS) -extern int32_t Crypto_AOS_ApplySecurity(uint8_t* ingest, int* len_ingest); -extern int32_t Crypto_AOS_ProcessSecurity(uint8_t* ingest, int* len_ingest); +extern int32_t Crypto_AOS_ApplySecurity(uint8_t *ingest, int *len_ingest); +extern int32_t Crypto_AOS_ProcessSecurity(uint8_t *ingest, int *len_ingest); // Security Functions -extern int32_t Crypto_ApplySecurity(uint8_t* ingest, int* len_ingest); -extern int32_t Crypto_ProcessSecurity(uint8_t* ingest, int* len_ingest); +extern int32_t Crypto_ApplySecurity(uint8_t *ingest, int *len_ingest); +extern int32_t Crypto_ProcessSecurity(uint8_t *ingest, int *len_ingest); // Data stores used in multiple components extern CCSDS_t sdls_frame; extern TM_t tm_frame; extern crypto_key_t ek_ring[NUM_KEYS]; // Assisting functions used in multiple components -extern uint8_t Crypto_Prep_Reply(uint8_t* ingest, uint8_t appID); +extern uint8_t Crypto_Prep_Reply(uint8_t *ingest, uint8_t appID); extern int32_t Crypto_increment(uint8_t *num, int length); -//Global configuration structs -extern CryptoConfig_t* crypto_config; -extern SadbMariaDBConfig_t* sadb_mariadb_config; -extern GvcidManagedParameters_t* gvcid_managed_parameters; -extern GvcidManagedParameters_t* current_managed_parameters; +// Global configuration structs +extern CryptoConfig_t *crypto_config; +extern SadbMariaDBConfig_t *sadb_mariadb_config; +extern GvcidManagedParameters_t *gvcid_managed_parameters; +extern GvcidManagedParameters_t *current_managed_parameters; #endif \ No newline at end of file diff --git a/include/crypto_config.h b/include/crypto_config.h index 5bbcb017..f00a1dcb 100644 --- a/include/crypto_config.h +++ b/include/crypto_config.h @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -18,164 +19,166 @@ #define _crypto_config_h_ // Build Defines - //#define BUILD_STATIC +//#define BUILD_STATIC // Debug Defines -- Use CMAKE options - //#define ARC_DEBUG - //#define CCSDS_DEBUG - //#define DEBUG //(CMAKE option, not hardcoded) - //#define FECF_DEBUG - //#define MAC_DEBUG - //#define OCF_DEBUG - //#define PDU_DEBUG - //#define SA_DEBUG - //#define TC_DEBUG - //#define TM_DEBUG +//#define ARC_DEBUG +//#define CCSDS_DEBUG +//#define DEBUG //(CMAKE option, not hardcoded) +//#define FECF_DEBUG +//#define MAC_DEBUG +//#define OCF_DEBUG +//#define PDU_DEBUG +//#define SA_DEBUG +//#define TC_DEBUG +//#define TM_DEBUG // Debug Colors - #ifdef DEBUG - #define KRED "\x1B[31m" - #define KGRN "\x1B[32m" - #define KYEL "\x1B[33m" - #define KBLU "\x1B[34m" - #define KMAG "\x1B[35m" - #define KCYN "\x1B[36m" - #define RESET "\033[0m" - #else - #define KRED - #define RED - #define KGRN - #define GREEN - #define KYEL - #define KBLU - #define KMAG - #define KCYN - #define RESET - #endif +#ifdef DEBUG +#define KRED "\x1B[31m" +#define KGRN "\x1B[32m" +#define KYEL "\x1B[33m" +#define KBLU "\x1B[34m" +#define KMAG "\x1B[35m" +#define KCYN "\x1B[36m" +#define RESET "\033[0m" +#else +#define KRED +#define RED +#define KGRN +#define GREEN +#define KYEL +#define KBLU +#define KMAG +#define KCYN +#define RESET +#endif // Spacecraft Defines - #define SCID 0x0003 // 0xC3D2 +#define SCID 0x0003 // 0xC3D2 // Functionality Defines - #define INCREMENT - #define FILL - // TM Fill Types - select 1 - //#define TM_ZERO_FILL - #define TM_IDLE_FILL +#define INCREMENT +#define FILL +// TM Fill Types - select 1 +//#define TM_ZERO_FILL +#define TM_IDLE_FILL // GVCID Defines - #define NUM_GVCID 64 - #define TYPE_TC 0 - #define TYPE_MAP 1 - #define TYPE_TM 2 +#define NUM_GVCID 64 +#define TYPE_TC 0 +#define TYPE_MAP 1 +#define TYPE_TM 2 // Specific to Authentication - #define SA_NONE 0 - #define SA_UNKEYED 1 - #define SA_KEYED 2 - #define SA_OPERATIONAL 3 +#define SA_NONE 0 +#define SA_UNKEYED 1 +#define SA_KEYED 2 +#define SA_OPERATIONAL 3 // SA State Transitions - #define SA_CREATE 5 - #define SA_REKEY 6 - #define SA_START 7 - #define SA_STOP 2 - #define SA_EXPIRE 1 - #define SA_DELETE 0 +#define SA_CREATE 5 +#define SA_REKEY 6 +#define SA_START 7 +#define SA_STOP 2 +#define SA_EXPIRE 1 +#define SA_DELETE 0 // SA Additional Directives - #define SA_STATUS 8 - #define SA_SETARC 9 - #define SA_SETARCW 10 +#define SA_STATUS 8 +#define SA_SETARC 9 +#define SA_SETARCW 10 // Key State Defines - #define KEY_PREACTIVE 0 - #define KEY_ACTIVE 1 - #define KEY_DEACTIVATED 2 - #define KEY_DESTROYED 3 - #define KEY_CORRUPTED 4 +#define KEY_PREACTIVE 0 +#define KEY_ACTIVE 1 +#define KEY_DEACTIVATED 2 +#define KEY_DESTROYED 3 +#define KEY_CORRUPTED 4 // SA Service Types - #define SA_PLAINTEXT 0 - #define SA_AUTHENTICATION 1 - #define SA_ENCRYPTION 2 - #define SA_AUTHENTICATED_ENCRYPTION 3 +#define SA_PLAINTEXT 0 +#define SA_AUTHENTICATION 1 +#define SA_ENCRYPTION 2 +#define SA_AUTHENTICATED_ENCRYPTION 3 // Generic Defines - #define NUM_SA 64 - #define SPI_LEN 2 /* bytes */ - #define KEY_SIZE 32 - #define KEY_ID_SIZE 8 - #define NUM_KEYS 256 - #define DISABLED 0 - #define ENABLED 1 - #define IV_SIZE 16 /* TM IV size bytes */ - #define IV_SIZE_TC 4 /* TC IV size bytes */ - #define OCF_SIZE 4 - #define MAC_SIZE 16 /* bytes */ - #define FECF_SIZE 2 - #define SEGMENT_HDR_SIZE 1 - #define ECS_SIZE 4 /* bytes */ - #define ABM_SIZE 1024 //20 /* bytes */ - #define ARC_SIZE 20 /* total messages */ - #define ARCW_SIZE 1 /* bytes */ - #define SN_SIZE 0 - #define CHALLENGE_SIZE 16 /* bytes */ - #define CHALLENGE_MAC_SIZE 16 /* bytes */ +#define NUM_SA 64 +#define SPI_LEN 2 /* bytes */ +#define KEY_SIZE 32 +#define KEY_ID_SIZE 8 +#define NUM_KEYS 256 +#define DISABLED 0 +#define ENABLED 1 +#define IV_SIZE 16 /* TM IV size bytes */ +#define IV_SIZE_TC 4 /* TC IV size bytes */ +#define OCF_SIZE 4 +#define MAC_SIZE 16 /* bytes */ +#define FECF_SIZE 2 +#define SEGMENT_HDR_SIZE 1 +#define ECS_SIZE 4 /* bytes */ +#define ABM_SIZE 1024 // 20 /* bytes */ +#define ARC_SIZE 20 /* total messages */ +#define ARCW_SIZE 1 /* bytes */ +#define SN_SIZE 0 +#define CHALLENGE_SIZE 16 /* bytes */ +#define CHALLENGE_MAC_SIZE 16 /* bytes */ // Monitoring and Control Defines - #define EMV_SIZE 4 /* bytes */ - #define LOG_SIZE 50 /* packets */ - #define ST_OK 0x00 - #define ST_NOK 0xFF +#define EMV_SIZE 4 /* bytes */ +#define LOG_SIZE 50 /* packets */ +#define ST_OK 0x00 +#define ST_NOK 0xFF // Procedure Identification (PID) - // Service Group - Key Management - #define SG_KEY_MGMT 0b00 - #define PID_OTAR 0b0001 - #define PID_KEY_ACTIVATION 0b0010 - #define PID_KEY_DEACTIVATION 0b0011 - #define PID_KEY_VERIFICATION 0b0100 - #define PID_KEY_DESTRUCTION 0b0110 - #define PID_KEY_INVENTORY 0b0111 - // Service Group - Security Association Management - #define SG_SA_MGMT 0b01 - #define PID_CREATE_SA 0b0001 - #define PID_REKEY_SA 0b0110 - #define PID_START_SA 0b1011 - #define PID_STOP_SA 0b1110 - #define PID_EXPIRE_SA 0b1001 - #define PID_DELETE_SA 0b0100 - #define PID_SET_ARSN 0b1010 - #define PID_SET_ARSNW 0b0101 - #define PID_READ_ARSN 0b0000 - #define PID_SA_STATUS 0b1111 - // Service Group - Security Monitoring & Control - #define SG_SEC_MON_CTRL 0b11 - #define PID_PING 0b0001 - #define PID_LOG_STATUS 0b0010 - #define PID_DUMP_LOG 0b0011 - #define PID_ERASE_LOG 0b0100 - #define PID_SELF_TEST 0b0101 - #define PID_ALARM_FLAG 0b0111 +// Service Group - Key Management +#define SG_KEY_MGMT 0b00 +#define PID_OTAR 0b0001 +#define PID_KEY_ACTIVATION 0b0010 +#define PID_KEY_DEACTIVATION 0b0011 +#define PID_KEY_VERIFICATION 0b0100 +#define PID_KEY_DESTRUCTION 0b0110 +#define PID_KEY_INVENTORY 0b0111 +// Service Group - Security Association Management +#define SG_SA_MGMT 0b01 +#define PID_CREATE_SA 0b0001 +#define PID_REKEY_SA 0b0110 +#define PID_START_SA 0b1011 +#define PID_STOP_SA 0b1110 +#define PID_EXPIRE_SA 0b1001 +#define PID_DELETE_SA 0b0100 +#define PID_SET_ARSN 0b1010 +#define PID_SET_ARSNW 0b0101 +#define PID_READ_ARSN 0b0000 +#define PID_SA_STATUS 0b1111 +// Service Group - Security Monitoring & Control +#define SG_SEC_MON_CTRL 0b11 +#define PID_PING 0b0001 +#define PID_LOG_STATUS 0b0010 +#define PID_DUMP_LOG 0b0011 +#define PID_ERASE_LOG 0b0100 +#define PID_SELF_TEST 0b0101 +#define PID_ALARM_FLAG 0b0111 // TC Defines - #define TC_SH_SIZE 8 /* bits */ - #define TC_SN_SIZE 0 - #define TC_SN_WINDOW 10 /* +/- value */ - #define TC_PAD_SIZE 0 - #define TC_FRAME_DATA_SIZE 1740 /* bytes */ +#define TC_SH_SIZE 8 /* bits */ +#define TC_SN_SIZE 0 +#define TC_SN_WINDOW 10 /* +/- value */ +#define TC_PAD_SIZE 0 +#define TC_FRAME_DATA_SIZE 1740 /* bytes */ // CCSDS PUS Defines - #define TLV_DATA_SIZE 494 /* bytes */ +#define TLV_DATA_SIZE 494 /* bytes */ // TM Defines - #define TM_FRAME_DATA_SIZE 1740 /* bytes */ - #define TM_FILL_SIZE 1145 /* bytes */ - #define TM_PAD_SIZE 2 /* bytes */ +#define TM_FRAME_DATA_SIZE 1740 /* bytes */ +#define TM_FILL_SIZE 1145 /* bytes */ +#define TM_PAD_SIZE 2 /* bytes */ // TC Behavior Defines - #define TC_SDLS_EP_VCID 4 //VCID which has SDLS PDUs (JPL uses VCIDs to determine TC type, there is no space packet layer with APIDs). Set to -1 if uses SP APIDs. +#define TC_SDLS_EP_VCID \ + 4 // VCID which has SDLS PDUs (JPL uses VCIDs to determine TC type, there is no space packet layer with APIDs). Set + // to -1 if uses SP APIDs. // Logic Behavior Defines - #define CRYPTO_FALSE 0 - #define CRYPTO_TRUE 1 +#define CRYPTO_FALSE 0 +#define CRYPTO_TRUE 1 #endif \ No newline at end of file diff --git a/include/crypto_config_structs.h b/include/crypto_config_structs.h index 86ea749e..97157946 100644 --- a/include/crypto_config_structs.h +++ b/include/crypto_config_structs.h @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2017 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. -This software is provided "as is" without any warranty of any, kind either express, implied, or statutory, including, but not -limited to, any warranty that the software will conform to, specifications any implied warranties of merchantability, fitness -for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or -any warranty that the software will be error free. +This software is provided "as is" without any warranty of any, kind either express, implied, or statutory, including, +but not limited to, any warranty that the software will conform to, specifications any implied warranties of +merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the +documentation will conform to the program, or any warranty that the software will be error free. -In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, -arising out of, resulting from, or in any way connected with the software or its documentation. Whether or not based upon warranty, -contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, -documentation or services provided hereunder +In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or +consequential damages, arising out of, resulting from, or in any way connected with the software or its documentation. +Whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained from, or arose +out of the results of, or use of, the software, documentation or services provided hereunder ITC Team NASA IV&V @@ -19,24 +20,64 @@ ivv-itc@lists.nasa.gov #include "crypto_config.h" -#ifdef NOS3 //NOS3/cFS build is ready +#ifdef NOS3 // NOS3/cFS build is ready #include "common_types.h" -#else //Assume build outside of NOS3/cFS infrastructure +#else // Assume build outside of NOS3/cFS infrastructure #include #endif -//main config enums -typedef enum { SADB_TYPE_INMEMORY, SADB_TYPE_MARIADB } SadbType; -//gvcid managed parameter enums -typedef enum { TC_NO_FECF, TC_HAS_FECF } TcFecfPresent; -typedef enum { TC_NO_SEGMENT_HDRS, TC_HAS_SEGMENT_HDRS } TcSegmentHdrsPresent; -typedef enum { CRYPTO_TC_CREATE_FECF_FALSE, CRYPTO_TC_CREATE_FECF_TRUE } TcCreateFecfBool; -typedef enum { TC_PROCESS_SDLS_PDUS_FALSE, TC_PROCESS_SDLS_PDUS_TRUE } TcProcessSdlsPdus; -typedef enum { TC_NO_PUS_HDR, TC_HAS_PUS_HDR } TcPusHdrPresent; -typedef enum { TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_SA_STATE_TRUE } TcIgnoreSaState; -typedef enum { TC_IGNORE_ANTI_REPLAY_FALSE, TC_IGNORE_ANTI_REPLAY_TRUE } TcIgnoreAntiReplay; -typedef enum { TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_UNIQUE_SA_PER_MAP_ID_TRUE } TcUniqueSaPerMapId; -typedef enum { TC_CHECK_FECF_FALSE, TC_CHECK_FECF_TRUE } TcCheckFecfBool; +// main config enums +typedef enum +{ + SADB_TYPE_INMEMORY, + SADB_TYPE_MARIADB +} SadbType; +// gvcid managed parameter enums +typedef enum +{ + TC_NO_FECF, + TC_HAS_FECF +} TcFecfPresent; +typedef enum +{ + TC_NO_SEGMENT_HDRS, + TC_HAS_SEGMENT_HDRS +} TcSegmentHdrsPresent; +typedef enum +{ + CRYPTO_TC_CREATE_FECF_FALSE, + CRYPTO_TC_CREATE_FECF_TRUE +} TcCreateFecfBool; +typedef enum +{ + TC_PROCESS_SDLS_PDUS_FALSE, + TC_PROCESS_SDLS_PDUS_TRUE +} TcProcessSdlsPdus; +typedef enum +{ + TC_NO_PUS_HDR, + TC_HAS_PUS_HDR +} TcPusHdrPresent; +typedef enum +{ + TC_IGNORE_SA_STATE_FALSE, + TC_IGNORE_SA_STATE_TRUE +} TcIgnoreSaState; +typedef enum +{ + TC_IGNORE_ANTI_REPLAY_FALSE, + TC_IGNORE_ANTI_REPLAY_TRUE +} TcIgnoreAntiReplay; +typedef enum +{ + TC_UNIQUE_SA_PER_MAP_ID_FALSE, + TC_UNIQUE_SA_PER_MAP_ID_TRUE +} TcUniqueSaPerMapId; +typedef enum +{ + TC_CHECK_FECF_FALSE, + TC_CHECK_FECF_TRUE +} TcCheckFecfBool; /* ** Main Crypto Configuration Block @@ -44,10 +85,11 @@ typedef enum { TC_CHECK_FECF_FALSE, TC_CHECK_FECF_TRUE } TcCheckFecfBool; typedef struct { SadbType sadb_type; - TcCreateFecfBool crypto_create_fecf; //Whether or not CryptoLib is expected to calculate TC FECFs and return payloads with the FECF - TcProcessSdlsPdus process_sdls_pdus; //Config to process SDLS extended procedure PDUs in CryptoLib + TcCreateFecfBool crypto_create_fecf; // Whether or not CryptoLib is expected to calculate TC FECFs and return + // payloads with the FECF + TcProcessSdlsPdus process_sdls_pdus; // Config to process SDLS extended procedure PDUs in CryptoLib TcPusHdrPresent has_pus_hdr; - TcIgnoreSaState ignore_sa_state; //TODO - add logic that uses this configuration + TcIgnoreSaState ignore_sa_state; // TODO - add logic that uses this configuration TcIgnoreAntiReplay ignore_anti_replay; TcUniqueSaPerMapId unique_sa_per_mapid; TcCheckFecfBool crypto_check_fecf; @@ -56,13 +98,14 @@ typedef struct #define CRYPTO_CONFIG_SIZE (sizeof(CryptoConfig_t)) typedef struct _GvcidManagedParameters_t GvcidManagedParameters_t; -struct _GvcidManagedParameters_t{ - uint8_t tfvn :4; // Transfer Frame Version Number - uint16_t scid :10; //SpacecraftID - uint8_t vcid :6; //Virtual Channel ID +struct _GvcidManagedParameters_t +{ + uint8_t tfvn : 4; // Transfer Frame Version Number + uint16_t scid : 10; // SpacecraftID + uint8_t vcid : 6; // Virtual Channel ID TcFecfPresent has_fecf; TcSegmentHdrsPresent has_segmentation_hdr; - GvcidManagedParameters_t* next; //Will be a list of managed parameters! + GvcidManagedParameters_t *next; // Will be a list of managed parameters! }; #define GVCID_MANAGED_PARAMETERS_SIZE (sizeof(GvcidManagedParameters_t)) @@ -71,11 +114,11 @@ struct _GvcidManagedParameters_t{ */ typedef struct { - uint8_t* mysql_username; - uint8_t* mysql_password; - uint8_t* mysql_hostname; - uint8_t* mysql_database; - uint16_t mysql_port; + uint8_t *mysql_username; + uint8_t *mysql_password; + uint8_t *mysql_hostname; + uint8_t *mysql_database; + uint16_t mysql_port; } SadbMariaDBConfig_t; #define SADB_MARIADB_CONFIG_SIZE (sizeof(SadbMariaDBConfig_t)) diff --git a/include/crypto_error.h b/include/crypto_error.h index 04510b0a..4aae2da1 100644 --- a/include/crypto_error.h +++ b/include/crypto_error.h @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -19,36 +20,34 @@ #include "sadb_mariadb_error.h" -#define SADB_INVALID_SADB_TYPE 201 -#define SADB_NULL_SA_USED 202 -#define CRYPTO_CONFIGURATION_NOT_COMPLETE 101 -#define CRYPTO_MANAGED_PARAM_CONFIGURATION_NOT_COMPLETE 102 -#define CRYPTO_MARIADB_CONFIGURATION_NOT_COMPLETE 103 -#define MANAGED_PARAMETERS_FOR_GVCID_NOT_FOUND 104 - - -#define CRYPTO_LIB_SUCCESS (0) -#define CRYPTO_LIB_ERROR (-1) -#define CRYPTO_LIB_ERR_NO_INIT (-2) -#define CRYPTO_LIB_ERR_INVALID_TFVN (-3) -#define CRYPTO_LIB_ERR_INVALID_SCID (-4) -#define CRYPTO_LIB_ERR_INVALID_VCID (-5) -#define CRYPTO_LIB_ERR_INVALID_MAPID (-6) -#define CRYPTO_LIB_ERR_INVALID_CC_FLAG (-7) -#define CRYPTO_LIB_ERR_NO_OPERATIONAL_SA (-8) -#define CRYPTO_LIB_ERR_NULL_BUFFER (-9) -#define CRYPTO_LIB_ERR_UT_BYTE_MISMATCH (-10) -#define CRYPTO_LIB_ERR_NO_CONFIG (-11) -#define CRYPTO_LIB_ERR_INVALID_FECF (-12) -#define CRYPTO_LIB_ERR_BAD_ANTIREPLAY_WINDOW (-13) -#define CRYPTO_LIB_ERR_LIBGCRYPT_ERROR (-14) -#define CRYPTO_LIB_ERR_AUTHENTICATION_ERROR (-15) -#define CRYPTO_LIB_ERR_NULL_IV (-16) -#define CRYPTO_LIB_ERR_NULL_ABM (-17) -#define CRYPTO_LIB_ERR_DECRYPT_ERROR (-18) -#define CRYPTO_LIB_ERR_ABM_TOO_SHORT_FOR_AAD (-19) -#define CRYPTO_LIB_ERR_MAC_RETRIEVAL_ERROR (-20) -#define CRYPTO_LIB_ERR_MAC_VALIDATION_ERROR (-21) - +#define SADB_INVALID_SADB_TYPE 201 +#define SADB_NULL_SA_USED 202 +#define CRYPTO_CONFIGURATION_NOT_COMPLETE 101 +#define CRYPTO_MANAGED_PARAM_CONFIGURATION_NOT_COMPLETE 102 +#define CRYPTO_MARIADB_CONFIGURATION_NOT_COMPLETE 103 +#define MANAGED_PARAMETERS_FOR_GVCID_NOT_FOUND 104 + +#define CRYPTO_LIB_SUCCESS (0) +#define CRYPTO_LIB_ERROR (-1) +#define CRYPTO_LIB_ERR_NO_INIT (-2) +#define CRYPTO_LIB_ERR_INVALID_TFVN (-3) +#define CRYPTO_LIB_ERR_INVALID_SCID (-4) +#define CRYPTO_LIB_ERR_INVALID_VCID (-5) +#define CRYPTO_LIB_ERR_INVALID_MAPID (-6) +#define CRYPTO_LIB_ERR_INVALID_CC_FLAG (-7) +#define CRYPTO_LIB_ERR_NO_OPERATIONAL_SA (-8) +#define CRYPTO_LIB_ERR_NULL_BUFFER (-9) +#define CRYPTO_LIB_ERR_UT_BYTE_MISMATCH (-10) +#define CRYPTO_LIB_ERR_NO_CONFIG (-11) +#define CRYPTO_LIB_ERR_INVALID_FECF (-12) +#define CRYPTO_LIB_ERR_BAD_ANTIREPLAY_WINDOW (-13) +#define CRYPTO_LIB_ERR_LIBGCRYPT_ERROR (-14) +#define CRYPTO_LIB_ERR_AUTHENTICATION_ERROR (-15) +#define CRYPTO_LIB_ERR_NULL_IV (-16) +#define CRYPTO_LIB_ERR_NULL_ABM (-17) +#define CRYPTO_LIB_ERR_DECRYPT_ERROR (-18) +#define CRYPTO_LIB_ERR_ABM_TOO_SHORT_FOR_AAD (-19) +#define CRYPTO_LIB_ERR_MAC_RETRIEVAL_ERROR (-20) +#define CRYPTO_LIB_ERR_MAC_VALIDATION_ERROR (-21) #endif //_crypto_error_h_ diff --git a/include/crypto_events.h b/include/crypto_events.h index d859dd4e..6c68c2fe 100644 --- a/include/crypto_events.h +++ b/include/crypto_events.h @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -17,15 +18,15 @@ #ifndef _crypto_events_h_ #define _crypto_events_h_ -#define FECF_ERR_EID 0 -#define MKID_INVALID_EID 1 -#define MKID_STATE_ERR_EID 2 -#define KEY_TRANSITION_ERR_EID 3 -#define SPI_INVALID_EID 4 -#define IV_WINDOW_ERR_EID 5 -#define IV_REPLAY_ERR_EID 6 -#define OTAR_MK_ERR_EID 7 +#define FECF_ERR_EID 0 +#define MKID_INVALID_EID 1 +#define MKID_STATE_ERR_EID 2 +#define KEY_TRANSITION_ERR_EID 3 +#define SPI_INVALID_EID 4 +#define IV_WINDOW_ERR_EID 5 +#define IV_REPLAY_ERR_EID 6 +#define OTAR_MK_ERR_EID 7 -#define STARTUP 10 +#define STARTUP 10 #endif \ No newline at end of file diff --git a/include/crypto_print.h b/include/crypto_print.h index 3e5e2ba0..54c448db 100644 --- a/include/crypto_print.h +++ b/include/crypto_print.h @@ -1,20 +1,21 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V jstar-development-team@mail.nasa.gov */ - + #ifndef _crypto_print_h_ #define _crypto_print_h_ @@ -24,17 +25,16 @@ #include "crypto.h" #include "crypto_structs.h" - /* ** Prototypes */ -void Crypto_tcPrint(TC_t* tc_frame); -void Crypto_tmPrint(TM_t* tm_frame); -void Crypto_clcwPrint(TM_FrameCLCW_t* clcw); -void Crypto_fsrPrint(SDLS_FSR_t* report); -void Crypto_ccsdsPrint(CCSDS_t* sdls_frame); -void Crypto_saPrint(SecurityAssociation_t* sa); +void Crypto_tcPrint(TC_t *tc_frame); +void Crypto_tmPrint(TM_t *tm_frame); +void Crypto_clcwPrint(TM_FrameCLCW_t *clcw); +void Crypto_fsrPrint(SDLS_FSR_t *report); +void Crypto_ccsdsPrint(CCSDS_t *sdls_frame); +void Crypto_saPrint(SecurityAssociation_t *sa); void Crypto_hexprint(void *c, size_t n); void Crypto_binprint(void *c, size_t n); -void Crypto_mpPrint(GvcidManagedParameters_t* managed_parameters,uint8_t print_children); -#endif +void Crypto_mpPrint(GvcidManagedParameters_t *managed_parameters, uint8_t print_children); +#endif diff --git a/include/crypto_structs.h b/include/crypto_structs.h index 4fbca9ed..b034cdd5 100644 --- a/include/crypto_structs.h +++ b/include/crypto_structs.h @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -20,9 +21,9 @@ #include "crypto_config.h" -#ifdef NOS3 //NOS3/cFS build is ready +#ifdef NOS3 // NOS3/cFS build is ready #include "common_types.h" -#else //Assume build outside of NOS3/cFS infrastructure +#else // Assume build outside of NOS3/cFS infrastructure #include #endif @@ -32,18 +33,18 @@ typedef struct { uint8_t value[KEY_SIZE]; - uint8_t key_state:4; + uint8_t key_state : 4; } crypto_key_t; -#define CRYPTO_KEY_SIZE (sizeof(crypto_key_t)) +#define CRYPTO_KEY_SIZE (sizeof(crypto_key_t)) typedef struct -{ // Global Virtual Channel ID / Global MAP ID - uint8_t tfvn : 4; // Transfer Frame Version Number - uint16_t scid : 16; // Spacecraft ID - uint16_t vcid : 6; // Virtual Channel ID - uint8_t mapid : 6; // Multiplexer Access Point ID +{ // Global Virtual Channel ID / Global MAP ID + uint8_t tfvn : 4; // Transfer Frame Version Number + uint16_t scid : 16; // Spacecraft ID + uint16_t vcid : 6; // Virtual Channel ID + uint8_t mapid : 6; // Multiplexer Access Point ID } crypto_gvcid_t; -#define CRYPTO_GVCID_SIZE (sizeof(crypto_gvcid_t)) +#define CRYPTO_GVCID_SIZE (sizeof(crypto_gvcid_t)) /* ** Security Association @@ -51,258 +52,258 @@ typedef struct typedef struct { // Status - uint16_t spi; //Security Parameter Index - uint16_t ekid; // Encryption Key ID - uint16_t akid; // Authentication Key ID - uint8_t sa_state:2; - crypto_gvcid_t gvcid_tc_blk; - crypto_gvcid_t gvcid_tm_blk[NUM_GVCID]; - uint8_t lpid; + uint16_t spi; // Security Parameter Index + uint16_t ekid; // Encryption Key ID + uint16_t akid; // Authentication Key ID + uint8_t sa_state : 2; + crypto_gvcid_t gvcid_tc_blk; + crypto_gvcid_t gvcid_tm_blk[NUM_GVCID]; + uint8_t lpid; // Configuration - uint8_t est :1; // Encryption Service Type - uint8_t ast :1; // Authentication Service Type - uint8_t shivf_len:6; // Sec. Header IV Field Length - uint8_t shsnf_len:6; // Sec. Header SN Field Length - uint8_t shplf_len:2; // Sec. Header PL Field Length - uint8_t stmacf_len:8; // Sec. Trailer MAC Field Length - uint8_t ecs_len :8; // Encryption Cipher Suite Length - uint8_t ecs[ECS_SIZE]; // Encryption Cipher Suite (algorithm / mode ID) - uint8_t* iv; // Initialization Vector - uint8_t acs_len :8; // Authentication Cipher Suite Length - uint8_t acs :8; // Authentication Cipher Suite (algorithm / mode ID) - uint16_t abm_len :16; // Authentication Bit Mask Length - uint8_t* abm; // Authentication Bit Mask (Primary Hdr. through Security Hdr.) - uint8_t arc_len :8; // Anti-Replay Counter Length - uint8_t* arc; // Anti-Replay Counter - uint8_t arcw_len:8; // Anti-Replay Counter Window Length - uint16_t arcw; // Anti-Replay Counter Window - + uint8_t est : 1; // Encryption Service Type + uint8_t ast : 1; // Authentication Service Type + uint8_t shivf_len : 6; // Sec. Header IV Field Length + uint8_t shsnf_len : 6; // Sec. Header SN Field Length + uint8_t shplf_len : 2; // Sec. Header PL Field Length + uint8_t stmacf_len : 8; // Sec. Trailer MAC Field Length + uint8_t ecs_len : 8; // Encryption Cipher Suite Length + uint8_t ecs[ECS_SIZE]; // Encryption Cipher Suite (algorithm / mode ID) + uint8_t *iv; // Initialization Vector + uint8_t acs_len : 8; // Authentication Cipher Suite Length + uint8_t acs : 8; // Authentication Cipher Suite (algorithm / mode ID) + uint16_t abm_len : 16; // Authentication Bit Mask Length + uint8_t *abm; // Authentication Bit Mask (Primary Hdr. through Security Hdr.) + uint8_t arc_len : 8; // Anti-Replay Counter Length + uint8_t *arc; // Anti-Replay Counter + uint8_t arcw_len : 8; // Anti-Replay Counter Window Length + uint16_t arcw; // Anti-Replay Counter Window + } SecurityAssociation_t; -#define SA_SIZE (sizeof(SecurityAssociation_t)) +#define SA_SIZE (sizeof(SecurityAssociation_t)) /* ** SDLS Definitions -*/ +*/ typedef struct { - uint8_t cwt :1; // Control Word Type - uint8_t vnum :3; // FSR Version Number - uint8_t af :1; // Alarm Field - uint8_t bsnf :1; // Bad SN Flag - uint8_t bmacf :1; // Bad MAC Flag - uint8_t ispif :1; // Invalid SPI Flag - uint16_t lspiu :16; // Last SPI Used - uint8_t snval :8; // SN Value (LSB) + uint8_t cwt : 1; // Control Word Type + uint8_t vnum : 3; // FSR Version Number + uint8_t af : 1; // Alarm Field + uint8_t bsnf : 1; // Bad SN Flag + uint8_t bmacf : 1; // Bad MAC Flag + uint8_t ispif : 1; // Invalid SPI Flag + uint16_t lspiu : 16; // Last SPI Used + uint8_t snval : 8; // SN Value (LSB) } SDLS_FSR_t; -#define SDLS_FSR_SIZE (sizeof(SDLS_FSR_t)) +#define SDLS_FSR_SIZE (sizeof(SDLS_FSR_t)) typedef struct { - uint8_t type :1; // Procedure Type Flag - uint8_t uf :1; // User Flag - uint8_t sg :2; // Service Group Field - uint8_t pid :4; // Procedure Identification Field - uint16_t pdu_len :16; // EP Data Field Length - BITS - uint8_t data[TLV_DATA_SIZE]; + uint8_t type : 1; // Procedure Type Flag + uint8_t uf : 1; // User Flag + uint8_t sg : 2; // Service Group Field + uint8_t pid : 4; // Procedure Identification Field + uint16_t pdu_len : 16; // EP Data Field Length - BITS + uint8_t data[TLV_DATA_SIZE]; } SDLS_TLV_t; -#define SDLS_TLV_SIZE (sizeof(SDLS_TLV_t)) +#define SDLS_TLV_SIZE (sizeof(SDLS_TLV_t)) typedef struct { - uint16_t ekid; // Encrypted Key ID - uint8_t ek[KEY_SIZE]; // Encrypted Key - //uint8_t ekcrc[4]; // Encrypted Key CRC + uint16_t ekid; // Encrypted Key ID + uint8_t ek[KEY_SIZE]; // Encrypted Key + // uint8_t ekcrc[4]; // Encrypted Key CRC } SDLS_EKB_t; -#define SDLS_EKB_SIZE (sizeof(SDLS_EKB_t)) +#define SDLS_EKB_SIZE (sizeof(SDLS_EKB_t)) typedef struct { - uint16_t mkid; // Master Key ID - uint8_t iv[IV_SIZE]; // Initialization Vector - SDLS_EKB_t EKB[30]; // Encrypted Key Block - uint8_t mac[MAC_SIZE]; // Message Authentication Code + uint16_t mkid; // Master Key ID + uint8_t iv[IV_SIZE]; // Initialization Vector + SDLS_EKB_t EKB[30]; // Encrypted Key Block + uint8_t mac[MAC_SIZE]; // Message Authentication Code } SDLS_OTAR_t; -#define SDLS_OTAR_SIZE (sizeof(SDLS_OTAR_t)) +#define SDLS_OTAR_SIZE (sizeof(SDLS_OTAR_t)) typedef struct { - uint16_t kid :16; // Key ID + uint16_t kid : 16; // Key ID } SDLS_KEY_t; -#define SDLS_KEY_SIZE (sizeof(SDLS_KEY_t)) +#define SDLS_KEY_SIZE (sizeof(SDLS_KEY_t)) typedef struct { - SDLS_KEY_t kblk[98]; // Key ID Block + SDLS_KEY_t kblk[98]; // Key ID Block } SDLS_KEY_BLK_t; -#define SDLS_KEY_BLK_SIZE (sizeof(SDLS_KEY_BLK_t)) +#define SDLS_KEY_BLK_SIZE (sizeof(SDLS_KEY_BLK_t)) typedef struct { - uint16_t kid_first :16; // First Key ID - uint16_t kid_last :16; // Last Key ID + uint16_t kid_first : 16; // First Key ID + uint16_t kid_last : 16; // Last Key ID } SDLS_KEY_INVENTORY_t; #define SDLS_KEY_INVENTORY_SIZE (sizeof(SDLS_KEY_INVENTORY_t)) typedef struct { - uint16_t kid :16; // Key ID - uint8_t challenge[CHALLENGE_SIZE]; // Key Challenge + uint16_t kid : 16; // Key ID + uint8_t challenge[CHALLENGE_SIZE]; // Key Challenge } SDLS_KEYV_CMD_BLK_t; -#define SDLS_KEYV_CMD_BLK_SIZE (sizeof(SDLS_KEYV_CMD_BLK_t)) +#define SDLS_KEYV_CMD_BLK_SIZE (sizeof(SDLS_KEYV_CMD_BLK_t)) typedef struct { - SDLS_KEYV_CMD_BLK_t blk[29]; // Key Verification Command Block + SDLS_KEYV_CMD_BLK_t blk[29]; // Key Verification Command Block } SDLS_KEYV_CMD_t; -#define SDLS_KEYV_CMD_SIZE (sizeof(SDLS_KEYV_CMD_t)) +#define SDLS_KEYV_CMD_SIZE (sizeof(SDLS_KEYV_CMD_t)) typedef struct { - uint16_t kid :16; // Key ID - uint8_t iv[IV_SIZE]; // Key Initialization Vector - uint8_t challenged[CHALLENGE_SIZE]; // Encrypted Challenge - uint8_t cmac[CHALLENGE_MAC_SIZE]; // Challenge Message Authentication Code + uint16_t kid : 16; // Key ID + uint8_t iv[IV_SIZE]; // Key Initialization Vector + uint8_t challenged[CHALLENGE_SIZE]; // Encrypted Challenge + uint8_t cmac[CHALLENGE_MAC_SIZE]; // Challenge Message Authentication Code } SDLS_KEYV_RPLY_BLK_t; -#define SDLS_KEYV_RPLY_BLK_SIZE (sizeof(SDLS_KEYV_RPLY_BLK_t)) +#define SDLS_KEYV_RPLY_BLK_SIZE (sizeof(SDLS_KEYV_RPLY_BLK_t)) typedef struct { - SDLS_KEYV_RPLY_BLK_t blk[29]; // Key Verification Reply Block + SDLS_KEYV_RPLY_BLK_t blk[29]; // Key Verification Reply Block } SDLS_KEYV_RPLY_t; -#define SDLS_KEYV_RPLY_SIZE (sizeof(SDLS_KEYV_RPLY_t)) +#define SDLS_KEYV_RPLY_SIZE (sizeof(SDLS_KEYV_RPLY_t)) typedef struct { - uint16_t kid :16; // Key ID - uint8_t challenged[10]; + uint16_t kid : 16; // Key ID + uint8_t challenged[10]; } SDLS_KEYDB_CMD_t; -#define SDLS_KEYDB_CMD_SIZE (sizeof(SDLS_KEYDB_CMD_t)) +#define SDLS_KEYDB_CMD_SIZE (sizeof(SDLS_KEYDB_CMD_t)) typedef struct { - uint16_t kid :16; // Key ID - uint8_t iv[IV_SIZE]; // Initialization Vector - uint8_t challenged[10]; // Encrypted Challenge - uint8_t cmac[4]; // Challenge Message Authentication Code + uint16_t kid : 16; // Key ID + uint8_t iv[IV_SIZE]; // Initialization Vector + uint8_t challenged[10]; // Encrypted Challenge + uint8_t cmac[4]; // Challenge Message Authentication Code } SDLS_KEYDB_RPLY_t; -#define SDLS_KEYDB_RPLY_SIZE (sizeof(SDLS_KEYDB_RPLY_t)) +#define SDLS_KEYDB_RPLY_SIZE (sizeof(SDLS_KEYDB_RPLY_t)) typedef struct { - uint16_t spi :16; // Security Parameter Index - uint8_t lpid :8; // Procedure ID from Last State Transition + uint16_t spi : 16; // Security Parameter Index + uint8_t lpid : 8; // Procedure ID from Last State Transition } SDLS_SA_STATUS_RPLY_t; #define SDLS_SA_STATUS_RPLY_SIZE (sizeof(SDLS_SA_STATUS_RPLY_t)) typedef struct { - uint16_t num_se; // Number of Security Events - uint16_t rs; // Remaining Space + uint16_t num_se; // Number of Security Events + uint16_t rs; // Remaining Space } SDLS_MC_LOG_RPLY_t; #define SDLS_MC_LOG_RPLY_SIZE (sizeof(SDLS_MC_LOG_RPLY_t)) typedef struct { - uint8_t emt :8; // Event Message Tag - uint16_t em_len :16; // Event Message Length - uint8_t emv[EMV_SIZE]; // Event Message Value + uint8_t emt : 8; // Event Message Tag + uint16_t em_len : 16; // Event Message Length + uint8_t emv[EMV_SIZE]; // Event Message Value } SDLS_MC_DUMP_RPLY_t; #define SDLS_MC_DUMP_RPLY_SIZE (sizeof(SDLS_MC_DUMP_RPLY_t)) typedef struct { - SDLS_MC_DUMP_RPLY_t blk[LOG_SIZE]; // Dump Log PDU + SDLS_MC_DUMP_RPLY_t blk[LOG_SIZE]; // Dump Log PDU } SDLS_MC_DUMP_BLK_RPLY_t; #define SDLS_MC_DUMP_BLK_RPLY_SIZE (sizeof(SDLS_MC_DUMP_BLK_RPLY_t)) typedef struct { - uint8_t str :8; // Self-Test Result + uint8_t str : 8; // Self-Test Result } SDLS_MC_ST_RPLY_t; #define SDLS_MC_ST_RPLY_SIZE (sizeof(SDLS_MC_ST_RPLY_t)) typedef struct { - uint8_t snv[SN_SIZE]; // Sequence Number Value + uint8_t snv[SN_SIZE]; // Sequence Number Value } SDLS_MC_SN_RPLY_t; #define SDLS_MC_SN_RPLY_SIZE (sizeof(SDLS_MC_SN_RPLY_t)) - /* ** Telecommand (TC) Definitions */ -//typedef struct __attribute__ ((packed)) //__attribute__ ((packed)) is not easily supported in CFFI python. Only add when CFFI properly supports packed & nonpacked structs. -typedef struct -{ - uint8_t tfvn :2; // Transfer Frame Version Number - uint8_t bypass :1; // Bypass - // 0 = Type A: Sequence Check, Acknowledgement - // 1 = Type B: Checks are bypassed - uint8_t cc :1; // Control Command - // 0 = Type D: Transfer Frame is Data Unit - // 1 = Type C: Contron Command (for COP) - uint8_t spare :2; // Reserved Spare - Shall be 00 - uint16_t scid :10; // Spacecraft ID - // Master Channel ID (MCID) = TFVN + SCID - uint8_t vcid :6; // Virtual Channel ID - uint16_t fl :10; // The whole transfer frame length (max 1024) - uint8_t fsn :8; // Frame sequence number, also N(S), zeroed on Type-B frames +// typedef struct __attribute__ ((packed)) //__attribute__ ((packed)) is not easily supported in CFFI python. Only add +// when CFFI properly supports packed & nonpacked structs. +typedef struct +{ + uint8_t tfvn : 2; // Transfer Frame Version Number + uint8_t bypass : 1; // Bypass + // 0 = Type A: Sequence Check, Acknowledgement + // 1 = Type B: Checks are bypassed + uint8_t cc : 1; // Control Command + // 0 = Type D: Transfer Frame is Data Unit + // 1 = Type C: Contron Command (for COP) + uint8_t spare : 2; // Reserved Spare - Shall be 00 + uint16_t scid : 10; // Spacecraft ID + // Master Channel ID (MCID) = TFVN + SCID + uint8_t vcid : 6; // Virtual Channel ID + uint16_t fl : 10; // The whole transfer frame length (max 1024) + uint8_t fsn : 8; // Frame sequence number, also N(S), zeroed on Type-B frames } TC_FramePrimaryHeader_t; -#define TC_FRAME_PRIMARYHEADER_STRUCT_SIZE (sizeof(TC_FramePrimaryHeader_t)) -#define TC_FRAME_HEADER_SIZE 5 +#define TC_FRAME_PRIMARYHEADER_STRUCT_SIZE (sizeof(TC_FramePrimaryHeader_t)) +#define TC_FRAME_HEADER_SIZE 5 typedef struct { - uint8_t sh:TC_SH_SIZE; // Segment Header - uint16_t spi; // Security Parameter Index - uint8_t iv[IV_SIZE]; // Initialization Vector for encryption - uint8_t sn[TC_SN_SIZE]; // Sequence Number for anti-replay - uint8_t pad[TC_PAD_SIZE]; // Count of the used fill Bytes + uint8_t sh : TC_SH_SIZE; // Segment Header + uint16_t spi; // Security Parameter Index + uint8_t iv[IV_SIZE]; // Initialization Vector for encryption + uint8_t sn[TC_SN_SIZE]; // Sequence Number for anti-replay + uint8_t pad[TC_PAD_SIZE]; // Count of the used fill Bytes } TC_FrameSecurityHeader_t; -#define TC_FRAME_SECHEADER_SIZE (sizeof(TC_FrameSecurityHeader_t)) +#define TC_FRAME_SECHEADER_SIZE (sizeof(TC_FrameSecurityHeader_t)) typedef struct { - uint8_t mac[MAC_SIZE]; // Message Authentication Code - uint16_t fecf; // Frame Error Control Field + uint8_t mac[MAC_SIZE]; // Message Authentication Code + uint16_t fecf; // Frame Error Control Field } TC_FrameSecurityTrailer_t; -#define TC_FRAME_SECTRAILER_SIZE (sizeof(TC_FrameSecurityTrailer_t)) +#define TC_FRAME_SECTRAILER_SIZE (sizeof(TC_FrameSecurityTrailer_t)) typedef struct { - TC_FramePrimaryHeader_t tc_header; - TC_FrameSecurityHeader_t tc_sec_header; - uint8_t tc_pdu[TC_FRAME_DATA_SIZE]; - uint16_t tc_pdu_len; - TC_FrameSecurityTrailer_t tc_sec_trailer; + TC_FramePrimaryHeader_t tc_header; + TC_FrameSecurityHeader_t tc_sec_header; + uint8_t tc_pdu[TC_FRAME_DATA_SIZE]; + uint16_t tc_pdu_len; + TC_FrameSecurityTrailer_t tc_sec_trailer; } TC_t; -#define TC_SIZE (sizeof(TC_t)) +#define TC_SIZE (sizeof(TC_t)) /* ** CCSDS Definitions */ typedef struct { - uint8_t pvn :3; // Packet Version Number - uint8_t type :1; // Type = 1 - uint8_t shdr :1; // Data Field Header Flag - uint16_t appID :11; // Application ID - uint8_t seq :2; // Sequence Flags - uint16_t pktid :14; // Sequence Count - uint16_t pkt_length :16; // Packet Length + uint8_t pvn : 3; // Packet Version Number + uint8_t type : 1; // Type = 1 + uint8_t shdr : 1; // Data Field Header Flag + uint16_t appID : 11; // Application ID + uint8_t seq : 2; // Sequence Flags + uint16_t pktid : 14; // Sequence Count + uint16_t pkt_length : 16; // Packet Length } CCSDS_HDR_t; #define CCSDS_HDR_SIZE (sizeof(CCSDS_HDR_t)) typedef struct { - uint8_t shf :1; // Secondary Header Flag - uint8_t pusv :3; // TC Packet PUS Version Number - uint8_t ack :4; // Acknowledgement - uint8_t st :8; // Service Type - uint8_t sst :8; // Service Subtype - uint8_t sid :4; // Source ID - uint8_t spare :4; + uint8_t shf : 1; // Secondary Header Flag + uint8_t pusv : 3; // TC Packet PUS Version Number + uint8_t ack : 4; // Acknowledgement + uint8_t st : 8; // Service Type + uint8_t sst : 8; // Service Subtype + uint8_t sid : 4; // Source ID + uint8_t spare : 4; } CCSDS_PUS_t; #define CCSDS_PUS_SIZE (sizeof(CCSDS_PUS_t)) @@ -316,87 +317,88 @@ typedef struct typedef struct { - CCSDS_HDR_t hdr; - CCSDS_PUS_t pus; - //CCSDS_2HDR_t cmd; - SDLS_TLV_t pdu; + CCSDS_HDR_t hdr; + CCSDS_PUS_t pus; + // CCSDS_2HDR_t cmd; + SDLS_TLV_t pdu; } CCSDS_t; -#define CCSDS_SIZE (sizeof(CCSDS_t)) +#define CCSDS_SIZE (sizeof(CCSDS_t)) /* ** Telemetry (TM) Definitions */ typedef struct { - uint8_t tfvn :2; // Transfer Frame Version Number - uint16_t scid :10; // Spacecraft ID - uint8_t vcid :3; // Virtual Channel ID - uint8_t ocff :1; // Describes wether OCF is present or not - uint8_t mcfc :8; // Master Channel Frame Count (modulo-256) - uint8_t vcfc :8; // Virtual Channel Frame Count (modulo-256) - uint8_t tfsh :1; // Transfer Frame Secondary Header - uint8_t sf :1; // Sync Flag - // 0 = Payload is either idle data or octet synchronized forward-ordered packets - // 1 = Data is a virtual channel access data unit - uint8_t pof :1; // Packet Order Flag - // 0 = Shall be set to 0 - // Sync Flag 1 = Undefined - uint8_t slid :2; // Segment Length ID - // Sync Flag 0 = Shall be 11 - // Sync Flag 1 = Undefined - uint16_t fhp :11; // First Header Pointer - // Sync Flag 0 = Contains position of the first byte of the first packet in the data field - // Sync Flag 1 = undefined - //uint8_t tfshvn :2; // Transfer Frame Secondary Header Version Number - shall be 00 - //uint8_t tfshlen :6; // TFSH Length (max 64 Bytes) + uint8_t tfvn : 2; // Transfer Frame Version Number + uint16_t scid : 10; // Spacecraft ID + uint8_t vcid : 3; // Virtual Channel ID + uint8_t ocff : 1; // Describes wether OCF is present or not + uint8_t mcfc : 8; // Master Channel Frame Count (modulo-256) + uint8_t vcfc : 8; // Virtual Channel Frame Count (modulo-256) + uint8_t tfsh : 1; // Transfer Frame Secondary Header + uint8_t sf : 1; // Sync Flag + // 0 = Payload is either idle data or octet synchronized forward-ordered packets + // 1 = Data is a virtual channel access data unit + uint8_t pof : 1; // Packet Order Flag + // 0 = Shall be set to 0 + // Sync Flag 1 = Undefined + uint8_t slid : 2; // Segment Length ID + // Sync Flag 0 = Shall be 11 + // Sync Flag 1 = Undefined + uint16_t fhp : 11; // First Header Pointer + // Sync Flag 0 = Contains position of the first byte of the first packet in the data field + // Sync Flag 1 = undefined + // uint8_t tfshvn :2; // Transfer Frame Secondary Header Version Number - shall be 00 + // uint8_t tfshlen :6; // TFSH Length (max 64 Bytes) } TM_FramePrimaryHeader_t; -#define TM_FRAME_PRIMARYHEADER_SIZE (sizeof(TM_FramePrimaryHeader_t)) +#define TM_FRAME_PRIMARYHEADER_SIZE (sizeof(TM_FramePrimaryHeader_t)) typedef struct { - uint16_t spi; // Security Parameter Index - uint8_t iv[IV_SIZE]; // Initialization Vector for encryption - //uint8_t sn[TM_SN_SIZE]; // Sequence Number for anti-replay - //uint8_t pad[TM_PAD_SIZE]; // Count of the used fill Bytes + uint16_t spi; // Security Parameter Index + uint8_t iv[IV_SIZE]; // Initialization Vector for encryption + // uint8_t sn[TM_SN_SIZE]; // Sequence Number for anti-replay + // uint8_t pad[TM_PAD_SIZE]; // Count of the used fill Bytes } TM_FrameSecurityHeader_t; -#define TM_FRAME_SECHEADER_SIZE (sizeof(TM_FrameSecurityHeader_t)) +#define TM_FRAME_SECHEADER_SIZE (sizeof(TM_FrameSecurityHeader_t)) typedef struct { - uint8_t mac[MAC_SIZE]; // Message Authentication Code - uint8_t ocf[OCF_SIZE]; // Operational Control Field - uint16_t fecf; // Frame Error Control Field + uint8_t mac[MAC_SIZE]; // Message Authentication Code + uint8_t ocf[OCF_SIZE]; // Operational Control Field + uint16_t fecf; // Frame Error Control Field } TM_FrameSecurityTrailer_t; -#define TM_FRAME_SECTRAILER_SIZE (sizeof(TM_FrameSecurityTrailer_t)) - -typedef struct -{ - uint8_t cwt :1; // Control Word Type "0" - uint8_t cvn :2; // CLCW Version Number "00" - uint8_t sf :3; // Status Field - uint8_t cie :2; // COP In Effect - uint8_t vci :6; // Virtual Channel Identification - uint8_t spare0 :2; // Reserved Spare - uint8_t nrfa :1; // No RF Avaliable Flag - uint8_t nbl :1; // No Bit Lock Flag - uint8_t lo :1; // Lock-Out Flag - uint8_t wait :1; // Wait Flag - uint8_t rt :1; // Retransmit Flag - uint8_t fbc :2; // FARM-B Counter - uint8_t spare1 :1; // Reserved Spare - uint8_t rv :8; // Report Value +#define TM_FRAME_SECTRAILER_SIZE (sizeof(TM_FrameSecurityTrailer_t)) + +typedef struct +{ + uint8_t cwt : 1; // Control Word Type "0" + uint8_t cvn : 2; // CLCW Version Number "00" + uint8_t sf : 3; // Status Field + uint8_t cie : 2; // COP In Effect + uint8_t vci : 6; // Virtual Channel Identification + uint8_t spare0 : 2; // Reserved Spare + uint8_t nrfa : 1; // No RF Avaliable Flag + uint8_t nbl : 1; // No Bit Lock Flag + uint8_t lo : 1; // Lock-Out Flag + uint8_t wait : 1; // Wait Flag + uint8_t rt : 1; // Retransmit Flag + uint8_t fbc : 2; // FARM-B Counter + uint8_t spare1 : 1; // Reserved Spare + uint8_t rv : 8; // Report Value } TM_FrameCLCW_t; #define TM_FRAME_CLCW_SIZE (sizeof(TM_FrameCLCW_t)) typedef struct { - TM_FramePrimaryHeader_t tm_header; - TM_FrameSecurityHeader_t tm_sec_header; - uint8_t tm_pdu[TM_FRAME_DATA_SIZE]; - TM_FrameSecurityTrailer_t tm_sec_trailer; + TM_FramePrimaryHeader_t tm_header; + TM_FrameSecurityHeader_t tm_sec_header; + uint8_t tm_pdu[TM_FRAME_DATA_SIZE]; + TM_FrameSecurityTrailer_t tm_sec_trailer; } TM_t; -#define TM_SIZE (sizeof(TM_t)) +#define TM_SIZE (sizeof(TM_t)) -#define TM_MIN_SIZE (TM_FRAME_PRIMARYHEADER_SIZE + TM_FRAME_SECHEADER_SIZE + TM_FRAME_SECTRAILER_SIZE + TM_FRAME_CLCW_SIZE) +#define TM_MIN_SIZE \ + (TM_FRAME_PRIMARYHEADER_SIZE + TM_FRAME_SECHEADER_SIZE + TM_FRAME_SECTRAILER_SIZE + TM_FRAME_CLCW_SIZE) #endif \ No newline at end of file diff --git a/include/sadb_mariadb_error.h b/include/sadb_mariadb_error.h index 985a87ac..e9ce50b2 100644 --- a/include/sadb_mariadb_error.h +++ b/include/sadb_mariadb_error.h @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V diff --git a/include/sadb_routine.h b/include/sadb_routine.h index c68e28c0..0aac39bf 100644 --- a/include/sadb_routine.h +++ b/include/sadb_routine.h @@ -15,41 +15,42 @@ #ifndef CRYPTOLIB_SADB_ROUTINE_H #define CRYPTOLIB_SADB_ROUTINE_H -#ifdef NOS3 //NOS3/cFS build is ready +#ifdef NOS3 // NOS3/cFS build is ready #include "common_types.h" #include "osapi.h" -#else //Assume build outside of NOS3/cFS infrastructure +#else // Assume build outside of NOS3/cFS infrastructure +#include #include #include -#include #endif #include "crypto_structs.h" -typedef struct { +typedef struct +{ // Security Association Initialization & Management Functions int32_t (*sadb_config)(void); int32_t (*sadb_init)(void); int32_t (*sadb_close)(void); // Security Association Interaction Functions - int32_t (*sadb_get_sa_from_spi)(uint16_t,SecurityAssociation_t**); - int32_t (*sadb_get_operational_sa_from_gvcid)(uint8_t,uint16_t,uint16_t,uint8_t,SecurityAssociation_t**); - int32_t (*sadb_save_sa)(SecurityAssociation_t*); + int32_t (*sadb_get_sa_from_spi)(uint16_t, SecurityAssociation_t **); + int32_t (*sadb_get_operational_sa_from_gvcid)(uint8_t, uint16_t, uint16_t, uint8_t, SecurityAssociation_t **); + int32_t (*sadb_save_sa)(SecurityAssociation_t *); // Security Association Utility Functions int32_t (*sadb_sa_stop)(void); - int32_t (*sadb_sa_start)(TC_t* tc_frame); - int32_t (*sadb_sa_expire)(void); - int32_t (*sadb_sa_rekey)(void); - int32_t (*sadb_sa_status)(uint8_t*); - int32_t (*sadb_sa_create)(void); - int32_t (*sadb_sa_setARSN)(void); - int32_t (*sadb_sa_setARSNW)(void); - int32_t (*sadb_sa_delete)(void); + int32_t (*sadb_sa_start)(TC_t *tc_frame); + int32_t (*sadb_sa_expire)(void); + int32_t (*sadb_sa_rekey)(void); + int32_t (*sadb_sa_status)(uint8_t *); + int32_t (*sadb_sa_create)(void); + int32_t (*sadb_sa_setARSN)(void); + int32_t (*sadb_sa_setARSNW)(void); + int32_t (*sadb_sa_delete)(void); } SadbRoutineStruct, *SadbRoutine; SadbRoutine get_sadb_routine_mariadb(void); SadbRoutine get_sadb_routine_inmemory(void); -//SadbRoutine init_parse_sadb_routine(uint8_t *); +// SadbRoutine init_parse_sadb_routine(uint8_t *); -#endif //CRYPTOLIB_SADB_ROUTINE_H +#endif // CRYPTOLIB_SADB_ROUTINE_H diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 454869d2..09603d71 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,18 +1,19 @@ -# Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. -# -# This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not -# limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness -# for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or -# any warranty that the software will be error free. -# -# In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, -# arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, -# contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, -# documentation or services provided hereunder. -# -# ITC Team -# NASA IV&V -# jstar-development-team@mail.nasa.gov +# Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. +# All Foreign Rights are Reserved to the U.S. Government. +# +# This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, +# including, but not limited to, any warranty that the software will conform to specifications, any implied warranties +# of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the +# documentation will conform to the program, or any warranty that the software will be error free. +# +# In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or +# consequential damages, arising out of, resulting from, or in any way connected with the software or its +# documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained +# from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. +# +# ITC Team +# NASA IV&V +# jstar-development-team@mail.nasa.gov include_directories(../include) diff --git a/src/src_main/crypto.c b/src/src_main/crypto.c index cb0ad920..73a203f8 100644 --- a/src/src_main/crypto.c +++ b/src/src_main/crypto.c @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -23,21 +24,20 @@ #include "crypto.h" #include "sadb_routine.h" -#include "crypto_structs.h" -#include "crypto_config_structs.h" -#include "crypto_print.h" #include "crypto_config.h" -#include "crypto_events.h" +#include "crypto_config_structs.h" #include "crypto_error.h" +#include "crypto_events.h" +#include "crypto_print.h" +#include "crypto_structs.h" #include - /* ** Static Library Declaration */ #ifdef BUILD_STATIC - CFS_MODULE_DECLARE_LIB(crypto); +CFS_MODULE_DECLARE_LIB(crypto); #endif static SadbRoutine sadb_routine = NULL; @@ -46,36 +46,36 @@ static SadbRoutine sadb_routine = NULL; ** Static Prototypes */ // Assisting Functions -//static int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr); -static int32_t Crypto_Get_tmLength(int len); -static uint8_t Crypto_Is_AEAD_Algorithm(uint32_t cipher_suite_id); -static uint8_t* Crypto_Prepare_TC_AAD(uint8_t* buffer, uint16_t len_aad, uint8_t* abm_buffer); -static void Crypto_TM_updatePDU(uint8_t* ingest, int len_ingest); -static void Crypto_TM_updateOCF(void); -static void Crypto_Local_Config(void); -static void Crypto_Local_Init(void); -//static int32_t Crypto_gcm_err(int gcm_err); +// static int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr); +static int32_t Crypto_Get_tmLength(int len); +static uint8_t Crypto_Is_AEAD_Algorithm(uint32_t cipher_suite_id); +static uint8_t *Crypto_Prepare_TC_AAD(uint8_t *buffer, uint16_t len_aad, uint8_t *abm_buffer); +static void Crypto_TM_updatePDU(uint8_t *ingest, int len_ingest); +static void Crypto_TM_updateOCF(void); +static void Crypto_Local_Config(void); +static void Crypto_Local_Init(void); +// static int32_t Crypto_gcm_err(int gcm_err); static int32_t Crypto_window(uint8_t *actual, uint8_t *expected, int length, int window); -//static int32_t Crypto_compare_less_equal(uint8_t *actual, uint8_t *expected, int length); -//static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_frame); -static uint16_t Crypto_Calc_FECF(uint8_t* ingest, int len_ingest); -static void Crypto_Calc_CRC_Init_Table(void); -static uint16_t Crypto_Calc_CRC16(uint8_t* data, int size); +// static int32_t Crypto_compare_less_equal(uint8_t *actual, uint8_t *expected, int length); +// static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_frame); +static uint16_t Crypto_Calc_FECF(uint8_t *ingest, int len_ingest); +static void Crypto_Calc_CRC_Init_Table(void); +static uint16_t Crypto_Calc_CRC16(uint8_t *data, int size); // Key Management Functions static int32_t Crypto_Key_OTAR(void); static int32_t Crypto_Key_update(uint8_t state); -static int32_t Crypto_Key_inventory(uint8_t*); -static int32_t Crypto_Key_verify(uint8_t*,TC_t* tc_frame); +static int32_t Crypto_Key_inventory(uint8_t *); +static int32_t Crypto_Key_verify(uint8_t *, TC_t *tc_frame); // Security Monitoring & Control Procedure -static int32_t Crypto_MC_ping(uint8_t* ingest); -static int32_t Crypto_MC_status(uint8_t* ingest); -static int32_t Crypto_MC_dump(uint8_t* ingest); -static int32_t Crypto_MC_erase(uint8_t* ingest); -static int32_t Crypto_MC_selftest(uint8_t* ingest); -static int32_t Crypto_SA_readARSN(uint8_t* ingest); +static int32_t Crypto_MC_ping(uint8_t *ingest); +static int32_t Crypto_MC_status(uint8_t *ingest); +static int32_t Crypto_MC_dump(uint8_t *ingest); +static int32_t Crypto_MC_erase(uint8_t *ingest); +static int32_t Crypto_MC_selftest(uint8_t *ingest); +static int32_t Crypto_SA_readARSN(uint8_t *ingest); static int32_t Crypto_MC_resetalarm(void); // User Functions -static int32_t Crypto_User_IdleTrigger(uint8_t* ingest); +static int32_t Crypto_User_IdleTrigger(uint8_t *ingest); static int32_t Crypto_User_BadSPI(void); static int32_t Crypto_User_BadIV(void); static int32_t Crypto_User_BadMAC(void); @@ -84,26 +84,29 @@ static int32_t Crypto_User_ModifyKey(void); static int32_t Crypto_User_ModifyActiveTM(void); static int32_t Crypto_User_ModifyVCID(void); // Determine Payload Data Unit -static int32_t Crypto_Process_Extended_Procedure_Pdu(TC_t* tc_sdls_processed_frame, uint8_t* ingest); -static int32_t Crypto_PDU(uint8_t* ingest, TC_t* tc_frame); +static int32_t Crypto_Process_Extended_Procedure_Pdu(TC_t *tc_sdls_processed_frame, uint8_t *ingest); +static int32_t Crypto_PDU(uint8_t *ingest, TC_t *tc_frame); // Managed Parameter Functions -static int32_t Crypto_Get_Managed_Parameters_For_Gvcid(uint8_t tfvn,uint16_t scid,uint8_t vcid,GvcidManagedParameters_t* managed_parameters_in, - GvcidManagedParameters_t** managed_parameters_out); -static int32_t crypto_config_add_gvcid_managed_parameter_recursion(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, uint8_t has_segmentation_hdr,GvcidManagedParameters_t* managed_parameter); -static void Crypto_Free_Managed_Parameters(GvcidManagedParameters_t* managed_parameters); +static int32_t Crypto_Get_Managed_Parameters_For_Gvcid(uint8_t tfvn, uint16_t scid, uint8_t vcid, + GvcidManagedParameters_t *managed_parameters_in, + GvcidManagedParameters_t **managed_parameters_out); +static int32_t crypto_config_add_gvcid_managed_parameter_recursion(uint8_t tfvn, uint16_t scid, uint8_t vcid, + uint8_t has_fecf, uint8_t has_segmentation_hdr, + GvcidManagedParameters_t *managed_parameter); +static void Crypto_Free_Managed_Parameters(GvcidManagedParameters_t *managed_parameters); /* ** Global Variables */ // Security crypto_key_t ek_ring[NUM_KEYS] = {0}; -//static crypto_key_t ak_ring[NUM_KEYS]; +// static crypto_key_t ak_ring[NUM_KEYS]; CCSDS_t sdls_frame; TM_t tm_frame; -CryptoConfig_t* crypto_config = NULL; -SadbMariaDBConfig_t* sadb_mariadb_config = NULL; -GvcidManagedParameters_t* gvcid_managed_parameters = NULL; -GvcidManagedParameters_t* current_managed_parameters = NULL; +CryptoConfig_t *crypto_config = NULL; +SadbMariaDBConfig_t *sadb_mariadb_config = NULL; +GvcidManagedParameters_t *gvcid_managed_parameters = NULL; +GvcidManagedParameters_t *current_managed_parameters = NULL; // OCF static uint8_t ocf = 0; static SDLS_FSR_t report; @@ -126,27 +129,30 @@ static uint16_t crc16Table[256]; */ /** -* @brief Function: Crypto_Init_Unit_test -* @return int32: status -**/ + * @brief Function: Crypto_Init_Unit_test + * @return int32: status + **/ int32_t Crypto_Init_Unit_Test(void) { int32_t status = CRYPTO_LIB_SUCCESS; - Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,1,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); + Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR, + TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, + TC_CHECK_FECF_TRUE, 0x3F); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 1, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS); status = Crypto_Init(); return status; } /** -* @brief Function: Crypto_Init_With_Configs -* @param crypto_config_p: CryptoConfig_t* -* @param gvcid_managed_parameters_p: GvcidManagedParameters_t* -* @param sadb_mariadb_config_p: SadbMariaDBConfig_t* -* @return int32: Success/Failure -**/ -int32_t Crypto_Init_With_Configs(CryptoConfig_t* crypto_config_p,GvcidManagedParameters_t* gvcid_managed_parameters_p,SadbMariaDBConfig_t* sadb_mariadb_config_p) + * @brief Function: Crypto_Init_With_Configs + * @param crypto_config_p: CryptoConfig_t* + * @param gvcid_managed_parameters_p: GvcidManagedParameters_t* + * @param sadb_mariadb_config_p: SadbMariaDBConfig_t* + * @return int32: Success/Failure + **/ +int32_t Crypto_Init_With_Configs(CryptoConfig_t *crypto_config_p, GvcidManagedParameters_t *gvcid_managed_parameters_p, + SadbMariaDBConfig_t *sadb_mariadb_config_p) { int32_t status = CRYPTO_LIB_SUCCESS; crypto_config = crypto_config_p; @@ -164,37 +170,48 @@ int32_t Crypto_Init(void) { int32_t status = CRYPTO_LIB_SUCCESS; - if(crypto_config==NULL){ + if (crypto_config == NULL) + { status = CRYPTO_CONFIGURATION_NOT_COMPLETE; printf(KRED "ERROR: CryptoLib must be configured before intializing!\n" RESET); - return status; //No configuration set -- return! + return status; // No configuration set -- return! } - if(gvcid_managed_parameters==NULL){ + if (gvcid_managed_parameters == NULL) + { status = CRYPTO_MANAGED_PARAM_CONFIGURATION_NOT_COMPLETE; printf(KRED "ERROR: CryptoLib Managed Parameters must be configured before intializing!\n" RESET); - return status; //No Managed Parameter configuration set -- return! + return status; // No Managed Parameter configuration set -- return! } - #ifdef TC_DEBUG - Crypto_mpPrint(gvcid_managed_parameters,1); - #endif +#ifdef TC_DEBUG + Crypto_mpPrint(gvcid_managed_parameters, 1); +#endif - //Prepare SADB type from config - if (crypto_config->sadb_type == SADB_TYPE_INMEMORY){ sadb_routine = get_sadb_routine_inmemory(); } - else if (crypto_config->sadb_type == SADB_TYPE_MARIADB){ - if(sadb_mariadb_config == NULL){ + // Prepare SADB type from config + if (crypto_config->sadb_type == SADB_TYPE_INMEMORY) + { + sadb_routine = get_sadb_routine_inmemory(); + } + else if (crypto_config->sadb_type == SADB_TYPE_MARIADB) + { + if (sadb_mariadb_config == NULL) + { status = CRYPTO_MARIADB_CONFIGURATION_NOT_COMPLETE; printf(KRED "ERROR: CryptoLib MariaDB must be configured before intializing!\n" RESET); - return status; //MariaDB connection specified but no configuration exists, return! + return status; // MariaDB connection specified but no configuration exists, return! } sadb_routine = get_sadb_routine_mariadb(); } - else { status = SADB_INVALID_SADB_TYPE; return status; } //TODO: Error stack + else + { + status = SADB_INVALID_SADB_TYPE; + return status; + } // TODO: Error stack // Initialize libgcrypt if (!gcry_check_version(GCRYPT_VERSION)) { - fprintf(stderr, "Gcrypt Version: %s",GCRYPT_VERSION); + fprintf(stderr, "Gcrypt Version: %s", GCRYPT_VERSION); printf(KRED "\tERROR: gcrypt version mismatch! \n" RESET); } if (gcry_control(GCRYCTL_SELFTEST) != GPG_ERR_NO_ERROR) @@ -216,136 +233,149 @@ int32_t Crypto_Init(void) Crypto_Calc_CRC_Init_Table(); // cFS Standard Initialized Message - printf (KBLU "Crypto Lib Intialized. Version %d.%d.%d.%d\n" RESET, - CRYPTO_LIB_MAJOR_VERSION, - CRYPTO_LIB_MINOR_VERSION, - CRYPTO_LIB_REVISION, - CRYPTO_LIB_MISSION_REV); - - return status; + printf(KBLU "Crypto Lib Intialized. Version %d.%d.%d.%d\n" RESET, CRYPTO_LIB_MAJOR_VERSION, + CRYPTO_LIB_MINOR_VERSION, CRYPTO_LIB_REVISION, CRYPTO_LIB_MISSION_REV); + + return status; } /** -* @brief Function: Crypto_Shutdown -* Free memory objects & restore pointers to NULL for re-initialization -* @return int32: Success/Failure -**/ + * @brief Function: Crypto_Shutdown + * Free memory objects & restore pointers to NULL for re-initialization + * @return int32: Success/Failure + **/ int32_t Crypto_Shutdown(void) { int32_t status = CRYPTO_LIB_SUCCESS; - if(crypto_config!=NULL){ + if (crypto_config != NULL) + { free(crypto_config); - crypto_config=NULL; + crypto_config = NULL; } - if(sadb_mariadb_config!=NULL){ + if (sadb_mariadb_config != NULL) + { free(sadb_mariadb_config); - sadb_mariadb_config=NULL; + sadb_mariadb_config = NULL; } - current_managed_parameters=NULL; + current_managed_parameters = NULL; - if(gvcid_managed_parameters!=NULL){ + if (gvcid_managed_parameters != NULL) + { Crypto_Free_Managed_Parameters(gvcid_managed_parameters); - gvcid_managed_parameters=NULL; + gvcid_managed_parameters = NULL; } return status; } /** -* @brief Function: Crypto_Config_CryptoLib -* @param sadb_type: uint8 -* @param crypto_create_fecf: uint8 -* @param process_sdls_pdus: uint8 -* @param has_pus_hdr: uint8 -* @param ignore_sa_state: uint8 -* @param ignore_anti_replay: uint8 -* @param unique_sa_per_mapid: uint8 -* @param crypto_check_fecf: uint8 -* @param vcid_bitmask: uint8 -* @return int32: Success/Failure -**/ -int32_t Crypto_Config_CryptoLib(uint8_t sadb_type, uint8_t crypto_create_fecf, uint8_t process_sdls_pdus, uint8_t has_pus_hdr, uint8_t ignore_sa_state, uint8_t ignore_anti_replay, uint8_t unique_sa_per_mapid,uint8_t crypto_check_fecf, uint8_t vcid_bitmask) + * @brief Function: Crypto_Config_CryptoLib + * @param sadb_type: uint8 + * @param crypto_create_fecf: uint8 + * @param process_sdls_pdus: uint8 + * @param has_pus_hdr: uint8 + * @param ignore_sa_state: uint8 + * @param ignore_anti_replay: uint8 + * @param unique_sa_per_mapid: uint8 + * @param crypto_check_fecf: uint8 + * @param vcid_bitmask: uint8 + * @return int32: Success/Failure + **/ +int32_t Crypto_Config_CryptoLib(uint8_t sadb_type, uint8_t crypto_create_fecf, uint8_t process_sdls_pdus, + uint8_t has_pus_hdr, uint8_t ignore_sa_state, uint8_t ignore_anti_replay, + uint8_t unique_sa_per_mapid, uint8_t crypto_check_fecf, uint8_t vcid_bitmask) { int32_t status = CRYPTO_LIB_SUCCESS; - crypto_config = (CryptoConfig_t*) calloc(1, CRYPTO_CONFIG_SIZE); - crypto_config->sadb_type=sadb_type; - crypto_config->crypto_create_fecf=crypto_create_fecf; - crypto_config->process_sdls_pdus=process_sdls_pdus; - crypto_config->has_pus_hdr=has_pus_hdr; - crypto_config->ignore_sa_state=ignore_sa_state; - crypto_config->ignore_anti_replay=ignore_anti_replay; + crypto_config = (CryptoConfig_t *)calloc(1, CRYPTO_CONFIG_SIZE); + crypto_config->sadb_type = sadb_type; + crypto_config->crypto_create_fecf = crypto_create_fecf; + crypto_config->process_sdls_pdus = process_sdls_pdus; + crypto_config->has_pus_hdr = has_pus_hdr; + crypto_config->ignore_sa_state = ignore_sa_state; + crypto_config->ignore_anti_replay = ignore_anti_replay; crypto_config->unique_sa_per_mapid = unique_sa_per_mapid; crypto_config->crypto_check_fecf = crypto_check_fecf; - crypto_config->vcid_bitmask=vcid_bitmask; + crypto_config->vcid_bitmask = vcid_bitmask; return status; } /** -* @brief Function: Crypto_Config_MariaDB -* @param mysql_username: uint8_t* -* @param mysql_password: uint8_t* -* @param mysql_hostname: uint8_t* -* @param mysql_database: uint8_t* -* @param mysql_port: uint16 -* @return int32: Success/Failure -**/ -int32_t Crypto_Config_MariaDB(uint8_t* mysql_username, uint8_t* mysql_password, uint8_t* mysql_hostname, uint8_t* mysql_database, uint16_t mysql_port) + * @brief Function: Crypto_Config_MariaDB + * @param mysql_username: uint8_t* + * @param mysql_password: uint8_t* + * @param mysql_hostname: uint8_t* + * @param mysql_database: uint8_t* + * @param mysql_port: uint16 + * @return int32: Success/Failure + **/ +int32_t Crypto_Config_MariaDB(uint8_t *mysql_username, uint8_t *mysql_password, uint8_t *mysql_hostname, + uint8_t *mysql_database, uint16_t mysql_port) { int32_t status = CRYPTO_LIB_SUCCESS; - sadb_mariadb_config = (SadbMariaDBConfig_t*)calloc(1, SADB_MARIADB_CONFIG_SIZE); - sadb_mariadb_config->mysql_username=mysql_username; - sadb_mariadb_config->mysql_password=mysql_password; - sadb_mariadb_config->mysql_hostname=mysql_hostname; - sadb_mariadb_config->mysql_database=mysql_database; - sadb_mariadb_config->mysql_port=mysql_port; + sadb_mariadb_config = (SadbMariaDBConfig_t *)calloc(1, SADB_MARIADB_CONFIG_SIZE); + sadb_mariadb_config->mysql_username = mysql_username; + sadb_mariadb_config->mysql_password = mysql_password; + sadb_mariadb_config->mysql_hostname = mysql_hostname; + sadb_mariadb_config->mysql_database = mysql_database; + sadb_mariadb_config->mysql_port = mysql_port; return status; } /** -* @brief Function: Crypto_Config_Add_Gvcid_Managed_Parameter -* @param tfvn: uint8 -* @param scid: uint16 -* @param vcid: uint8 -* @param has_fecf: uint8 -* @param has_segmentation_hdr: uint8 -* @return int32: Success/Failure -**/ -int32_t Crypto_Config_Add_Gvcid_Managed_Parameter(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, uint8_t has_segmentation_hdr) + * @brief Function: Crypto_Config_Add_Gvcid_Managed_Parameter + * @param tfvn: uint8 + * @param scid: uint16 + * @param vcid: uint8 + * @param has_fecf: uint8 + * @param has_segmentation_hdr: uint8 + * @return int32: Success/Failure + **/ +int32_t Crypto_Config_Add_Gvcid_Managed_Parameter(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, + uint8_t has_segmentation_hdr) { int32_t status = CRYPTO_LIB_SUCCESS; - if(gvcid_managed_parameters==NULL){//case: Global Root Node not Set - gvcid_managed_parameters = (GvcidManagedParameters_t*) calloc(1,GVCID_MANAGED_PARAMETERS_SIZE); - gvcid_managed_parameters->tfvn=tfvn; - gvcid_managed_parameters->scid=scid; - gvcid_managed_parameters->vcid=vcid; - gvcid_managed_parameters->has_fecf=has_fecf; - gvcid_managed_parameters->has_segmentation_hdr=has_segmentation_hdr; - gvcid_managed_parameters->next=NULL; + if (gvcid_managed_parameters == NULL) + { // case: Global Root Node not Set + gvcid_managed_parameters = (GvcidManagedParameters_t *)calloc(1, GVCID_MANAGED_PARAMETERS_SIZE); + gvcid_managed_parameters->tfvn = tfvn; + gvcid_managed_parameters->scid = scid; + gvcid_managed_parameters->vcid = vcid; + gvcid_managed_parameters->has_fecf = has_fecf; + gvcid_managed_parameters->has_segmentation_hdr = has_segmentation_hdr; + gvcid_managed_parameters->next = NULL; return status; - } else { //Recurse through nodes and add at end - return crypto_config_add_gvcid_managed_parameter_recursion(tfvn, scid, vcid, has_fecf, has_segmentation_hdr,gvcid_managed_parameters); } - + else + { // Recurse through nodes and add at end + return crypto_config_add_gvcid_managed_parameter_recursion(tfvn, scid, vcid, has_fecf, has_segmentation_hdr, + gvcid_managed_parameters); + } } /** -* @brief Function: crypto_config_add_gvcid_managed_parameter_recursion -* @param tfvn: uint8 -* @param scid: uint16 -* @param vcid: uint8 -* @param has_fecf: uint8 -* @param has_segmentation_hdr: uint8 -* @param managed_parameter: GvcidManagedParameters_t* -* @return int32: Success/Failure -**/ -static int32_t crypto_config_add_gvcid_managed_parameter_recursion(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, uint8_t has_segmentation_hdr,GvcidManagedParameters_t* managed_parameter) + * @brief Function: crypto_config_add_gvcid_managed_parameter_recursion + * @param tfvn: uint8 + * @param scid: uint16 + * @param vcid: uint8 + * @param has_fecf: uint8 + * @param has_segmentation_hdr: uint8 + * @param managed_parameter: GvcidManagedParameters_t* + * @return int32: Success/Failure + **/ +static int32_t crypto_config_add_gvcid_managed_parameter_recursion(uint8_t tfvn, uint16_t scid, uint8_t vcid, + uint8_t has_fecf, uint8_t has_segmentation_hdr, + GvcidManagedParameters_t *managed_parameter) { - if(managed_parameter->next!=NULL){ - return crypto_config_add_gvcid_managed_parameter_recursion(tfvn, scid, vcid, has_fecf, has_segmentation_hdr,managed_parameter->next); - } else { - managed_parameter->next = (GvcidManagedParameters_t*) calloc(1,GVCID_MANAGED_PARAMETERS_SIZE); + if (managed_parameter->next != NULL) + { + return crypto_config_add_gvcid_managed_parameter_recursion(tfvn, scid, vcid, has_fecf, has_segmentation_hdr, + managed_parameter->next); + } + else + { + managed_parameter->next = (GvcidManagedParameters_t *)calloc(1, GVCID_MANAGED_PARAMETERS_SIZE); managed_parameter->next->tfvn = tfvn; managed_parameter->next->scid = scid; managed_parameter->next->vcid = vcid; @@ -386,16 +416,16 @@ static void Crypto_Local_Config(void) // Master Keys // 0 - 000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F -> ACTIVE - ek_ring[0].value[0] = 0x00; - ek_ring[0].value[1] = 0x01; - ek_ring[0].value[2] = 0x02; - ek_ring[0].value[3] = 0x03; - ek_ring[0].value[4] = 0x04; - ek_ring[0].value[5] = 0x05; - ek_ring[0].value[6] = 0x06; - ek_ring[0].value[7] = 0x07; - ek_ring[0].value[8] = 0x08; - ek_ring[0].value[9] = 0x09; + ek_ring[0].value[0] = 0x00; + ek_ring[0].value[1] = 0x01; + ek_ring[0].value[2] = 0x02; + ek_ring[0].value[3] = 0x03; + ek_ring[0].value[4] = 0x04; + ek_ring[0].value[5] = 0x05; + ek_ring[0].value[6] = 0x06; + ek_ring[0].value[7] = 0x07; + ek_ring[0].value[8] = 0x08; + ek_ring[0].value[9] = 0x09; ek_ring[0].value[10] = 0x0A; ek_ring[0].value[11] = 0x0B; ek_ring[0].value[12] = 0x0C; @@ -420,16 +450,16 @@ static void Crypto_Local_Config(void) ek_ring[0].value[31] = 0x0F; ek_ring[0].key_state = KEY_ACTIVE; // 1 - 101112131415161718191A1B1C1D1E1F101112131415161718191A1B1C1D1E1F -> ACTIVE - ek_ring[1].value[0] = 0x10; - ek_ring[1].value[1] = 0x11; - ek_ring[1].value[2] = 0x12; - ek_ring[1].value[3] = 0x13; - ek_ring[1].value[4] = 0x14; - ek_ring[1].value[5] = 0x15; - ek_ring[1].value[6] = 0x16; - ek_ring[1].value[7] = 0x17; - ek_ring[1].value[8] = 0x18; - ek_ring[1].value[9] = 0x19; + ek_ring[1].value[0] = 0x10; + ek_ring[1].value[1] = 0x11; + ek_ring[1].value[2] = 0x12; + ek_ring[1].value[3] = 0x13; + ek_ring[1].value[4] = 0x14; + ek_ring[1].value[5] = 0x15; + ek_ring[1].value[6] = 0x16; + ek_ring[1].value[7] = 0x17; + ek_ring[1].value[8] = 0x18; + ek_ring[1].value[9] = 0x19; ek_ring[1].value[10] = 0x1A; ek_ring[1].value[11] = 0x1B; ek_ring[1].value[12] = 0x1C; @@ -454,16 +484,16 @@ static void Crypto_Local_Config(void) ek_ring[1].value[31] = 0x1F; ek_ring[1].key_state = KEY_ACTIVE; // 2 - 202122232425262728292A2B2C2D2E2F202122232425262728292A2B2C2D2E2F -> ACTIVE - ek_ring[2].value[0] = 0x20; - ek_ring[2].value[1] = 0x21; - ek_ring[2].value[2] = 0x22; - ek_ring[2].value[3] = 0x23; - ek_ring[2].value[4] = 0x24; - ek_ring[2].value[5] = 0x25; - ek_ring[2].value[6] = 0x26; - ek_ring[2].value[7] = 0x27; - ek_ring[2].value[8] = 0x28; - ek_ring[2].value[9] = 0x29; + ek_ring[2].value[0] = 0x20; + ek_ring[2].value[1] = 0x21; + ek_ring[2].value[2] = 0x22; + ek_ring[2].value[3] = 0x23; + ek_ring[2].value[4] = 0x24; + ek_ring[2].value[5] = 0x25; + ek_ring[2].value[6] = 0x26; + ek_ring[2].value[7] = 0x27; + ek_ring[2].value[8] = 0x28; + ek_ring[2].value[9] = 0x29; ek_ring[2].value[10] = 0x2A; ek_ring[2].value[11] = 0x2B; ek_ring[2].value[12] = 0x2C; @@ -490,16 +520,16 @@ static void Crypto_Local_Config(void) // Session Keys // 128 - 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF -> ACTIVE - ek_ring[128].value[0] = 0x01; - ek_ring[128].value[1] = 0x23; - ek_ring[128].value[2] = 0x45; - ek_ring[128].value[3] = 0x67; - ek_ring[128].value[4] = 0x89; - ek_ring[128].value[5] = 0xAB; - ek_ring[128].value[6] = 0xCD; - ek_ring[128].value[7] = 0xEF; - ek_ring[128].value[8] = 0x01; - ek_ring[128].value[9] = 0x23; + ek_ring[128].value[0] = 0x01; + ek_ring[128].value[1] = 0x23; + ek_ring[128].value[2] = 0x45; + ek_ring[128].value[3] = 0x67; + ek_ring[128].value[4] = 0x89; + ek_ring[128].value[5] = 0xAB; + ek_ring[128].value[6] = 0xCD; + ek_ring[128].value[7] = 0xEF; + ek_ring[128].value[8] = 0x01; + ek_ring[128].value[9] = 0x23; ek_ring[128].value[10] = 0x45; ek_ring[128].value[11] = 0x67; ek_ring[128].value[12] = 0x89; @@ -524,16 +554,16 @@ static void Crypto_Local_Config(void) ek_ring[128].value[31] = 0xEF; ek_ring[128].key_state = KEY_ACTIVE; // 129 - ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789 -> ACTIVE - ek_ring[129].value[0] = 0xAB; - ek_ring[129].value[1] = 0xCD; - ek_ring[129].value[2] = 0xEF; - ek_ring[129].value[3] = 0x01; - ek_ring[129].value[4] = 0x23; - ek_ring[129].value[5] = 0x45; - ek_ring[129].value[6] = 0x67; - ek_ring[129].value[7] = 0x89; - ek_ring[129].value[8] = 0xAB; - ek_ring[129].value[9] = 0xCD; + ek_ring[129].value[0] = 0xAB; + ek_ring[129].value[1] = 0xCD; + ek_ring[129].value[2] = 0xEF; + ek_ring[129].value[3] = 0x01; + ek_ring[129].value[4] = 0x23; + ek_ring[129].value[5] = 0x45; + ek_ring[129].value[6] = 0x67; + ek_ring[129].value[7] = 0x89; + ek_ring[129].value[8] = 0xAB; + ek_ring[129].value[9] = 0xCD; ek_ring[129].value[10] = 0xEF; ek_ring[129].value[11] = 0x01; ek_ring[129].value[12] = 0x23; @@ -558,16 +588,16 @@ static void Crypto_Local_Config(void) ek_ring[129].value[31] = 0x89; ek_ring[129].key_state = KEY_ACTIVE; // 130 - FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210 -> ACTIVE - ek_ring[130].value[0] = 0xFE; - ek_ring[130].value[1] = 0xDC; - ek_ring[130].value[2] = 0xBA; - ek_ring[130].value[3] = 0x98; - ek_ring[130].value[4] = 0x76; - ek_ring[130].value[5] = 0x54; - ek_ring[130].value[6] = 0x32; - ek_ring[130].value[7] = 0x10; - ek_ring[130].value[8] = 0xFE; - ek_ring[130].value[9] = 0xDC; + ek_ring[130].value[0] = 0xFE; + ek_ring[130].value[1] = 0xDC; + ek_ring[130].value[2] = 0xBA; + ek_ring[130].value[3] = 0x98; + ek_ring[130].value[4] = 0x76; + ek_ring[130].value[5] = 0x54; + ek_ring[130].value[6] = 0x32; + ek_ring[130].value[7] = 0x10; + ek_ring[130].value[8] = 0xFE; + ek_ring[130].value[9] = 0xDC; ek_ring[130].value[10] = 0xBA; ek_ring[130].value[11] = 0x98; ek_ring[130].value[12] = 0x76; @@ -592,16 +622,16 @@ static void Crypto_Local_Config(void) ek_ring[130].value[31] = 0x10; ek_ring[130].key_state = KEY_ACTIVE; // 131 - 9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA -> ACTIVE - ek_ring[131].value[0] = 0x98; - ek_ring[131].value[1] = 0x76; - ek_ring[131].value[2] = 0x54; - ek_ring[131].value[3] = 0x32; - ek_ring[131].value[4] = 0x10; - ek_ring[131].value[5] = 0xFE; - ek_ring[131].value[6] = 0xDC; - ek_ring[131].value[7] = 0xBA; - ek_ring[131].value[8] = 0x98; - ek_ring[131].value[9] = 0x76; + ek_ring[131].value[0] = 0x98; + ek_ring[131].value[1] = 0x76; + ek_ring[131].value[2] = 0x54; + ek_ring[131].value[3] = 0x32; + ek_ring[131].value[4] = 0x10; + ek_ring[131].value[5] = 0xFE; + ek_ring[131].value[6] = 0xDC; + ek_ring[131].value[7] = 0xBA; + ek_ring[131].value[8] = 0x98; + ek_ring[131].value[9] = 0x76; ek_ring[131].value[10] = 0x54; ek_ring[131].value[11] = 0x32; ek_ring[131].value[12] = 0x10; @@ -626,16 +656,16 @@ static void Crypto_Local_Config(void) ek_ring[131].value[31] = 0xBA; ek_ring[131].key_state = KEY_ACTIVE; // 132 - 0123456789ABCDEFABCDEF01234567890123456789ABCDEFABCDEF0123456789 -> PRE_ACTIVATION - ek_ring[132].value[0] = 0x01; - ek_ring[132].value[1] = 0x23; - ek_ring[132].value[2] = 0x45; - ek_ring[132].value[3] = 0x67; - ek_ring[132].value[4] = 0x89; - ek_ring[132].value[5] = 0xAB; - ek_ring[132].value[6] = 0xCD; - ek_ring[132].value[7] = 0xEF; - ek_ring[132].value[8] = 0xAB; - ek_ring[132].value[9] = 0xCD; + ek_ring[132].value[0] = 0x01; + ek_ring[132].value[1] = 0x23; + ek_ring[132].value[2] = 0x45; + ek_ring[132].value[3] = 0x67; + ek_ring[132].value[4] = 0x89; + ek_ring[132].value[5] = 0xAB; + ek_ring[132].value[6] = 0xCD; + ek_ring[132].value[7] = 0xEF; + ek_ring[132].value[8] = 0xAB; + ek_ring[132].value[9] = 0xCD; ek_ring[132].value[10] = 0xEF; ek_ring[132].value[11] = 0x01; ek_ring[132].value[12] = 0x23; @@ -660,16 +690,16 @@ static void Crypto_Local_Config(void) ek_ring[132].value[31] = 0x89; ek_ring[132].key_state = KEY_PREACTIVE; // 133 - ABCDEF01234567890123456789ABCDEFABCDEF01234567890123456789ABCDEF -> ACTIVE - ek_ring[133].value[0] = 0xAB; - ek_ring[133].value[1] = 0xCD; - ek_ring[133].value[2] = 0xEF; - ek_ring[133].value[3] = 0x01; - ek_ring[133].value[4] = 0x23; - ek_ring[133].value[5] = 0x45; - ek_ring[133].value[6] = 0x67; - ek_ring[133].value[7] = 0x89; - ek_ring[133].value[8] = 0x01; - ek_ring[133].value[9] = 0x23; + ek_ring[133].value[0] = 0xAB; + ek_ring[133].value[1] = 0xCD; + ek_ring[133].value[2] = 0xEF; + ek_ring[133].value[3] = 0x01; + ek_ring[133].value[4] = 0x23; + ek_ring[133].value[5] = 0x45; + ek_ring[133].value[6] = 0x67; + ek_ring[133].value[7] = 0x89; + ek_ring[133].value[8] = 0x01; + ek_ring[133].value[9] = 0x23; ek_ring[133].value[10] = 0x45; ek_ring[133].value[11] = 0x67; ek_ring[133].value[12] = 0x89; @@ -694,16 +724,16 @@ static void Crypto_Local_Config(void) ek_ring[133].value[31] = 0xEF; ek_ring[133].key_state = KEY_ACTIVE; // 134 - ABCDEF0123456789FEDCBA9876543210ABCDEF0123456789FEDCBA9876543210 -> DEACTIVE - ek_ring[134].value[0] = 0xAB; - ek_ring[134].value[1] = 0xCD; - ek_ring[134].value[2] = 0xEF; - ek_ring[134].value[3] = 0x01; - ek_ring[134].value[4] = 0x23; - ek_ring[134].value[5] = 0x45; - ek_ring[134].value[6] = 0x67; - ek_ring[134].value[7] = 0x89; - ek_ring[134].value[8] = 0xFE; - ek_ring[134].value[9] = 0xDC; + ek_ring[134].value[0] = 0xAB; + ek_ring[134].value[1] = 0xCD; + ek_ring[134].value[2] = 0xEF; + ek_ring[134].value[3] = 0x01; + ek_ring[134].value[4] = 0x23; + ek_ring[134].value[5] = 0x45; + ek_ring[134].value[6] = 0x67; + ek_ring[134].value[7] = 0x89; + ek_ring[134].value[8] = 0xFE; + ek_ring[134].value[9] = 0xDC; ek_ring[134].value[10] = 0xBA; ek_ring[134].value[11] = 0x98; ek_ring[134].value[12] = 0x76; @@ -729,16 +759,16 @@ static void Crypto_Local_Config(void) ek_ring[134].key_state = KEY_DEACTIVATED; // 135 - ABCDEF0123456789FEDCBA9876543210ABCDEF0123456789FEDCBA9876543210 -> DEACTIVE - ek_ring[135].value[0] = 0x00; - ek_ring[135].value[1] = 0x00; - ek_ring[135].value[2] = 0x00; - ek_ring[135].value[3] = 0x00; - ek_ring[135].value[4] = 0x00; - ek_ring[135].value[5] = 0x00; - ek_ring[135].value[6] = 0x00; - ek_ring[135].value[7] = 0x00; - ek_ring[135].value[8] = 0x00; - ek_ring[135].value[9] = 0x00; + ek_ring[135].value[0] = 0x00; + ek_ring[135].value[1] = 0x00; + ek_ring[135].value[2] = 0x00; + ek_ring[135].value[3] = 0x00; + ek_ring[135].value[4] = 0x00; + ek_ring[135].value[5] = 0x00; + ek_ring[135].value[6] = 0x00; + ek_ring[135].value[7] = 0x00; + ek_ring[135].value[8] = 0x00; + ek_ring[135].value[9] = 0x00; ek_ring[135].value[10] = 0x00; ek_ring[135].value[11] = 0x00; ek_ring[135].value[12] = 0x00; @@ -764,17 +794,18 @@ static void Crypto_Local_Config(void) ek_ring[135].key_state = KEY_DEACTIVATED; // 136 - ef9f9284cf599eac3b119905a7d18851e7e374cf63aea04358586b0f757670f8 - // Reference: https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip - ek_ring[136].value[0] = 0xff; - ek_ring[136].value[1] = 0x9f; - ek_ring[136].value[2] = 0x92; - ek_ring[136].value[3] = 0x84; - ek_ring[136].value[4] = 0xcf; - ek_ring[136].value[5] = 0x59; - ek_ring[136].value[6] = 0x9e; - ek_ring[136].value[7] = 0xac; - ek_ring[136].value[8] = 0x3b; - ek_ring[136].value[9] = 0x11; + // Reference: + // https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip + ek_ring[136].value[0] = 0xff; + ek_ring[136].value[1] = 0x9f; + ek_ring[136].value[2] = 0x92; + ek_ring[136].value[3] = 0x84; + ek_ring[136].value[4] = 0xcf; + ek_ring[136].value[5] = 0x59; + ek_ring[136].value[6] = 0x9e; + ek_ring[136].value[7] = 0xac; + ek_ring[136].value[8] = 0x3b; + ek_ring[136].value[9] = 0x11; ek_ring[136].value[10] = 0x99; ek_ring[136].value[11] = 0x05; ek_ring[136].value[12] = 0xa7; @@ -802,72 +833,71 @@ static void Crypto_Local_Config(void) /** * @brief Function: Crypto_Local_Init - * Initalize TM Frame, CLCW + * Initalize TM Frame, CLCW **/ static void Crypto_Local_Init(void) { // Initialize TM Frame // TM Header - tm_frame.tm_header.tfvn = 0; // Shall be 00 for TM-/TC-SDLP - tm_frame.tm_header.scid = SCID & 0x3FF; - tm_frame.tm_header.vcid = 0; - tm_frame.tm_header.ocff = 1; - tm_frame.tm_header.mcfc = 1; - tm_frame.tm_header.vcfc = 1; - tm_frame.tm_header.tfsh = 0; - tm_frame.tm_header.sf = 0; - tm_frame.tm_header.pof = 0; // Shall be set to 0 - tm_frame.tm_header.slid = 3; // Shall be set to 11 - tm_frame.tm_header.fhp = 0; + tm_frame.tm_header.tfvn = 0; // Shall be 00 for TM-/TC-SDLP + tm_frame.tm_header.scid = SCID & 0x3FF; + tm_frame.tm_header.vcid = 0; + tm_frame.tm_header.ocff = 1; + tm_frame.tm_header.mcfc = 1; + tm_frame.tm_header.vcfc = 1; + tm_frame.tm_header.tfsh = 0; + tm_frame.tm_header.sf = 0; + tm_frame.tm_header.pof = 0; // Shall be set to 0 + tm_frame.tm_header.slid = 3; // Shall be set to 11 + tm_frame.tm_header.fhp = 0; // TM Security Header tm_frame.tm_sec_header.spi = 0x0000; - for ( int x = 0; x < IV_SIZE; x++) - { // Initialization Vector + for (int x = 0; x < IV_SIZE; x++) + { // Initialization Vector *(tm_frame.tm_sec_header.iv + x) = 0x00; } // TM Payload Data Unit - for ( int x = 0; x < TM_FRAME_DATA_SIZE; x++) - { // Zero TM PDU + for (int x = 0; x < TM_FRAME_DATA_SIZE; x++) + { // Zero TM PDU tm_frame.tm_pdu[x] = 0x00; } // TM Security Trailer - for ( int x = 0; x < MAC_SIZE; x++) - { // Zero TM Message Authentication Code + for (int x = 0; x < MAC_SIZE; x++) + { // Zero TM Message Authentication Code tm_frame.tm_sec_trailer.mac[x] = 0x00; } - for ( int x = 0; x < OCF_SIZE; x++) - { // Zero TM Operational Control Field + for (int x = 0; x < OCF_SIZE; x++) + { // Zero TM Operational Control Field tm_frame.tm_sec_trailer.ocf[x] = 0x00; } tm_frame.tm_sec_trailer.fecf = 0xFECF; // Initialize CLCW - clcw.cwt = 0; // Control Word Type "0" - clcw.cvn = 0; // CLCW Version Number "00" - clcw.sf = 0; // Status Field - clcw.cie = 1; // COP In Effect - clcw.vci = 0; // Virtual Channel Identification - clcw.spare0 = 0; // Reserved Spare - clcw.nrfa = 0; // No RF Avaliable Flag - clcw.nbl = 0; // No Bit Lock Flag - clcw.lo = 0; // Lock-Out Flag - clcw.wait = 0; // Wait Flag - clcw.rt = 0; // Retransmit Flag - clcw.fbc = 0; // FARM-B Counter - clcw.spare1 = 0; // Reserved Spare - clcw.rv = 0; // Report Value + clcw.cwt = 0; // Control Word Type "0" + clcw.cvn = 0; // CLCW Version Number "00" + clcw.sf = 0; // Status Field + clcw.cie = 1; // COP In Effect + clcw.vci = 0; // Virtual Channel Identification + clcw.spare0 = 0; // Reserved Spare + clcw.nrfa = 0; // No RF Avaliable Flag + clcw.nbl = 0; // No Bit Lock Flag + clcw.lo = 0; // Lock-Out Flag + clcw.wait = 0; // Wait Flag + clcw.rt = 0; // Retransmit Flag + clcw.fbc = 0; // FARM-B Counter + clcw.spare1 = 0; // Reserved Spare + clcw.rv = 0; // Report Value // Initialize Frame Security Report - report.cwt = 1; // Control Word Type "0b1"" - report.vnum = 4; // FSR Version "0b100"" - report.af = 0; // Alarm Field - report.bsnf = 0; // Bad SN Flag - report.bmacf = 0; // Bad MAC Flag - report.ispif = 0; // Invalid SPI Flag - report.lspiu = 0; // Last SPI Used - report.snval = 0; // SN Value (LSB) - + report.cwt = 1; // Control Word Type "0b1"" + report.vnum = 4; // FSR Version "0b100"" + report.af = 0; // Alarm Field + report.bsnf = 0; // Bad SN Flag + report.bmacf = 0; // Bad MAC Flag + report.ispif = 0; // Invalid SPI Flag + report.lspiu = 0; // Last SPI Used + report.snval = 0; // SN Value (LSB) } /** @@ -875,7 +905,7 @@ static void Crypto_Local_Init(void) * Initialize CRC Table **/ static void Crypto_Calc_CRC_Init_Table(void) -{ +{ uint16_t val; uint32_t poly = 0xEDB88320; uint32_t crc; @@ -889,23 +919,31 @@ static void Crypto_Calc_CRC_Init_Table(void) crc = (crc >> 1) ^ (-(int)(crc & 1) & poly); } crc32Table[i] = crc; - //printf("crc32Table[%d] = 0x%08x \n", i, crc32Table[i]); + // printf("crc32Table[%d] = 0x%08x \n", i, crc32Table[i]); } - + // Code provided by ESA for (int i = 0; i < 256; i++) { val = 0; - if ( (i & 1) != 0 ) val ^= 0x1021; - if ( (i & 2) != 0 ) val ^= 0x2042; - if ( (i & 4) != 0 ) val ^= 0x4084; - if ( (i & 8) != 0 ) val ^= 0x8108; - if ( (i & 16) != 0 ) val ^= 0x1231; - if ( (i & 32) != 0 ) val ^= 0x2462; - if ( (i & 64) != 0 ) val ^= 0x48C4; - if ( (i & 128) != 0 ) val ^= 0x9188; + if ((i & 1) != 0) + val ^= 0x1021; + if ((i & 2) != 0) + val ^= 0x2042; + if ((i & 4) != 0) + val ^= 0x4084; + if ((i & 8) != 0) + val ^= 0x8108; + if ((i & 16) != 0) + val ^= 0x1231; + if ((i & 32) != 0) + val ^= 0x2462; + if ((i & 64) != 0) + val ^= 0x48C4; + if ((i & 128) != 0) + val ^= 0x9188; crc16Table[i] = val; - //printf("crc16Table[%d] = 0x%04x \n", i, crc16Table[i]); + // printf("crc16Table[%d] = 0x%04x \n", i, crc16Table[i]); } } @@ -938,8 +976,8 @@ static int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t printf("\tiv_size\t%d\n",iv_size); printf("\tmac\t%d\n",mac_size); printf("\tfecf \t%d\n",fecf); - printf("\tTOTAL LENGTH: %d\n", (tc_frame->tc_header.fl - (tf_hdr + seg_hdr + spi + iv_size ) - (mac_size + fecf))); - #endif + printf("\tTOTAL LENGTH: %d\n", (tc_frame->tc_header.fl - (tf_hdr + seg_hdr + spi + iv_size ) - (mac_size + +fecf))); #endif return (tc_frame->tc_header.fl + 1 - (tf_hdr + seg_hdr + spi + iv_size ) - (mac_size + fecf) ); } @@ -953,11 +991,11 @@ static int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t **/ static int32_t Crypto_Get_tmLength(int len) { - #ifdef FILL - len = TM_FILL_SIZE; - #else - len = TM_FRAME_PRIMARYHEADER_SIZE + TM_FRAME_SECHEADER_SIZE + len + TM_FRAME_SECTRAILER_SIZE + TM_FRAME_CLCW_SIZE; - #endif +#ifdef FILL + len = TM_FILL_SIZE; +#else + len = TM_FRAME_PRIMARYHEADER_SIZE + TM_FRAME_SECHEADER_SIZE + len + TM_FRAME_SECTRAILER_SIZE + TM_FRAME_CLCW_SIZE; +#endif return len; } @@ -969,8 +1007,9 @@ static int32_t Crypto_Get_tmLength(int len) **/ static uint8_t Crypto_Is_AEAD_Algorithm(uint32_t cipher_suite_id) { - //CryptoLib only supports AES-GCM, which is an AEAD (Authenticated Encryption with Associated Data) algorithm, so return true/1. - //TODO - Add cipher suite mapping to which algorithms are AEAD and which are not. + // CryptoLib only supports AES-GCM, which is an AEAD (Authenticated Encryption with Associated Data) algorithm, so + // return true/1. + // TODO - Add cipher suite mapping to which algorithms are AEAD and which are not. cipher_suite_id = cipher_suite_id; return CRYPTO_TRUE; @@ -984,24 +1023,24 @@ static uint8_t Crypto_Is_AEAD_Algorithm(uint32_t cipher_suite_id) * @param len_aad: uint16_t * @param abm_buffer: uint8_t* **/ -static uint8_t* Crypto_Prepare_TC_AAD(uint8_t* buffer, uint16_t len_aad, uint8_t* abm_buffer) +static uint8_t *Crypto_Prepare_TC_AAD(uint8_t *buffer, uint16_t len_aad, uint8_t *abm_buffer) { - uint8_t* aad = (uint8_t*) calloc(1,len_aad*sizeof(uint8_t)); + uint8_t *aad = (uint8_t *)calloc(1, len_aad * sizeof(uint8_t)); for (int i = 0; i < len_aad; i++) { aad[i] = buffer[i] & abm_buffer[i]; } - #ifdef MAC_DEBUG - printf(KYEL "Preparing AAD:\n"); - printf("\tUsing AAD Length of %d\n\t", len_aad); - for (int i = 0; i < len_aad; i++) - { - printf("%02x", aad[i]); - } - printf("\n" RESET); - #endif +#ifdef MAC_DEBUG + printf(KYEL "Preparing AAD:\n"); + printf("\tUsing AAD Length of %d\n\t", len_aad); + for (int i = 0; i < len_aad; i++) + { + printf("%02x", aad[i]); + } + printf("\n" RESET); +#endif return aad; } @@ -1012,15 +1051,16 @@ static uint8_t* Crypto_Prepare_TC_AAD(uint8_t* buffer, uint16_t len_aad, uint8_t * @param ingest: uint8_t* * @param len_ingest: int **/ -static void Crypto_TM_updatePDU(uint8_t* ingest, int len_ingest) -{ // Copy ingest to PDU +static void Crypto_TM_updatePDU(uint8_t *ingest, int len_ingest) +{ // Copy ingest to PDU int x = 0; int fill_size = 0; - SecurityAssociation_t* sa_ptr; + SecurityAssociation_t *sa_ptr; - if(sadb_routine->sadb_get_sa_from_spi(tm_frame.tm_sec_header.spi,&sa_ptr) != CRYPTO_LIB_SUCCESS){ - //TODO - Error handling - return; //Error -- unable to get SA from SPI. + if (sadb_routine->sadb_get_sa_from_spi(tm_frame.tm_sec_header.spi, &sa_ptr) != CRYPTO_LIB_SUCCESS) + { + // TODO - Error handling + return; // Error -- unable to get SA from SPI. } if ((sa_ptr->est == 1) && (sa_ptr->ast == 1)) @@ -1032,121 +1072,121 @@ static void Crypto_TM_updatePDU(uint8_t* ingest, int len_ingest) fill_size = 1129; } - #ifdef TM_ZERO_FILL - for (int x = 0; x < TM_FILL_SIZE; x++) +#ifdef TM_ZERO_FILL + for (int x = 0; x < TM_FILL_SIZE; x++) + { + if (x < len_ingest) + { // Fill + tm_frame.tm_pdu[x] = (uint8_t)ingest[x]; + } + else + { // Zero + tm_frame.tm_pdu[x] = 0x00; + } + } +#else + // Pre-append remaining packet if exist + if (tm_offset == 63) + { + tm_frame.tm_pdu[x++] = 0xff; + tm_offset--; + } + if (tm_offset == 62) + { + tm_frame.tm_pdu[x++] = 0x00; + tm_offset--; + } + if (tm_offset == 61) + { + tm_frame.tm_pdu[x++] = 0x00; + tm_offset--; + } + if (tm_offset == 60) + { + tm_frame.tm_pdu[x++] = 0x00; + tm_offset--; + } + if (tm_offset == 59) + { + tm_frame.tm_pdu[x++] = 0x39; + tm_offset--; + } + while (x < tm_offset) + { + tm_frame.tm_pdu[x] = 0x00; + x++; + } + // Copy actual packet + while (x < len_ingest + tm_offset) + { + // printf("ingest[x - tm_offset] = 0x%02x \n", (uint8_t)ingest[x - tm_offset]); + tm_frame.tm_pdu[x] = (uint8_t)ingest[x - tm_offset]; + x++; + } +#ifdef TM_IDLE_FILL + // Check for idle frame trigger + if (((uint8_t)ingest[0] == 0x08) && ((uint8_t)ingest[1] == 0x90)) + { + // Don't fill idle frames + } + else + { + while (x < (fill_size - 64)) { - if (x < len_ingest) - { // Fill - tm_frame.tm_pdu[x] = (uint8_t)ingest[x]; - } - else - { // Zero - tm_frame.tm_pdu[x] = 0x00; + tm_frame.tm_pdu[x++] = 0x07; + tm_frame.tm_pdu[x++] = 0xff; + tm_frame.tm_pdu[x++] = 0x00; + tm_frame.tm_pdu[x++] = 0x00; + tm_frame.tm_pdu[x++] = 0x00; + tm_frame.tm_pdu[x++] = 0x39; + for (int y = 0; y < 58; y++) + { + tm_frame.tm_pdu[x++] = 0x00; } } - #else - // Pre-append remaining packet if exist - if (tm_offset == 63) + // Add partial packet, if possible, and set offset + if (x < fill_size) + { + tm_frame.tm_pdu[x++] = 0x07; + tm_offset = 63; + } + if (x < fill_size) { tm_frame.tm_pdu[x++] = 0xff; tm_offset--; } - if (tm_offset == 62) + if (x < fill_size) { tm_frame.tm_pdu[x++] = 0x00; tm_offset--; } - if (tm_offset == 61) + if (x < fill_size) { tm_frame.tm_pdu[x++] = 0x00; tm_offset--; } - if (tm_offset == 60) + if (x < fill_size) { tm_frame.tm_pdu[x++] = 0x00; tm_offset--; } - if (tm_offset == 59) + if (x < fill_size) { tm_frame.tm_pdu[x++] = 0x39; tm_offset--; } - while (x < tm_offset) - { - tm_frame.tm_pdu[x] = 0x00; - x++; - } - // Copy actual packet - while (x < len_ingest + tm_offset) + for (int y = 0; x < fill_size; y++) { - //printf("ingest[x - tm_offset] = 0x%02x \n", (uint8_t)ingest[x - tm_offset]); - tm_frame.tm_pdu[x] = (uint8_t)ingest[x - tm_offset]; - x++; + tm_frame.tm_pdu[x++] = 00; + tm_offset--; } - #ifdef TM_IDLE_FILL - // Check for idle frame trigger - if (((uint8_t)ingest[0] == 0x08) && ((uint8_t)ingest[1] == 0x90)) - { - // Don't fill idle frames - } - else - { - while (x < (fill_size - 64) ) - { - tm_frame.tm_pdu[x++] = 0x07; - tm_frame.tm_pdu[x++] = 0xff; - tm_frame.tm_pdu[x++] = 0x00; - tm_frame.tm_pdu[x++] = 0x00; - tm_frame.tm_pdu[x++] = 0x00; - tm_frame.tm_pdu[x++] = 0x39; - for (int y = 0; y < 58; y++) - { - tm_frame.tm_pdu[x++] = 0x00; - } - } - // Add partial packet, if possible, and set offset - if (x < fill_size) - { - tm_frame.tm_pdu[x++] = 0x07; - tm_offset = 63; - } - if (x < fill_size) - { - tm_frame.tm_pdu[x++] = 0xff; - tm_offset--; - } - if (x < fill_size) - { - tm_frame.tm_pdu[x++] = 0x00; - tm_offset--; - } - if (x < fill_size) - { - tm_frame.tm_pdu[x++] = 0x00; - tm_offset--; - } - if (x < fill_size) - { - tm_frame.tm_pdu[x++] = 0x00; - tm_offset--; - } - if (x < fill_size) - { - tm_frame.tm_pdu[x++] = 0x39; - tm_offset--; - } - for (int y = 0; x < fill_size; y++) - { - tm_frame.tm_pdu[x++] = 00; - tm_offset--; - } - } - while (x < TM_FILL_SIZE) - { - tm_frame.tm_pdu[x++] = 0x00; - } - #endif - #endif + } + while (x < TM_FILL_SIZE) + { + tm_frame.tm_pdu[x++] = 0x00; + } +#endif +#endif return; } @@ -1157,34 +1197,36 @@ static void Crypto_TM_updatePDU(uint8_t* ingest, int len_ingest) static void Crypto_TM_updateOCF(void) { if (ocf == 0) - { // CLCW + { // CLCW clcw.vci = tm_frame.tm_header.vcid; tm_frame.tm_sec_trailer.ocf[0] = (clcw.cwt << 7) | (clcw.cvn << 5) | (clcw.sf << 2) | (clcw.cie); tm_frame.tm_sec_trailer.ocf[1] = (clcw.vci << 2) | (clcw.spare0); - tm_frame.tm_sec_trailer.ocf[2] = (clcw.nrfa << 7) | (clcw.nbl << 6) | (clcw.lo << 5) | (clcw.wait << 4) | (clcw.rt << 3) | (clcw.fbc << 1) | (clcw.spare1); + tm_frame.tm_sec_trailer.ocf[2] = (clcw.nrfa << 7) | (clcw.nbl << 6) | (clcw.lo << 5) | (clcw.wait << 4) | + (clcw.rt << 3) | (clcw.fbc << 1) | (clcw.spare1); tm_frame.tm_sec_trailer.ocf[3] = (clcw.rv); // Alternate OCF ocf = 1; - #ifdef OCF_DEBUG - Crypto_clcwPrint(&clcw); - #endif - } +#ifdef OCF_DEBUG + Crypto_clcwPrint(&clcw); +#endif + } else - { // FSR - tm_frame.tm_sec_trailer.ocf[0] = (report.cwt << 7) | (report.vnum << 4) | (report.af << 3) | (report.bsnf << 2) | (report.bmacf << 1) | (report.ispif); + { // FSR + tm_frame.tm_sec_trailer.ocf[0] = (report.cwt << 7) | (report.vnum << 4) | (report.af << 3) | + (report.bsnf << 2) | (report.bmacf << 1) | (report.ispif); tm_frame.tm_sec_trailer.ocf[1] = (report.lspiu & 0xFF00) >> 8; tm_frame.tm_sec_trailer.ocf[2] = (report.lspiu & 0x00FF); - tm_frame.tm_sec_trailer.ocf[3] = (report.snval); + tm_frame.tm_sec_trailer.ocf[3] = (report.snval); // Alternate OCF ocf = 0; - #ifdef OCF_DEBUG - Crypto_fsrPrint(&report); - #endif +#ifdef OCF_DEBUG + Crypto_fsrPrint(&report); +#endif } } -//TODO - Review this. Not sure it quite works how we think +// TODO - Review this. Not sure it quite works how we think /** * @brief Function: Crypto_increment * Increments the bytes within a uint8_t array @@ -1196,15 +1238,15 @@ int32_t Crypto_increment(uint8_t *num, int length) { int i; /* go from right (least significant) to left (most signifcant) */ - for(i = length - 1; i >= 0; --i) + for (i = length - 1; i >= 0; --i) { ++(num[i]); /* increment current byte */ - if(num[i] != 0) /* if byte did not overflow, we're done! */ - break; + if (num[i] != 0) /* if byte did not overflow, we're done! */ + break; } - if(i < 0) /* this means num[0] was incremented and overflowed */ + if (i < 0) /* this means num[0] was incremented and overflowed */ return CRYPTO_LIB_ERROR; else return CRYPTO_LIB_SUCCESS; @@ -1228,7 +1270,7 @@ static int32_t Crypto_window(uint8_t *actual, uint8_t *expected, int length, int memcpy(temp, expected, length); for (int i = 0; i < window; i++) - { + { result = 0; /* go from right (least significant) to left (most signifcant) */ for (int j = length - 1; j >= 0; --j) @@ -1237,7 +1279,7 @@ static int32_t Crypto_window(uint8_t *actual, uint8_t *expected, int length, int { result++; } - } + } if (result == length) { status = CRYPTO_LIB_SUCCESS; @@ -1284,20 +1326,21 @@ static int32_t Crypto_compare_less_equal(uint8_t *actual, uint8_t *expected, int * @param appID: uint8 * @return uint8: Count **/ -uint8_t Crypto_Prep_Reply(uint8_t* ingest, uint8_t appID) +uint8_t Crypto_Prep_Reply(uint8_t *ingest, uint8_t appID) { uint8_t count = 0; - + // Prepare CCSDS for reply - sdls_frame.hdr.pvn = 0; - sdls_frame.hdr.type = 0; - sdls_frame.hdr.shdr = 1; + sdls_frame.hdr.pvn = 0; + sdls_frame.hdr.type = 0; + sdls_frame.hdr.shdr = 1; sdls_frame.hdr.appID = appID; - sdls_frame.pdu.type = 1; - + sdls_frame.pdu.type = 1; + // Fill ingest with reply header - ingest[count++] = (sdls_frame.hdr.pvn << 5) | (sdls_frame.hdr.type << 4) | (sdls_frame.hdr.shdr << 3) | ((sdls_frame.hdr.appID & 0x700 >> 8)); + ingest[count++] = (sdls_frame.hdr.pvn << 5) | (sdls_frame.hdr.type << 4) | (sdls_frame.hdr.shdr << 3) | + ((sdls_frame.hdr.appID & 0x700 >> 8)); ingest[count++] = (sdls_frame.hdr.appID & 0x00FF); ingest[count++] = (sdls_frame.hdr.seq << 6) | ((sdls_frame.hdr.pktid & 0x3F00) >> 8); ingest[count++] = (sdls_frame.hdr.pktid & 0x00FF); @@ -1305,13 +1348,14 @@ uint8_t Crypto_Prep_Reply(uint8_t* ingest, uint8_t appID) ingest[count++] = (sdls_frame.hdr.pkt_length & 0x00FF); // Fill ingest with PUS - //ingest[count++] = (sdls_frame.pus.shf << 7) | (sdls_frame.pus.pusv << 4) | (sdls_frame.pus.ack); - //ingest[count++] = (sdls_frame.pus.st); - //ingest[count++] = (sdls_frame.pus.sst); - //ingest[count++] = (sdls_frame.pus.sid << 4) | (sdls_frame.pus.spare); - + // ingest[count++] = (sdls_frame.pus.shf << 7) | (sdls_frame.pus.pusv << 4) | (sdls_frame.pus.ack); + // ingest[count++] = (sdls_frame.pus.st); + // ingest[count++] = (sdls_frame.pus.sst); + // ingest[count++] = (sdls_frame.pus.sid << 4) | (sdls_frame.pus.spare); + // Fill ingest with Tag and Length - ingest[count++] = (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | (sdls_frame.pdu.pid); + ingest[count++] = + (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | (sdls_frame.pdu.pid); ingest[count++] = (sdls_frame.pdu.pdu_len & 0xFF00) >> 8; ingest[count++] = (sdls_frame.pdu.pdu_len & 0x00FF); @@ -1335,8 +1379,9 @@ static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_fr if ( (fecf & 0xFFFF) != calc_fecf ) { - if (((uint8_t)ingest[18] == 0x0B) && ((uint8_t)ingest[19] == 0x00) && (((uint8_t)ingest[20] & 0xF0) == 0x40)) - { + if (((uint8_t)ingest[18] == 0x0B) && ((uint8_t)ingest[19] == 0x00) && (((uint8_t)ingest[20] & 0xF0) == +0x40)) + { // User packet check only used for ESA Testing! } else @@ -1354,9 +1399,8 @@ static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_fr log.blk[log_count++].em_len = 4; } #ifdef FECF_DEBUG - printf("\t Calculated = 0x%04x \n\t Received = 0x%04x \n", calc_fecf, tc_frame->tc_sec_trailer.fecf); - #endif - result = CRYPTO_LIB_ERROR; + printf("\t Calculated = 0x%04x \n\t Received = 0x%04x \n", calc_fecf, +tc_frame->tc_sec_trailer.fecf); #endif result = CRYPTO_LIB_ERROR; } } @@ -1371,19 +1415,19 @@ static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_fr * @param len_ingest: int * @return uint16: FECF **/ -static uint16_t Crypto_Calc_FECF(uint8_t* ingest, int len_ingest) +static uint16_t Crypto_Calc_FECF(uint8_t *ingest, int len_ingest) { uint16_t fecf = 0xFFFF; - uint16_t poly = 0x1021; // TODO: This polynomial is (CRC-CCITT) for ESA testing, may not match standard protocol + uint16_t poly = 0x1021; // TODO: This polynomial is (CRC-CCITT) for ESA testing, may not match standard protocol uint8_t bit; uint8_t c15; for (int i = 0; i < len_ingest; i++) - { // Byte Logic + { // Byte Logic for (int j = 0; j < 8; j++) - { // Bit Logic - bit = ((ingest[i] >> (7 - j) & 1) == 1); - c15 = ((fecf >> 15 & 1) == 1); + { // Bit Logic + bit = ((ingest[i] >> (7 - j) & 1) == 1); + c15 = ((fecf >> 15 & 1) == 1); fecf <<= 1; if (c15 ^ bit) { @@ -1397,17 +1441,18 @@ static uint16_t Crypto_Calc_FECF(uint8_t* ingest, int len_ingest) fecf++; } - #ifdef FECF_DEBUG - printf(KCYN "Crypto_Calc_FECF: 0x%02x%02x%02x%02x%02x, len_ingest = %d\n" RESET, ingest[0], ingest[1], ingest[2], ingest[3], ingest[4], len_ingest); - printf(KCYN "0x" RESET); - for (int x = 0; x < len_ingest; x++) - { - printf(KCYN "%02x" RESET, (uint8_t)*(ingest+x)); - } - printf(KCYN "\n" RESET); - printf(KCYN "In Crypto_Calc_FECF! fecf = 0x%04x\n" RESET, fecf); - #endif - +#ifdef FECF_DEBUG + printf(KCYN "Crypto_Calc_FECF: 0x%02x%02x%02x%02x%02x, len_ingest = %d\n" RESET, ingest[0], ingest[1], ingest[2], + ingest[3], ingest[4], len_ingest); + printf(KCYN "0x" RESET); + for (int x = 0; x < len_ingest; x++) + { + printf(KCYN "%02x" RESET, (uint8_t) * (ingest + x)); + } + printf(KCYN "\n" RESET); + printf(KCYN "In Crypto_Calc_FECF! fecf = 0x%04x\n" RESET, fecf); +#endif + return fecf; } @@ -1418,17 +1463,17 @@ static uint16_t Crypto_Calc_FECF(uint8_t* ingest, int len_ingest) * @param size: int * @return uint16: CRC **/ -static uint16_t Crypto_Calc_CRC16(uint8_t* data, int size) -{ // Code provided by ESA +static uint16_t Crypto_Calc_CRC16(uint8_t *data, int size) +{ // Code provided by ESA uint16_t crc = 0xFFFF; - for ( ; size > 0; size--) - { - //printf("*data = 0x%02x \n", (uint8_t) *data); + for (; size > 0; size--) + { + // printf("*data = 0x%02x \n", (uint8_t) *data); crc = ((crc << 8) & 0xFF00) ^ crc16Table[(crc >> 8) ^ *data++]; } - - return crc; + + return crc; } /* @@ -1467,7 +1512,7 @@ static int32_t Crypto_Key_OTAR(void) report.af = 1; if (log_summary.rs > 0) { - Crypto_increment((uint8_t*)&log_summary.num_se, 4); + Crypto_increment((uint8_t *)&log_summary.num_se, 4); log_summary.rs--; log.blk[log_count].emt = MKID_INVALID_EID; log.blk[log_count].emv[0] = 0x4E; @@ -1482,88 +1527,73 @@ static int32_t Crypto_Key_OTAR(void) } for (int count = 2; count < (2 + IV_SIZE); count++) - { // Initialization Vector - packet.iv[count-2] = sdls_frame.pdu.data[count]; - //printf("packet.iv[%d] = 0x%02x\n", count-2, packet.iv[count-2]); + { // Initialization Vector + packet.iv[count - 2] = sdls_frame.pdu.data[count]; + // printf("packet.iv[%d] = 0x%02x\n", count-2, packet.iv[count-2]); } - - count = sdls_frame.pdu.pdu_len - MAC_SIZE; + + count = sdls_frame.pdu.pdu_len - MAC_SIZE; for (int w = 0; w < 16; w++) - { // MAC + { // MAC packet.mac[w] = sdls_frame.pdu.data[count + w]; - //printf("packet.mac[%d] = 0x%02x\n", w, packet.mac[w]); + // printf("packet.mac[%d] = 0x%02x\n", w, packet.mac[w]); } - gcry_error = gcry_cipher_open( - &(tmp_hd), - GCRY_CIPHER_AES256, - GCRY_CIPHER_MODE_GCM, - GCRY_CIPHER_CBC_MAC - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERROR; return status; } - gcry_error = gcry_cipher_setkey( - tmp_hd, - &(ek_ring[packet.mkid].value[0]), - KEY_SIZE - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[packet.mkid].value[0]), KEY_SIZE); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERROR; return status; } - gcry_error = gcry_cipher_setiv( - tmp_hd, - &(packet.iv[0]), - IV_SIZE - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + gcry_error = gcry_cipher_setiv(tmp_hd, &(packet.iv[0]), IV_SIZE); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERROR; return status; } - gcry_error = gcry_cipher_decrypt( - tmp_hd, - &(sdls_frame.pdu.data[14]), // plaintext output - pdu_keys * (2 + KEY_SIZE), // length of data - NULL, // in place decryption - 0 // in data length + gcry_error = gcry_cipher_decrypt(tmp_hd, + &(sdls_frame.pdu.data[14]), // plaintext output + pdu_keys * (2 + KEY_SIZE), // length of data + NULL, // in place decryption + 0 // in data length ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERROR; return status; } - gcry_error = gcry_cipher_checktag( - tmp_hd, - &(packet.mac[0]), // tag input - MAC_SIZE // tag size + gcry_error = gcry_cipher_checktag(tmp_hd, + &(packet.mac[0]), // tag input + MAC_SIZE // tag size ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERROR; return status; } gcry_cipher_close(tmp_hd); - + // Read in Decrypted Data for (int count = 14; x < pdu_keys; x++) - { // Encrypted Key Blocks - packet.EKB[x].ekid = (sdls_frame.pdu.data[count] << 8) | (sdls_frame.pdu.data[count+1]); + { // Encrypted Key Blocks + packet.EKB[x].ekid = (sdls_frame.pdu.data[count] << 8) | (sdls_frame.pdu.data[count + 1]); if (packet.EKB[x].ekid < 128) { report.af = 1; if (log_summary.rs > 0) { - Crypto_increment((uint8_t*)&log_summary.num_se, 4); + Crypto_increment((uint8_t *)&log_summary.num_se, 4); log_summary.rs--; log.blk[log_count].emt = OTAR_MK_ERR_EID; log.blk[log_count].emv[0] = 0x4E; // N @@ -1574,17 +1604,17 @@ static int32_t Crypto_Key_OTAR(void) } printf(KRED "Error: Cannot OTAR master key! \n" RESET); status = CRYPTO_LIB_ERROR; - return status; + return status; } else - { + { count = count + 2; for (int y = count; y < (KEY_SIZE + count); y++) - { // Encrypted Key - packet.EKB[x].ek[y-count] = sdls_frame.pdu.data[y]; - #ifdef SA_DEBUG - printf("\t packet.EKB[%d].ek[%d] = 0x%02x\n", x, y-count, packet.EKB[x].ek[y-count]); - #endif + { // Encrypted Key + packet.EKB[x].ek[y - count] = sdls_frame.pdu.data[y]; +#ifdef SA_DEBUG + printf("\t packet.EKB[%d].ek[%d] = 0x%02x\n", x, y - count, packet.EKB[x].ek[y - count]); +#endif // Setup Key Ring ek_ring[packet.EKB[x].ekid].value[y - count] = sdls_frame.pdu.data[y]; @@ -1596,20 +1626,20 @@ static int32_t Crypto_Key_OTAR(void) } } - #ifdef PDU_DEBUG - printf("Received %d keys via master key %d: \n", pdu_keys, packet.mkid); - for (int x = 0; x < pdu_keys; x++) +#ifdef PDU_DEBUG + printf("Received %d keys via master key %d: \n", pdu_keys, packet.mkid); + for (int x = 0; x < pdu_keys; x++) + { + printf("%d) Key ID = %d, 0x", x + 1, packet.EKB[x].ekid); + for (int y = 0; y < KEY_SIZE; y++) { - printf("%d) Key ID = %d, 0x", x+1, packet.EKB[x].ekid); - for(int y = 0; y < KEY_SIZE; y++) - { - printf("%02x", packet.EKB[x].ek[y]); - } - printf("\n"); - } - #endif - - return CRYPTO_LIB_SUCCESS; + printf("%02x", packet.EKB[x].ek[y]); + } + printf("\n"); + } +#endif + + return CRYPTO_LIB_SUCCESS; } /** * @brief Function: Crypto_Key_update @@ -1618,53 +1648,53 @@ static int32_t Crypto_Key_OTAR(void) * @return uint32: Success/Failure **/ static int32_t Crypto_Key_update(uint8_t state) -{ // Local variables +{ // Local variables SDLS_KEY_BLK_t packet; int count = 0; int pdu_keys = sdls_frame.pdu.pdu_len / 2; - #ifdef PDU_DEBUG - printf("Keys "); - #endif +#ifdef PDU_DEBUG + printf("Keys "); +#endif // Read in PDU for (int x = 0; x < pdu_keys; x++) { - packet.kblk[x].kid = (sdls_frame.pdu.data[count] << 8) | (sdls_frame.pdu.data[count+1]); + packet.kblk[x].kid = (sdls_frame.pdu.data[count] << 8) | (sdls_frame.pdu.data[count + 1]); count = count + 2; - #ifdef PDU_DEBUG - if (x != (pdu_keys - 1)) - { - printf("%d, ", packet.kblk[x].kid); - } - else - { - printf("and %d ", packet.kblk[x].kid); - } - #endif - } - #ifdef PDU_DEBUG - printf("changed to state "); - switch (state) +#ifdef PDU_DEBUG + if (x != (pdu_keys - 1)) { - case KEY_PREACTIVE: - printf("PREACTIVE. \n"); - break; - case KEY_ACTIVE: - printf("ACTIVE. \n"); - break; - case KEY_DEACTIVATED: - printf("DEACTIVATED. \n"); - break; - case KEY_DESTROYED: - printf("DESTROYED. \n"); - break; - case KEY_CORRUPTED: - printf("CORRUPTED. \n"); - break; - default: - printf("ERROR. \n"); - break; + printf("%d, ", packet.kblk[x].kid); + } + else + { + printf("and %d ", packet.kblk[x].kid); } - #endif +#endif + } +#ifdef PDU_DEBUG + printf("changed to state "); + switch (state) + { + case KEY_PREACTIVE: + printf("PREACTIVE. \n"); + break; + case KEY_ACTIVE: + printf("ACTIVE. \n"); + break; + case KEY_DEACTIVATED: + printf("DEACTIVATED. \n"); + break; + case KEY_DESTROYED: + printf("DESTROYED. \n"); + break; + case KEY_CORRUPTED: + printf("CORRUPTED. \n"); + break; + default: + printf("ERROR. \n"); + break; + } +#endif // Update Key State for (int x = 0; x < pdu_keys; x++) { @@ -1673,7 +1703,7 @@ static int32_t Crypto_Key_update(uint8_t state) report.af = 1; if (log_summary.rs > 0) { - Crypto_increment((uint8_t*)&log_summary.num_se, 4); + Crypto_increment((uint8_t *)&log_summary.num_se, 4); log_summary.rs--; log.blk[log_count].emt = MKID_STATE_ERR_EID; log.blk[log_count].emv[0] = 0x4E; @@ -1689,15 +1719,15 @@ static int32_t Crypto_Key_update(uint8_t state) if (ek_ring[packet.kblk[x].kid].key_state == (state - 1)) { ek_ring[packet.kblk[x].kid].key_state = state; - #ifdef PDU_DEBUG - //printf("Key ID %d state changed to ", packet.kblk[x].kid); - #endif +#ifdef PDU_DEBUG + // printf("Key ID %d state changed to ", packet.kblk[x].kid); +#endif } - else + else { if (log_summary.rs > 0) { - Crypto_increment((uint8_t*)&log_summary.num_se, 4); + Crypto_increment((uint8_t *)&log_summary.num_se, 4); log_summary.rs--; log.blk[log_count].emt = KEY_TRANSITION_ERR_EID; log.blk[log_count].emv[0] = 0x4E; @@ -1709,7 +1739,7 @@ static int32_t Crypto_Key_update(uint8_t state) printf(KRED "Error: Key %d cannot transition to desired state! \n" RESET, packet.kblk[x].kid); } } - return CRYPTO_LIB_SUCCESS; + return CRYPTO_LIB_SUCCESS; } /** @@ -1717,7 +1747,7 @@ static int32_t Crypto_Key_update(uint8_t state) * @param ingest: uint8_t* * @return int32: count **/ -static int32_t Crypto_Key_inventory(uint8_t* ingest) +static int32_t Crypto_Key_inventory(uint8_t *ingest) { // Local variables SDLS_KEY_INVENTORY_t packet; @@ -1725,9 +1755,9 @@ static int32_t Crypto_Key_inventory(uint8_t* ingest) uint16_t range = 0; // Read in PDU - packet.kid_first = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count+1]); + packet.kid_first = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count + 1]); count = count + 2; - packet.kid_last = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count+1]); + packet.kid_last = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count + 1]); count = count + 2; // Prepare for Reply @@ -1738,7 +1768,7 @@ static int32_t Crypto_Key_inventory(uint8_t* ingest) ingest[count++] = (range & 0xFF00) >> 8; ingest[count++] = (range & 0x00FF); for (uint16_t x = packet.kid_first; x < packet.kid_last; x++) - { // Key ID + { // Key ID ingest[count++] = (x & 0xFF00) >> 8; ingest[count++] = (x & 0x00FF); // Key State @@ -1753,7 +1783,7 @@ static int32_t Crypto_Key_inventory(uint8_t* ingest) * @param tc_frame: TC_t* * @return int32: count **/ -static int32_t Crypto_Key_verify(uint8_t* ingest,TC_t* tc_frame) +static int32_t Crypto_Key_verify(uint8_t *ingest, TC_t *tc_frame) { // Local variables SDLS_KEYV_CMD_t packet; @@ -1764,118 +1794,102 @@ static int32_t Crypto_Key_verify(uint8_t* ingest,TC_t* tc_frame) gcry_cipher_hd_t tmp_hd; uint8_t iv_loc; - //uint8_t tmp_mac[MAC_SIZE]; + // uint8_t tmp_mac[MAC_SIZE]; + +#ifdef PDU_DEBUG + printf("Crypto_Key_verify: Requested %d key(s) to verify \n", pdu_keys); +#endif - #ifdef PDU_DEBUG - printf("Crypto_Key_verify: Requested %d key(s) to verify \n", pdu_keys); - #endif - // Read in PDU for (int x = 0; x < pdu_keys; x++) - { + { // Key ID - packet.blk[x].kid = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count+1]); + packet.blk[x].kid = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count + 1]); count = count + 2; - #ifdef PDU_DEBUG - printf("Crypto_Key_verify: Block %d Key ID is %d \n", x, packet.blk[x].kid); - #endif +#ifdef PDU_DEBUG + printf("Crypto_Key_verify: Block %d Key ID is %d \n", x, packet.blk[x].kid); +#endif // Key Challenge for (int y = 0; y < CHALLENGE_SIZE; y++) { packet.blk[x].challenge[y] = sdls_frame.pdu.data[count++]; } - #ifdef PDU_DEBUG - printf("\n"); - #endif +#ifdef PDU_DEBUG + printf("\n"); +#endif } - + // Prepare for Reply sdls_frame.pdu.pdu_len = pdu_keys * (2 + IV_SIZE + CHALLENGE_SIZE + CHALLENGE_MAC_SIZE); sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; count = Crypto_Prep_Reply(ingest, 128); for (int x = 0; x < pdu_keys; x++) - { // Key ID + { // Key ID ingest[count++] = (packet.blk[x].kid & 0xFF00) >> 8; ingest[count++] = (packet.blk[x].kid & 0x00FF); // Initialization Vector iv_loc = count; for (int y = 0; y < IV_SIZE; y++) - { - ingest[count++] = *(tc_frame->tc_sec_header.iv+y); + { + ingest[count++] = *(tc_frame->tc_sec_header.iv + y); } - ingest[count-1] = ingest[count-1] + x + 1; + ingest[count - 1] = ingest[count - 1] + x + 1; - // Encrypt challenge - gcry_error = gcry_cipher_open( - &(tmp_hd), - GCRY_CIPHER_AES256, - GCRY_CIPHER_MODE_GCM, - GCRY_CIPHER_CBC_MAC - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + // Encrypt challenge + gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); } - gcry_error = gcry_cipher_setkey( - tmp_hd, - &(ek_ring[packet.blk[x].kid].value[0]), - KEY_SIZE - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[packet.blk[x].kid].value[0]), KEY_SIZE); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); } - gcry_error = gcry_cipher_setiv( - tmp_hd, - &(ingest[iv_loc]), - IV_SIZE - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + gcry_error = gcry_cipher_setiv(tmp_hd, &(ingest[iv_loc]), IV_SIZE); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); } - gcry_error = gcry_cipher_encrypt( - tmp_hd, - &(ingest[count]), // ciphertext output - CHALLENGE_SIZE, // length of data - &(packet.blk[x].challenge[0]), // plaintext input - CHALLENGE_SIZE // in data length + gcry_error = gcry_cipher_encrypt(tmp_hd, + &(ingest[count]), // ciphertext output + CHALLENGE_SIZE, // length of data + &(packet.blk[x].challenge[0]), // plaintext input + CHALLENGE_SIZE // in data length ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_encrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_encrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); } count = count + CHALLENGE_SIZE; // Don't forget to increment count! - - gcry_error = gcry_cipher_gettag( - tmp_hd, - &(ingest[count]), // tag output - CHALLENGE_MAC_SIZE // tag size + + gcry_error = gcry_cipher_gettag(tmp_hd, + &(ingest[count]), // tag output + CHALLENGE_MAC_SIZE // tag size ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_gettag error code %d \n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_gettag error code %d \n" RESET, gcry_error & GPG_ERR_CODE_MASK); } count = count + CHALLENGE_MAC_SIZE; // Don't forget to increment count! // Copy from tmp_mac into ingest - //for( int y = 0; y < CHALLENGE_MAC_SIZE; y++) + // for( int y = 0; y < CHALLENGE_MAC_SIZE; y++) //{ // ingest[count++] = tmp_mac[y]; //} gcry_cipher_close(tmp_hd); } - #ifdef PDU_DEBUG - printf("Crypto_Key_verify: Response is %d bytes \n", count); - #endif +#ifdef PDU_DEBUG + printf("Crypto_Key_verify: Response is %d bytes \n", count); +#endif return count; } - /* ** Security Association Monitoring and Control */ @@ -1884,7 +1898,7 @@ static int32_t Crypto_Key_verify(uint8_t* ingest,TC_t* tc_frame) * @param ingest: uint8_t* * return int32: count **/ -static int32_t Crypto_MC_ping(uint8_t* ingest) +static int32_t Crypto_MC_ping(uint8_t *ingest) { int count = 0; @@ -1901,7 +1915,7 @@ static int32_t Crypto_MC_ping(uint8_t* ingest) * @param ingest: uint8_t* * @return int32: count **/ -static int32_t Crypto_MC_status(uint8_t* ingest) +static int32_t Crypto_MC_status(uint8_t *ingest) { int count = 0; @@ -1911,17 +1925,17 @@ static int32_t Crypto_MC_status(uint8_t* ingest) sdls_frame.pdu.pdu_len = 2; // 4 sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; count = Crypto_Prep_Reply(ingest, 128); - + // PDU - //ingest[count++] = (log_summary.num_se & 0xFF00) >> 8; + // ingest[count++] = (log_summary.num_se & 0xFF00) >> 8; ingest[count++] = (log_summary.num_se & 0x00FF); - //ingest[count++] = (log_summary.rs & 0xFF00) >> 8; + // ingest[count++] = (log_summary.rs & 0xFF00) >> 8; ingest[count++] = (log_summary.rs & 0x00FF); - - #ifdef PDU_DEBUG - printf("log_summary.num_se = 0x%02x \n",log_summary.num_se); - printf("log_summary.rs = 0x%02x \n",log_summary.rs); - #endif + +#ifdef PDU_DEBUG + printf("log_summary.num_se = 0x%02x \n", log_summary.num_se); + printf("log_summary.rs = 0x%02x \n", log_summary.rs); +#endif return count; } @@ -1931,12 +1945,12 @@ static int32_t Crypto_MC_status(uint8_t* ingest) * @param ingest: uint8_t* * @return int32: Count **/ -static int32_t Crypto_MC_dump(uint8_t* ingest) +static int32_t Crypto_MC_dump(uint8_t *ingest) { int count = 0; - + // Prepare for Reply - sdls_frame.pdu.pdu_len = (log_count * 6); // SDLS_MC_DUMP_RPLY_SIZE + sdls_frame.pdu.pdu_len = (log_count * 6); // SDLS_MC_DUMP_RPLY_SIZE sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; count = Crypto_Prep_Reply(ingest, 128); @@ -1944,7 +1958,7 @@ static int32_t Crypto_MC_dump(uint8_t* ingest) for (int x = 0; x < log_count; x++) { ingest[count++] = log.blk[x].emt; - //ingest[count++] = (log.blk[x].em_len & 0xFF00) >> 8; + // ingest[count++] = (log.blk[x].em_len & 0xFF00) >> 8; ingest[count++] = (log.blk[x].em_len & 0x00FF); for (int y = 0; y < EMV_SIZE; y++) { @@ -1952,13 +1966,13 @@ static int32_t Crypto_MC_dump(uint8_t* ingest) } } - #ifdef PDU_DEBUG - printf("log_count = %d \n", log_count); - printf("log_summary.num_se = 0x%02x \n",log_summary.num_se); - printf("log_summary.rs = 0x%02x \n",log_summary.rs); - #endif +#ifdef PDU_DEBUG + printf("log_count = %d \n", log_count); + printf("log_summary.num_se = 0x%02x \n", log_summary.num_se); + printf("log_summary.rs = 0x%02x \n", log_summary.rs); +#endif - return count; + return count; } /** @@ -1966,7 +1980,7 @@ static int32_t Crypto_MC_dump(uint8_t* ingest) * @param ingest: uint8_t* * @return int32: count **/ -static int32_t Crypto_MC_erase(uint8_t* ingest) +static int32_t Crypto_MC_erase(uint8_t *ingest) { int count = 0; @@ -1992,12 +2006,12 @@ static int32_t Crypto_MC_erase(uint8_t* ingest) count = Crypto_Prep_Reply(ingest, 128); // PDU - //ingest[count++] = (log_summary.num_se & 0xFF00) >> 8; + // ingest[count++] = (log_summary.num_se & 0xFF00) >> 8; ingest[count++] = (log_summary.num_se & 0x00FF); - //ingest[count++] = (log_summary.rs & 0xFF00) >> 8; + // ingest[count++] = (log_summary.rs & 0xFF00) >> 8; ingest[count++] = (log_summary.rs & 0x00FF); - return count; + return count; } /** @@ -2005,7 +2019,7 @@ static int32_t Crypto_MC_erase(uint8_t* ingest) * @param ingest: uint8_t* * @return int32: Count **/ -static int32_t Crypto_MC_selftest(uint8_t* ingest) +static int32_t Crypto_MC_selftest(uint8_t *ingest) { uint8_t count = 0; uint8_t result = ST_OK; @@ -2018,8 +2032,8 @@ static int32_t Crypto_MC_selftest(uint8_t* ingest) count = Crypto_Prep_Reply(ingest, 128); ingest[count++] = result; - - return count; + + return count; } /** @@ -2027,11 +2041,11 @@ static int32_t Crypto_MC_selftest(uint8_t* ingest) * @param ingest: uint8_t* * @return int32: Count **/ -static int32_t Crypto_SA_readARSN(uint8_t* ingest) +static int32_t Crypto_SA_readARSN(uint8_t *ingest) { uint8_t count = 0; uint16_t spi = 0x0000; - SecurityAssociation_t* sa_ptr; + SecurityAssociation_t *sa_ptr; // Read ingest spi = ((uint8_t)sdls_frame.pdu.data[0] << 8) | (uint8_t)sdls_frame.pdu.data[1]; @@ -2045,49 +2059,48 @@ static int32_t Crypto_SA_readARSN(uint8_t* ingest) ingest[count++] = (spi & 0xFF00) >> 8; ingest[count++] = (spi & 0x00FF); - - if(sadb_routine->sadb_get_sa_from_spi(spi,&sa_ptr) != CRYPTO_LIB_SUCCESS){ - //TODO - Error handling - return CRYPTO_LIB_ERROR; //Error -- unable to get SA from SPI. + if (sadb_routine->sadb_get_sa_from_spi(spi, &sa_ptr) != CRYPTO_LIB_SUCCESS) + { + // TODO - Error handling + return CRYPTO_LIB_ERROR; // Error -- unable to get SA from SPI. } - if (sa_ptr->shivf_len > 0) - { // Set IV - authenticated encryption + { // Set IV - authenticated encryption for (int x = 0; x < sa_ptr->shivf_len - 1; x++) { ingest[count++] = *(sa_ptr->iv + x); } - + // TODO: Do we need this? if (*(sa_ptr->iv + sa_ptr->shivf_len - 1) > 0) - { // Adjust to report last received, not expected - ingest[count++] = *(sa_ptr->iv +sa_ptr->shivf_len - 1) - 1; + { // Adjust to report last received, not expected + ingest[count++] = *(sa_ptr->iv + sa_ptr->shivf_len - 1) - 1; } else - { + { ingest[count++] = *(sa_ptr->iv + sa_ptr->shivf_len - 1); } } else - { + { // TODO } - #ifdef PDU_DEBUG - printf("spi = %d \n", spi); - if (sa_ptr->shivf_len > 0) +#ifdef PDU_DEBUG + printf("spi = %d \n", spi); + if (sa_ptr->shivf_len > 0) + { + printf("ARSN = 0x"); + for (int x = 0; x < sa_ptr->shivf_len; x++) { - printf("ARSN = 0x"); - for (int x = 0; x < sa_ptr->shivf_len; x++) - { - printf("%02x", *(sa_ptr->iv + x)); - } - printf("\n"); + printf("%02x", *(sa_ptr->iv + x)); } - #endif - - return count; + printf("\n"); + } +#endif + + return count; } /** @@ -2095,12 +2108,12 @@ static int32_t Crypto_SA_readARSN(uint8_t* ingest) * @return int32: Success/Failure **/ static int32_t Crypto_MC_resetalarm(void) -{ // Reset all alarm flags +{ // Reset all alarm flags report.af = 0; report.bsnf = 0; report.bmacf = 0; - report.ispif = 0; - return CRYPTO_LIB_SUCCESS; + report.ispif = 0; + return CRYPTO_LIB_SUCCESS; } /** @@ -2108,7 +2121,7 @@ static int32_t Crypto_MC_resetalarm(void) * @param ingest: uint8_t* * @return int32: count **/ -static int32_t Crypto_User_IdleTrigger(uint8_t* ingest) +static int32_t Crypto_User_IdleTrigger(uint8_t *ingest) { uint8_t count = 0; @@ -2116,27 +2129,27 @@ static int32_t Crypto_User_IdleTrigger(uint8_t* ingest) sdls_frame.pdu.pdu_len = 0; sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; count = Crypto_Prep_Reply(ingest, 144); - - return count; + + return count; } /** * @brief Function: Crypto_User_BadSPI * @return int32: Success/Failure - **/ + **/ static int32_t Crypto_User_BadSPI(void) { // Toggle Bad Sequence Number if (badSPI == 0) { badSPI = 1; - } + } else { badSPI = 0; } - - return CRYPTO_LIB_SUCCESS; + + return CRYPTO_LIB_SUCCESS; } /** @@ -2149,13 +2162,13 @@ static int32_t Crypto_User_BadMAC(void) if (badMAC == 0) { badMAC = 1; - } + } else { badMAC = 0; } - - return CRYPTO_LIB_SUCCESS; + + return CRYPTO_LIB_SUCCESS; } /** @@ -2187,13 +2200,13 @@ static int32_t Crypto_User_BadFECF(void) if (badFECF == 0) { badFECF = 1; - } + } else { badFECF = 0; } - - return CRYPTO_LIB_SUCCESS; + + return CRYPTO_LIB_SUCCESS; } /** @@ -2208,20 +2221,20 @@ static int32_t Crypto_User_ModifyKey(void) switch (mod) { - case 1: // Invalidate Key - ek_ring[kid].value[KEY_SIZE-1]++; - printf("Key %d value invalidated! \n", kid); - break; - case 2: // Modify key state - ek_ring[kid].key_state = (uint8_t)sdls_frame.pdu.data[3] & 0x0F; - printf("Key %d state changed to %d! \n", kid, mod); - break; - default: - // Error - break; + case 1: // Invalidate Key + ek_ring[kid].value[KEY_SIZE - 1]++; + printf("Key %d value invalidated! \n", kid); + break; + case 2: // Modify key state + ek_ring[kid].key_state = (uint8_t)sdls_frame.pdu.data[3] & 0x0F; + printf("Key %d state changed to %d! \n", kid, mod); + break; + default: + // Error + break; } - - return CRYPTO_LIB_SUCCESS; + + return CRYPTO_LIB_SUCCESS; } /** @@ -2231,8 +2244,8 @@ static int32_t Crypto_User_ModifyKey(void) **/ static int32_t Crypto_User_ModifyActiveTM(void) { - tm_frame.tm_sec_header.spi = (uint8_t)sdls_frame.pdu.data[0]; - return CRYPTO_LIB_SUCCESS; + tm_frame.tm_sec_header.spi = (uint8_t)sdls_frame.pdu.data[0]; + return CRYPTO_LIB_SUCCESS; } /** @@ -2242,13 +2255,14 @@ static int32_t Crypto_User_ModifyActiveTM(void) static int32_t Crypto_User_ModifyVCID(void) { tm_frame.tm_header.vcid = (uint8_t)sdls_frame.pdu.data[0]; - SecurityAssociation_t* sa_ptr; + SecurityAssociation_t *sa_ptr; for (int i = 0; i < NUM_GVCID; i++) { - if(sadb_routine->sadb_get_sa_from_spi(i,&sa_ptr) != CRYPTO_LIB_SUCCESS){ - //TODO - Error handling - return CRYPTO_LIB_ERROR; //Error -- unable to get SA from SPI. + if (sadb_routine->sadb_get_sa_from_spi(i, &sa_ptr) != CRYPTO_LIB_SUCCESS) + { + // TODO - Error handling + return CRYPTO_LIB_ERROR; // Error -- unable to get SA from SPI. } for (int j = 0; j < NUM_SA; j++) { @@ -2258,7 +2272,7 @@ static int32_t Crypto_User_ModifyVCID(void) if (sa_ptr->gvcid_tm_blk[j].vcid == tm_frame.tm_header.vcid) { tm_frame.tm_sec_header.spi = i; - printf("TM Frame SPI changed to %d \n",i); + printf("TM Frame SPI changed to %d \n", i); break; } } @@ -2277,305 +2291,315 @@ static int32_t Crypto_User_ModifyVCID(void) * @param tc_frame: TC_t* * @return int32: Success/Failure **/ -static int32_t Crypto_PDU(uint8_t* ingest,TC_t* tc_frame) +static int32_t Crypto_PDU(uint8_t *ingest, TC_t *tc_frame) { int32_t status = CRYPTO_LIB_SUCCESS; - + switch (sdls_frame.pdu.type) { - case 0: // Command - switch (sdls_frame.pdu.uf) + case 0: // Command + switch (sdls_frame.pdu.uf) + { + case 0: // CCSDS Defined Command + switch (sdls_frame.pdu.sg) { - case 0: // CCSDS Defined Command - switch (sdls_frame.pdu.sg) - { - case SG_KEY_MGMT: // Key Management Procedure - switch (sdls_frame.pdu.pid) - { - case PID_OTAR: - #ifdef PDU_DEBUG - printf(KGRN "Key OTAR\n" RESET); - #endif - status = Crypto_Key_OTAR(); - break; - case PID_KEY_ACTIVATION: - #ifdef PDU_DEBUG - printf(KGRN "Key Activate\n" RESET); - #endif - status = Crypto_Key_update(KEY_ACTIVE); - break; - case PID_KEY_DEACTIVATION: - #ifdef PDU_DEBUG - printf(KGRN "Key Deactivate\n" RESET); - #endif - status = Crypto_Key_update(KEY_DEACTIVATED); - break; - case PID_KEY_VERIFICATION: - #ifdef PDU_DEBUG - printf(KGRN "Key Verify\n" RESET); - #endif - status = Crypto_Key_verify(ingest,tc_frame); - break; - case PID_KEY_DESTRUCTION: - #ifdef PDU_DEBUG - printf(KGRN "Key Destroy\n" RESET); - #endif - status = Crypto_Key_update(KEY_DESTROYED); - break; - case PID_KEY_INVENTORY: - #ifdef PDU_DEBUG - printf(KGRN "Key Inventory\n" RESET); - #endif - status = Crypto_Key_inventory(ingest); - break; - default: - printf(KRED "Error: Crypto_PDU failed interpreting Key Management Procedure Identification Field! \n" RESET); - break; - } - break; - case SG_SA_MGMT: // Security Association Management Procedure - switch (sdls_frame.pdu.pid) - { - case PID_CREATE_SA: - #ifdef PDU_DEBUG - printf(KGRN "SA Create\n" RESET); - #endif - status = sadb_routine->sadb_sa_create(); - break; - case PID_DELETE_SA: - #ifdef PDU_DEBUG - printf(KGRN "SA Delete\n" RESET); - #endif - status = sadb_routine->sadb_sa_delete(); - break; - case PID_SET_ARSNW: - #ifdef PDU_DEBUG - printf(KGRN "SA setARSNW\n" RESET); - #endif - status = sadb_routine->sadb_sa_setARSNW(); - break; - case PID_REKEY_SA: - #ifdef PDU_DEBUG - printf(KGRN "SA Rekey\n" RESET); - #endif - status = sadb_routine->sadb_sa_rekey(); - break; - case PID_EXPIRE_SA: - #ifdef PDU_DEBUG - printf(KGRN "SA Expire\n" RESET); - #endif - status = sadb_routine->sadb_sa_expire(); - break; - case PID_SET_ARSN: - #ifdef PDU_DEBUG - printf(KGRN "SA SetARSN\n" RESET); - #endif - status = sadb_routine->sadb_sa_setARSN(); - break; - case PID_START_SA: - #ifdef PDU_DEBUG - printf(KGRN "SA Start\n" RESET); - #endif - status = sadb_routine->sadb_sa_start(tc_frame); - break; - case PID_STOP_SA: - #ifdef PDU_DEBUG - printf(KGRN "SA Stop\n" RESET); - #endif - status = sadb_routine->sadb_sa_stop(); - break; - case PID_READ_ARSN: - #ifdef PDU_DEBUG - printf(KGRN "SA readARSN\n" RESET); - #endif - status = Crypto_SA_readARSN(ingest); - break; - case PID_SA_STATUS: - #ifdef PDU_DEBUG - printf(KGRN "SA Status\n" RESET); - #endif - status = sadb_routine->sadb_sa_status(ingest); - break; - default: - printf(KRED "Error: Crypto_PDU failed interpreting SA Procedure Identification Field! \n" RESET); - break; - } - break; - case SG_SEC_MON_CTRL: // Security Monitoring & Control Procedure - switch (sdls_frame.pdu.pid) - { - case PID_PING: - #ifdef PDU_DEBUG - printf(KGRN "MC Ping\n" RESET); - #endif - status = Crypto_MC_ping(ingest); - break; - case PID_LOG_STATUS: - #ifdef PDU_DEBUG - printf(KGRN "MC Status\n" RESET); - #endif - status = Crypto_MC_status(ingest); - break; - case PID_DUMP_LOG: - #ifdef PDU_DEBUG - printf(KGRN "MC Dump\n" RESET); - #endif - status = Crypto_MC_dump(ingest); - break; - case PID_ERASE_LOG: - #ifdef PDU_DEBUG - printf(KGRN "MC Erase\n" RESET); - #endif - status = Crypto_MC_erase(ingest); - break; - case PID_SELF_TEST: - #ifdef PDU_DEBUG - printf(KGRN "MC Selftest\n" RESET); - #endif - status = Crypto_MC_selftest(ingest); - break; - case PID_ALARM_FLAG: - #ifdef PDU_DEBUG - printf(KGRN "MC Reset Alarm\n" RESET); - #endif - status = Crypto_MC_resetalarm(); - break; - default: - printf(KRED "Error: Crypto_PDU failed interpreting MC Procedure Identification Field! \n" RESET); - break; - } - break; - default: // ERROR - printf(KRED "Error: Crypto_PDU failed interpreting Service Group! \n" RESET); - break; - } + case SG_KEY_MGMT: // Key Management Procedure + switch (sdls_frame.pdu.pid) + { + case PID_OTAR: +#ifdef PDU_DEBUG + printf(KGRN "Key OTAR\n" RESET); +#endif + status = Crypto_Key_OTAR(); break; - - case 1: // User Defined Command - switch (sdls_frame.pdu.sg) - { - default: - switch (sdls_frame.pdu.pid) - { - case 0: // Idle Frame Trigger - #ifdef PDU_DEBUG - printf(KMAG "User Idle Trigger\n" RESET); - #endif - status = Crypto_User_IdleTrigger(ingest); - break; - case 1: // Toggle Bad SPI - #ifdef PDU_DEBUG - printf(KMAG "User Toggle Bad SPI\n" RESET); - #endif - status = Crypto_User_BadSPI(); - break; - case 2: // Toggle Bad IV - #ifdef PDU_DEBUG - printf(KMAG "User Toggle Bad IV\n" RESET); - #endif - status = Crypto_User_BadIV();\ - break; - case 3: // Toggle Bad MAC - #ifdef PDU_DEBUG - printf(KMAG "User Toggle Bad MAC\n" RESET); - #endif - status = Crypto_User_BadMAC(); - break; - case 4: // Toggle Bad FECF - #ifdef PDU_DEBUG - printf(KMAG "User Toggle Bad FECF\n" RESET); - #endif - status = Crypto_User_BadFECF(); - break; - case 5: // Modify Key - #ifdef PDU_DEBUG - printf(KMAG "User Modify Key\n" RESET); - #endif - status = Crypto_User_ModifyKey(); - break; - case 6: // Modify ActiveTM - #ifdef PDU_DEBUG - printf(KMAG "User Modify Active TM\n" RESET); - #endif - status = Crypto_User_ModifyActiveTM(); - break; - case 7: // Modify TM VCID - #ifdef PDU_DEBUG - printf(KMAG "User Modify VCID\n" RESET); - #endif - status = Crypto_User_ModifyVCID(); - break; - default: - printf(KRED "Error: Crypto_PDU received user defined command! \n" RESET); - break; - } - } + case PID_KEY_ACTIVATION: +#ifdef PDU_DEBUG + printf(KGRN "Key Activate\n" RESET); +#endif + status = Crypto_Key_update(KEY_ACTIVE); break; + case PID_KEY_DEACTIVATION: +#ifdef PDU_DEBUG + printf(KGRN "Key Deactivate\n" RESET); +#endif + status = Crypto_Key_update(KEY_DEACTIVATED); + break; + case PID_KEY_VERIFICATION: +#ifdef PDU_DEBUG + printf(KGRN "Key Verify\n" RESET); +#endif + status = Crypto_Key_verify(ingest, tc_frame); + break; + case PID_KEY_DESTRUCTION: +#ifdef PDU_DEBUG + printf(KGRN "Key Destroy\n" RESET); +#endif + status = Crypto_Key_update(KEY_DESTROYED); + break; + case PID_KEY_INVENTORY: +#ifdef PDU_DEBUG + printf(KGRN "Key Inventory\n" RESET); +#endif + status = Crypto_Key_inventory(ingest); + break; + default: + printf(KRED "Error: Crypto_PDU failed interpreting Key Management Procedure Identification Field! " + "\n" RESET); + break; + } + break; + case SG_SA_MGMT: // Security Association Management Procedure + switch (sdls_frame.pdu.pid) + { + case PID_CREATE_SA: +#ifdef PDU_DEBUG + printf(KGRN "SA Create\n" RESET); +#endif + status = sadb_routine->sadb_sa_create(); + break; + case PID_DELETE_SA: +#ifdef PDU_DEBUG + printf(KGRN "SA Delete\n" RESET); +#endif + status = sadb_routine->sadb_sa_delete(); + break; + case PID_SET_ARSNW: +#ifdef PDU_DEBUG + printf(KGRN "SA setARSNW\n" RESET); +#endif + status = sadb_routine->sadb_sa_setARSNW(); + break; + case PID_REKEY_SA: +#ifdef PDU_DEBUG + printf(KGRN "SA Rekey\n" RESET); +#endif + status = sadb_routine->sadb_sa_rekey(); + break; + case PID_EXPIRE_SA: +#ifdef PDU_DEBUG + printf(KGRN "SA Expire\n" RESET); +#endif + status = sadb_routine->sadb_sa_expire(); + break; + case PID_SET_ARSN: +#ifdef PDU_DEBUG + printf(KGRN "SA SetARSN\n" RESET); +#endif + status = sadb_routine->sadb_sa_setARSN(); + break; + case PID_START_SA: +#ifdef PDU_DEBUG + printf(KGRN "SA Start\n" RESET); +#endif + status = sadb_routine->sadb_sa_start(tc_frame); + break; + case PID_STOP_SA: +#ifdef PDU_DEBUG + printf(KGRN "SA Stop\n" RESET); +#endif + status = sadb_routine->sadb_sa_stop(); + break; + case PID_READ_ARSN: +#ifdef PDU_DEBUG + printf(KGRN "SA readARSN\n" RESET); +#endif + status = Crypto_SA_readARSN(ingest); + break; + case PID_SA_STATUS: +#ifdef PDU_DEBUG + printf(KGRN "SA Status\n" RESET); +#endif + status = sadb_routine->sadb_sa_status(ingest); + break; + default: + printf(KRED "Error: Crypto_PDU failed interpreting SA Procedure Identification Field! \n" RESET); + break; + } + break; + case SG_SEC_MON_CTRL: // Security Monitoring & Control Procedure + switch (sdls_frame.pdu.pid) + { + case PID_PING: +#ifdef PDU_DEBUG + printf(KGRN "MC Ping\n" RESET); +#endif + status = Crypto_MC_ping(ingest); + break; + case PID_LOG_STATUS: +#ifdef PDU_DEBUG + printf(KGRN "MC Status\n" RESET); +#endif + status = Crypto_MC_status(ingest); + break; + case PID_DUMP_LOG: +#ifdef PDU_DEBUG + printf(KGRN "MC Dump\n" RESET); +#endif + status = Crypto_MC_dump(ingest); + break; + case PID_ERASE_LOG: +#ifdef PDU_DEBUG + printf(KGRN "MC Erase\n" RESET); +#endif + status = Crypto_MC_erase(ingest); + break; + case PID_SELF_TEST: +#ifdef PDU_DEBUG + printf(KGRN "MC Selftest\n" RESET); +#endif + status = Crypto_MC_selftest(ingest); + break; + case PID_ALARM_FLAG: +#ifdef PDU_DEBUG + printf(KGRN "MC Reset Alarm\n" RESET); +#endif + status = Crypto_MC_resetalarm(); + break; + default: + printf(KRED "Error: Crypto_PDU failed interpreting MC Procedure Identification Field! \n" RESET); + break; + } + break; + default: // ERROR + printf(KRED "Error: Crypto_PDU failed interpreting Service Group! \n" RESET); + break; } break; - - case 1: // Reply - printf(KRED "Error: Crypto_PDU failed interpreting PDU Type! Received a Reply!?! \n" RESET); + + case 1: // User Defined Command + switch (sdls_frame.pdu.sg) + { + default: + switch (sdls_frame.pdu.pid) + { + case 0: // Idle Frame Trigger +#ifdef PDU_DEBUG + printf(KMAG "User Idle Trigger\n" RESET); +#endif + status = Crypto_User_IdleTrigger(ingest); + break; + case 1: // Toggle Bad SPI +#ifdef PDU_DEBUG + printf(KMAG "User Toggle Bad SPI\n" RESET); +#endif + status = Crypto_User_BadSPI(); + break; + case 2: // Toggle Bad IV +#ifdef PDU_DEBUG + printf(KMAG "User Toggle Bad IV\n" RESET); +#endif + status = Crypto_User_BadIV(); + break; + case 3: // Toggle Bad MAC +#ifdef PDU_DEBUG + printf(KMAG "User Toggle Bad MAC\n" RESET); +#endif + status = Crypto_User_BadMAC(); + break; + case 4: // Toggle Bad FECF +#ifdef PDU_DEBUG + printf(KMAG "User Toggle Bad FECF\n" RESET); +#endif + status = Crypto_User_BadFECF(); + break; + case 5: // Modify Key +#ifdef PDU_DEBUG + printf(KMAG "User Modify Key\n" RESET); +#endif + status = Crypto_User_ModifyKey(); + break; + case 6: // Modify ActiveTM +#ifdef PDU_DEBUG + printf(KMAG "User Modify Active TM\n" RESET); +#endif + status = Crypto_User_ModifyActiveTM(); + break; + case 7: // Modify TM VCID +#ifdef PDU_DEBUG + printf(KMAG "User Modify VCID\n" RESET); +#endif + status = Crypto_User_ModifyVCID(); + break; + default: + printf(KRED "Error: Crypto_PDU received user defined command! \n" RESET); + break; + } + } break; + } + break; + + case 1: // Reply + printf(KRED "Error: Crypto_PDU failed interpreting PDU Type! Received a Reply!?! \n" RESET); + break; } - #ifdef CCSDS_DEBUG - if (status > 0) +#ifdef CCSDS_DEBUG + if (status > 0) + { + printf(KMAG "CCSDS message put on software bus: 0x" RESET); + for (int x = 0; x < status; x++) { - printf(KMAG "CCSDS message put on software bus: 0x" RESET); - for (int x = 0; x < status; x++) - { - printf(KMAG "%02x" RESET, (uint8_t) ingest[x]); - } - printf("\n"); + printf(KMAG "%02x" RESET, (uint8_t)ingest[x]); } - #endif + printf("\n"); + } +#endif return status; } /** -* @brief Function: Crypto_Get_Managed_Parameters_For_Gvcid -* @param tfvn: uint8 -* @param scid: uint16 -* @param vcid: uint8 -* @param managed_parameters_in: GvcidManagedParameters_t* -* @param managed_parameters_out: GvcidManagedParameters_t** -* @return int32: Success/Failure -**/ -static int32_t Crypto_Get_Managed_Parameters_For_Gvcid(uint8_t tfvn,uint16_t scid,uint8_t vcid,GvcidManagedParameters_t* managed_parameters_in, - GvcidManagedParameters_t** managed_parameters_out) + * @brief Function: Crypto_Get_Managed_Parameters_For_Gvcid + * @param tfvn: uint8 + * @param scid: uint16 + * @param vcid: uint8 + * @param managed_parameters_in: GvcidManagedParameters_t* + * @param managed_parameters_out: GvcidManagedParameters_t** + * @return int32: Success/Failure + **/ +static int32_t Crypto_Get_Managed_Parameters_For_Gvcid(uint8_t tfvn, uint16_t scid, uint8_t vcid, + GvcidManagedParameters_t *managed_parameters_in, + GvcidManagedParameters_t **managed_parameters_out) { int32_t status = MANAGED_PARAMETERS_FOR_GVCID_NOT_FOUND; - if(managed_parameters_in != NULL) + if (managed_parameters_in != NULL) { - if(managed_parameters_in->tfvn==tfvn && managed_parameters_in->scid==scid && managed_parameters_in->vcid==vcid) { + if (managed_parameters_in->tfvn == tfvn && managed_parameters_in->scid == scid && + managed_parameters_in->vcid == vcid) + { *managed_parameters_out = managed_parameters_in; status = CRYPTO_LIB_SUCCESS; return status; - }else { - return Crypto_Get_Managed_Parameters_For_Gvcid(tfvn,scid,vcid,managed_parameters_in->next,managed_parameters_out); + } + else + { + return Crypto_Get_Managed_Parameters_For_Gvcid(tfvn, scid, vcid, managed_parameters_in->next, + managed_parameters_out); } } else { - printf(KRED "Error: Managed Parameters for GVCID(TFVN: %d, SCID: %d, VCID: %d) not found. \n" RESET,tfvn,scid,vcid); + printf(KRED "Error: Managed Parameters for GVCID(TFVN: %d, SCID: %d, VCID: %d) not found. \n" RESET, tfvn, scid, + vcid); return status; } } /** -* @brief Function: Crypto_Free_Managed_Parameters -* Managed parameters are expected to live the duration of the program, this may not be necessary. -* @param managed_parameters: GvcidManagedParameters_t* -**/ -static void Crypto_Free_Managed_Parameters(GvcidManagedParameters_t* managed_parameters) + * @brief Function: Crypto_Free_Managed_Parameters + * Managed parameters are expected to live the duration of the program, this may not be necessary. + * @param managed_parameters: GvcidManagedParameters_t* + **/ +static void Crypto_Free_Managed_Parameters(GvcidManagedParameters_t *managed_parameters) { - if(managed_parameters==NULL){ - return; //Nothing to free, just return! + if (managed_parameters == NULL) + { + return; // Nothing to free, just return! } - if(managed_parameters->next != NULL){ + if (managed_parameters->next != NULL) + { Crypto_Free_Managed_Parameters(managed_parameters->next); } free(managed_parameters); @@ -2590,71 +2614,76 @@ static void Crypto_Free_Managed_Parameters(GvcidManagedParameters_t* managed_par * @param p_enc_frame_len: uint16 * @return int32: Success/Failure **/ -int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_frame_length, \ - uint8_t **pp_in_frame, uint16_t *p_enc_frame_len) +int32_t Crypto_TC_ApplySecurity(const uint8_t *p_in_frame, const uint16_t in_frame_length, uint8_t **pp_in_frame, + uint16_t *p_enc_frame_len) { // Local Variables int32_t status = CRYPTO_LIB_SUCCESS; TC_FramePrimaryHeader_t temp_tc_header; - SecurityAssociation_t* sa_ptr = NULL; + SecurityAssociation_t *sa_ptr = NULL; uint8_t *p_new_enc_frame = NULL; uint8_t sa_service_type = -1; uint16_t mac_loc = 0; uint16_t tf_payload_len = 0x0000; uint16_t new_fecf = 0x0000; - uint8_t* aad; + uint8_t *aad; gcry_cipher_hd_t tmp_hd; gcry_error_t gcry_error = GPG_ERR_NO_ERROR; uint16_t new_enc_frame_header_field_length = 0; uint32_t encryption_cipher; uint8_t ecs_is_aead_algorithm; - #ifdef DEBUG - printf(KYEL "\n----- Crypto_TC_ApplySecurity START -----\n" RESET); - #endif +#ifdef DEBUG + printf(KYEL "\n----- Crypto_TC_ApplySecurity START -----\n" RESET); +#endif if (p_in_frame == NULL) { status = CRYPTO_LIB_ERR_NULL_BUFFER; printf(KRED "Error: Input Buffer NULL! \n" RESET); - return status; // Just return here, nothing can be done. + return status; // Just return here, nothing can be done. } - #ifdef DEBUG - printf("%d TF Bytes received\n", in_frame_length); - printf("DEBUG - "); - for(int i=0; i < in_frame_length; i++) - { - printf("%02X", ((uint8_t *)&*p_in_frame)[i]); - } - printf("\nPrinted %d bytes\n", in_frame_length); - #endif +#ifdef DEBUG + printf("%d TF Bytes received\n", in_frame_length); + printf("DEBUG - "); + for (int i = 0; i < in_frame_length; i++) + { + printf("%02X", ((uint8_t *)&*p_in_frame)[i]); + } + printf("\nPrinted %d bytes\n", in_frame_length); +#endif - if(crypto_config == NULL) + if (crypto_config == NULL) { printf(KRED "ERROR: CryptoLib Configuration Not Set! -- CRYPTO_LIB_ERR_NO_CONFIG, Will Exit\n" RESET); status = CRYPTO_LIB_ERR_NO_CONFIG; } // Primary Header - temp_tc_header.tfvn = ((uint8_t)p_in_frame[0] & 0xC0) >> 6; + temp_tc_header.tfvn = ((uint8_t)p_in_frame[0] & 0xC0) >> 6; temp_tc_header.bypass = ((uint8_t)p_in_frame[0] & 0x20) >> 5; - temp_tc_header.cc = ((uint8_t)p_in_frame[0] & 0x10) >> 4; - temp_tc_header.spare = ((uint8_t)p_in_frame[0] & 0x0C) >> 2; - temp_tc_header.scid = ((uint8_t)p_in_frame[0] & 0x03) << 8; - temp_tc_header.scid = temp_tc_header.scid | (uint8_t)p_in_frame[1]; - temp_tc_header.vcid = ((uint8_t)p_in_frame[2] & 0xFC) >> 2 & crypto_config->vcid_bitmask; - temp_tc_header.fl = ((uint8_t)p_in_frame[2] & 0x03) << 8; - temp_tc_header.fl = temp_tc_header.fl | (uint8_t)p_in_frame[3]; - temp_tc_header.fsn = (uint8_t)p_in_frame[4]; - - //Lookup-retrieve managed parameters for frame via gvcid: - status = Crypto_Get_Managed_Parameters_For_Gvcid(temp_tc_header.tfvn,temp_tc_header.scid,temp_tc_header.vcid,gvcid_managed_parameters,¤t_managed_parameters); - if(status != CRYPTO_LIB_SUCCESS) {return status;} //Unable to get necessary Managed Parameters for TC TF -- return with error. + temp_tc_header.cc = ((uint8_t)p_in_frame[0] & 0x10) >> 4; + temp_tc_header.spare = ((uint8_t)p_in_frame[0] & 0x0C) >> 2; + temp_tc_header.scid = ((uint8_t)p_in_frame[0] & 0x03) << 8; + temp_tc_header.scid = temp_tc_header.scid | (uint8_t)p_in_frame[1]; + temp_tc_header.vcid = ((uint8_t)p_in_frame[2] & 0xFC) >> 2 & crypto_config->vcid_bitmask; + temp_tc_header.fl = ((uint8_t)p_in_frame[2] & 0x03) << 8; + temp_tc_header.fl = temp_tc_header.fl | (uint8_t)p_in_frame[3]; + temp_tc_header.fsn = (uint8_t)p_in_frame[4]; + + // Lookup-retrieve managed parameters for frame via gvcid: + status = Crypto_Get_Managed_Parameters_For_Gvcid(temp_tc_header.tfvn, temp_tc_header.scid, temp_tc_header.vcid, + gvcid_managed_parameters, ¤t_managed_parameters); + if (status != CRYPTO_LIB_SUCCESS) + { + return status; + } // Unable to get necessary Managed Parameters for TC TF -- return with error. uint8_t segmentation_hdr = 0x00; uint8_t map_id = 0; - if(current_managed_parameters->has_segmentation_hdr==TC_HAS_SEGMENT_HDRS){ + if (current_managed_parameters->has_segmentation_hdr == TC_HAS_SEGMENT_HDRS) + { segmentation_hdr = p_in_frame[5]; map_id = segmentation_hdr & 0x3F; } @@ -2662,28 +2691,29 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra // Check if command frame flag set if ((temp_tc_header.cc == 1) && (status == CRYPTO_LIB_SUCCESS)) { - /* - ** CCSDS 232.0-B-3 - ** Section 6.3.1 - ** "Type-C frames do not have the Security Header and Security Trailer." - */ - #ifdef TC_DEBUG - printf(KYEL "DEBUG - Received Control/Command frame - nothing to do.\n" RESET); - #endif +/* +** CCSDS 232.0-B-3 +** Section 6.3.1 +** "Type-C frames do not have the Security Header and Security Trailer." +*/ +#ifdef TC_DEBUG + printf(KYEL "DEBUG - Received Control/Command frame - nothing to do.\n" RESET); +#endif status = CRYPTO_LIB_ERR_INVALID_CC_FLAG; } if (status == CRYPTO_LIB_SUCCESS) { // Query SA DB for active SA / SDLS parameters - if(sadb_routine == NULL) //This should not happen, but tested here for safety + if (sadb_routine == NULL) // This should not happen, but tested here for safety { printf(KRED "ERROR: SA DB Not initalized! -- CRYPTO_LIB_ERR_NO_INIT, Will Exit\n" RESET); status = CRYPTO_LIB_ERR_NO_INIT; } else { - status = sadb_routine->sadb_get_operational_sa_from_gvcid(temp_tc_header.tfvn, temp_tc_header.scid, temp_tc_header.vcid, map_id,&sa_ptr); + status = sadb_routine->sadb_get_operational_sa_from_gvcid(temp_tc_header.tfvn, temp_tc_header.scid, + temp_tc_header.vcid, map_id, &sa_ptr); } // If unable to get operational SA, can return @@ -2692,10 +2722,10 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra return status; } - #ifdef SA_DEBUG - printf(KYEL "DEBUG - Printing SA Entry for current frame.\n" RESET); - Crypto_saPrint(sa_ptr); - #endif +#ifdef SA_DEBUG + printf(KYEL "DEBUG - Printing SA Entry for current frame.\n" RESET); + Crypto_saPrint(sa_ptr); +#endif // Determine SA Service Type if ((sa_ptr->est == 0) && (sa_ptr->ast == 0)) @@ -2724,82 +2754,83 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra } // Determine Algorithm cipher & mode. // TODO - Parse authentication_cipher, and handle AEAD cases properly - if(sa_service_type != SA_PLAINTEXT) + if (sa_service_type != SA_PLAINTEXT) { - encryption_cipher = (sa_ptr->ecs[0] << 24) | (sa_ptr->ecs[1] << 16) | (sa_ptr->ecs[2] << 8) | sa_ptr->ecs[3]; + encryption_cipher = + (sa_ptr->ecs[0] << 24) | (sa_ptr->ecs[1] << 16) | (sa_ptr->ecs[2] << 8) | sa_ptr->ecs[3]; ecs_is_aead_algorithm = Crypto_Is_AEAD_Algorithm(encryption_cipher); } - #ifdef TC_DEBUG - switch(sa_service_type) - { - case SA_PLAINTEXT: - printf(KBLU "Creating a TC - CLEAR!\n" RESET); - break; - case SA_AUTHENTICATION: - printf(KBLU "Creating a TC - AUTHENTICATED!\n" RESET); - break; - case SA_ENCRYPTION: - printf(KBLU "Creating a TC - ENCRYPTED!\n" RESET); - break; - case SA_AUTHENTICATED_ENCRYPTION: - printf(KBLU "Creating a TC - AUTHENTICATED ENCRYPTION!\n" RESET); - break; - } - #endif +#ifdef TC_DEBUG + switch (sa_service_type) + { + case SA_PLAINTEXT: + printf(KBLU "Creating a TC - CLEAR!\n" RESET); + break; + case SA_AUTHENTICATION: + printf(KBLU "Creating a TC - AUTHENTICATED!\n" RESET); + break; + case SA_ENCRYPTION: + printf(KBLU "Creating a TC - ENCRYPTED!\n" RESET); + break; + case SA_AUTHENTICATED_ENCRYPTION: + printf(KBLU "Creating a TC - AUTHENTICATED ENCRYPTION!\n" RESET); + break; + } +#endif // Determine length of buffer to be malloced // TODO: Determine TC_PAD_SIZE // TODO: Note: Currently assumes ciphertext output length is same as ciphertext input length - switch(sa_service_type) + switch (sa_service_type) { - case SA_PLAINTEXT: - // Ingest length + spi_index (2) + some variable length fields - *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shplf_len; - new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; - break; - case SA_AUTHENTICATION: - // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) - // + shplf_len + arc_len + pad_size + stmacf_len - *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + \ - sa_ptr->shplf_len + sa_ptr->arc_len + TC_PAD_SIZE + sa_ptr->stmacf_len; - new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; - break; - case SA_ENCRYPTION: - // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) - // + shplf_len + arc_len + pad_size - *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + \ - sa_ptr->shplf_len + sa_ptr->arc_len + TC_PAD_SIZE; - new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; - break; - case SA_AUTHENTICATED_ENCRYPTION: - // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) - // + shplf_len + arc_len + pad_size + stmacf_len - *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + \ - sa_ptr->shplf_len + sa_ptr->arc_len + TC_PAD_SIZE + sa_ptr->stmacf_len; - new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; - break; - default: - printf(KRED "Unknown SA Service Type Detected!" RESET); - break; + case SA_PLAINTEXT: + // Ingest length + spi_index (2) + some variable length fields + *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shplf_len; + new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; + break; + case SA_AUTHENTICATION: + // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) + // + shplf_len + arc_len + pad_size + stmacf_len + *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + + sa_ptr->arc_len + TC_PAD_SIZE + sa_ptr->stmacf_len; + new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; + break; + case SA_ENCRYPTION: + // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) + // + shplf_len + arc_len + pad_size + *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + + sa_ptr->arc_len + TC_PAD_SIZE; + new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; + break; + case SA_AUTHENTICATED_ENCRYPTION: + // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) + // + shplf_len + arc_len + pad_size + stmacf_len + *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + + sa_ptr->arc_len + TC_PAD_SIZE + sa_ptr->stmacf_len; + new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; + break; + default: + printf(KRED "Unknown SA Service Type Detected!" RESET); + break; } - #ifdef TC_DEBUG - printf(KYEL "DEBUG - Total TC Buffer to be malloced is: %d bytes\n" RESET, *p_enc_frame_len); - printf(KYEL "\tlen of TF\t = %d\n" RESET, temp_tc_header.fl); - //printf(KYEL "\tsegment hdr\t = 1\n" RESET); // TODO: Determine presence of this so not hard-coded - printf(KYEL "\tspi len\t\t = 2\n" RESET); - printf(KYEL "\tshivf_len\t = %d\n" RESET, sa_ptr->shivf_len); - printf(KYEL "\tshsnf_len\t = %d\n" RESET, sa_ptr->shsnf_len); - printf(KYEL "\tshplf len\t = %d\n" RESET, sa_ptr->shplf_len); - printf(KYEL "\tarc_len\t\t = %d\n" RESET, sa_ptr->arc_len); - printf(KYEL "\tpad_size\t = %d\n" RESET, TC_PAD_SIZE); - printf(KYEL "\tstmacf_len\t = %d\n" RESET, sa_ptr->stmacf_len); - #endif - +#ifdef TC_DEBUG + printf(KYEL "DEBUG - Total TC Buffer to be malloced is: %d bytes\n" RESET, *p_enc_frame_len); + printf(KYEL "\tlen of TF\t = %d\n" RESET, temp_tc_header.fl); + // printf(KYEL "\tsegment hdr\t = 1\n" RESET); // TODO: Determine presence of this so not hard-coded + printf(KYEL "\tspi len\t\t = 2\n" RESET); + printf(KYEL "\tshivf_len\t = %d\n" RESET, sa_ptr->shivf_len); + printf(KYEL "\tshsnf_len\t = %d\n" RESET, sa_ptr->shsnf_len); + printf(KYEL "\tshplf len\t = %d\n" RESET, sa_ptr->shplf_len); + printf(KYEL "\tarc_len\t\t = %d\n" RESET, sa_ptr->arc_len); + printf(KYEL "\tpad_size\t = %d\n" RESET, TC_PAD_SIZE); + printf(KYEL "\tstmacf_len\t = %d\n" RESET, sa_ptr->stmacf_len); +#endif + // Accio buffer - p_new_enc_frame = (uint8_t *)malloc((*p_enc_frame_len) * sizeof (uint8_t)); - if(!p_new_enc_frame) + p_new_enc_frame = (uint8_t *)malloc((*p_enc_frame_len) * sizeof(uint8_t)); + if (!p_new_enc_frame) { printf(KRED "Error: Malloc for encrypted output buffer failed! \n" RESET); status = CRYPTO_LIB_ERROR; @@ -2812,26 +2843,28 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra // Set new TF Header length // Recall: Length field is one minus total length per spec - *(p_new_enc_frame+2) = ((*(p_new_enc_frame + 2) & 0xFC) | (((new_enc_frame_header_field_length) & (0x0300)) >> 8)); - *(p_new_enc_frame+3) = ((new_enc_frame_header_field_length) & (0x00FF)); + *(p_new_enc_frame + 2) = + ((*(p_new_enc_frame + 2) & 0xFC) | (((new_enc_frame_header_field_length) & (0x0300)) >> 8)); + *(p_new_enc_frame + 3) = ((new_enc_frame_header_field_length) & (0x00FF)); - #ifdef TC_DEBUG - printf(KYEL "Printing updated TF Header:\n\t"); - for (int i=0; ihas_segmentation_hdr==TC_HAS_SEGMENT_HDRS){ - index++; //Add 1 byte to index because segmentation header used for this gvcid. + if (current_managed_parameters->has_segmentation_hdr == TC_HAS_SEGMENT_HDRS) + { + index++; // Add 1 byte to index because segmentation header used for this gvcid. } /* @@ -2844,16 +2877,19 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra index += 2; // Set initialization vector if specified - if ((sa_service_type == SA_AUTHENTICATION) || \ - (sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || (sa_service_type == SA_ENCRYPTION)) + if ((sa_service_type == SA_AUTHENTICATION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || + (sa_service_type == SA_ENCRYPTION)) { - #ifdef SA_DEBUG - printf(KYEL "Using IV value:\n\t"); - for(int i=0; ishivf_len; i++) {printf("%02x", *(sa_ptr->iv + i));} - printf("\n" RESET); - #endif +#ifdef SA_DEBUG + printf(KYEL "Using IV value:\n\t"); + for (int i = 0; i < sa_ptr->shivf_len; i++) + { + printf("%02x", *(sa_ptr->iv + i)); + } + printf("\n" RESET); +#endif - for (int i=0; i < sa_ptr->shivf_len; i++) + for (int i = 0; i < sa_ptr->shivf_len; i++) { // TODO: Likely API call // Copy in IV from SA @@ -2865,7 +2901,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra // Set anti-replay sequence number if specified /* ** See also: 4.1.1.4.2 - ** 4.1.1.4.4 If authentication or authenticated encryption is not selected + ** 4.1.1.4.4 If authentication or authenticated encryption is not selected ** for an SA, the Sequence Number field shall be zero octets in length. ** Reference CCSDS 3550b1 */ @@ -2877,7 +2913,7 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra // TODO: API call instead? // TODO: Check return code Crypto_increment(sa_ptr->arc, sa_ptr->shsnf_len); - for (int i=0; i < sa_ptr->shsnf_len; i++) + for (int i = 0; i < sa_ptr->shsnf_len; i++) { *(p_new_enc_frame + index) = *(sa_ptr->arc + i); index++; @@ -2886,13 +2922,13 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra // Set security header padding if specified /* - ** 4.2.3.4 h) if the algorithm and mode selected for the SA require the use of - ** fill padding, place the number of fill bytes used into the Pad Length field + ** 4.2.3.4 h) if the algorithm and mode selected for the SA require the use of + ** fill padding, place the number of fill bytes used into the Pad Length field ** of the Security Header - Reference CCSDS 3550b1 */ // TODO: Revisit this // TODO: Likely SA API Call - for (int i=0; i < sa_ptr->shplf_len; i++) + for (int i = 0; i < sa_ptr->shplf_len; i++) { /* 4.1.1.5.2 The Pad Length field shall contain the count of fill bytes used in the ** cryptographic process, consisting of an integral number of octets. - CCSDS 3550b1 @@ -2907,19 +2943,26 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra */ uint8_t fecf_len = FECF_SIZE; - if(current_managed_parameters->has_fecf==TC_NO_FECF) { fecf_len = 0; } + if (current_managed_parameters->has_fecf == TC_NO_FECF) + { + fecf_len = 0; + } uint8_t segment_hdr_len = SEGMENT_HDR_SIZE; - if(current_managed_parameters->has_segmentation_hdr==TC_NO_SEGMENT_HDRS) { segment_hdr_len = 0; } + if (current_managed_parameters->has_segmentation_hdr == TC_NO_SEGMENT_HDRS) + { + segment_hdr_len = 0; + } // Copy in original TF data - except FECF // Will be over-written if using encryption later // and if it was present in the original TCTF - //if FECF - // Even though FECF is not part of apply_security payload, we still have to subtract the length from the temp_tc_header.fl since that includes FECF length & segment header length. + // if FECF + // Even though FECF is not part of apply_security payload, we still have to subtract the length from the + // temp_tc_header.fl since that includes FECF length & segment header length. tf_payload_len = temp_tc_header.fl - TC_FRAME_HEADER_SIZE - segment_hdr_len - fecf_len + 1; - //if no FECF - //tf_payload_len = temp_tc_header.fl - TC_FRAME_PRIMARYHEADER_STRUCT_SIZE; - memcpy((p_new_enc_frame+index), (p_in_frame+TC_FRAME_PRIMARYHEADER_STRUCT_SIZE), tf_payload_len); - //index += tf_payload_len; + // if no FECF + // tf_payload_len = temp_tc_header.fl - TC_FRAME_PRIMARYHEADER_STRUCT_SIZE; + memcpy((p_new_enc_frame + index), (p_in_frame + TC_FRAME_PRIMARYHEADER_STRUCT_SIZE), tf_payload_len); + // index += tf_payload_len; /* ** Begin Security Trailer Fields @@ -2942,80 +2985,74 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra ** End Security Trailer Fields */ - /* + /* ** Begin Authentication / Encryption */ if (sa_service_type != SA_PLAINTEXT) { - gcry_error = gcry_cipher_open( - &(tmp_hd), - GCRY_CIPHER_AES256, - GCRY_CIPHER_MODE_GCM, - GCRY_CIPHER_CBC_MAC - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERROR; return status; } - gcry_error = gcry_cipher_setkey( - tmp_hd, - &(ek_ring[sa_ptr->ekid].value[0]), - KEY_SIZE //TODO: look into this + gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[sa_ptr->ekid].value[0]), + KEY_SIZE // TODO: look into this ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERROR; return status; } - gcry_error = gcry_cipher_setiv( - tmp_hd, - sa_ptr->iv, - sa_ptr->shivf_len - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + gcry_error = gcry_cipher_setiv(tmp_hd, sa_ptr->iv, sa_ptr->shivf_len); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERROR; return status; } - if ((sa_service_type == SA_ENCRYPTION) || \ - (sa_service_type == SA_AUTHENTICATED_ENCRYPTION)) + if ((sa_service_type == SA_ENCRYPTION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION)) { - // TODO: More robust calculation of this location - // uint16_t output_loc = TC_FRAME_PRIMARYHEADER_STRUCT_SIZE + 1 + 2 + temp_SA.shivf_len + temp_SA.shsnf_len + temp_SA.shplf_len; - #ifdef TC_DEBUG - printf("Encrypted bytes output_loc is %d\n", index); - printf("tf_payload_len is %d\n", tf_payload_len); - printf(KYEL "Printing TC Frame prior to encryption:\n\t"); - for(int i=0; i < *p_enc_frame_len; i++) - { - printf("%02X", *(p_new_enc_frame + i)); - } - printf("\n"); - #endif +// TODO: More robust calculation of this location +// uint16_t output_loc = TC_FRAME_PRIMARYHEADER_STRUCT_SIZE + 1 + 2 + temp_SA.shivf_len + temp_SA.shsnf_len + +// temp_SA.shplf_len; +#ifdef TC_DEBUG + printf("Encrypted bytes output_loc is %d\n", index); + printf("tf_payload_len is %d\n", tf_payload_len); + printf(KYEL "Printing TC Frame prior to encryption:\n\t"); + for (int i = 0; i < *p_enc_frame_len; i++) + { + printf("%02X", *(p_new_enc_frame + i)); + } + printf("\n"); +#endif - if(sa_service_type == SA_AUTHENTICATED_ENCRYPTION && ecs_is_aead_algorithm==CRYPTO_TRUE) // Algorithm is AEAD algorithm, Add AAD before encrypt! + if (sa_service_type == SA_AUTHENTICATED_ENCRYPTION && + ecs_is_aead_algorithm == CRYPTO_TRUE) // Algorithm is AEAD algorithm, Add AAD before encrypt! { - //Prepare the Header AAD (CCSDS 335.0-B-1 4.2.3.2.2.3) - uint16_t aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len; - if(sa_ptr->abm_len < aad_len) { return CRYPTO_LIB_ERR_ABM_TOO_SHORT_FOR_AAD; } + // Prepare the Header AAD (CCSDS 335.0-B-1 4.2.3.2.2.3) + uint16_t aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + + sa_ptr->shsnf_len + sa_ptr->shplf_len; + if (sa_ptr->abm_len < aad_len) + { + return CRYPTO_LIB_ERR_ABM_TOO_SHORT_FOR_AAD; + } aad = Crypto_Prepare_TC_AAD(p_new_enc_frame, aad_len, sa_ptr->abm); - //Add the AAD to the libgcrypt cipher handle - gcry_error = gcry_cipher_authenticate( - tmp_hd, - aad, // additional authenticated data - aad_len // length of AAD + // Add the AAD to the libgcrypt cipher handle + gcry_error = gcry_cipher_authenticate(tmp_hd, + aad, // additional authenticated data + aad_len // length of AAD ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error),gcry_strerror (gcry_error)); + printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET, + gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error), gcry_strerror(gcry_error)); status = CRYPTO_LIB_ERR_AUTHENTICATION_ERROR; return status; } @@ -3023,48 +3060,50 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra free(aad); } - gcry_error = gcry_cipher_encrypt( - tmp_hd, - &p_new_enc_frame[index], // ciphertext output - tf_payload_len, // length of data - (p_in_frame + TC_FRAME_HEADER_SIZE + segment_hdr_len), // plaintext input - tf_payload_len // in data length - ); + gcry_error = + gcry_cipher_encrypt(tmp_hd, + &p_new_enc_frame[index], // ciphertext output + tf_payload_len, // length of data + (p_in_frame + TC_FRAME_HEADER_SIZE + segment_hdr_len), // plaintext input + tf_payload_len // in data length + ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_encrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_encrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERROR; return status; } - #ifdef TC_DEBUG - printf("Encrypted bytes output_loc is %d\n", index); - printf("tf_payload_len is %d\n", tf_payload_len); - printf(KYEL "Printing TC Frame after encryption:\n\t"); - for(int i=0; i < *p_enc_frame_len; i++) - { - printf("%02X", *(p_new_enc_frame + i)); - } - printf("\n"); - #endif +#ifdef TC_DEBUG + printf("Encrypted bytes output_loc is %d\n", index); + printf("tf_payload_len is %d\n", tf_payload_len); + printf(KYEL "Printing TC Frame after encryption:\n\t"); + for (int i = 0; i < *p_enc_frame_len; i++) + { + printf("%02X", *(p_new_enc_frame + i)); + } + printf("\n"); +#endif - //Get MAC & insert into p_new_enc_frame - if(sa_service_type == SA_AUTHENTICATED_ENCRYPTION && ecs_is_aead_algorithm==CRYPTO_TRUE) + // Get MAC & insert into p_new_enc_frame + if (sa_service_type == SA_AUTHENTICATED_ENCRYPTION && ecs_is_aead_algorithm == CRYPTO_TRUE) { - mac_loc = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + tf_payload_len; - #ifdef MAC_DEBUG - printf(KYEL "MAC location is: %d\n" RESET, mac_loc); - printf(KYEL "MAC size is: %d\n" RESET, MAC_SIZE); - #endif + mac_loc = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + + sa_ptr->shplf_len + tf_payload_len; +#ifdef MAC_DEBUG + printf(KYEL "MAC location is: %d\n" RESET, mac_loc); + printf(KYEL "MAC size is: %d\n" RESET, MAC_SIZE); +#endif gcry_error = gcry_cipher_gettag( - tmp_hd, - &p_new_enc_frame[mac_loc], // tag output - MAC_SIZE // tag size // TODO - use sa_ptr->abm_len instead of hardcoded mac size? + tmp_hd, + &p_new_enc_frame[mac_loc], // tag output + MAC_SIZE // tag size // TODO - use sa_ptr->abm_len instead of hardcoded mac size? ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, + gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERR_MAC_RETRIEVAL_ERROR; return status; } @@ -3075,74 +3114,70 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra } // Prepare additional authenticated data, if needed - if ((sa_service_type == SA_AUTHENTICATION) || \ - ( (sa_service_type == SA_AUTHENTICATED_ENCRYPTION) && ecs_is_aead_algorithm==CRYPTO_FALSE ) ) //Authenticated Encryption without AEAD algorithm, AEAD algorithms handled in encryption block! + if ((sa_service_type == SA_AUTHENTICATION) || + ((sa_service_type == SA_AUTHENTICATED_ENCRYPTION) && + ecs_is_aead_algorithm == CRYPTO_FALSE)) // Authenticated Encryption without AEAD algorithm, AEAD + // algorithms handled in encryption block! { - gcry_error = gcry_cipher_open( - &(tmp_hd), - GCRY_CIPHER_AES256, - GCRY_CIPHER_MODE_GCM, - GCRY_CIPHER_CBC_MAC - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERROR; return status; } - gcry_error = gcry_cipher_setkey( - tmp_hd, - &(ek_ring[sa_ptr->ekid].value[0]), - KEY_SIZE //TODO: look into this + gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[sa_ptr->ekid].value[0]), + KEY_SIZE // TODO: look into this ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERROR; return status; } - gcry_error = gcry_cipher_setiv( - tmp_hd, - sa_ptr->iv, - sa_ptr->shivf_len - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + gcry_error = gcry_cipher_setiv(tmp_hd, sa_ptr->iv, sa_ptr->shivf_len); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERROR; return status; } - uint16_t aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + tf_payload_len; - if(sa_ptr->abm_len < aad_len) { return CRYPTO_LIB_ERR_ABM_TOO_SHORT_FOR_AAD; } + uint16_t aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + + sa_ptr->shsnf_len + sa_ptr->shplf_len + tf_payload_len; + if (sa_ptr->abm_len < aad_len) + { + return CRYPTO_LIB_ERR_ABM_TOO_SHORT_FOR_AAD; + } aad = Crypto_Prepare_TC_AAD(p_new_enc_frame, aad_len, sa_ptr->abm); - gcry_error = gcry_cipher_authenticate( - tmp_hd, - aad, // additional authenticated data - aad_len // length of AAD + gcry_error = gcry_cipher_authenticate(tmp_hd, + aad, // additional authenticated data + aad_len // length of AAD ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error),gcry_strerror (gcry_error)); + printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET, + gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error), gcry_strerror(gcry_error)); status = CRYPTO_LIB_ERROR; return status; } - mac_loc = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + tf_payload_len; - #ifdef MAC_DEBUG - printf(KYEL "MAC location is: %d\n" RESET, mac_loc); - printf(KYEL "MAC size is: %d\n" RESET, MAC_SIZE); - #endif - gcry_error = gcry_cipher_gettag( - tmp_hd, - &p_new_enc_frame[mac_loc], // tag output - MAC_SIZE // tag size // TODO - use sa_ptr->abm_len instead of hardcoded mac size? - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + mac_loc = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + + sa_ptr->shplf_len + tf_payload_len; +#ifdef MAC_DEBUG + printf(KYEL "MAC location is: %d\n" RESET, mac_loc); + printf(KYEL "MAC size is: %d\n" RESET, MAC_SIZE); +#endif + gcry_error = + gcry_cipher_gettag(tmp_hd, + &p_new_enc_frame[mac_loc], // tag output + MAC_SIZE // tag size // TODO - use sa_ptr->abm_len instead of hardcoded mac size? + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERR_MAC_RETRIEVAL_ERROR; return status; } @@ -3153,59 +3188,65 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra if (sa_service_type != SA_PLAINTEXT) { - #ifdef INCREMENT - if(sa_ptr->iv == NULL) { printf("\n\nNULL\n\n");} - Crypto_increment(sa_ptr->iv, sa_ptr->shivf_len); - #ifdef SA_DEBUG - printf(KYEL "Next IV value is:\n\t"); - for(int i=0; ishivf_len; i++) {printf("%02x", *(sa_ptr->iv + i));} - printf("\n" RESET); - #endif - #endif +#ifdef INCREMENT + if (sa_ptr->iv == NULL) + { + printf("\n\nNULL\n\n"); + } + Crypto_increment(sa_ptr->iv, sa_ptr->shivf_len); +#ifdef SA_DEBUG + printf(KYEL "Next IV value is:\n\t"); + for (int i = 0; i < sa_ptr->shivf_len; i++) + { + printf("%02x", *(sa_ptr->iv + i)); + } + printf("\n" RESET); +#endif +#endif } /* ** End Authentication / Encryption */ - //Only calculate & insert FECF if CryptoLib is configured to do so & gvcid includes FECF. - if( current_managed_parameters->has_fecf==TC_HAS_FECF ) + // Only calculate & insert FECF if CryptoLib is configured to do so & gvcid includes FECF. + if (current_managed_parameters->has_fecf == TC_HAS_FECF) { - // Set FECF Field if present - #ifdef FECF_DEBUG +// Set FECF Field if present +#ifdef FECF_DEBUG printf(KCYN "Calcing FECF over %d bytes\n" RESET, new_enc_frame_header_field_length - 1); - #endif - if ( crypto_config->crypto_create_fecf==CRYPTO_TC_CREATE_FECF_TRUE ) +#endif + if (crypto_config->crypto_create_fecf == CRYPTO_TC_CREATE_FECF_TRUE) { new_fecf = Crypto_Calc_FECF(p_new_enc_frame, new_enc_frame_header_field_length - 1); - *(p_new_enc_frame + new_enc_frame_header_field_length - 1) = (uint8_t) ((new_fecf & 0xFF00) >> 8); - *(p_new_enc_frame + new_enc_frame_header_field_length ) = (uint8_t) (new_fecf & 0x00FF); + *(p_new_enc_frame + new_enc_frame_header_field_length - 1) = (uint8_t)((new_fecf & 0xFF00) >> 8); + *(p_new_enc_frame + new_enc_frame_header_field_length) = (uint8_t)(new_fecf & 0x00FF); } else // CRYPTO_TC_CREATE_FECF_FALSE { - *(p_new_enc_frame + new_enc_frame_header_field_length - 1) = (uint8_t) 0x00; - *(p_new_enc_frame + new_enc_frame_header_field_length ) = (uint8_t) 0x00; + *(p_new_enc_frame + new_enc_frame_header_field_length - 1) = (uint8_t)0x00; + *(p_new_enc_frame + new_enc_frame_header_field_length) = (uint8_t)0x00; } index += 2; } - #ifdef TC_DEBUG - printf(KYEL "Printing new TC Frame:\n\t"); - for(int i=0; i < *p_enc_frame_len; i++) - { - printf("%02X", *(p_new_enc_frame + i)); - } - printf("\n\tThe returned length is: %d\n" RESET, new_enc_frame_header_field_length); - #endif +#ifdef TC_DEBUG + printf(KYEL "Printing new TC Frame:\n\t"); + for (int i = 0; i < *p_enc_frame_len; i++) + { + printf("%02X", *(p_new_enc_frame + i)); + } + printf("\n\tThe returned length is: %d\n" RESET, new_enc_frame_header_field_length); +#endif *pp_in_frame = p_new_enc_frame; } status = sadb_routine->sadb_save_sa(sa_ptr); - #ifdef DEBUG - printf(KYEL "----- Crypto_TC_ApplySecurity END -----\n" RESET); - #endif +#ifdef DEBUG + printf(KYEL "----- Crypto_TC_ApplySecurity END -----\n" RESET); +#endif return status; } @@ -3218,74 +3259,80 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_fra * @param tc_sdls_processed_frame: TC_t* * @return int32: Success/Failure **/ -int32_t Crypto_TC_ProcessSecurity( uint8_t* ingest, int* len_ingest,TC_t* tc_sdls_processed_frame) +int32_t Crypto_TC_ProcessSecurity(uint8_t *ingest, int *len_ingest, TC_t *tc_sdls_processed_frame) // Loads the ingest frame into the global tc_frame while performing decryption { // Local Variables int32_t status = CRYPTO_LIB_SUCCESS; gcry_cipher_hd_t tmp_hd; gcry_error_t gcry_error = GPG_ERR_NO_ERROR; - SecurityAssociation_t* sa_ptr = NULL; + SecurityAssociation_t *sa_ptr = NULL; uint8_t sa_service_type = -1; - uint8_t* aad; + uint8_t *aad; uint32_t encryption_cipher; uint8_t ecs_is_aead_algorithm; - if(crypto_config == NULL) + if (crypto_config == NULL) { printf(KRED "ERROR: CryptoLib Configuration Not Set! -- CRYPTO_LIB_ERR_NO_CONFIG, Will Exit\n" RESET); status = CRYPTO_LIB_ERR_NO_CONFIG; return status; } - #ifdef DEBUG - printf(KYEL "\n----- Crypto_TC_ProcessSecurity START -----\n" RESET); - #endif +#ifdef DEBUG + printf(KYEL "\n----- Crypto_TC_ProcessSecurity START -----\n" RESET); +#endif int byte_idx = 0; // Primary Header - tc_sdls_processed_frame->tc_header.tfvn = ((uint8_t)ingest[byte_idx] & 0xC0) >> 6; + tc_sdls_processed_frame->tc_header.tfvn = ((uint8_t)ingest[byte_idx] & 0xC0) >> 6; tc_sdls_processed_frame->tc_header.bypass = ((uint8_t)ingest[byte_idx] & 0x20) >> 5; - tc_sdls_processed_frame->tc_header.cc = ((uint8_t)ingest[byte_idx] & 0x10) >> 4; - tc_sdls_processed_frame->tc_header.spare = ((uint8_t)ingest[byte_idx] & 0x0C) >> 2; - tc_sdls_processed_frame->tc_header.scid = ((uint8_t)ingest[byte_idx] & 0x03) << 8; + tc_sdls_processed_frame->tc_header.cc = ((uint8_t)ingest[byte_idx] & 0x10) >> 4; + tc_sdls_processed_frame->tc_header.spare = ((uint8_t)ingest[byte_idx] & 0x0C) >> 2; + tc_sdls_processed_frame->tc_header.scid = ((uint8_t)ingest[byte_idx] & 0x03) << 8; byte_idx++; - tc_sdls_processed_frame->tc_header.scid = tc_sdls_processed_frame->tc_header.scid | (uint8_t)ingest[byte_idx]; + tc_sdls_processed_frame->tc_header.scid = tc_sdls_processed_frame->tc_header.scid | (uint8_t)ingest[byte_idx]; byte_idx++; - tc_sdls_processed_frame->tc_header.vcid = (((uint8_t)ingest[byte_idx] & 0xFC) >> 2) & crypto_config->vcid_bitmask; - tc_sdls_processed_frame->tc_header.fl = ((uint8_t)ingest[byte_idx] & 0x03) << 8; + tc_sdls_processed_frame->tc_header.vcid = (((uint8_t)ingest[byte_idx] & 0xFC) >> 2) & crypto_config->vcid_bitmask; + tc_sdls_processed_frame->tc_header.fl = ((uint8_t)ingest[byte_idx] & 0x03) << 8; byte_idx++; - tc_sdls_processed_frame->tc_header.fl = tc_sdls_processed_frame->tc_header.fl | (uint8_t)ingest[byte_idx]; + tc_sdls_processed_frame->tc_header.fl = tc_sdls_processed_frame->tc_header.fl | (uint8_t)ingest[byte_idx]; byte_idx++; - tc_sdls_processed_frame->tc_header.fsn = (uint8_t)ingest[byte_idx]; + tc_sdls_processed_frame->tc_header.fsn = (uint8_t)ingest[byte_idx]; byte_idx++; - //Lookup-retrieve managed parameters for frame via gvcid: - status = Crypto_Get_Managed_Parameters_For_Gvcid(tc_sdls_processed_frame->tc_header.tfvn,tc_sdls_processed_frame->tc_header.scid, - tc_sdls_processed_frame->tc_header.vcid,gvcid_managed_parameters,¤t_managed_parameters); + // Lookup-retrieve managed parameters for frame via gvcid: + status = Crypto_Get_Managed_Parameters_For_Gvcid( + tc_sdls_processed_frame->tc_header.tfvn, tc_sdls_processed_frame->tc_header.scid, + tc_sdls_processed_frame->tc_header.vcid, gvcid_managed_parameters, ¤t_managed_parameters); - if(status != CRYPTO_LIB_SUCCESS) {return status;} //Unable to get necessary Managed Parameters for TC TF -- return with error. + if (status != CRYPTO_LIB_SUCCESS) + { + return status; + } // Unable to get necessary Managed Parameters for TC TF -- return with error. // Segment Header - if(current_managed_parameters->has_segmentation_hdr==TC_HAS_SEGMENT_HDRS){ - tc_sdls_processed_frame->tc_sec_header.sh = (uint8_t)ingest[byte_idx]; + if (current_managed_parameters->has_segmentation_hdr == TC_HAS_SEGMENT_HDRS) + { + tc_sdls_processed_frame->tc_sec_header.sh = (uint8_t)ingest[byte_idx]; byte_idx++; } // Security Header - tc_sdls_processed_frame->tc_sec_header.spi = ((uint8_t)ingest[byte_idx] << 8) | (uint8_t)ingest[byte_idx+1]; - byte_idx+=2; - #ifdef TC_DEBUG - printf("vcid = %d \n", tc_sdls_processed_frame->tc_header.vcid ); - printf("spi = %d \n", tc_sdls_processed_frame->tc_sec_header.spi); - #endif + tc_sdls_processed_frame->tc_sec_header.spi = ((uint8_t)ingest[byte_idx] << 8) | (uint8_t)ingest[byte_idx + 1]; + byte_idx += 2; +#ifdef TC_DEBUG + printf("vcid = %d \n", tc_sdls_processed_frame->tc_header.vcid); + printf("spi = %d \n", tc_sdls_processed_frame->tc_sec_header.spi); +#endif - status = sadb_routine->sadb_get_sa_from_spi(tc_sdls_processed_frame->tc_sec_header.spi,&sa_ptr); + status = sadb_routine->sadb_get_sa_from_spi(tc_sdls_processed_frame->tc_sec_header.spi, &sa_ptr); // If no valid SPI, return - if(status != CRYPTO_LIB_SUCCESS){ + if (status != CRYPTO_LIB_SUCCESS) + { return status; } - encryption_cipher = (sa_ptr->ecs[0] << 24) | (sa_ptr->ecs[1] << 16) | (sa_ptr->ecs[2] << 8) | sa_ptr->ecs[3]; + encryption_cipher = (sa_ptr->ecs[0] << 24) | (sa_ptr->ecs[1] << 16) | (sa_ptr->ecs[2] << 8) | sa_ptr->ecs[3]; ecs_is_aead_algorithm = Crypto_Is_AEAD_Algorithm(encryption_cipher); // Determine SA Service Type @@ -3315,45 +3362,52 @@ int32_t Crypto_TC_ProcessSecurity( uint8_t* ingest, int* len_ingest,TC_t* tc_sdl } // Determine Algorithm cipher & mode. // TODO - Parse authentication_cipher, and handle AEAD cases properly - if(sa_service_type != SA_PLAINTEXT) + if (sa_service_type != SA_PLAINTEXT) { - encryption_cipher = (sa_ptr->ecs[0] << 24) | (sa_ptr->ecs[1] << 16) | (sa_ptr->ecs[2] << 8) | sa_ptr->ecs[3]; + encryption_cipher = (sa_ptr->ecs[0] << 24) | (sa_ptr->ecs[1] << 16) | (sa_ptr->ecs[2] << 8) | sa_ptr->ecs[3]; ecs_is_aead_algorithm = Crypto_Is_AEAD_Algorithm(encryption_cipher); } - #ifdef TC_DEBUG - switch(sa_service_type) - { - case SA_PLAINTEXT: - printf(KBLU "Processing a TC - CLEAR!\n" RESET); - break; - case SA_AUTHENTICATION: - printf(KBLU "Processing a TC - AUTHENTICATED!\n" RESET); - break; - case SA_ENCRYPTION: - printf(KBLU "Processing a TC - ENCRYPTED!\n" RESET); - break; - case SA_AUTHENTICATED_ENCRYPTION: - printf(KBLU "Processing a TC - AUTHENTICATED ENCRYPTION!\n" RESET); - break; - } - #endif +#ifdef TC_DEBUG + switch (sa_service_type) + { + case SA_PLAINTEXT: + printf(KBLU "Processing a TC - CLEAR!\n" RESET); + break; + case SA_AUTHENTICATION: + printf(KBLU "Processing a TC - AUTHENTICATED!\n" RESET); + break; + case SA_ENCRYPTION: + printf(KBLU "Processing a TC - ENCRYPTED!\n" RESET); + break; + case SA_AUTHENTICATED_ENCRYPTION: + printf(KBLU "Processing a TC - AUTHENTICATED ENCRYPTION!\n" RESET); + break; + } +#endif // TODO: Calculate lengths when needed uint8_t fecf_len = FECF_SIZE; - if(current_managed_parameters->has_fecf==TC_NO_FECF) { fecf_len = 0; } + if (current_managed_parameters->has_fecf == TC_NO_FECF) + { + fecf_len = 0; + } uint8_t segment_hdr_len = SEGMENT_HDR_SIZE; - if(current_managed_parameters->has_segmentation_hdr==TC_NO_SEGMENT_HDRS) { segment_hdr_len = 0; } + if (current_managed_parameters->has_segmentation_hdr == TC_NO_SEGMENT_HDRS) + { + segment_hdr_len = 0; + } // Check FECF - if(current_managed_parameters->has_fecf==TC_HAS_FECF) + if (current_managed_parameters->has_fecf == TC_HAS_FECF) { - if(crypto_config->crypto_check_fecf == TC_CHECK_FECF_TRUE) + if (crypto_config->crypto_check_fecf == TC_CHECK_FECF_TRUE) { - uint16_t received_fecf = (((ingest[tc_sdls_processed_frame->tc_header.fl - 1] << 8) & 0xFF00) | (ingest[tc_sdls_processed_frame->tc_header.fl] & 0x00FF)); + uint16_t received_fecf = (((ingest[tc_sdls_processed_frame->tc_header.fl - 1] << 8) & 0xFF00) | + (ingest[tc_sdls_processed_frame->tc_header.fl] & 0x00FF)); // Calculate our own - uint16_t calculated_fecf = Crypto_Calc_FECF(ingest, *len_ingest-2); + uint16_t calculated_fecf = Crypto_Calc_FECF(ingest, *len_ingest - 2); // Compare if (received_fecf != calculated_fecf) { @@ -3364,190 +3418,194 @@ int32_t Crypto_TC_ProcessSecurity( uint8_t* ingest, int* len_ingest,TC_t* tc_sdl } // Parse the security header - tc_sdls_processed_frame->tc_sec_header.spi = (uint16_t)((uint8_t)ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len] | (uint8_t)ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + 1]); + tc_sdls_processed_frame->tc_sec_header.spi = + (uint16_t)((uint8_t)ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len] | + (uint8_t)ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + 1]); // Get SA via SPI status = sadb_routine->sadb_get_sa_from_spi(tc_sdls_processed_frame->tc_sec_header.spi, &sa_ptr); - if(status != CRYPTO_LIB_SUCCESS){ return status; } + if (status != CRYPTO_LIB_SUCCESS) + { + return status; + } // Parse IV - memcpy((tc_sdls_processed_frame->tc_sec_header.iv), &(ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN]), sa_ptr->shivf_len); + memcpy((tc_sdls_processed_frame->tc_sec_header.iv), &(ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN]), + sa_ptr->shivf_len); // Parse Sequence Number - memcpy((tc_sdls_processed_frame->tc_sec_header.sn)+(TC_SN_SIZE-sa_ptr->shsnf_len), &(ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len]), sa_ptr->shsnf_len); + memcpy((tc_sdls_processed_frame->tc_sec_header.sn) + (TC_SN_SIZE - sa_ptr->shsnf_len), + &(ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len]), sa_ptr->shsnf_len); // Parse pad length - memcpy((tc_sdls_processed_frame->tc_sec_header.pad)+(TC_PAD_SIZE-sa_ptr->shplf_len), &(ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len]) , sa_ptr->shplf_len); + memcpy((tc_sdls_processed_frame->tc_sec_header.pad) + (TC_PAD_SIZE - sa_ptr->shplf_len), + &(ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len]), + sa_ptr->shplf_len); - if((sa_service_type == SA_AUTHENTICATION) || - (sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || + if ((sa_service_type == SA_AUTHENTICATION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || (sa_service_type == SA_ENCRYPTION)) { - gcry_error = gcry_cipher_open( - &(tmp_hd), - GCRY_CIPHER_AES256, - GCRY_CIPHER_MODE_GCM, - GCRY_CIPHER_CBC_MAC - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERR_LIBGCRYPT_ERROR; return status; } - gcry_error = gcry_cipher_setkey( - tmp_hd, - ek_ring[sa_ptr->ekid].value, - KEY_SIZE - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + gcry_error = gcry_cipher_setkey(tmp_hd, ek_ring[sa_ptr->ekid].value, KEY_SIZE); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERR_LIBGCRYPT_ERROR; return status; } - gcry_error = gcry_cipher_setiv( - tmp_hd, - tc_sdls_processed_frame->tc_sec_header.iv, - sa_ptr->shivf_len - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + gcry_error = gcry_cipher_setiv(tmp_hd, tc_sdls_processed_frame->tc_sec_header.iv, sa_ptr->shivf_len); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERR_LIBGCRYPT_ERROR; return status; } } // Check MAC, if applicable - if((sa_service_type == SA_AUTHENTICATION) || - (sa_service_type == SA_AUTHENTICATED_ENCRYPTION)) + if ((sa_service_type == SA_AUTHENTICATION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION)) { uint16_t tc_mac_start_index = tc_sdls_processed_frame->tc_header.fl + 1 - fecf_len - sa_ptr->stmacf_len; // Parse the received MAC - memcpy((tc_sdls_processed_frame->tc_sec_trailer.mac)+(MAC_SIZE-sa_ptr->stmacf_len), &(ingest[tc_mac_start_index]) , sa_ptr->stmacf_len); - if (crypto_config->ignore_anti_replay==TC_IGNORE_ANTI_REPLAY_FALSE ) + memcpy((tc_sdls_processed_frame->tc_sec_trailer.mac) + (MAC_SIZE - sa_ptr->stmacf_len), + &(ingest[tc_mac_start_index]), sa_ptr->stmacf_len); + if (crypto_config->ignore_anti_replay == TC_IGNORE_ANTI_REPLAY_FALSE) { // If sequence number field is greater than zero, use as arsn - if(sa_ptr->shsnf_len > 0) + if (sa_ptr->shsnf_len > 0) { // Check Sequence Number is in ARCW status = Crypto_window(tc_sdls_processed_frame->tc_sec_header.sn, sa_ptr->arc, sa_ptr->shsnf_len, - sa_ptr->arcw); - if (status != CRYPTO_LIB_SUCCESS) { return status; } + sa_ptr->arcw); + if (status != CRYPTO_LIB_SUCCESS) + { + return status; + } // TODO: Update SA ARC through SADB_Routine function call } else { // Check IV is in ARCW status = Crypto_window(tc_sdls_processed_frame->tc_sec_header.iv, sa_ptr->iv, sa_ptr->shivf_len, - sa_ptr->arcw); - #ifdef DEBUG - printf("Received IV is\n\t"); - for(int i=0; ishivf_len; i++) - // for(int i=0; itc_sec_header.iv + i)); - } - printf("\nSA IV is\n\t"); - for(int i=0; ishivf_len; i++) - { - printf("%02x", *(sa_ptr->iv + i)); - } - printf("\nARCW is: %d\n", sa_ptr->arcw); - #endif - if (status != CRYPTO_LIB_SUCCESS) { return status; } + sa_ptr->arcw); +#ifdef DEBUG + printf("Received IV is\n\t"); + for (int i = 0; i < sa_ptr->shivf_len; i++) + // for(int i=0; itc_sec_header.iv + i)); + } + printf("\nSA IV is\n\t"); + for (int i = 0; i < sa_ptr->shivf_len; i++) + { + printf("%02x", *(sa_ptr->iv + i)); + } + printf("\nARCW is: %d\n", sa_ptr->arcw); +#endif + if (status != CRYPTO_LIB_SUCCESS) + { + return status; + } // TODO: Update SA IV through SADB_Routine function call } - } uint16_t aad_len = tc_mac_start_index; - if((sa_service_type == SA_AUTHENTICATED_ENCRYPTION) && (ecs_is_aead_algorithm == CRYPTO_TRUE)) { aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len; } + if ((sa_service_type == SA_AUTHENTICATED_ENCRYPTION) && (ecs_is_aead_algorithm == CRYPTO_TRUE)) + { + aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + + sa_ptr->shplf_len; + } aad = Crypto_Prepare_TC_AAD(ingest, aad_len, sa_ptr->abm); - gcry_error = gcry_cipher_authenticate( - tmp_hd, - aad, // additional authenticated data - aad_len // length of AAD + gcry_error = gcry_cipher_authenticate(tmp_hd, + aad, // additional authenticated data + aad_len // length of AAD ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error),gcry_strerror (gcry_error)); + printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error), gcry_strerror(gcry_error)); status = CRYPTO_LIB_ERR_AUTHENTICATION_ERROR; return status; } } // Decrypt, if applicable - if((sa_service_type == SA_ENCRYPTION) || - (sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || - (sa_service_type == SA_AUTHENTICATION)) - { - uint16_t tc_enc_payload_start_index = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len; - tc_sdls_processed_frame->tc_pdu_len = tc_sdls_processed_frame->tc_header.fl + 1 - tc_enc_payload_start_index - sa_ptr->stmacf_len - fecf_len; - - if(sa_service_type == SA_AUTHENTICATION) - {//Authenticate only! No input data passed into decryption function, only AAD. - gcry_error = gcry_cipher_decrypt( - tmp_hd, - NULL, // plaintext output - 0, // length of data - NULL, // ciphertext input - 0 // in data length + if ((sa_service_type == SA_ENCRYPTION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || + (sa_service_type == SA_AUTHENTICATION)) + { + uint16_t tc_enc_payload_start_index = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + + sa_ptr->shsnf_len + sa_ptr->shplf_len; + tc_sdls_processed_frame->tc_pdu_len = + tc_sdls_processed_frame->tc_header.fl + 1 - tc_enc_payload_start_index - sa_ptr->stmacf_len - fecf_len; + + if (sa_service_type == SA_AUTHENTICATION) + { // Authenticate only! No input data passed into decryption function, only AAD. + gcry_error = gcry_cipher_decrypt(tmp_hd, + NULL, // plaintext output + 0, // length of data + NULL, // ciphertext input + 0 // in data length ); - //If authentication only, don't decrypt the data. Just pass the data PDU through. - memcpy(tc_sdls_processed_frame->tc_pdu,&(ingest[tc_enc_payload_start_index]),tc_sdls_processed_frame->tc_pdu_len); - } else + // If authentication only, don't decrypt the data. Just pass the data PDU through. + memcpy(tc_sdls_processed_frame->tc_pdu, &(ingest[tc_enc_payload_start_index]), + tc_sdls_processed_frame->tc_pdu_len); + } + else { // Decrypt - gcry_error = gcry_cipher_decrypt( - tmp_hd, - tc_sdls_processed_frame->tc_pdu, // plaintext output - tc_sdls_processed_frame->tc_pdu_len, // length of data - &(ingest[tc_enc_payload_start_index]), // ciphertext input - tc_sdls_processed_frame->tc_pdu_len // in data length + gcry_error = gcry_cipher_decrypt(tmp_hd, + tc_sdls_processed_frame->tc_pdu, // plaintext output + tc_sdls_processed_frame->tc_pdu_len, // length of data + &(ingest[tc_enc_payload_start_index]), // ciphertext input + tc_sdls_processed_frame->tc_pdu_len // in data length ); } - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); status = CRYPTO_LIB_ERR_DECRYPT_ERROR; return status; } - if ((sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || - (sa_service_type == SA_AUTHENTICATION)) + if ((sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || (sa_service_type == SA_AUTHENTICATION)) { - gcry_error = gcry_cipher_checktag( - tmp_hd, - tc_sdls_processed_frame->tc_sec_trailer.mac, // Frame Expected Tag - sa_ptr->stmacf_len // tag size + gcry_error = gcry_cipher_checktag(tmp_hd, + tc_sdls_processed_frame->tc_sec_trailer.mac, // Frame Expected Tag + sa_ptr->stmacf_len // tag size ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - fprintf(stderr,"gcry_cipher_decrypt failed: %s\n", gpg_strerror (gcry_error)); + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + fprintf(stderr, "gcry_cipher_decrypt failed: %s\n", gpg_strerror(gcry_error)); status = CRYPTO_LIB_ERR_MAC_VALIDATION_ERROR; return status; } } - } - if(sa_service_type != SA_PLAINTEXT) + if (sa_service_type != SA_PLAINTEXT) { gcry_cipher_close(tmp_hd); } - if(sa_service_type == SA_PLAINTEXT) + if (sa_service_type == SA_PLAINTEXT) { // TODO: Plaintext ARSN - uint16_t tc_enc_payload_start_index = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len; - tc_sdls_processed_frame->tc_pdu_len = tc_sdls_processed_frame->tc_header.fl + 1 - tc_enc_payload_start_index - sa_ptr->stmacf_len - fecf_len; - memcpy(tc_sdls_processed_frame->tc_pdu, &(ingest[tc_enc_payload_start_index]), tc_sdls_processed_frame->tc_pdu_len); + uint16_t tc_enc_payload_start_index = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + + sa_ptr->shsnf_len + sa_ptr->shplf_len; + tc_sdls_processed_frame->tc_pdu_len = + tc_sdls_processed_frame->tc_header.fl + 1 - tc_enc_payload_start_index - sa_ptr->stmacf_len - fecf_len; + memcpy(tc_sdls_processed_frame->tc_pdu, &(ingest[tc_enc_payload_start_index]), + tc_sdls_processed_frame->tc_pdu_len); } // Extended PDU processing, if applicable - if(crypto_config->process_sdls_pdus == TC_PROCESS_SDLS_PDUS_TRUE) + if (crypto_config->process_sdls_pdus == TC_PROCESS_SDLS_PDUS_TRUE) { status = Crypto_Process_Extended_Procedure_Pdu(tc_sdls_processed_frame, ingest); } @@ -3561,26 +3619,26 @@ int32_t Crypto_TC_ProcessSecurity( uint8_t* ingest, int* len_ingest,TC_t* tc_sdl * @param ingest: uint8_t* * @note TODO - Actually update based on variable config * */ -static int32_t Crypto_Process_Extended_Procedure_Pdu(TC_t* tc_sdls_processed_frame, uint8_t* ingest) +static int32_t Crypto_Process_Extended_Procedure_Pdu(TC_t *tc_sdls_processed_frame, uint8_t *ingest) { int32_t status = CRYPTO_LIB_SUCCESS; - if (crypto_config->has_pus_hdr==TC_HAS_PUS_HDR) + if (crypto_config->has_pus_hdr == TC_HAS_PUS_HDR) { if ((tc_sdls_processed_frame->tc_pdu[0] == 0x18) && (tc_sdls_processed_frame->tc_pdu[1] == 0x80)) // Crypto Lib Application ID { - #ifdef DEBUG +#ifdef DEBUG printf(KGRN "Received SDLS command: " RESET); - #endif +#endif // CCSDS Header sdls_frame.hdr.pvn = (tc_sdls_processed_frame->tc_pdu[0] & 0xE0) >> 5; sdls_frame.hdr.type = (tc_sdls_processed_frame->tc_pdu[0] & 0x10) >> 4; sdls_frame.hdr.shdr = (tc_sdls_processed_frame->tc_pdu[0] & 0x08) >> 3; sdls_frame.hdr.appID = - ((tc_sdls_processed_frame->tc_pdu[0] & 0x07) << 8) | tc_sdls_processed_frame->tc_pdu[1]; + ((tc_sdls_processed_frame->tc_pdu[0] & 0x07) << 8) | tc_sdls_processed_frame->tc_pdu[1]; sdls_frame.hdr.seq = (tc_sdls_processed_frame->tc_pdu[2] & 0xC0) >> 6; sdls_frame.hdr.pktid = - ((tc_sdls_processed_frame->tc_pdu[2] & 0x3F) << 8) | tc_sdls_processed_frame->tc_pdu[3]; + ((tc_sdls_processed_frame->tc_pdu[2] & 0x3F) << 8) | tc_sdls_processed_frame->tc_pdu[3]; sdls_frame.hdr.pkt_length = (tc_sdls_processed_frame->tc_pdu[4] << 8) | tc_sdls_processed_frame->tc_pdu[5]; // CCSDS PUS @@ -3598,23 +3656,24 @@ static int32_t Crypto_Process_Extended_Procedure_Pdu(TC_t* tc_sdls_processed_fra sdls_frame.pdu.sg = (tc_sdls_processed_frame->tc_pdu[10] & 0x30) >> 4; sdls_frame.pdu.pid = (tc_sdls_processed_frame->tc_pdu[10] & 0x0F); sdls_frame.pdu.pdu_len = (tc_sdls_processed_frame->tc_pdu[11] << 8) | tc_sdls_processed_frame->tc_pdu[12]; - for (int x = 13; x < (13 + sdls_frame.hdr.pkt_length); x++) { + for (int x = 13; x < (13 + sdls_frame.hdr.pkt_length); x++) + { sdls_frame.pdu.data[x - 13] = tc_sdls_processed_frame->tc_pdu[x]; } - #ifdef CCSDS_DEBUG +#ifdef CCSDS_DEBUG Crypto_ccsdsPrint(&sdls_frame); - #endif +#endif // Determine type of PDU status = Crypto_PDU(ingest, tc_sdls_processed_frame); } } - else if (tc_sdls_processed_frame->tc_header.vcid == TC_SDLS_EP_VCID) //TC SDLS PDU with no packet layer + else if (tc_sdls_processed_frame->tc_header.vcid == TC_SDLS_EP_VCID) // TC SDLS PDU with no packet layer { - #ifdef DEBUG +#ifdef DEBUG printf(KGRN "Received SDLS command: " RESET); - #endif +#endif // No Packet HDR or PUS in these frames // SDLS TLV PDU sdls_frame.pdu.type = (tc_sdls_processed_frame->tc_pdu[0] & 0x80) >> 7; @@ -3622,25 +3681,27 @@ static int32_t Crypto_Process_Extended_Procedure_Pdu(TC_t* tc_sdls_processed_fra sdls_frame.pdu.sg = (tc_sdls_processed_frame->tc_pdu[0] & 0x30) >> 4; sdls_frame.pdu.pid = (tc_sdls_processed_frame->tc_pdu[0] & 0x0F); sdls_frame.pdu.pdu_len = (tc_sdls_processed_frame->tc_pdu[1] << 8) | tc_sdls_processed_frame->tc_pdu[2]; - for (int x = 3; x < (3 + tc_sdls_processed_frame->tc_header.fl); x++) { - //Todo - Consider how this behaves with large OTAR PDUs that are larger than 1 TC in size. Most likely fails. Must consider Uplink Sessions (sequence numbers). + for (int x = 3; x < (3 + tc_sdls_processed_frame->tc_header.fl); x++) + { + // Todo - Consider how this behaves with large OTAR PDUs that are larger than 1 TC in size. Most likely + // fails. Must consider Uplink Sessions (sequence numbers). sdls_frame.pdu.data[x - 3] = tc_sdls_processed_frame->tc_pdu[x]; } - #ifdef CCSDS_DEBUG +#ifdef CCSDS_DEBUG Crypto_ccsdsPrint(&sdls_frame); - #endif +#endif // Determine type of PDU status = Crypto_PDU(ingest, tc_sdls_processed_frame); } - else { - //TODO - Process SDLS PDU with Packet Layer without PUS_HDR + else + { + // TODO - Process SDLS PDU with Packet Layer without PUS_HDR } return status; -}//End Process SDLS PDU - +} // End Process SDLS PDU /** * @brief Function: Crypto_TM_ApplySecurity @@ -3648,7 +3709,7 @@ static int32_t Crypto_Process_Extended_Procedure_Pdu(TC_t* tc_sdls_processed_fra * @param len_ingest: int* * @return int32: Success/Failure **/ -int32_t Crypto_TM_ApplySecurity( uint8_t* ingest, int* len_ingest) +int32_t Crypto_TM_ApplySecurity(uint8_t *ingest, int *len_ingest) // Accepts CCSDS message in ingest, and packs into TM before encryption { int32_t status = CRYPTO_LIB_SUCCESS; @@ -3665,28 +3726,28 @@ int32_t Crypto_TM_ApplySecurity( uint8_t* ingest, int* len_ingest) uint16_t spi = tm_frame.tm_sec_header.spi; uint16_t spp_crc = 0x0000; SecurityAssociation_t sa; - SecurityAssociation_t* sa_ptr = &sa; + SecurityAssociation_t *sa_ptr = &sa; gcry_cipher_hd_t tmp_hd; gcry_error_t gcry_error = GPG_ERR_NO_ERROR; memset(&tempTM, 0, TM_SIZE); - - #ifdef DEBUG - printf(KYEL "\n----- Crypto_TM_ApplySecurity START -----\n" RESET); - #endif + +#ifdef DEBUG + printf(KYEL "\n----- Crypto_TM_ApplySecurity START -----\n" RESET); +#endif // Check for idle frame trigger if (((uint8_t)ingest[0] == 0x08) && ((uint8_t)ingest[1] == 0x90)) - { // Zero ingest + { // Zero ingest for (x = 0; x < *len_ingest; x++) { ingest[x] = 0; } // Update TM First Header Pointer tm_frame.tm_header.fhp = 0xFE; - } + } else - { // Update the length of the ingest from the CCSDS header + { // Update the length of the ingest from the CCSDS header *len_ingest = (ingest[4] << 8) | ingest[5]; ingest[5] = ingest[5] - 5; // Remove outgoing secondary space packet header flag @@ -3695,269 +3756,252 @@ int32_t Crypto_TM_ApplySecurity( uint8_t* ingest, int* len_ingest) ingest[2] = 0xFF; ingest[3] = 0xFF; // Add 2 bytes of CRC to space packet - spp_crc = Crypto_Calc_CRC16((uint8_t*) ingest, *len_ingest); + spp_crc = Crypto_Calc_CRC16((uint8_t *)ingest, *len_ingest); ingest[*len_ingest] = (spp_crc & 0xFF00) >> 8; - ingest[*len_ingest+1] = (spp_crc & 0x00FF); + ingest[*len_ingest + 1] = (spp_crc & 0x00FF); *len_ingest = *len_ingest + 2; // Update TM First Header Pointer tm_frame.tm_header.fhp = tm_offset; - #ifdef TM_DEBUG - printf("tm_offset = %d \n", tm_offset); - #endif - } +#ifdef TM_DEBUG + printf("tm_offset = %d \n", tm_offset); +#endif + } // Update Current Telemetry Frame in Memory - // Counters - tm_frame.tm_header.mcfc++; - tm_frame.tm_header.vcfc++; - // Operational Control Field - Crypto_TM_updateOCF(); - // Payload Data Unit - Crypto_TM_updatePDU(ingest, *len_ingest); + // Counters + tm_frame.tm_header.mcfc++; + tm_frame.tm_header.vcfc++; + // Operational Control Field + Crypto_TM_updateOCF(); + // Payload Data Unit + Crypto_TM_updatePDU(ingest, *len_ingest); + + if (sadb_routine->sadb_get_sa_from_spi(spi, &sa_ptr) != CRYPTO_LIB_SUCCESS) + { + // TODO - Error handling + return CRYPTO_LIB_ERROR; // Error -- unable to get SA from SPI. + } - if(sadb_routine->sadb_get_sa_from_spi(spi,&sa_ptr) != CRYPTO_LIB_SUCCESS){ - //TODO - Error handling - return CRYPTO_LIB_ERROR; //Error -- unable to get SA from SPI. - } + // Check test flags + if (badSPI == 1) + { + tm_frame.tm_sec_header.spi++; + } + if (badIV == 1) + { + *(sa_ptr->iv + sa_ptr->shivf_len - 1) = *(sa_ptr->iv + sa_ptr->shivf_len - 1) + 1; + } + if (badMAC == 1) + { + tm_frame.tm_sec_trailer.mac[MAC_SIZE - 1]++; + } + // Initialize the temporary TM frame + // Header + tempTM[count++] = (uint8_t)((tm_frame.tm_header.tfvn << 6) | ((tm_frame.tm_header.scid & 0x3F0) >> 4)); + tempTM[count++] = (uint8_t)(((tm_frame.tm_header.scid & 0x00F) << 4) | (tm_frame.tm_header.vcid << 1) | + (tm_frame.tm_header.ocff)); + tempTM[count++] = (uint8_t)(tm_frame.tm_header.mcfc); + tempTM[count++] = (uint8_t)(tm_frame.tm_header.vcfc); + tempTM[count++] = + (uint8_t)((tm_frame.tm_header.tfsh << 7) | (tm_frame.tm_header.sf << 6) | (tm_frame.tm_header.pof << 5) | + (tm_frame.tm_header.slid << 3) | ((tm_frame.tm_header.fhp & 0x700) >> 8)); + tempTM[count++] = (uint8_t)(tm_frame.tm_header.fhp & 0x0FF); + // tempTM[count++] = (uint8_t) ((tm_frame.tm_header.tfshvn << 6) | tm_frame.tm_header.tfshlen); + // Security Header + tempTM[count++] = (uint8_t)((spi & 0xFF00) >> 8); + tempTM[count++] = (uint8_t)((spi & 0x00FF)); + memcpy(tm_frame.tm_sec_header.iv, sa_ptr->iv, sa_ptr->shivf_len); - // Check test flags - if (badSPI == 1) + // Padding Length + pad_len = Crypto_Get_tmLength(*len_ingest) - TM_MIN_SIZE + IV_SIZE + TM_PAD_SIZE - *len_ingest; + + // Only add IV for authenticated encryption + if ((sa_ptr->est == 1) && (sa_ptr->ast == 1)) + { // Initialization Vector +#ifdef INCREMENT + Crypto_increment(sa_ptr->iv, sa_ptr->shivf_len); +#endif + if ((sa_ptr->est == 1) || (sa_ptr->ast == 1)) { - tm_frame.tm_sec_header.spi++; + for (x = 0; x < IV_SIZE; x++) + { + tempTM[count++] = *(sa_ptr->iv + x); + } } - if (badIV == 1) + pdu_loc = count; + pad_len = pad_len - IV_SIZE - TM_PAD_SIZE + OCF_SIZE; + pdu_len = *len_ingest + pad_len; + } + else + { // Include padding length bytes - hard coded per ESA testing + tempTM[count++] = 0x00; // pad_len >> 8; + tempTM[count++] = 0x1A; // pad_len + pdu_loc = count; + pdu_len = *len_ingest + pad_len; + } + + // Payload Data Unit + for (x = 0; x < (pdu_len); x++) + { + tempTM[count++] = (uint8_t)tm_frame.tm_pdu[x]; + } + // Message Authentication Code + mac_loc = count; + for (x = 0; x < MAC_SIZE; x++) + { + tempTM[count++] = 0x00; + } + // Operational Control Field + for (x = 0; x < OCF_SIZE; x++) + { + tempTM[count++] = (uint8_t)tm_frame.tm_sec_trailer.ocf[x]; + } + // Frame Error Control Field + fecf_loc = count; + tm_frame.tm_sec_trailer.fecf = Crypto_Calc_FECF((uint8_t *)tempTM, count); + tempTM[count++] = (uint8_t)((tm_frame.tm_sec_trailer.fecf & 0xFF00) >> 8); + tempTM[count++] = (uint8_t)(tm_frame.tm_sec_trailer.fecf & 0x00FF); + + // Determine Mode + // Clear + if ((sa_ptr->est == 0) && (sa_ptr->ast == 0)) + { +#ifdef DEBUG + printf(KBLU "Creating a TM - CLEAR! \n" RESET); +#endif + // Copy temporary frame to ingest + memcpy(ingest, tempTM, count); + } + // Authenticated Encryption + else if ((sa_ptr->est == 1) && (sa_ptr->ast == 1)) + { +#ifdef DEBUG + printf(KBLU "Creating a TM - AUTHENTICATED ENCRYPTION! \n" RESET); +#endif + + // Copy TM to ingest + memcpy(ingest, tempTM, pdu_loc); + +#ifdef MAC_DEBUG + printf("AAD = 0x"); +#endif + // Prepare additional authenticated data + for (y = 0; y < sa_ptr->abm_len; y++) { - *(sa_ptr->iv + sa_ptr->shivf_len -1) = *(sa_ptr->iv + sa_ptr->shivf_len -1) + 1; + aad[y] = ingest[y] & *(sa_ptr->abm + y); +#ifdef MAC_DEBUG + printf("%02x", aad[y]); +#endif } - if (badMAC == 1) +#ifdef MAC_DEBUG + printf("\n"); +#endif + + gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - tm_frame.tm_sec_trailer.mac[MAC_SIZE-1]++; + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; } - - // Initialize the temporary TM frame - // Header - tempTM[count++] = (uint8_t) ((tm_frame.tm_header.tfvn << 6) | ((tm_frame.tm_header.scid & 0x3F0) >> 4)); - tempTM[count++] = (uint8_t) (((tm_frame.tm_header.scid & 0x00F) << 4) | (tm_frame.tm_header.vcid << 1) | (tm_frame.tm_header.ocff)); - tempTM[count++] = (uint8_t) (tm_frame.tm_header.mcfc); - tempTM[count++] = (uint8_t) (tm_frame.tm_header.vcfc); - tempTM[count++] = (uint8_t) ((tm_frame.tm_header.tfsh << 7) | (tm_frame.tm_header.sf << 6) | (tm_frame.tm_header.pof << 5) | (tm_frame.tm_header.slid << 3) | ((tm_frame.tm_header.fhp & 0x700) >> 8)); - tempTM[count++] = (uint8_t) (tm_frame.tm_header.fhp & 0x0FF); - // tempTM[count++] = (uint8_t) ((tm_frame.tm_header.tfshvn << 6) | tm_frame.tm_header.tfshlen); - // Security Header - tempTM[count++] = (uint8_t) ((spi & 0xFF00) >> 8); - tempTM[count++] = (uint8_t) ((spi & 0x00FF)); - memcpy(tm_frame.tm_sec_header.iv, sa_ptr->iv, sa_ptr->shivf_len); - - // Padding Length - pad_len = Crypto_Get_tmLength(*len_ingest) - TM_MIN_SIZE + IV_SIZE + TM_PAD_SIZE - *len_ingest; - - // Only add IV for authenticated encryption - if ((sa_ptr->est == 1) && - (sa_ptr->ast == 1)) - { // Initialization Vector - #ifdef INCREMENT - Crypto_increment(sa_ptr->iv, sa_ptr->shivf_len); - #endif - if ((sa_ptr->est == 1) || (sa_ptr->ast == 1)) - { for (x = 0; x < IV_SIZE; x++) - { - tempTM[count++] = *(sa_ptr->iv + x); - } - } - pdu_loc = count; - pad_len = pad_len - IV_SIZE - TM_PAD_SIZE + OCF_SIZE; - pdu_len = *len_ingest + pad_len; + gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[sa_ptr->ekid].value[0]), KEY_SIZE); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; } - else - { // Include padding length bytes - hard coded per ESA testing - tempTM[count++] = 0x00; // pad_len >> 8; - tempTM[count++] = 0x1A; // pad_len - pdu_loc = count; - pdu_len = *len_ingest + pad_len; + gcry_error = gcry_cipher_setiv(tmp_hd, sa_ptr->iv, sa_ptr->shivf_len); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; } - - // Payload Data Unit - for (x = 0; x < (pdu_len); x++) + gcry_error = gcry_cipher_encrypt(tmp_hd, + &(ingest[pdu_loc]), // ciphertext output + pdu_len, // length of data + &(tempTM[pdu_loc]), // plaintext input + pdu_len // in data length + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - tempTM[count++] = (uint8_t) tm_frame.tm_pdu[x]; + printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; } - // Message Authentication Code - mac_loc = count; - for (x = 0; x < MAC_SIZE; x++) + gcry_error = gcry_cipher_authenticate(tmp_hd, + &(aad[0]), // additional authenticated data + sa_ptr->abm_len // length of AAD + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - tempTM[count++] = 0x00; + printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; } - // Operational Control Field - for (x = 0; x < OCF_SIZE; x++) + gcry_error = gcry_cipher_gettag(tmp_hd, + &(ingest[mac_loc]), // tag output + MAC_SIZE // tag size + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) { - tempTM[count++] = (uint8_t) tm_frame.tm_sec_trailer.ocf[x]; + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; } - // Frame Error Control Field - fecf_loc = count; - tm_frame.tm_sec_trailer.fecf = Crypto_Calc_FECF((uint8_t*) tempTM, count); - tempTM[count++] = (uint8_t) ((tm_frame.tm_sec_trailer.fecf & 0xFF00) >> 8); - tempTM[count++] = (uint8_t) (tm_frame.tm_sec_trailer.fecf & 0x00FF); - - // Determine Mode - // Clear - if ((sa_ptr->est == 0) && - (sa_ptr->ast == 0)) - { - #ifdef DEBUG - printf(KBLU "Creating a TM - CLEAR! \n" RESET); - #endif - // Copy temporary frame to ingest - memcpy(ingest, tempTM, count); - } - // Authenticated Encryption - else if ((sa_ptr->est == 1) && - (sa_ptr->ast == 1)) - { - #ifdef DEBUG - printf(KBLU "Creating a TM - AUTHENTICATED ENCRYPTION! \n" RESET); - #endif - - // Copy TM to ingest - memcpy(ingest, tempTM, pdu_loc); - - #ifdef MAC_DEBUG - printf("AAD = 0x"); - #endif - // Prepare additional authenticated data - for (y = 0; y < sa_ptr->abm_len; y++) - { - aad[y] = ingest[y] & *(sa_ptr->abm + y); - #ifdef MAC_DEBUG - printf("%02x", aad[y]); - #endif - } - #ifdef MAC_DEBUG - printf("\n"); - #endif - - gcry_error = gcry_cipher_open( - &(tmp_hd), - GCRY_CIPHER_AES256, - GCRY_CIPHER_MODE_GCM, - GCRY_CIPHER_CBC_MAC - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_setkey( - tmp_hd, - &(ek_ring[sa_ptr->ekid].value[0]), - KEY_SIZE - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_setiv( - tmp_hd, - sa_ptr->iv, - sa_ptr->shivf_len - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_encrypt( - tmp_hd, - &(ingest[pdu_loc]), // ciphertext output - pdu_len, // length of data - &(tempTM[pdu_loc]), // plaintext input - pdu_len // in data length - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_authenticate( - tmp_hd, - &(aad[0]), // additional authenticated data - sa_ptr->abm_len // length of AAD - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_gettag( - tmp_hd, - &(ingest[mac_loc]), // tag output - MAC_SIZE // tag size - ); - if((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET,gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - - #ifdef MAC_DEBUG - printf("MAC = 0x"); - for(x = 0; x < MAC_SIZE; x++) - { - printf("%02x", (uint8_t) ingest[x + mac_loc]); - } - printf("\n"); - #endif - - // Update OCF - y = 0; - for (x = OCF_SIZE; x > 0; x--) - { - ingest[fecf_loc - x] = tm_frame.tm_sec_trailer.ocf[y++]; - } - // Update FECF - tm_frame.tm_sec_trailer.fecf = Crypto_Calc_FECF((uint8_t*) ingest, fecf_loc - 1); - ingest[fecf_loc] = (uint8_t) ((tm_frame.tm_sec_trailer.fecf & 0xFF00) >> 8); - ingest[fecf_loc + 1] = (uint8_t) (tm_frame.tm_sec_trailer.fecf & 0x00FF); - } - // Authentication - else if ((sa_ptr->est == 0) && - (sa_ptr->ast == 1)) +#ifdef MAC_DEBUG + printf("MAC = 0x"); + for (x = 0; x < MAC_SIZE; x++) { - #ifdef DEBUG - printf(KBLU "Creating a TM - AUTHENTICATED! \n" RESET); - #endif - // TODO: Future work. Operationally same as clear. - memcpy(ingest, tempTM, count); + printf("%02x", (uint8_t)ingest[x + mac_loc]); } - // Encryption - else if ((sa_ptr->est == 1) && - (sa_ptr->ast == 0)) + printf("\n"); +#endif + + // Update OCF + y = 0; + for (x = OCF_SIZE; x > 0; x--) { - #ifdef DEBUG - printf(KBLU "Creating a TM - ENCRYPTED! \n" RESET); - #endif - // TODO: Future work. Operationally same as clear. - memcpy(ingest, tempTM, count); + ingest[fecf_loc - x] = tm_frame.tm_sec_trailer.ocf[y++]; } - #ifdef TM_DEBUG - Crypto_tmPrint(&tm_frame); - #endif - - #ifdef DEBUG - printf(KYEL "----- Crypto_TM_ApplySecurity END -----\n" RESET); - #endif + // Update FECF + tm_frame.tm_sec_trailer.fecf = Crypto_Calc_FECF((uint8_t *)ingest, fecf_loc - 1); + ingest[fecf_loc] = (uint8_t)((tm_frame.tm_sec_trailer.fecf & 0xFF00) >> 8); + ingest[fecf_loc + 1] = (uint8_t)(tm_frame.tm_sec_trailer.fecf & 0x00FF); + } + // Authentication + else if ((sa_ptr->est == 0) && (sa_ptr->ast == 1)) + { +#ifdef DEBUG + printf(KBLU "Creating a TM - AUTHENTICATED! \n" RESET); +#endif + // TODO: Future work. Operationally same as clear. + memcpy(ingest, tempTM, count); + } + // Encryption + else if ((sa_ptr->est == 1) && (sa_ptr->ast == 0)) + { +#ifdef DEBUG + printf(KBLU "Creating a TM - ENCRYPTED! \n" RESET); +#endif + // TODO: Future work. Operationally same as clear. + memcpy(ingest, tempTM, count); + } + +#ifdef TM_DEBUG + Crypto_tmPrint(&tm_frame); +#endif + +#ifdef DEBUG + printf(KYEL "----- Crypto_TM_ApplySecurity END -----\n" RESET); +#endif *len_ingest = count; - return status; + return status; } /** @@ -3966,22 +4010,22 @@ int32_t Crypto_TM_ApplySecurity( uint8_t* ingest, int* len_ingest) * @param len_ingest: int* * @return int32: Success/Failure **/ -int32_t Crypto_TM_ProcessSecurity(uint8_t* ingest, int* len_ingest) +int32_t Crypto_TM_ProcessSecurity(uint8_t *ingest, int *len_ingest) { // Local Variables int32_t status = CRYPTO_LIB_SUCCESS; - #ifdef DEBUG - printf(KYEL "\n----- Crypto_TM_ProcessSecurity START -----\n" RESET); - #endif +#ifdef DEBUG + printf(KYEL "\n----- Crypto_TM_ProcessSecurity START -----\n" RESET); +#endif // TODO: This whole function! len_ingest = len_ingest; ingest[0] = ingest[0]; - #ifdef DEBUG - printf(KYEL "----- Crypto_TM_ProcessSecurity END -----\n" RESET); - #endif +#ifdef DEBUG + printf(KYEL "----- Crypto_TM_ProcessSecurity END -----\n" RESET); +#endif return status; } @@ -3992,22 +4036,22 @@ int32_t Crypto_TM_ProcessSecurity(uint8_t* ingest, int* len_ingest) * @param len_ingest: int* * @return int32: Success/Failure **/ -int32_t Crypto_AOS_ApplySecurity(uint8_t* ingest, int* len_ingest) +int32_t Crypto_AOS_ApplySecurity(uint8_t *ingest, int *len_ingest) { // Local Variables int32_t status = CRYPTO_LIB_SUCCESS; - #ifdef DEBUG - printf(KYEL "\n----- Crypto_AOS_ApplySecurity START -----\n" RESET); - #endif +#ifdef DEBUG + printf(KYEL "\n----- Crypto_AOS_ApplySecurity START -----\n" RESET); +#endif // TODO: This whole function! len_ingest = len_ingest; ingest[0] = ingest[0]; - #ifdef DEBUG - printf(KYEL "----- Crypto_AOS_ApplySecurity END -----\n" RESET); - #endif +#ifdef DEBUG + printf(KYEL "----- Crypto_AOS_ApplySecurity END -----\n" RESET); +#endif return status; } @@ -4018,22 +4062,22 @@ int32_t Crypto_AOS_ApplySecurity(uint8_t* ingest, int* len_ingest) * @param len_ingest: int* * @return int32: Success/Failure **/ -int32_t Crypto_AOS_ProcessSecurity(uint8_t* ingest, int* len_ingest) +int32_t Crypto_AOS_ProcessSecurity(uint8_t *ingest, int *len_ingest) { // Local Variables int32_t status = CRYPTO_LIB_SUCCESS; - #ifdef DEBUG - printf(KYEL "\n----- Crypto_AOS_ProcessSecurity START -----\n" RESET); - #endif +#ifdef DEBUG + printf(KYEL "\n----- Crypto_AOS_ProcessSecurity START -----\n" RESET); +#endif // TODO: This whole function! len_ingest = len_ingest; ingest[0] = ingest[0]; - #ifdef DEBUG - printf(KYEL "----- Crypto_AOS_ProcessSecurity END -----\n" RESET); - #endif +#ifdef DEBUG + printf(KYEL "----- Crypto_AOS_ProcessSecurity END -----\n" RESET); +#endif return status; } @@ -4044,22 +4088,22 @@ int32_t Crypto_AOS_ProcessSecurity(uint8_t* ingest, int* len_ingest) * @param len_ingest: int* * @return int32: Success/Failure **/ -int32_t Crypto_ApplySecurity(uint8_t* ingest, int* len_ingest) +int32_t Crypto_ApplySecurity(uint8_t *ingest, int *len_ingest) { // Local Variables int32_t status = CRYPTO_LIB_SUCCESS; - #ifdef DEBUG - printf(KYEL "\n----- Crypto_ApplySecurity START -----\n" RESET); - #endif +#ifdef DEBUG + printf(KYEL "\n----- Crypto_ApplySecurity START -----\n" RESET); +#endif // TODO: This whole function! len_ingest = len_ingest; ingest[0] = ingest[0]; - #ifdef DEBUG - printf(KYEL "----- Crypto_ApplySecurity END -----\n" RESET); - #endif +#ifdef DEBUG + printf(KYEL "----- Crypto_ApplySecurity END -----\n" RESET); +#endif return status; } @@ -4070,22 +4114,22 @@ int32_t Crypto_ApplySecurity(uint8_t* ingest, int* len_ingest) * @param len_ingest: int* * @return int32: Success/Failure **/ -int32_t Crypto_ProcessSecurity(uint8_t* ingest, int* len_ingest) +int32_t Crypto_ProcessSecurity(uint8_t *ingest, int *len_ingest) { // Local Variables int32_t status = CRYPTO_LIB_SUCCESS; - #ifdef DEBUG - printf(KYEL "\n----- Crypto_ProcessSecurity START -----\n" RESET); - #endif +#ifdef DEBUG + printf(KYEL "\n----- Crypto_ProcessSecurity START -----\n" RESET); +#endif // TODO: This whole function! len_ingest = len_ingest; ingest[0] = ingest[0]; - #ifdef DEBUG - printf(KYEL "----- Crypto_ProcessSecurity END -----\n" RESET); - #endif +#ifdef DEBUG + printf(KYEL "----- Crypto_ProcessSecurity END -----\n" RESET); +#endif return status; } diff --git a/src/src_main/crypto_print.c b/src/src_main/crypto_print.c index 2d2d99b4..1a441f29 100644 --- a/src/src_main/crypto_print.c +++ b/src/src_main/crypto_print.c @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -24,13 +25,12 @@ #include "crypto_print.h" #include "crypto_structs.h" - /** * @brief Function: Crypto_tcPrint * Prints the current TC in memory. * @param tc_frame: TC_t* **/ -void Crypto_tcPrint(TC_t* tc_frame) +void Crypto_tcPrint(TC_t *tc_frame) { printf("Current TC in memory is: \n"); printf("\t Header\n"); @@ -60,7 +60,7 @@ void Crypto_tcPrint(TC_t* tc_frame) * Prints the current TM in memory. * @param tm_frame: TM_t* **/ -void Crypto_tmPrint(TM_t* tm_frame) +void Crypto_tmPrint(TM_t *tm_frame) { printf("Current TM in memory is: \n"); printf("\t Header\n"); @@ -75,8 +75,8 @@ void Crypto_tmPrint(TM_t* tm_frame) printf("\t\t pof = 0x%01x \n", tm_frame->tm_header.pof); printf("\t\t slid = 0x%01x \n", tm_frame->tm_header.slid); printf("\t\t fhp = 0x%03x \n", tm_frame->tm_header.fhp); - //printf("\t\t tfshvn = 0x%01x \n", tm_frame.tm_header.tfshvn); - //printf("\t\t tfshlen= 0x%02x \n", tm_frame.tm_header.tfshlen); + // printf("\t\t tfshvn = 0x%01x \n", tm_frame.tm_header.tfshvn); + // printf("\t\t tfshlen= 0x%02x \n", tm_frame.tm_header.tfshlen); printf("\t SDLS Header\n"); printf("\t\t spi = 0x%04x \n", tm_frame->tm_sec_header.spi); printf("\t\t iv[%d] = 0x%02x \n", (IV_SIZE - 1), tm_frame->tm_sec_header.iv[IV_SIZE - 1]); @@ -100,7 +100,7 @@ void Crypto_tmPrint(TM_t* tm_frame) * Prints the current CLCW in memory. * @param clcw: TM_FrameCLCW_t* **/ -void Crypto_clcwPrint(TM_FrameCLCW_t* clcw) +void Crypto_clcwPrint(TM_FrameCLCW_t *clcw) { printf("Current CLCW in memory is: \n"); printf("\t cwt = 0x%01x \n", clcw->cwt); @@ -125,7 +125,7 @@ void Crypto_clcwPrint(TM_FrameCLCW_t* clcw) * Prints the current FSR in memory. * @param report: SDLS_FSR_t* **/ -void Crypto_fsrPrint(SDLS_FSR_t* report) +void Crypto_fsrPrint(SDLS_FSR_t *report) { printf("Current FSR in memory is: \n"); printf("\t cwt = 0x%01x \n", report->cwt); @@ -144,7 +144,7 @@ void Crypto_fsrPrint(SDLS_FSR_t* report) * Prints the current CCSDS in memory. * @param sdls_frame: CCSDS_t* **/ -void Crypto_ccsdsPrint(CCSDS_t* sdls_frame) +void Crypto_ccsdsPrint(CCSDS_t *sdls_frame) { printf("Current CCSDS in memory is: \n"); printf("\t Primary Header\n"); @@ -180,15 +180,15 @@ void Crypto_ccsdsPrint(CCSDS_t* sdls_frame) * Prints the current Security Association in memory. * @param sa: SecurityAssociation_t* **/ -void Crypto_saPrint(SecurityAssociation_t* sa) +void Crypto_saPrint(SecurityAssociation_t *sa) { printf("SA status: \n"); printf("\t spi = 0x%01x \n", sa->spi); printf("\t sa_state = 0x%01x \n", sa->sa_state); - //printf("\t gvcid[0] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[0]); - //printf("\t gvcid[1] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[1]); - //printf("\t gvcid[2] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[2]); - //printf("\t gvcid[3] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[3]); + // printf("\t gvcid[0] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[0]); + // printf("\t gvcid[1] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[1]); + // printf("\t gvcid[2] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[2]); + // printf("\t gvcid[3] = 0x%02x \n", sa->gvcid_blk[spi].gvcid[3]); printf("\t est = 0x%01x \n", sa->est); printf("\t ast = 0x%01x \n", sa->ast); printf("\t shivf_len = 0x%02x \n", sa->shivf_len); @@ -196,14 +196,14 @@ void Crypto_saPrint(SecurityAssociation_t* sa) printf("\t shplf_len = 0x%01x \n", sa->shplf_len); printf("\t stmacf_len = 0x%02x \n", sa->stmacf_len); printf("\t ecs_len = 0x%02x \n", sa->ecs_len); - printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE-4, sa->ecs[ECS_SIZE - 4]); - printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE-3, sa->ecs[ECS_SIZE - 3]); - printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE-2, sa->ecs[ECS_SIZE - 2]); - printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE-1, sa->ecs[ECS_SIZE - 1]); + printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE - 4, sa->ecs[ECS_SIZE - 4]); + printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE - 3, sa->ecs[ECS_SIZE - 3]); + printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE - 2, sa->ecs[ECS_SIZE - 2]); + printf("\t ecs[%d] = 0x%02x \n", ECS_SIZE - 1, sa->ecs[ECS_SIZE - 1]); printf("\t iv_len = 0x%02x \n", sa->shivf_len); - if(sa->iv != NULL) + if (sa->iv != NULL) { - for(int i = 0; i < sa->shivf_len; i++) + for (int i = 0; i < sa->shivf_len; i++) { printf("\t iv[%d] = 0x%02x \n", i, *(sa->iv + i)); } @@ -211,20 +211,20 @@ void Crypto_saPrint(SecurityAssociation_t* sa) printf("\t acs_len = 0x%02x \n", sa->acs_len); printf("\t acs = 0x%02x \n", sa->acs); printf("\t abm_len = 0x%04x \n", sa->abm_len); - if(sa->abm != NULL) + if (sa->abm != NULL) { printf("\t abm: \n"); - for(int i = 0; i < sa->abm_len; i++) + for (int i = 0; i < sa->abm_len; i++) { printf("%02x", *(sa->abm + i)); } printf("\n"); } printf("\t arc_len = 0x%02x \n", sa->arc_len); - if(sa->arc != NULL) + if (sa->arc != NULL) { printf("\t arc: \n"); - for(int i = 0; i < sa->arc_len; i++) + for (int i = 0; i < sa->arc_len; i++) { printf("%02x", *(sa->arc + i)); } @@ -246,7 +246,8 @@ void Crypto_hexprint(void *c, size_t n) uint8_t *t = c; if (c == NULL) return; - while (n > 0) { + while (n > 0) + { --n; printf("%02x", t[n]); } @@ -264,19 +265,21 @@ void Crypto_binprint(void *c, size_t n) uint8_t *t = c; if (c == NULL) return; - while (n > 0) { + while (n > 0) + { int q; --n; - for(q = 0x80; q; q >>= 1) + for (q = 0x80; q; q >>= 1) printf("%x", !!(t[n] & q)); } printf("\n"); } -void Crypto_mpPrint(GvcidManagedParameters_t* managed_parameters, uint8_t print_children) -//Prints the currently configured Managed Parameters +void Crypto_mpPrint(GvcidManagedParameters_t *managed_parameters, uint8_t print_children) +// Prints the currently configured Managed Parameters { - if(managed_parameters != NULL){ + if (managed_parameters != NULL) + { printf("Managed Parameter: \n"); printf("\t tfvn: %d", managed_parameters->tfvn); printf("\t scid: %d", managed_parameters->scid); @@ -284,8 +287,9 @@ void Crypto_mpPrint(GvcidManagedParameters_t* managed_parameters, uint8_t print_ printf("\t has_fecf: %d", managed_parameters->has_fecf); printf("\t has_segmentation_headers: %d\n", managed_parameters->has_segmentation_hdr); } - if(managed_parameters->next!=NULL && print_children!=0){ - Crypto_mpPrint(managed_parameters->next,print_children); + if (managed_parameters->next != NULL && print_children != 0) + { + Crypto_mpPrint(managed_parameters->next, print_children); } } #endif \ No newline at end of file diff --git a/src/src_main/sadb_routine_inmemory.template.c b/src/src_main/sadb_routine_inmemory.template.c index fa638559..26af9fcd 100644 --- a/src/src_main/sadb_routine_inmemory.template.c +++ b/src/src_main/sadb_routine_inmemory.template.c @@ -12,31 +12,30 @@ * foreign persons. */ -#include "sadb_routine.h" -#include "crypto_structs.h" -#include "crypto_print.h" #include "crypto.h" #include "crypto_error.h" +#include "crypto_print.h" +#include "crypto_structs.h" +#include "sadb_routine.h" // Security Association Initialization Functions int32_t sadb_config(void); int32_t sadb_init(void); int32_t sadb_close(void); // Security Association Interaction Functions -int32_t sadb_get_sa_from_spi(uint16_t,SecurityAssociation_t**); -int32_t sadb_get_operational_sa_from_gvcid(uint8_t,uint16_t,uint16_t,uint8_t,SecurityAssociation_t**); -int32_t sadb_save_sa(SecurityAssociation_t* sa); +int32_t sadb_get_sa_from_spi(uint16_t, SecurityAssociation_t **); +int32_t sadb_get_operational_sa_from_gvcid(uint8_t, uint16_t, uint16_t, uint8_t, SecurityAssociation_t **); +int32_t sadb_save_sa(SecurityAssociation_t *sa); // Security Association Utility Functions -int32_t sadb_sa_start(TC_t* tc_frame); +int32_t sadb_sa_start(TC_t *tc_frame); int32_t sadb_sa_expire(void); int32_t sadb_sa_rekey(void); -int32_t sadb_sa_status(uint8_t*); +int32_t sadb_sa_status(uint8_t *); int32_t sadb_sa_create(void); int32_t sadb_sa_setARSN(void); int32_t sadb_sa_setARSNW(void); int32_t sadb_sa_delete(void); - /* ** Global Variables */ @@ -82,14 +81,14 @@ int32_t sadb_config(void) sa[1].sa_state = SA_OPERATIONAL; sa[1].est = 0; sa[1].ast = 0; - //sa[1].shivf_len = 12; - //sa[1].iv = (uint8_t*) calloc(1, sa[1].shivf_len * sizeof(uint8_t)); + // sa[1].shivf_len = 12; + // sa[1].iv = (uint8_t*) calloc(1, sa[1].shivf_len * sizeof(uint8_t)); sa[1].arc_len = 1; sa[1].arcw_len = 1; sa[1].arcw = 5; - sa[1].gvcid_tc_blk.tfvn = 0; - sa[1].gvcid_tc_blk.scid = SCID & 0x3FF; - sa[1].gvcid_tc_blk.vcid = 0; + sa[1].gvcid_tc_blk.tfvn = 0; + sa[1].gvcid_tc_blk.scid = SCID & 0x3FF; + sa[1].gvcid_tc_blk.vcid = 0; sa[1].gvcid_tc_blk.mapid = TYPE_TC; // SA 2 - KEYED; ARCW:5; AES-GCM; IV:00...00; IV-len:12; MAC-len:16; Key-ID: 128 @@ -99,10 +98,10 @@ int32_t sadb_config(void) sa[2].est = 1; sa[2].ast = 1; sa[2].shivf_len = 12; - sa[2].iv = (uint8_t*) calloc(1, sa[2].shivf_len * sizeof(uint8_t)); + sa[2].iv = (uint8_t *)calloc(1, sa[2].shivf_len * sizeof(uint8_t)); *(sa[2].iv + sa[2].shivf_len - 1) = 0; sa[2].abm_len = ABM_SIZE; // 20 - sa[2].abm = (uint8_t*) calloc(1, sa[2].abm_len * sizeof(uint8_t)); + sa[2].abm = (uint8_t *)calloc(1, sa[2].abm_len * sizeof(uint8_t)); sa[2].arcw_len = 1; sa[2].arcw = 5; sa[2].arc_len = (sa[2].arcw * 2) + 1; @@ -114,14 +113,14 @@ int32_t sadb_config(void) sa[3].est = 1; sa[3].ast = 1; sa[3].shivf_len = 12; - sa[3].iv = (uint8_t*) calloc(1, sa[3].shivf_len * sizeof(uint8_t)); + sa[3].iv = (uint8_t *)calloc(1, sa[3].shivf_len * sizeof(uint8_t)); *(sa[3].iv + sa[3].shivf_len - 1) = 0; sa[3].abm_len = ABM_SIZE; // 20 - sa[3].abm = (uint8_t*) calloc(1, sa[3].abm_len * sizeof(uint8_t)); + sa[3].abm = (uint8_t *)calloc(1, sa[3].abm_len * sizeof(uint8_t)); sa[3].arcw_len = 1; sa[3].arcw = 5; sa[3].arc_len = (sa[3].arcw * 2) + 1; - + // SA 4 - KEYED; ARCW:5; AES-GCM; IV:00...00; IV-len:12; MAC-len:16; Key-ID: 130 // SA 4 VC0/1 is now 4-VC0, 7-VC1 sa[4].spi = 4; @@ -131,16 +130,16 @@ int32_t sadb_config(void) sa[4].ast = 1; sa[4].shivf_len = 12; sa[4].stmacf_len = 16; - sa[4].iv = (uint8_t*) calloc(1, sa[4].shivf_len * sizeof(uint8_t)); + sa[4].iv = (uint8_t *)calloc(1, sa[4].shivf_len * sizeof(uint8_t)); *(sa[4].iv + 11) = 0; sa[4].abm_len = ABM_SIZE; // 20 - sa[4].abm = (uint8_t*) calloc(1, sa[4].abm_len * sizeof(uint8_t)); + sa[4].abm = (uint8_t *)calloc(1, sa[4].abm_len * sizeof(uint8_t)); sa[4].arcw_len = 1; sa[4].arcw = 5; sa[4].arc_len = (sa[4].arcw * 2) + 1; - sa[4].gvcid_tc_blk.tfvn = 0; - sa[4].gvcid_tc_blk.scid = SCID & 0x3FF; - sa[4].gvcid_tc_blk.vcid = 0; + sa[4].gvcid_tc_blk.tfvn = 0; + sa[4].gvcid_tc_blk.scid = SCID & 0x3FF; + sa[4].gvcid_tc_blk.vcid = 0; sa[4].gvcid_tc_blk.mapid = TYPE_TC; // SA 5 - KEYED; ARCW:5; AES-GCM; IV:00...00; IV-len:12; MAC-len:16; Key-ID: 131 @@ -150,10 +149,10 @@ int32_t sadb_config(void) sa[5].est = 1; sa[5].ast = 1; sa[5].shivf_len = 12; - sa[5].iv = (uint8_t*) calloc(1, sa[5].shivf_len * sizeof(uint8_t)); + sa[5].iv = (uint8_t *)calloc(1, sa[5].shivf_len * sizeof(uint8_t)); *(sa[5].iv + sa[5].shivf_len - 1) = 0; sa[5].abm_len = ABM_SIZE; // 20 - sa[5].abm = (uint8_t*) calloc(1, sa[5].abm_len * sizeof(uint8_t)); + sa[5].abm = (uint8_t *)calloc(1, sa[5].abm_len * sizeof(uint8_t)); sa[5].arcw_len = 1; sa[5].arcw = 5; sa[5].arc_len = (sa[5].arcw * 2) + 1; @@ -164,10 +163,10 @@ int32_t sadb_config(void) sa[6].est = 1; sa[6].ast = 1; sa[6].shivf_len = 12; - sa[6].iv = (uint8_t*) calloc(1, sa[6].shivf_len * sizeof(uint8_t)); + sa[6].iv = (uint8_t *)calloc(1, sa[6].shivf_len * sizeof(uint8_t)); *(sa[6].iv + sa[6].shivf_len - 1) = 0; sa[6].abm_len = ABM_SIZE; // 20 - sa[6].abm = (uint8_t*) calloc(1, sa[6].abm_len * sizeof(uint8_t)); + sa[6].abm = (uint8_t *)calloc(1, sa[6].abm_len * sizeof(uint8_t)); sa[6].arcw_len = 1; sa[6].arcw = 5; sa[6].arc_len = (sa[6].arcw * 2) + 1; @@ -179,16 +178,16 @@ int32_t sadb_config(void) sa[7].est = 1; sa[7].ast = 1; sa[7].shivf_len = 12; - sa[7].iv = (uint8_t*) calloc(1, sa[7].shivf_len * sizeof(uint8_t)); + sa[7].iv = (uint8_t *)calloc(1, sa[7].shivf_len * sizeof(uint8_t)); *(sa[7].iv + sa[7].shivf_len - 1) = 0; sa[7].abm_len = ABM_SIZE; // 20 - sa[7].abm = (uint8_t*) calloc(1, sa[7].abm_len * sizeof(uint8_t)); + sa[7].abm = (uint8_t *)calloc(1, sa[7].abm_len * sizeof(uint8_t)); sa[7].arcw_len = 1; sa[7].arcw = 5; sa[7].arc_len = (sa[7].arcw * 2) + 1; - sa[7].gvcid_tc_blk.tfvn = 0; - sa[7].gvcid_tc_blk.scid = SCID & 0x3FF; - sa[7].gvcid_tc_blk.vcid = 1; + sa[7].gvcid_tc_blk.tfvn = 0; + sa[7].gvcid_tc_blk.scid = SCID & 0x3FF; + sa[7].gvcid_tc_blk.vcid = 1; sa[7].gvcid_tc_blk.mapid = TYPE_TC; // SA 8 - CLEAR MODE @@ -199,9 +198,9 @@ int32_t sadb_config(void) sa[8].arc_len = 1; sa[8].arcw_len = 1; sa[8].arcw = 5; - sa[8].gvcid_tc_blk.tfvn = 0; - sa[8].gvcid_tc_blk.scid = SCID & 0x3FF; - sa[8].gvcid_tc_blk.vcid = 1; + sa[8].gvcid_tc_blk.tfvn = 0; + sa[8].gvcid_tc_blk.scid = SCID & 0x3FF; + sa[8].gvcid_tc_blk.vcid = 1; sa[8].gvcid_tc_blk.mapid = TYPE_TC; // SA 9 - Validation Tests @@ -211,16 +210,16 @@ int32_t sadb_config(void) sa[9].est = 1; sa[9].ast = 0; sa[9].shivf_len = 12; - sa[9].iv = (uint8_t*) calloc(1, sa[9].shivf_len * sizeof(uint8_t)); + sa[9].iv = (uint8_t *)calloc(1, sa[9].shivf_len * sizeof(uint8_t)); *(sa[9].iv + 11) = 0; sa[9].abm_len = ABM_SIZE; // 20 - sa[9].abm = (uint8_t*) calloc(1, sa[9].abm_len * sizeof(uint8_t)); + sa[9].abm = (uint8_t *)calloc(1, sa[9].abm_len * sizeof(uint8_t)); sa[9].arcw_len = 1; sa[9].arcw = 5; sa[9].arc_len = (sa[9].arcw * 2) + 1; - sa[9].gvcid_tc_blk.tfvn = 0; - sa[9].gvcid_tc_blk.scid = SCID & 0x3FF; - sa[9].gvcid_tc_blk.vcid = 0; + sa[9].gvcid_tc_blk.tfvn = 0; + sa[9].gvcid_tc_blk.scid = SCID & 0x3FF; + sa[9].gvcid_tc_blk.vcid = 0; sa[9].gvcid_tc_blk.mapid = TYPE_TC; return status; @@ -260,7 +259,7 @@ int32_t sadb_init(void) **/ int32_t sadb_close(void) { - //closing not necessary for inmemory DB. + // closing not necessary for inmemory DB. return CRYPTO_LIB_SUCCESS; } @@ -273,17 +272,26 @@ int32_t sadb_close(void) * @param security_association: SecurityAssociation_t** * @return int32: Success/Failure **/ -int32_t sadb_get_sa_from_spi(uint16_t spi,SecurityAssociation_t** security_association) +int32_t sadb_get_sa_from_spi(uint16_t spi, SecurityAssociation_t **security_association) { int32_t status = CRYPTO_LIB_SUCCESS; - if(sa == NULL) { return CRYPTO_LIB_ERR_NO_INIT; } + if (sa == NULL) + { + return CRYPTO_LIB_ERR_NO_INIT; + } *security_association = &sa[spi]; - if(sa[spi].iv == NULL && ( sa[spi].ast == 1 || sa[spi].est == 1 )) { return CRYPTO_LIB_ERR_NULL_IV; } //Must have IV if doing encryption or authentication - if(sa[spi].abm == NULL && sa[spi].ast) { return CRYPTO_LIB_ERR_NULL_ABM; } //Must have IV if doing encryption or authentication - #ifdef SA_DEBUG - printf(KYEL "DEBUG - Printing local copy of SA Entry for current SPI.\n" RESET); - Crypto_saPrint(*security_association); - #endif + if (sa[spi].iv == NULL && (sa[spi].ast == 1 || sa[spi].est == 1)) + { + return CRYPTO_LIB_ERR_NULL_IV; + } // Must have IV if doing encryption or authentication + if (sa[spi].abm == NULL && sa[spi].ast) + { + return CRYPTO_LIB_ERR_NULL_ABM; + } // Must have IV if doing encryption or authentication +#ifdef SA_DEBUG + printf(KYEL "DEBUG - Printing local copy of SA Entry for current SPI.\n" RESET); + Crypto_saPrint(*security_association); +#endif return status; } @@ -296,23 +304,36 @@ int32_t sadb_get_sa_from_spi(uint16_t spi,SecurityAssociation_t** security_assoc * @param security_association: SecurityAssociation_t** * @return int32: Success/Failure **/ -int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn,uint16_t scid,uint16_t vcid,uint8_t mapid,SecurityAssociation_t** security_association) +int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn, uint16_t scid, uint16_t vcid, uint8_t mapid, + SecurityAssociation_t **security_association) { int32_t status = CRYPTO_LIB_ERR_NO_OPERATIONAL_SA; - if(sa == NULL) { return CRYPTO_LIB_ERR_NO_INIT; } + if (sa == NULL) + { + return CRYPTO_LIB_ERR_NO_INIT; + } - for (int i=0; i<10; i++) + for (int i = 0; i < 10; i++) { - if ((sa[i].gvcid_tc_blk.tfvn == tfvn) && (sa[i].gvcid_tc_blk.scid == scid) && (sa[i].gvcid_tc_blk.vcid == vcid) && (sa[i].sa_state == SA_OPERATIONAL) && - (crypto_config->unique_sa_per_mapid==TC_UNIQUE_SA_PER_MAP_ID_FALSE || sa[i].gvcid_tc_blk.mapid == mapid)) //only require MapID match is unique SA per MapID set (only relevant when using segmentation hdrs) + if ((sa[i].gvcid_tc_blk.tfvn == tfvn) && (sa[i].gvcid_tc_blk.scid == scid) && + (sa[i].gvcid_tc_blk.vcid == vcid) && (sa[i].sa_state == SA_OPERATIONAL) && + (crypto_config->unique_sa_per_mapid == TC_UNIQUE_SA_PER_MAP_ID_FALSE || + sa[i].gvcid_tc_blk.mapid == mapid)) // only require MapID match is unique SA per MapID set (only relevant + // when using segmentation hdrs) { *security_association = &sa[i]; - if(sa[i].iv == NULL && ( sa[i].ast == 1 || sa[i].est == 1 )) { return CRYPTO_LIB_ERR_NULL_IV; } - if(sa[i].abm == NULL && sa[i].ast) { return CRYPTO_LIB_ERR_NULL_ABM; } //Must have IV if doing encryption or authentication + if (sa[i].iv == NULL && (sa[i].ast == 1 || sa[i].est == 1)) + { + return CRYPTO_LIB_ERR_NULL_IV; + } + if (sa[i].abm == NULL && sa[i].ast) + { + return CRYPTO_LIB_ERR_NULL_ABM; + } // Must have IV if doing encryption or authentication - #ifdef SA_DEBUG - printf("Valid operational SA found at index %d.\n", i); - #endif +#ifdef SA_DEBUG + printf("Valid operational SA found at index %d.\n", i); +#endif status = CRYPTO_LIB_SUCCESS; break; @@ -322,53 +343,58 @@ int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn,uint16_t scid,uint16_t v // If not a success, attempt to generate a meaningful error code if (status != CRYPTO_LIB_SUCCESS) { - #ifdef SA_DEBUG - printf(KRED "Error - Making best attempt at a useful error code:\n\t" RESET); - #endif +#ifdef SA_DEBUG + printf(KRED "Error - Making best attempt at a useful error code:\n\t" RESET); +#endif - for (int i=0; i> 4); - gvcid.scid = (sdls_frame.pdu.data[count] << 12) | - (sdls_frame.pdu.data[count + 1] << 4) | - (sdls_frame.pdu.data[count + 2] >> 4); - gvcid.vcid = (sdls_frame.pdu.data[count + 2] << 4) | - (sdls_frame.pdu.data[count + 3] && 0x3F); - if(current_managed_parameters->has_segmentation_hdr==TC_HAS_SEGMENT_HDRS){gvcid.mapid = (sdls_frame.pdu.data[count + 3]);} - else {gvcid.mapid=0;} + for (int x = 0; x <= ((sdls_frame.pdu.pdu_len - 2) / 4); x++) + { // Read in GVCID + gvcid.tfvn = (sdls_frame.pdu.data[count] >> 4); + gvcid.scid = (sdls_frame.pdu.data[count] << 12) | (sdls_frame.pdu.data[count + 1] << 4) | + (sdls_frame.pdu.data[count + 2] >> 4); + gvcid.vcid = (sdls_frame.pdu.data[count + 2] << 4) | (sdls_frame.pdu.data[count + 3] && 0x3F); + if (current_managed_parameters->has_segmentation_hdr == TC_HAS_SEGMENT_HDRS) + { + gvcid.mapid = (sdls_frame.pdu.data[count + 3]); + } + else + { + gvcid.mapid = 0; + } // TC if (gvcid.vcid != tc_frame->tc_header.vcid) - { // Clear all GVCIDs for provided SPI + { // Clear all GVCIDs for provided SPI if (gvcid.mapid == TYPE_TC) { - sa[spi].gvcid_tc_blk.tfvn = 0; - sa[spi].gvcid_tc_blk.scid = 0; - sa[spi].gvcid_tc_blk.vcid = 0; - sa[spi].gvcid_tc_blk.mapid = 0; + sa[spi].gvcid_tc_blk.tfvn = 0; + sa[spi].gvcid_tc_blk.scid = 0; + sa[spi].gvcid_tc_blk.vcid = 0; + sa[spi].gvcid_tc_blk.mapid = 0; } // Write channel to SA if (gvcid.mapid != TYPE_MAP) - { // TC - sa[spi].gvcid_tc_blk.tfvn = gvcid.tfvn; - sa[spi].gvcid_tc_blk.scid = gvcid.scid; + { // TC + sa[spi].gvcid_tc_blk.tfvn = gvcid.tfvn; + sa[spi].gvcid_tc_blk.scid = gvcid.scid; sa[spi].gvcid_tc_blk.mapid = gvcid.mapid; } else @@ -456,23 +488,23 @@ int32_t sadb_sa_start(TC_t* tc_frame) } // TM if (gvcid.vcid != tm_frame.tm_header.vcid) - { // Clear all GVCIDs for provided SPI + { // Clear all GVCIDs for provided SPI if (gvcid.mapid == TYPE_TM) { for (int i = 0; i < NUM_GVCID; i++) - { // TM - sa[spi].gvcid_tm_blk[x].tfvn = 0; - sa[spi].gvcid_tm_blk[x].scid = 0; - sa[spi].gvcid_tm_blk[x].vcid = 0; + { // TM + sa[spi].gvcid_tm_blk[x].tfvn = 0; + sa[spi].gvcid_tm_blk[x].scid = 0; + sa[spi].gvcid_tm_blk[x].vcid = 0; sa[spi].gvcid_tm_blk[x].mapid = 0; } } // Write channel to SA if (gvcid.mapid != TYPE_MAP) - { // TM - sa[spi].gvcid_tm_blk[gvcid.vcid].tfvn = gvcid.tfvn; - sa[spi].gvcid_tm_blk[gvcid.vcid].scid = gvcid.scid; - sa[spi].gvcid_tm_blk[gvcid.vcid].vcid = gvcid.vcid; + { // TM + sa[spi].gvcid_tm_blk[gvcid.vcid].tfvn = gvcid.tfvn; + sa[spi].gvcid_tm_blk[gvcid.vcid].scid = gvcid.scid; + sa[spi].gvcid_tm_blk[gvcid.vcid].vcid = gvcid.vcid; sa[spi].gvcid_tm_blk[gvcid.vcid].mapid = gvcid.mapid; } else @@ -483,21 +515,21 @@ int32_t sadb_sa_start(TC_t* tc_frame) #ifdef PDU_DEBUG printf("SPI %d changed to OPERATIONAL state. \n", spi); - switch (gvcid.mapid) - { - case TYPE_TC: - printf("Type TC, "); - break; - case TYPE_MAP: - printf("Type MAP, "); - break; - case TYPE_TM: - printf("Type TM, "); - break; - default: - printf("Type Unknown, "); - break; - } + switch (gvcid.mapid) + { + case TYPE_TC: + printf("Type TC, "); + break; + case TYPE_MAP: + printf("Type MAP, "); + break; + case TYPE_TM: + printf("Type TM, "); + break; + default: + printf("Type Unknown, "); + break; + } #endif // Change to operational state @@ -535,7 +567,8 @@ int32_t sadb_sa_stop(void) printf("spi = %d \n", spi); // Overwrite last PID - sa[spi].lpid = (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; + sa[spi].lpid = + (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; // Check SPI exists and in 'Active' state if (spi < NUM_SA) @@ -543,16 +576,16 @@ int32_t sadb_sa_stop(void) if (sa[spi].sa_state == SA_OPERATIONAL) { // Remove all GVC/GMAP IDs - sa[spi].gvcid_tc_blk.tfvn = 0; - sa[spi].gvcid_tc_blk.scid = 0; - sa[spi].gvcid_tc_blk.vcid = 0; + sa[spi].gvcid_tc_blk.tfvn = 0; + sa[spi].gvcid_tc_blk.scid = 0; + sa[spi].gvcid_tc_blk.vcid = 0; sa[spi].gvcid_tc_blk.mapid = 0; for (int x = 0; x < NUM_GVCID; x++) { // TM - sa[spi].gvcid_tm_blk[x].tfvn = 0; - sa[spi].gvcid_tm_blk[x].scid = 0; - sa[spi].gvcid_tm_blk[x].vcid = 0; + sa[spi].gvcid_tm_blk[x].tfvn = 0; + sa[spi].gvcid_tm_blk[x].scid = 0; + sa[spi].gvcid_tm_blk[x].vcid = 0; sa[spi].gvcid_tm_blk[x].mapid = 0; } @@ -591,43 +624,44 @@ int32_t sadb_sa_rekey(void) int x = 0; // Read ingest - spi = ((uint8_t)sdls_frame.pdu.data[count] << 8) | (uint8_t)sdls_frame.pdu.data[count+1]; + spi = ((uint8_t)sdls_frame.pdu.data[count] << 8) | (uint8_t)sdls_frame.pdu.data[count + 1]; count = count + 2; // Overwrite last PID - sa[spi].lpid = (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; + sa[spi].lpid = + (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; // Check SPI exists and in 'Unkeyed' state if (spi < NUM_SA) { if (sa[spi].sa_state == SA_UNKEYED) - { // Encryption Key - sa[spi].ekid = ((uint8_t)sdls_frame.pdu.data[count] << 8) | (uint8_t)sdls_frame.pdu.data[count+1]; + { // Encryption Key + sa[spi].ekid = ((uint8_t)sdls_frame.pdu.data[count] << 8) | (uint8_t)sdls_frame.pdu.data[count + 1]; count = count + 2; // Authentication Key - //sa[spi].akid = ((uint8_t)sdls_frame.pdu.data[count] << 8) | (uint8_t)sdls_frame.pdu.data[count+1]; - //count = count + 2; + // sa[spi].akid = ((uint8_t)sdls_frame.pdu.data[count] << 8) | (uint8_t)sdls_frame.pdu.data[count+1]; + // count = count + 2; // Anti-Replay Counter #ifdef PDU_DEBUG printf("SPI %d IV updated to: 0x", spi); #endif if (sa[spi].shivf_len > 0) - { // Set IV - authenticated encryption + { // Set IV - authenticated encryption for (x = count; x < (sa[spi].shivf_len + count); x++) { // TODO: Uncomment once fixed in ESA implementation // TODO: Assuming this was fixed... - *(sa[spi].iv + x - count) = (uint8_t) sdls_frame.pdu.data[x]; + *(sa[spi].iv + x - count) = (uint8_t)sdls_frame.pdu.data[x]; #ifdef PDU_DEBUG printf("%02x", sdls_frame.pdu.data[x]); #endif } } else - { // Set SN - // TODO + { // Set SN + // TODO } #ifdef PDU_DEBUG printf("\n"); @@ -651,8 +685,8 @@ int32_t sadb_sa_rekey(void) #ifdef DEBUG printf("\t spi = %d \n", spi); - printf("\t ekid = %d \n", sa[spi].ekid); - //printf("\t akid = %d \n", sa[spi].akid); + printf("\t ekid = %d \n", sa[spi].ekid); + // printf("\t akid = %d \n", sa[spi].akid); #endif return CRYPTO_LIB_SUCCESS; @@ -672,13 +706,14 @@ int32_t sadb_sa_expire(void) printf("spi = %d \n", spi); // Overwrite last PID - sa[spi].lpid = (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; + sa[spi].lpid = + (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; // Check SPI exists and in 'Keyed' state if (spi < NUM_SA) { if (sa[spi].sa_state == SA_KEYED) - { // Change to 'Unkeyed' state + { // Change to 'Unkeyed' state sa[spi].sa_state = SA_UNKEYED; #ifdef PDU_DEBUG printf("SPI %d changed to UNKEYED state. \n", spi); @@ -712,14 +747,18 @@ int32_t sadb_sa_create(void) printf("spi = %d \n", spi); // Overwrite last PID - sa[spi].lpid = (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; + sa[spi].lpid = + (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; // Write SA Configuration sa[spi].est = ((uint8_t)sdls_frame.pdu.data[2] & 0x80) >> 7; sa[spi].ast = ((uint8_t)sdls_frame.pdu.data[2] & 0x40) >> 6; sa[spi].shivf_len = ((uint8_t)sdls_frame.pdu.data[2] & 0x3F); - if(sa[spi].iv != NULL) { free(sa[spi].iv); } - sa[spi].iv = (uint8_t*) calloc(1, sa[spi].shivf_len * sizeof(uint8_t)); + if (sa[spi].iv != NULL) + { + free(sa[spi].iv); + } + sa[spi].iv = (uint8_t *)calloc(1, sa[spi].shivf_len * sizeof(uint8_t)); sa[spi].shsnf_len = ((uint8_t)sdls_frame.pdu.data[3] & 0xFC) >> 2; sa[spi].shplf_len = ((uint8_t)sdls_frame.pdu.data[3] & 0x03); sa[spi].stmacf_len = ((uint8_t)sdls_frame.pdu.data[4]); @@ -738,15 +777,18 @@ int32_t sadb_sa_create(void) { sa[spi].acs = ((uint8_t)sdls_frame.pdu.data[count++]); } - sa[spi].abm_len = (uint8_t)((sdls_frame.pdu.data[count] << 8) | (sdls_frame.pdu.data[count+1])); + sa[spi].abm_len = (uint8_t)((sdls_frame.pdu.data[count] << 8) | (sdls_frame.pdu.data[count + 1])); count = count + 2; for (int x = 0; x < sa[spi].abm_len; x++) { sa[spi].abm[x] = ((uint8_t)sdls_frame.pdu.data[count++]); } sa[spi].arc_len = ((uint8_t)sdls_frame.pdu.data[count++]); - if(sa[spi].arc != NULL) { free(sa[spi].arc); } - sa[spi].arc = (uint8_t*) calloc(1, sa[spi].arc_len * sizeof(uint8_t)); + if (sa[spi].arc != NULL) + { + free(sa[spi].arc); + } + sa[spi].arc = (uint8_t *)calloc(1, sa[spi].arc_len * sizeof(uint8_t)); for (int x = 0; x < sa[spi].arc_len; x++) { *(sa[spi].arc + x) = ((uint8_t)sdls_frame.pdu.data[count++]); @@ -754,7 +796,7 @@ int32_t sadb_sa_create(void) sa[spi].arcw_len = ((uint8_t)sdls_frame.pdu.data[count++]); for (int x = 0; x < sa[spi].arcw_len; x++) { - sa[spi].arcw = sa[spi].arcw | ( ((uint8_t)sdls_frame.pdu.data[count++]) << (sa[spi].arcw_len - x) ); + sa[spi].arcw = sa[spi].arcw | (((uint8_t)sdls_frame.pdu.data[count++]) << (sa[spi].arcw_len - x)); } // TODO: Checks for valid data @@ -783,13 +825,14 @@ int32_t sadb_sa_delete(void) printf("spi = %d \n", spi); // Overwrite last PID - sa[spi].lpid = (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; + sa[spi].lpid = + (sdls_frame.pdu.type << 7) | (sdls_frame.pdu.uf << 6) | (sdls_frame.pdu.sg << 4) | sdls_frame.pdu.pid; // Check SPI exists and in 'Unkeyed' state if (spi < NUM_SA) { if (sa[spi].sa_state == SA_UNKEYED) - { // Change to 'None' state + { // Change to 'None' state sa[spi].sa_state = SA_NONE; #ifdef PDU_DEBUG printf("SPI %d changed to NONE state. \n", spi); @@ -833,10 +876,10 @@ int32_t sadb_sa_setARSN(void) printf("SPI %d IV updated to: 0x", spi); #endif if (sa[spi].shivf_len > 0) - { // Set IV - authenticated encryption + { // Set IV - authenticated encryption for (int x = 0; x < IV_SIZE; x++) { - *(sa[spi].iv + x) = (uint8_t) sdls_frame.pdu.data[x + 2]; + *(sa[spi].iv + x) = (uint8_t)sdls_frame.pdu.data[x + 2]; #ifdef PDU_DEBUG printf("%02x", *(sa[spi].iv + x)); #endif @@ -844,8 +887,8 @@ int32_t sadb_sa_setARSN(void) Crypto_increment(sa[spi].iv, sa[spi].shivf_len); } else - { // Set SN - // TODO + { // Set SN + // TODO } #ifdef PDU_DEBUG printf("\n"); @@ -875,7 +918,7 @@ int32_t sadb_sa_setARSNW(void) // Check SPI exists if (spi < NUM_SA) { - sa[spi].arcw_len = (uint8_t) sdls_frame.pdu.data[2]; + sa[spi].arcw_len = (uint8_t)sdls_frame.pdu.data[2]; // Check for out of bounds if (sa[spi].arcw_len > (ARC_SIZE)) @@ -883,9 +926,9 @@ int32_t sadb_sa_setARSNW(void) sa[spi].arcw_len = ARC_SIZE; } - for(int x = 0; x < sa[spi].arcw_len; x++) + for (int x = 0; x < sa[spi].arcw_len; x++) { - sa[spi].arcw = (((uint8_t) sdls_frame.pdu.data[x+3]) << (sa[spi].arcw_len - x) ); + sa[spi].arcw = (((uint8_t)sdls_frame.pdu.data[x + 3]) << (sa[spi].arcw_len - x)); } } else @@ -901,7 +944,7 @@ int32_t sadb_sa_setARSNW(void) * @param ingest: uint8_t* * @return int32: count **/ -int32_t sadb_sa_status(uint8_t* ingest) +int32_t sadb_sa_status(uint8_t *ingest) { // Local variables int count = 0; diff --git a/src/src_mysql/sadb_routine_mariadb.template.c b/src/src_mysql/sadb_routine_mariadb.template.c index 21029f80..c5f89833 100644 --- a/src/src_mysql/sadb_routine_mariadb.template.c +++ b/src/src_mysql/sadb_routine_mariadb.template.c @@ -12,49 +12,56 @@ * foreign persons. */ -#include "sadb_routine.h" -#include "crypto_structs.h" #include "crypto_config.h" #include "crypto_error.h" #include "crypto_print.h" +#include "crypto_structs.h" +#include "sadb_routine.h" #include #include -#include #include +#include // Security Association Initialization Functions static int32_t sadb_config(void); static int32_t sadb_init(void); static int32_t sadb_close(void); // Security Association Interaction Functions -static int32_t sadb_get_sa_from_spi(uint16,SecurityAssociation_t**); -static int32_t sadb_get_operational_sa_from_gvcid(uint8,uint16,uint16,uint8,SecurityAssociation_t**); -static int32_t sadb_save_sa(SecurityAssociation_t* sa); +static int32_t sadb_get_sa_from_spi(uint16, SecurityAssociation_t **); +static int32_t sadb_get_operational_sa_from_gvcid(uint8, uint16, uint16, uint8, SecurityAssociation_t **); +static int32_t sadb_save_sa(SecurityAssociation_t *sa); // Security Association Utility Functions -static int32_t sadb_sa_start(TC_t* tc_frame); +static int32_t sadb_sa_start(TC_t *tc_frame); static int32_t sadb_sa_expire(void); static int32_t sadb_sa_rekey(void); -static int32_t sadb_sa_status(uint8_t*); +static int32_t sadb_sa_status(uint8_t *); static int32_t sadb_sa_create(void); static int32_t sadb_sa_setARSN(void); static int32_t sadb_sa_setARSNW(void); static int32_t sadb_sa_delete(void); -//MySQL local functions -static int32_t finish_with_error(MYSQL *con,int err); -//MySQL Queries -const static uint8_t* SQL_SADB_GET_SA_BY_SPI = "SELECT spi,ekid,akid,sa_state,tfvn,scid,vcid,mapid,lpid,est,ast,shivf_len,shsnf_len,shplf_len,stmacf_len,ecs_len,HEX(ecs),iv_len,HEX(iv),acs_len,acs,abm_len,HEX(abm),arc_len,HEX(arc),arcw_len,HEX(arcw)" - " FROM security_associations WHERE spi='%d'"; -const static uint8_t* SQL_SADB_GET_SA_BY_GVCID = "SELECT spi,ekid,akid,sa_state,tfvn,scid,vcid,mapid,lpid,est,ast,shivf_len,shsnf_len,shplf_len,stmacf_len,ecs_len,HEX(ecs),iv_len,HEX(iv),acs_len,acs,abm_len,HEX(abm),arc_len,HEX(arc),arcw_len,HEX(arcw)" - " FROM security_associations WHERE tfvn='%d' AND scid='%d' AND vcid='%d' AND mapid='%d' AND sa_state='%d'"; -const static uint8_t* SQL_SADB_UPDATE_IV_ARC_BY_SPI = "UPDATE security_associations" - " SET iv=X'%s', arc=X'%s'" - " WHERE spi='%d' AND tfvn='%d' AND scid='%d' AND vcid='%d' AND mapid='%d'"; +// MySQL local functions +static int32_t finish_with_error(MYSQL *con, int err); +// MySQL Queries +const static uint8_t *SQL_SADB_GET_SA_BY_SPI = + "SELECT " + "spi,ekid,akid,sa_state,tfvn,scid,vcid,mapid,lpid,est,ast,shivf_len,shsnf_len,shplf_len,stmacf_len,ecs_len,HEX(ecs)" + ",iv_len,HEX(iv),acs_len,acs,abm_len,HEX(abm),arc_len,HEX(arc),arcw_len,HEX(arcw)" + " FROM security_associations WHERE spi='%d'"; +const static uint8_t *SQL_SADB_GET_SA_BY_GVCID = + "SELECT " + "spi,ekid,akid,sa_state,tfvn,scid,vcid,mapid,lpid,est,ast,shivf_len,shsnf_len,shplf_len,stmacf_len,ecs_len,HEX(ecs)" + ",iv_len,HEX(iv),acs_len,acs,abm_len,HEX(abm),arc_len,HEX(arc),arcw_len,HEX(arcw)" + " FROM security_associations WHERE tfvn='%d' AND scid='%d' AND vcid='%d' AND mapid='%d' AND sa_state='%d'"; +const static uint8_t *SQL_SADB_UPDATE_IV_ARC_BY_SPI = + "UPDATE security_associations" + " SET iv=X'%s', arc=X'%s'" + " WHERE spi='%d' AND tfvn='%d' AND scid='%d' AND vcid='%d' AND mapid='%d'"; // sadb_routine mariaDB private helper functions -static int32_t parse_sa_from_mysql_query(uint8_t* query, SecurityAssociation_t** security_association); -static int32_t convert_hexstring_to_byte_array(uint8_t* hexstr, uint8_t* byte_array); -static uint8_t* convert_byte_array_to_hexstring(void* src_buffer, size_t buffer_length); +static int32_t parse_sa_from_mysql_query(uint8_t *query, SecurityAssociation_t **security_association); +static int32_t convert_hexstring_to_byte_array(uint8_t *hexstr, uint8_t *byte_array); +static uint8_t *convert_byte_array_to_hexstring(void *src_buffer, size_t buffer_length); /* ** Global Variables @@ -62,7 +69,7 @@ static uint8_t* convert_byte_array_to_hexstring(void* src_buffer, size_t buffer_ // Security static SadbRoutineStruct sadb_routine; static SecurityAssociation_t sa[NUM_SA]; -static MYSQL* con; +static MYSQL *con; SadbRoutine get_sadb_routine_mariadb(void) { @@ -92,13 +99,13 @@ static int32_t sadb_init(void) int32_t status = CRYPTO_LIB_SUCCESS; con = mysql_init(NULL); - //TODO - add mysql_options/mysql_get_ssl_cipher logic for mTLS connections. + // TODO - add mysql_options/mysql_get_ssl_cipher logic for mTLS connections. if (mysql_real_connect(con, sadb_mariadb_config->mysql_hostname, sadb_mariadb_config->mysql_username, sadb_mariadb_config->mysql_password, sadb_mariadb_config->mysql_database, sadb_mariadb_config->mysql_port, NULL, 0) == NULL) - { //0,NULL,0 are port number, unix socket, client flag - status = finish_with_error(con,SADB_MARIADB_CONNECTION_FAILED); + { // 0,NULL,0 are port number, unix socket, client flag + status = finish_with_error(con, SADB_MARIADB_CONNECTION_FAILED); } return status; @@ -111,81 +118,121 @@ static int32_t sadb_close(void) } // Security Association Interaction Functions -static int32_t sadb_get_sa_from_spi(uint16_t spi,SecurityAssociation_t** security_association) +static int32_t sadb_get_sa_from_spi(uint16_t spi, SecurityAssociation_t **security_association) { int32_t status = CRYPTO_LIB_SUCCESS; uint8_t spi_query[2048]; - snprintf(spi_query, sizeof(spi_query),SQL_SADB_GET_SA_BY_SPI,spi); + snprintf(spi_query, sizeof(spi_query), SQL_SADB_GET_SA_BY_SPI, spi); - status = parse_sa_from_mysql_query(&spi_query[0],security_association); + status = parse_sa_from_mysql_query(&spi_query[0], security_association); return status; } -static int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn,uint16_t scid,uint16_t vcid,uint8_t mapid,SecurityAssociation_t** security_association) +static int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn, uint16_t scid, uint16_t vcid, uint8_t mapid, + SecurityAssociation_t **security_association) { int32_t status = CRYPTO_LIB_SUCCESS; uint8_t gvcid_query[2048]; - snprintf(gvcid_query, sizeof(gvcid_query),SQL_SADB_GET_SA_BY_GVCID,tfvn,scid,vcid,mapid,SA_OPERATIONAL); + snprintf(gvcid_query, sizeof(gvcid_query), SQL_SADB_GET_SA_BY_GVCID, tfvn, scid, vcid, mapid, SA_OPERATIONAL); - status = parse_sa_from_mysql_query(&gvcid_query[0],security_association); + status = parse_sa_from_mysql_query(&gvcid_query[0], security_association); return status; } -static int32_t sadb_save_sa(SecurityAssociation_t* sa) +static int32_t sadb_save_sa(SecurityAssociation_t *sa) { int32_t status = CRYPTO_LIB_SUCCESS; - if(sa==NULL) {return SADB_NULL_SA_USED;} + if (sa == NULL) + { + return SADB_NULL_SA_USED; + } uint8_t update_sa_query[2048]; - snprintf(update_sa_query, sizeof(update_sa_query),SQL_SADB_UPDATE_IV_ARC_BY_SPI,convert_byte_array_to_hexstring(sa->iv,sa->shivf_len),convert_byte_array_to_hexstring(sa->arc,sa->shsnf_len),sa->spi,sa->gvcid_tc_blk.tfvn,sa->gvcid_tc_blk.scid,sa->gvcid_tc_blk.vcid,sa->gvcid_tc_blk.mapid); - - #ifdef SA_DEBUG - fprintf(stderr,"MySQL Insert SA Query: %s \n", update_sa_query); - #endif - - //Crypto_saPrint(sa); - if(mysql_query(con,update_sa_query)) { - status = finish_with_error(con,SADB_QUERY_FAILED); return status; + snprintf(update_sa_query, sizeof(update_sa_query), SQL_SADB_UPDATE_IV_ARC_BY_SPI, + convert_byte_array_to_hexstring(sa->iv, sa->shivf_len), + convert_byte_array_to_hexstring(sa->arc, sa->shsnf_len), sa->spi, sa->gvcid_tc_blk.tfvn, + sa->gvcid_tc_blk.scid, sa->gvcid_tc_blk.vcid, sa->gvcid_tc_blk.mapid); + +#ifdef SA_DEBUG + fprintf(stderr, "MySQL Insert SA Query: %s \n", update_sa_query); +#endif + + // Crypto_saPrint(sa); + if (mysql_query(con, update_sa_query)) + { + status = finish_with_error(con, SADB_QUERY_FAILED); + return status; } // todo - if query fails, need to push failure message to error stack instead of just return code. - //We free the allocated SA memory in the save function. - if(sa->iv != NULL) free(sa->iv); - if(sa->abm != NULL) free(sa->abm); - if(sa->arc != NULL) free(sa->arc); + // We free the allocated SA memory in the save function. + if (sa->iv != NULL) + free(sa->iv); + if (sa->abm != NULL) + free(sa->abm); + if (sa->arc != NULL) + free(sa->arc); free(sa); return status; } // Security Association Utility Functions -static int32_t sadb_sa_start(TC_t* tc_frame){return CRYPTO_LIB_SUCCESS;} -static int32_t sadb_sa_expire(void){return CRYPTO_LIB_SUCCESS;} -static int32_t sadb_sa_rekey(void){return CRYPTO_LIB_SUCCESS;} -static int32_t sadb_sa_status(uint8_t* ingest){return CRYPTO_LIB_SUCCESS;} -static int32_t sadb_sa_create(void){return CRYPTO_LIB_SUCCESS;} -static int32_t sadb_sa_setARSN(void){return CRYPTO_LIB_SUCCESS;} -static int32_t sadb_sa_setARSNW(void){return CRYPTO_LIB_SUCCESS;} -static int32_t sadb_sa_delete(void){return CRYPTO_LIB_SUCCESS;} +static int32_t sadb_sa_start(TC_t *tc_frame) +{ + return CRYPTO_LIB_SUCCESS; +} +static int32_t sadb_sa_expire(void) +{ + return CRYPTO_LIB_SUCCESS; +} +static int32_t sadb_sa_rekey(void) +{ + return CRYPTO_LIB_SUCCESS; +} +static int32_t sadb_sa_status(uint8_t *ingest) +{ + return CRYPTO_LIB_SUCCESS; +} +static int32_t sadb_sa_create(void) +{ + return CRYPTO_LIB_SUCCESS; +} +static int32_t sadb_sa_setARSN(void) +{ + return CRYPTO_LIB_SUCCESS; +} +static int32_t sadb_sa_setARSNW(void) +{ + return CRYPTO_LIB_SUCCESS; +} +static int32_t sadb_sa_delete(void) +{ + return CRYPTO_LIB_SUCCESS; +} // sadb_routine private helper functions -static int32_t parse_sa_from_mysql_query(uint8_t* query, SecurityAssociation_t** security_association) +static int32_t parse_sa_from_mysql_query(uint8_t *query, SecurityAssociation_t **security_association) { int32_t status = CRYPTO_LIB_SUCCESS; - SecurityAssociation_t* sa = malloc(sizeof(SecurityAssociation_t)); + SecurityAssociation_t *sa = malloc(sizeof(SecurityAssociation_t)); - #ifdef SA_DEBUG - fprintf(stderr,"MySQL Query: %s \n", query); - #endif +#ifdef SA_DEBUG + fprintf(stderr, "MySQL Query: %s \n", query); +#endif - if(mysql_real_query(con,query,strlen(query))) { //query should be NUL terminated! - status = finish_with_error(con,SADB_QUERY_FAILED); return status; + if (mysql_real_query(con, query, strlen(query))) + { // query should be NUL terminated! + status = finish_with_error(con, SADB_QUERY_FAILED); + return status; } // todo - if query fails, need to push failure message to error stack instead of just return code. MYSQL_RES *result = mysql_store_result(con); - if(result == NULL) { - status = finish_with_error(con,SADB_QUERY_EMPTY_RESULTS); return status; + if (result == NULL) + { + status = finish_with_error(con, SADB_QUERY_EMPTY_RESULTS); + return status; } int num_fields = mysql_num_fields(result); @@ -195,73 +242,182 @@ static int32_t parse_sa_from_mysql_query(uint8_t* query, SecurityAssociation_t** uint8_t *field_names[num_fields]; //[64]; 64 == max length of column name in MySQL - - //TODO -- Need to store mysql query hex string and then malloc sa->iv according to size. - //TODO -- IV && arc && abm as uint8_t* instead of uint8[]!!! - uint8_t* iv_byte_str; - uint8_t* arc_byte_str; - uint8_t* abm_byte_str; - while((row = mysql_fetch_row(result))){ - for(int i=0; i < num_fields; i++) + // TODO -- Need to store mysql query hex string and then malloc sa->iv according to size. + // TODO -- IV && arc && abm as uint8_t* instead of uint8[]!!! + uint8_t *iv_byte_str; + uint8_t *arc_byte_str; + uint8_t *abm_byte_str; + while ((row = mysql_fetch_row(result))) + { + for (int i = 0; i < num_fields; i++) { - //Parse out all the field names. - if(i == 0){ + // Parse out all the field names. + if (i == 0) + { int field_idx = 0; - while(field = mysql_fetch_field(result)){ + while (field = mysql_fetch_field(result)) + { field_names[field_idx] = field->name; field_idx++; } } - //Handle query results + // Handle query results int spi; uint8_t tmp_uint8; - if(row[i]==NULL){continue;} //Don't do anything with NULL fields from MySQL query. - if(strcmp(field_names[i],"spi")==0){sa->spi = atoi(row[i]);continue;} - if(strcmp(field_names[i],"ekid")==0){sa->ekid=atoi(row[i]);continue;} - if(strcmp(field_names[i],"akid")==0){sa->akid=atoi(row[i]);continue;} - if(strcmp(field_names[i],"sa_state")==0){sa->sa_state=atoi(row[i]);continue;} - if(strcmp(field_names[i],"tfvn")==0){sa->gvcid_tc_blk.tfvn=atoi(row[i]);continue;} - if(strcmp(field_names[i],"scid")==0){sa->gvcid_tc_blk.scid=atoi(row[i]);continue;} - if(strcmp(field_names[i],"vcid")==0){sa->gvcid_tc_blk.vcid=atoi(row[i]);continue;} - if(strcmp(field_names[i],"mapid")==0){sa->gvcid_tc_blk.mapid=atoi(row[i]);continue;} - if(strcmp(field_names[i],"lpid")==0){sa->lpid=atoi(row[i]);continue;} - if(strcmp(field_names[i],"est")==0){sa->est=atoi(row[i]);continue;} - if(strcmp(field_names[i],"ast")==0){sa->ast=atoi(row[i]);continue;} - if(strcmp(field_names[i],"shivf_len")==0){sa->shivf_len=atoi(row[i]);continue;} - if(strcmp(field_names[i],"shsnf_len")==0){sa->shsnf_len=atoi(row[i]);continue;} - if(strcmp(field_names[i],"shplf_len")==0){sa->shplf_len=atoi(row[i]);continue;} - if(strcmp(field_names[i],"stmacf_len")==0){sa->stmacf_len=atoi(row[i]);continue;} - if(strcmp(field_names[i],"ecs_len")==0){sa->ecs_len=atoi(row[i]);continue;} - if(strcmp(field_names[i],"HEX(ecs)")==0){convert_hexstring_to_byte_array(row[i],sa->ecs);continue;} + if (row[i] == NULL) + { + continue; + } // Don't do anything with NULL fields from MySQL query. + if (strcmp(field_names[i], "spi") == 0) + { + sa->spi = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "ekid") == 0) + { + sa->ekid = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "akid") == 0) + { + sa->akid = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "sa_state") == 0) + { + sa->sa_state = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "tfvn") == 0) + { + sa->gvcid_tc_blk.tfvn = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "scid") == 0) + { + sa->gvcid_tc_blk.scid = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "vcid") == 0) + { + sa->gvcid_tc_blk.vcid = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "mapid") == 0) + { + sa->gvcid_tc_blk.mapid = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "lpid") == 0) + { + sa->lpid = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "est") == 0) + { + sa->est = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "ast") == 0) + { + sa->ast = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "shivf_len") == 0) + { + sa->shivf_len = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "shsnf_len") == 0) + { + sa->shsnf_len = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "shplf_len") == 0) + { + sa->shplf_len = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "stmacf_len") == 0) + { + sa->stmacf_len = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "ecs_len") == 0) + { + sa->ecs_len = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "HEX(ecs)") == 0) + { + convert_hexstring_to_byte_array(row[i], sa->ecs); + continue; + } // if(strcmp(field_names[i],"HEX(iv)")==0){memcpy(&(sa->iv),&row[i],IV_SIZE);continue;} - if(strcmp(field_names[i],"HEX(iv)")==0){iv_byte_str = row[i];continue;} - if(strcmp(field_names[i],"acs_len")==0){sa->acs_len=atoi(row[i]);continue;} - if(strcmp(field_names[i],"acs")==0){sa->acs=atoi(row[i]);continue;} - if(strcmp(field_names[i],"abm_len")==0){sa->abm_len=atoi(row[i]);continue;} - if(strcmp(field_names[i],"HEX(abm)")==0){abm_byte_str = row[i];continue;} + if (strcmp(field_names[i], "HEX(iv)") == 0) + { + iv_byte_str = row[i]; + continue; + } + if (strcmp(field_names[i], "acs_len") == 0) + { + sa->acs_len = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "acs") == 0) + { + sa->acs = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "abm_len") == 0) + { + sa->abm_len = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "HEX(abm)") == 0) + { + abm_byte_str = row[i]; + continue; + } // if(strcmp(field_names[i],"HEX(abm)")==0){convert_hexstring_to_byte_array(row[i],sa->abm);continue;} - if(strcmp(field_names[i],"arc_len")==0){sa->arc_len=atoi(row[i]);continue;} - if(strcmp(field_names[i],"HEX(arc)")==0){arc_byte_str = row[i];continue;} + if (strcmp(field_names[i], "arc_len") == 0) + { + sa->arc_len = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "HEX(arc)") == 0) + { + arc_byte_str = row[i]; + continue; + } // if(strcmp(field_names[i],"HEX(arc)")==0){convert_hexstring_to_byte_array(row[i],sa->arc);continue;} - if(strcmp(field_names[i],"arcw_len")==0){sa->arcw_len=atoi(row[i]);continue;} - if(strcmp(field_names[i],"arcw")==0){sa->arcw=atoi(row[i]);continue;} - //printf("%s:%s ",field_names[i], row[i] ? row[i] : "NULL"); + if (strcmp(field_names[i], "arcw_len") == 0) + { + sa->arcw_len = atoi(row[i]); + continue; + } + if (strcmp(field_names[i], "arcw") == 0) + { + sa->arcw = atoi(row[i]); + continue; + } + // printf("%s:%s ",field_names[i], row[i] ? row[i] : "NULL"); } - //printf("\n"); + // printf("\n"); } - sa->iv = (uint8_t*) calloc(1, sa->shivf_len * sizeof(uint8_t)); - sa->arc = (uint8_t*) calloc(1, sa->arc_len * sizeof(uint8_t)); - sa->abm = (uint8_t*) calloc(1, sa->abm_len * sizeof(uint8_t)); - convert_hexstring_to_byte_array(iv_byte_str,sa->iv); - convert_hexstring_to_byte_array(arc_byte_str,sa->arc); - convert_hexstring_to_byte_array(abm_byte_str,sa->abm); + sa->iv = (uint8_t *)calloc(1, sa->shivf_len * sizeof(uint8_t)); + sa->arc = (uint8_t *)calloc(1, sa->arc_len * sizeof(uint8_t)); + sa->abm = (uint8_t *)calloc(1, sa->abm_len * sizeof(uint8_t)); + convert_hexstring_to_byte_array(iv_byte_str, sa->iv); + convert_hexstring_to_byte_array(arc_byte_str, sa->arc); + convert_hexstring_to_byte_array(abm_byte_str, sa->abm); *security_association = sa; mysql_free_result(result); return status; } -static int32_t convert_hexstring_to_byte_array(uint8_t* source_str, uint8_t* dest_buffer) +static int32_t convert_hexstring_to_byte_array(uint8_t *source_str, uint8_t *dest_buffer) { // https://stackoverflow.com/questions/3408706/hexadecimal-string-to-byte-array-in-c/56247335#56247335 uint8_t *line = source_str; uint8_t *data = line; @@ -269,35 +425,38 @@ static int32_t convert_hexstring_to_byte_array(uint8_t* source_str, uint8_t* des uint8_t read_byte; uint8_t data_len = 0; - while (sscanf(data, " %02x%n", &read_byte, &offset) == 1) { + while (sscanf(data, " %02x%n", &read_byte, &offset) == 1) + { dest_buffer[data_len++] = read_byte; data += offset; } return data_len; } -static uint8_t* convert_byte_array_to_hexstring(void* src_buffer, size_t buffer_length) +static uint8_t *convert_byte_array_to_hexstring(void *src_buffer, size_t buffer_length) { - if(buffer_length==0){ //Return empty string (with null char!) if buffer is empty + if (buffer_length == 0) + { // Return empty string (with null char!) if buffer is empty return ""; } - unsigned uint8_t* bytes = src_buffer; - unsigned uint8_t* hexstr = malloc(buffer_length*2+1); + unsigned uint8_t *bytes = src_buffer; + unsigned uint8_t *hexstr = malloc(buffer_length * 2 + 1); - if(src_buffer == NULL) return NULL; + if (src_buffer == NULL) + return NULL; - for(size_t i = 0; i < buffer_length; i++){ + for (size_t i = 0; i < buffer_length; i++) + { uint8_t nib1 = (bytes[i] >> 4) & 0x0F; uint8_t nib2 = (bytes[i]) & 0x0F; - hexstr[i*2+0] = nib1 < 0xA ? '0' + nib1 : 'A' + nib1 - 0xA; - hexstr[i*2+1] = nib2 < 0xA ? '0' + nib2 : 'A' + nib2 - 0xA; + hexstr[i * 2 + 0] = nib1 < 0xA ? '0' + nib1 : 'A' + nib1 - 0xA; + hexstr[i * 2 + 1] = nib2 < 0xA ? '0' + nib2 : 'A' + nib2 - 0xA; } - hexstr[buffer_length*2] = '\0'; + hexstr[buffer_length * 2] = '\0'; return hexstr; } - static int32_t finish_with_error(MYSQL *con, int err) { fprintf(stderr, "%s\n", mysql_error(con)); // todo - if query fails, need to push failure message to error stack diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 50d609fb..66aaaf3b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,18 +1,19 @@ -# Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. -# -# This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not -# limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness -# for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or -# any warranty that the software will be error free. -# -# In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, -# arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, -# contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, -# documentation or services provided hereunder. -# -# ITC Team -# NASA IV&V -# jstar-development-team@mail.nasa.gov +# Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. +# All Foreign Rights are Reserved to the U.S. Government. +# +# This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, +# including, but not limited to, any warranty that the software will conform to specifications, any implied warranties +# of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the +# documentation will conform to the program, or any warranty that the software will be error free. +# +# In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or +# consequential damages, arising out of, resulting from, or in any way connected with the software or its +# documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained +# from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. +# +# ITC Team +# NASA IV&V +# jstar-development-team@mail.nasa.gov set(PROJECT_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/test/crypto_test.py b/test/crypto_test.py index ab86a0ed..1d67ac47 100644 --- a/test/crypto_test.py +++ b/test/crypto_test.py @@ -1,18 +1,19 @@ -# Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. -# -# This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not -# limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness -# for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or -# any warranty that the software will be error free. -# -# In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, -# arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, -# contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, -# documentation or services provided hereunder. -# -# ITC Team -# NASA IV&V -# jstar-development-team@mail.nasa.gov +# Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. +# All Foreign Rights are Reserved to the U.S. Government. +# +# This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, +# including, but not limited to, any warranty that the software will conform to specifications, any implied warranties +# of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the +# documentation will conform to the program, or any warranty that the software will be error free. +# +# In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or +# consequential damages, arising out of, resulting from, or in any way connected with the software or its +# documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained +# from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. +# +# ITC Team +# NASA IV&V +# jstar-development-team@mail.nasa.gov # # Connect to cFS via UDP to CI_Lab and TO_Lab to send and receive messages diff --git a/util/CMakeLists.txt b/util/CMakeLists.txt index 1b0fc753..960b3cc9 100644 --- a/util/CMakeLists.txt +++ b/util/CMakeLists.txt @@ -1,20 +1,19 @@ -# Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. -# -# This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not -# limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness -# for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or -# any warranty that the software will be error free. -# -# In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, -# arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, -# contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, -# documentation or services provided hereunder. -# -# ITC Team -# NASA IV&V -# jstar-development-team@mail.nasa.gov - - +# Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. +# All Foreign Rights are Reserved to the U.S. Government. +# +# This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, +# including, but not limited to, any warranty that the software will conform to specifications, any implied warranties +# of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the +# documentation will conform to the program, or any warranty that the software will be error free. +# +# In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or +# consequential damages, arising out of, resulting from, or in any way connected with the software or its +# documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained +# from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. +# +# ITC Team +# NASA IV&V +# jstar-development-team@mail.nasa.gov include_directories(include) include_directories(../crypto/public_inc) diff --git a/util/core/shared_util.c b/util/core/shared_util.c index 07583dcf..4cc829a8 100644 --- a/util/core/shared_util.c +++ b/util/core/shared_util.c @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -17,10 +18,9 @@ #include "shared_util.h" -//temp debug, remove later. +// temp debug, remove later. #include - /** * @brief Function: c_read_file * Reads a file from disk into a char * buffer. @@ -29,28 +29,33 @@ * @return malloc'd char* containing the contents of the buffer. * @note This buffer is NOT null terminated and must be free()'d. **/ -char* c_read_file(const char* f_name, long* f_size) { - char* buffer=0; +char *c_read_file(const char *f_name, long *f_size) +{ + char *buffer = 0; long length; - FILE* f = fopen(f_name,"rb"); - if (f){ - fseek (f, 0, SEEK_END); - length = ftell (f); - fseek (f, 0, SEEK_SET); - buffer = malloc (length); - if (buffer) { - fread (buffer, 1, length, f); + FILE *f = fopen(f_name, "rb"); + if (f) + { + fseek(f, 0, SEEK_END); + length = ftell(f); + fseek(f, 0, SEEK_SET); + buffer = malloc(length); + if (buffer) + { + fread(buffer, 1, length, f); } - fclose (f); + fclose(f); } - if (buffer){ + if (buffer) + { *f_size = length; - debug_printf("Buffer Length:%lu\n",length); + debug_printf("Buffer Length:%lu\n", length); return buffer; - } else{ + } + else + { return NULL; } - } /** @@ -60,7 +65,7 @@ char* c_read_file(const char* f_name, long* f_size) { * @param dest_buffer: uint8*, The destination char array from which the hex array will be converted to bytes * @return int length of dest_buffer **/ -int convert_hexstring_to_byte_array(char* source_str, char* dest_buffer) +int convert_hexstring_to_byte_array(char *source_str, char *dest_buffer) { char *line = source_str; char *data = line; @@ -68,7 +73,7 @@ int convert_hexstring_to_byte_array(char* source_str, char* dest_buffer) int read_byte; int data_len = 0; - while (sscanf(data, " %02x%n", &read_byte, &offset) == 1) + while (sscanf(data, " %02x%n", &read_byte, &offset) == 1) { dest_buffer[data_len++] = read_byte; data += offset; @@ -78,8 +83,8 @@ int convert_hexstring_to_byte_array(char* source_str, char* dest_buffer) /** * @brief Function: hex_conversion - * Makes use of the convert_hexstring_to_byte_array(char* source_str, char* dest_buffer) function to malloc the appropiate destination buffer - * As well as to make the function call as well. + * Makes use of the convert_hexstring_to_byte_array(char* source_str, char* dest_buffer) function to malloc the + *appropiate destination buffer As well as to make the function call as well. * @param buffer_h: char*, The incoming hexstyle character array. * @param buffer_b: uint**, The resulting byte array. * @param buffer_b_length: int*, The resulting length of the new buffer_b array. @@ -88,7 +93,7 @@ int convert_hexstring_to_byte_array(char* source_str, char* dest_buffer) void hex_conversion(char *buffer_h, char **buffer_b, int *buffer_b_length) { // Convert input plaintext - *buffer_b = (char*)malloc((strlen(buffer_h) / 2) * sizeof(char)); + *buffer_b = (char *)malloc((strlen(buffer_h) / 2) * sizeof(char)); *buffer_b_length = convert_hexstring_to_byte_array(buffer_h, *buffer_b); } @@ -102,12 +107,13 @@ void debug_printf(const char *format, ...) va_list args; fprintf(stderr, "DEBUG - "); va_start(args, format); - vfprintf(stderr,format, args); + vfprintf(stderr, format, args); va_end(args); } #else -void debug_printf(const char* format, ...) { - //Do nothing, DEBUG preprocessor disabled. +void debug_printf(const char *format, ...) +{ + // Do nothing, DEBUG preprocessor disabled. } #endif @@ -120,19 +126,21 @@ void debug_printf(const char* format, ...) { **/ void debug_hexprintf(const char *bin_data, int size_bin_data) { - //https://stackoverflow.com/questions/6357031/how-do-you-convert-a-byte-array-to-a-hexadecimal-string-in-c - //https://stackoverflow.com/questions/5040920/converting-from-signed-char-to-unsigned-char-and-back-again - char* u_bin_data = (char*)bin_data; - char output[(size_bin_data*2)+1]; + // https://stackoverflow.com/questions/6357031/how-do-you-convert-a-byte-array-to-a-hexadecimal-string-in-c + // https://stackoverflow.com/questions/5040920/converting-from-signed-char-to-unsigned-char-and-back-again + char *u_bin_data = (char *)bin_data; + char output[(size_bin_data * 2) + 1]; char *ptr = &output[0]; int i; - for(i=0; i < size_bin_data; i++){ - ptr += sprintf(ptr,"%02X",u_bin_data[i]); + for (i = 0; i < size_bin_data; i++) + { + ptr += sprintf(ptr, "%02X", u_bin_data[i]); } - debug_printf("%s\n",output); + debug_printf("%s\n", output); } #else -void debug_hexprintf(const char* bin_data, int size_bin_data) { - //Do nothing, DEBUG preprocessor disabled. +void debug_hexprintf(const char *bin_data, int size_bin_data) +{ + // Do nothing, DEBUG preprocessor disabled. } #endif diff --git a/util/include/apply_security.h b/util/include/apply_security.h index a24d6642..e2740d4a 100644 --- a/util/include/apply_security.h +++ b/util/include/apply_security.h @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -19,16 +20,16 @@ #define CRYPTOLIB_APPLY_SECURITY_H #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif - #include "crypto.h" #include "shared_util.h" #include #ifdef __cplusplus -} /* Close scope of 'extern "C"' declaration which encloses file. */ +} /* Close scope of 'extern "C"' declaration which encloses file. */ #endif -#endif //CRYPTOLIB_APPLY_SECURITY_H +#endif // CRYPTOLIB_APPLY_SECURITY_H diff --git a/util/include/crypto_sequence.h b/util/include/crypto_sequence.h index e35f63fd..fadd2e66 100644 --- a/util/include/crypto_sequence.h +++ b/util/include/crypto_sequence.h @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -19,16 +20,16 @@ #define CRYPTOLIB_CRYPTO_SEQUENCE_H #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif - #include "crypto.h" #include "shared_util.h" #include #ifdef __cplusplus -} /* Close scope of 'extern "C"' declaration which encloses file. */ +} /* Close scope of 'extern "C"' declaration which encloses file. */ #endif -#endif //CRYPTOLIB_CRYPTO_SEQUENCE_H +#endif // CRYPTOLIB_CRYPTO_SEQUENCE_H diff --git a/util/include/et_dt_validation.h b/util/include/et_dt_validation.h index 358a1562..9a8a44b0 100644 --- a/util/include/et_dt_validation.h +++ b/util/include/et_dt_validation.h @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2017 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2017 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any, kind either express, implied, or statutory, including, but not - limited to, any warranty that the software will conform to, specifications any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any, kind either express, implied, or statutory, including, + but not limited to, any warranty that the software will conform to, specifications any implied warranties of + merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation. Whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation. Whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was + sustained from, or arose out of the results of, or use of, the software, documentation or services provided hereunder ITC Team NASA IV&V @@ -19,16 +20,16 @@ #define CRYPTOLIB_ET_DT_VALIDATION_H #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif - #include "crypto.h" #include "shared_util.h" #include #ifdef __cplusplus -} /* Close scope of 'extern "C"' declaration which encloses file. */ +} /* Close scope of 'extern "C"' declaration which encloses file. */ #endif -#endif //CRYPTOLIB_ET_DT_VALIDATION_H \ No newline at end of file +#endif // CRYPTOLIB_ET_DT_VALIDATION_H \ No newline at end of file diff --git a/util/include/process_security.h b/util/include/process_security.h index f344c082..6b0956e5 100644 --- a/util/include/process_security.h +++ b/util/include/process_security.h @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -19,16 +20,16 @@ #define CRYPTOLIB_PROCESS_SECURITY_H #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif - #include "crypto.h" #include "shared_util.h" #include #ifdef __cplusplus -} /* Close scope of 'extern "C"' declaration which encloses file. */ +} /* Close scope of 'extern "C"' declaration which encloses file. */ #endif -#endif //CRYPTOLIB_PROCESS_SECURITY_H +#endif // CRYPTOLIB_PROCESS_SECURITY_H diff --git a/util/include/shared_util.h b/util/include/shared_util.h index 56e9a19d..088e1c17 100644 --- a/util/include/shared_util.h +++ b/util/include/shared_util.h @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -19,28 +20,29 @@ #define CRYPTOLIB_SHARED_UTIL_H #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif #include #include -#include -#include #include +#include +#include #include #include "crypto_error.h" -char * c_read_file(const char * f_name, long * f_size); + char *c_read_file(const char *f_name, long *f_size); -void debug_printf(const char* format, ...); -void debug_hexprintf(const char* bin_data,int size_bin_data); + void debug_printf(const char *format, ...); + void debug_hexprintf(const char *bin_data, int size_bin_data); -void hex_conversion(char *buffer_h, char **buffer_b, int *buffer_b_length); -int convert_hexstring_to_byte_array(char* source_str, char* dest_buffer); + void hex_conversion(char *buffer_h, char **buffer_b, int *buffer_b_length); + int convert_hexstring_to_byte_array(char *source_str, char *dest_buffer); #ifdef __cplusplus -} /* Close scope of 'extern "C"' declaration which encloses file. */ +} /* Close scope of 'extern "C"' declaration which encloses file. */ #endif -#endif //CRYPTOLIB_SHARED_UTIL_H +#endif // CRYPTOLIB_SHARED_UTIL_H diff --git a/util/include/ut_tc_apply.h b/util/include/ut_tc_apply.h index 8e46bd4d..1c913960 100644 --- a/util/include/ut_tc_apply.h +++ b/util/include/ut_tc_apply.h @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -19,16 +20,16 @@ #define CRYPTOLIB_UT_TC_APPLY_H #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif - #include "crypto.h" #include "shared_util.h" #include #ifdef __cplusplus -} /* Close scope of 'extern "C"' declaration which encloses file. */ +} /* Close scope of 'extern "C"' declaration which encloses file. */ #endif -#endif //CRYPTOLIB_UT_TC_APPLY_H \ No newline at end of file +#endif // CRYPTOLIB_UT_TC_APPLY_H \ No newline at end of file diff --git a/util/src_util/apply_security.c b/util/src_util/apply_security.c index 58f94702..4ff2ec1c 100644 --- a/util/src_util/apply_security.c +++ b/util/src_util/apply_security.c @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -16,62 +17,74 @@ */ /* - * Simple apply security program that reads a file into memory and calls the Crypto_TC_ApplySecurity function on the data. - */ + * Simple apply security program that reads a file into memory and calls the Crypto_TC_ApplySecurity function on the + * data. + */ #include "apply_security.h" -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]) +{ char *buffer; const char *filename; long buffer_size; char st[64]; char *security_type = st; - if (argc == 3) { + if (argc == 3) + { security_type = argv[1]; filename = argv[2]; - } else { - fprintf(stderr,"Command line usage: \n"\ - "\t%s \n"\ - " : Apply TeleCommand (tc) | Telemetry (tm) | Advanced Orbiting Systems (aos) Security T\n"\ - " : binary file with telecommand transfer frame bits\n",argv[0]); + } + else + { + fprintf(stderr, + "Command line usage: \n" + "\t%s \n" + " : Apply TeleCommand (tc) | Telemetry (tm) | Advanced Orbiting Systems (aos) Security T\n" + " : binary file with telecommand transfer frame bits\n", + argv[0]); return CRYPTO_LIB_ERROR; } - buffer = c_read_file(filename,&buffer_size); - debug_printf("File buffer size:%lu\n",buffer_size); - uint32_t buffer_size_i = (uint32_t) buffer_size; - debug_printf("File buffer size int:%d\n",buffer_size_i); + buffer = c_read_file(filename, &buffer_size); + debug_printf("File buffer size:%lu\n", buffer_size); + uint32_t buffer_size_i = (uint32_t)buffer_size; + debug_printf("File buffer size int:%d\n", buffer_size_i); debug_printf("File content: \n"); - debug_hexprintf(buffer,buffer_size_i); + debug_hexprintf(buffer, buffer_size_i); - //Setup & Initialize CryptoLib + // Setup & Initialize CryptoLib Crypto_Init(); - uint8_t* ptr_enc_frame = NULL; - uint16_t enc_frame_len; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len; - //Call ApplySecurity on buffer contents depending on type. - if (strcmp(security_type,"tc")==0){ - Crypto_TC_ApplySecurity((uint8_t*) buffer, (const uint16_t) buffer_size_i, &ptr_enc_frame, &enc_frame_len); - } else if (strcmp(security_type,"tm")==0){ - Crypto_TM_ApplySecurity((uint8_t*) buffer, (int*) &buffer_size_i); - } else if (strcmp(security_type,"aos")==0){ - Crypto_AOS_ApplySecurity((uint8_t*) buffer, (int*) &buffer_size_i); + // Call ApplySecurity on buffer contents depending on type. + if (strcmp(security_type, "tc") == 0) + { + Crypto_TC_ApplySecurity((uint8_t *)buffer, (const uint16_t)buffer_size_i, &ptr_enc_frame, &enc_frame_len); + } + else if (strcmp(security_type, "tm") == 0) + { + Crypto_TM_ApplySecurity((uint8_t *)buffer, (int *)&buffer_size_i); + } + else if (strcmp(security_type, "aos") == 0) + { + Crypto_AOS_ApplySecurity((uint8_t *)buffer, (int *)&buffer_size_i); } - #ifdef TC_DEBUG - printf(KYEL "ApplySecurity Output:\n" RESET); - printf(KYEL "\tBuffer size int:%d\n" RESET, enc_frame_len); - printf(KYEL "\tEncrypted Frame Contents: \n\t" RESET); - - for(int i=0; i < enc_frame_len; i++) - { - printf(KYEL "%02X" RESET, *(ptr_enc_frame+i)); - } - printf("\n"); - #endif +#ifdef TC_DEBUG + printf(KYEL "ApplySecurity Output:\n" RESET); + printf(KYEL "\tBuffer size int:%d\n" RESET, enc_frame_len); + printf(KYEL "\tEncrypted Frame Contents: \n\t" RESET); + + for (int i = 0; i < enc_frame_len; i++) + { + printf(KYEL "%02X" RESET, *(ptr_enc_frame + i)); + } + printf("\n"); +#endif free(buffer); free(ptr_enc_frame); diff --git a/util/src_util/crypto_sequence.c b/util/src_util/crypto_sequence.c index d55543a2..2d5081ee 100644 --- a/util/src_util/crypto_sequence.c +++ b/util/src_util/crypto_sequence.c @@ -1,78 +1,97 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V jstar-development-team@mail.nasa.gov */ - /* * Simple crypto security program that reads files into memory and calls the appropriate Crypto* function on the data. */ #include "crypto_sequence.h" -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]) +{ char *buffer; const char *filename; long buffer_size; char *security_type; - if (argc < 3 || argc % 2 == 0) { - fprintf(stderr,"Command line usage: \n"\ - "\t%s [ ]+\n"\ - "specify as many [ ] pairs as necessary to complete your crypto sequence test. Each file will be loaded and processed in sequence. \n"\ - " : Apply TeleCommand (tc_a) | Telemetry (tm_a) | Advanced Orbiting Systems (aos_a) Security T\n"\ - " : Process TeleCommand (tc_p) | Telemetry (tm_p) | Advanced Orbiting Systems (aos_p) Security T\n"\ - " : binary file with telecommand transfer frame bits\n",argv[0]); + if (argc < 3 || argc % 2 == 0) + { + fprintf(stderr, + "Command line usage: \n" + "\t%s [ ]+\n" + "specify as many [ ] pairs as necessary to complete your " + "crypto sequence test. Each file will be loaded and processed in sequence. \n" + " : Apply TeleCommand (tc_a) | Telemetry (tm_a) | Advanced Orbiting Systems (aos_a) " + "Security T\n" + " : Process TeleCommand (tc_p) | Telemetry (tm_p) | Advanced Orbiting Systems (aos_p) " + "Security T\n" + " : binary file with telecommand transfer frame bits\n", + argv[0]); return CRYPTO_LIB_ERROR; } - //Setup & Initialize CryptoLib + // Setup & Initialize CryptoLib Crypto_Init(); int arg_index = 0; - uint8_t * ptr_enc_frame = NULL; - uint16_t enc_frame_len; + uint8_t *ptr_enc_frame = NULL; + uint16_t enc_frame_len; - while(arg_index != argc-1){ + while (arg_index != argc - 1) + { security_type = argv[++arg_index]; - debug_printf("Security Type: %s\n",security_type); + debug_printf("Security Type: %s\n", security_type); filename = argv[++arg_index]; - debug_printf("Filename: %s\n",filename); - buffer = c_read_file(filename,&buffer_size); - debug_printf("File buffer size:%lu\n",buffer_size); - int buffer_size_i = (int) buffer_size; - debug_printf("File buffer size int:%d\n",buffer_size_i); + debug_printf("Filename: %s\n", filename); + buffer = c_read_file(filename, &buffer_size); + debug_printf("File buffer size:%lu\n", buffer_size); + int buffer_size_i = (int)buffer_size; + debug_printf("File buffer size int:%d\n", buffer_size_i); debug_printf("File content: \n"); - debug_hexprintf(buffer,buffer_size_i); - + debug_hexprintf(buffer, buffer_size_i); - //Call Apply/ProcessSecurity on buffer contents depending on type. - if (strcmp(security_type,"tc_a")==0){ - Crypto_TC_ApplySecurity((const uint8_t*) buffer, (const uint16_t) buffer_size_i, &ptr_enc_frame, &enc_frame_len);} - else if (strcmp(security_type,"tm_a")==0){ - Crypto_TM_ApplySecurity((uint8_t*) buffer, (int*) &buffer_size_i); - } else if (strcmp(security_type,"aos_a")==0){ - Crypto_AOS_ApplySecurity((uint8_t*) buffer, (int*) &buffer_size_i); - } else if (strcmp(security_type,"tc_p")==0){ - TC_t* tc_sdls_processed_frame = malloc(sizeof(TC_t)); - Crypto_TC_ProcessSecurity((uint8_t*) buffer, (int*) &buffer_size_i, tc_sdls_processed_frame); + // Call Apply/ProcessSecurity on buffer contents depending on type. + if (strcmp(security_type, "tc_a") == 0) + { + Crypto_TC_ApplySecurity((const uint8_t *)buffer, (const uint16_t)buffer_size_i, &ptr_enc_frame, + &enc_frame_len); + } + else if (strcmp(security_type, "tm_a") == 0) + { + Crypto_TM_ApplySecurity((uint8_t *)buffer, (int *)&buffer_size_i); + } + else if (strcmp(security_type, "aos_a") == 0) + { + Crypto_AOS_ApplySecurity((uint8_t *)buffer, (int *)&buffer_size_i); + } + else if (strcmp(security_type, "tc_p") == 0) + { + TC_t *tc_sdls_processed_frame = malloc(sizeof(TC_t)); + Crypto_TC_ProcessSecurity((uint8_t *)buffer, (int *)&buffer_size_i, tc_sdls_processed_frame); free(tc_sdls_processed_frame); - } else if (strcmp(security_type,"tm_p")==0){ - Crypto_TM_ProcessSecurity((uint8_t*) buffer, (int*) &buffer_size_i); - } else if (strcmp(security_type,"aos_p")==0){ - Crypto_AOS_ProcessSecurity((uint8_t*) buffer, (int*) &buffer_size_i); + } + else if (strcmp(security_type, "tm_p") == 0) + { + Crypto_TM_ProcessSecurity((uint8_t *)buffer, (int *)&buffer_size_i); + } + else if (strcmp(security_type, "aos_p") == 0) + { + Crypto_AOS_ProcessSecurity((uint8_t *)buffer, (int *)&buffer_size_i); } free(buffer); } diff --git a/util/src_util/et_dt_validation.c b/util/src_util/et_dt_validation.c index 1aae760d..78a2121d 100644 --- a/util/src_util/et_dt_validation.c +++ b/util/src_util/et_dt_validation.c @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2017 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2017 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any, kind either express, implied, or statutory, including, but not - limited to, any warranty that the software will conform to, specifications any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any, kind either express, implied, or statutory, including, + but not limited to, any warranty that the software will conform to, specifications any implied warranties of + merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation. Whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation. Whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was + sustained from, or arose out of the results of, or use of, the software, documentation or services provided hereunder ITC Team NASA IV&V @@ -24,9 +25,8 @@ #include "utest.h" #include -#include "sadb_routine.h" #include "crypto_error.h" - +#include "sadb_routine.h" // Setup for some Unit Tests using a Python Script to Verify validiy of frames PyObject *pName, *pModule, *pDict, *pFunc, *pValue, *pArgs, *pClass, *pInstance; @@ -55,18 +55,21 @@ int EndPython() * @param iv Hextring of the IV to be used during encryption * @param header Hextring of the header (AAD) that will be used during encryption * @param bitmask Hexstring of the bitmask that will be used on the header - * @param expected Ouput character array that will be allocated within this function. Memory must be freed upon completion of test. + * @param expected Ouput character array that will be allocated within this function. Memory must be freed upon + *completion of test. * @param expected_length The length of the expected character array that is set within this function - * @note The char** expected that is passsed to this function must be freed by the user upon completion of unit test or other call. + * @note The char** expected that is passsed to this function must be freed by the user upon completion of unit test or + *other call. **/ -void python_auth_encryption(char* data, char* key, char* iv, char* header, char* bitmask, uint8_t** expected, long* expected_length) +void python_auth_encryption(char *data, char *key, char *iv, char *header, char *bitmask, uint8_t **expected, + long *expected_length) { Py_Initialize(); PyRun_SimpleString("import sys\nsys.path.append('../../test')"); pName = PyUnicode_FromString("encryption_test"); pModule = PyImport_Import(pName); - if(pModule == NULL) + if (pModule == NULL) { printf("ERROR, NO MODULE FOUND\n"); EndPython(); @@ -93,35 +96,37 @@ void python_auth_encryption(char* data, char* key, char* iv, char* header, char* long temp_length = PyLong_AsLong(pValue); *expected_length = temp_length; pValue = PyObject_CallMethod(pInstance, "get_results", NULL); - char* temp_expected = PyBytes_AsString(pValue); - *expected= (uint8_t*)malloc(sizeof(uint8_t) * (int)*expected_length); + char *temp_expected = PyBytes_AsString(pValue); + *expected = (uint8_t *)malloc(sizeof(uint8_t) * (int)*expected_length); memcpy(*expected, temp_expected, (int)*expected_length); return; } /** * @brief Validation Test: Authorized Encryption using Python Truth Data - * Utilizes the python_auth_encryption(uint8_t* data, uint8_t* key, uint8_t* iv, uint8_t* header, uint8_t* bitmask, uint8_t** expected, long* expected_length) function to create baseline truth data. This data is then compared against the - * generated tag and cipher text that is generated by the Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const uint16_t in_frame_length, uint8_t **pp_in_frame, uint16_t *p_enc_frame_len) function, as well as the FECF. + * Utilizes the python_auth_encryption(uint8_t* data, uint8_t* key, uint8_t* iv, uint8_t* header, uint8_t* bitmask, + *uint8_t** expected, long* expected_length) function to create baseline truth data. This data is then compared against + *the generated tag and cipher text that is generated by the Crypto_TC_ApplySecurity(const uint8_t* p_in_frame, const + *uint16_t in_frame_length, uint8_t **pp_in_frame, uint16_t *p_enc_frame_len) function, as well as the FECF. **/ UTEST(ET_VALIDATION, AUTH_ENCRYPTION_TEST) { - //Setup & Initialize CryptoLib + // Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); SadbRoutine sadb_routine = get_sadb_routine_inmemory(); - uint8_t* expected = NULL; + uint8_t *expected = NULL; long expected_length = 0; - char *activate_sa4_h = "2003002000ff000100001880d2c9000e197f0b001b0004000400003040d95ea61a"; - char *enc_test_ping_h = "2003041600ff1880d2ca0008197f0b0031000039c5082d"; + char *activate_sa4_h = "2003002000ff000100001880d2c9000e197f0b001b0004000400003040d95ea61a"; + char *enc_test_ping_h = "2003041600ff1880d2ca0008197f0b0031000039c5082d"; uint8_t *activate_sa4_b, *enc_test_ping_b = NULL; int activate_sa4_len, enc_test_ping_len = 0; - hex_conversion(activate_sa4_h, (char**) &activate_sa4_b, &activate_sa4_len); - hex_conversion(enc_test_ping_h, (char**) &enc_test_ping_b, &enc_test_ping_len); - SecurityAssociation_t* test_association = NULL; + hex_conversion(activate_sa4_h, (char **)&activate_sa4_b, &activate_sa4_len); + hex_conversion(enc_test_ping_h, (char **)&enc_test_ping_b, &enc_test_ping_len); + SecurityAssociation_t *test_association = NULL; test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); uint8_t *ptr_enc_frame = NULL; @@ -132,35 +137,37 @@ UTEST(ET_VALIDATION, AUTH_ENCRYPTION_TEST) tc_sdls_processed_frame = malloc(sizeof(uint8_t) * TC_SIZE); memset(tc_sdls_processed_frame, 0, (sizeof(uint8_t) * TC_SIZE)); // Ensure that Process Security can activate SA 4 - return_val = Crypto_TC_ProcessSecurity(activate_sa4_b, &activate_sa4_len, tc_sdls_processed_frame); + return_val = Crypto_TC_ProcessSecurity(activate_sa4_b, &activate_sa4_len, tc_sdls_processed_frame); printf("Verifying TC_Process Return Value\n"); ASSERT_EQ(CRYPTO_LIB_SUCCESS, return_val); // Expose SA 1 for testing - sadb_routine->sadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); // Deactive SA 1 test_association->sa_state = SA_NONE; // Expose SA 4 for testing - sadb_routine->sadb_get_sa_from_spi(4,&test_association); + sadb_routine->sadb_get_sa_from_spi(4, &test_association); test_association->arc_len = 0; - test_association->gvcid_tc_blk.vcid=1; + test_association->gvcid_tc_blk.vcid = 1; test_association->iv[11] = 1; test_association->ast = 1; test_association->est = 1; test_association->sa_state = SA_OPERATIONAL; - + return_val = Crypto_TC_ApplySecurity(enc_test_ping_b, enc_test_ping_len, &ptr_enc_frame, &enc_frame_len); ASSERT_EQ(CRYPTO_LIB_SUCCESS, return_val); // Get Truth Baseline - python_auth_encryption("1880d2ca0008197f0b0031000039c5", "FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210", "000000000000000000000001", "2003043400FF0004", "00", &expected, &expected_length); - - for(int i = 0; i < expected_length; i++) + python_auth_encryption("1880d2ca0008197f0b0031000039c5", + "FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210", + "000000000000000000000001", "2003043400FF0004", "00", &expected, &expected_length); + + for (int i = 0; i < expected_length; i++) { printf("[%d]: %02x -> %02x \n", i, expected[i], ptr_enc_frame[i]); ASSERT_EQ(expected[i], ptr_enc_frame[i]); } free(activate_sa4_b); free(enc_test_ping_b); - free(ptr_enc_frame); + free(ptr_enc_frame); free(expected); free(tc_sdls_processed_frame); EndPython(); @@ -168,27 +175,30 @@ UTEST(ET_VALIDATION, AUTH_ENCRYPTION_TEST) /** * @brief Validation Test: Authorized Decryption - * Makes use of truth data created from the previous AUTH_ENCRYPTION_TEST, to validate that Crypto_TC_ProcessSecurity( uint8_t* ingest, int* len_ingest,TC_t* tc_sdls_processed_frame) - * properly decrypts data and returns it to the intial truth data created by the python_auth_encryption(uint8_t* data, uint8_t* key, uint8_t* iv, uint8_t* header, uint8_t* bitmask, uint8_t** expected, long* expected_length) function. + * Makes use of truth data created from the previous AUTH_ENCRYPTION_TEST, to validate that Crypto_TC_ProcessSecurity( + *uint8_t* ingest, int* len_ingest,TC_t* tc_sdls_processed_frame) properly decrypts data and returns it to the intial + *truth data created by the python_auth_encryption(uint8_t* data, uint8_t* key, uint8_t* iv, uint8_t* header, uint8_t* + *bitmask, uint8_t** expected, long* expected_length) function. **/ UTEST(DT_VALIDATION, AUTH_DECRYPTION_TEST) { - //Setup & Initialize CryptoLib + // Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); SadbRoutine sadb_routine = get_sadb_routine_inmemory(); - char *activate_sa4_h = "2003002000ff000100001880d2c9000e197f0b001b0004000400003040d95ea61a"; - char *dec_test_ping_h = "2003043400FF00040000000000000000000000017E1D8EEA8D45CEBA17888E0CDCD747DC78E5F372F997F2A63AA5DFC168395DC987"; + char *activate_sa4_h = "2003002000ff000100001880d2c9000e197f0b001b0004000400003040d95ea61a"; + char *dec_test_ping_h = + "2003043400FF00040000000000000000000000017E1D8EEA8D45CEBA17888E0CDCD747DC78E5F372F997F2A63AA5DFC168395DC987"; char *enc_test_ping_h = "1880d2ca0008197f0b0031000039c5"; uint8_t *activate_sa4_b, *dec_test_ping_b, *enc_test_ping_b = NULL; int activate_sa4_len, dec_test_ping_len, enc_test_ping_len = 0; - hex_conversion(activate_sa4_h, (char**) &activate_sa4_b, &activate_sa4_len); - hex_conversion(dec_test_ping_h, (char**) &dec_test_ping_b, &dec_test_ping_len); - hex_conversion(enc_test_ping_h, (char**) &enc_test_ping_b, &enc_test_ping_len); + hex_conversion(activate_sa4_h, (char **)&activate_sa4_b, &activate_sa4_len); + hex_conversion(dec_test_ping_h, (char **)&dec_test_ping_b, &dec_test_ping_len); + hex_conversion(enc_test_ping_h, (char **)&enc_test_ping_b, &enc_test_ping_len); - SecurityAssociation_t* test_association = NULL; + SecurityAssociation_t *test_association = NULL; test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); int32_t return_val = -1; @@ -199,39 +209,39 @@ UTEST(DT_VALIDATION, AUTH_DECRYPTION_TEST) // Ensure that Process Security can activate SA 4 return_val = Crypto_TC_ProcessSecurity(activate_sa4_b, &activate_sa4_len, tc_sdls_processed_frame); - ASSERT_EQ(CRYPTO_LIB_SUCCESS,return_val); + ASSERT_EQ(CRYPTO_LIB_SUCCESS, return_val); // Expose SA 1 for testing - sadb_routine->sadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); // Deactive SA 1 test_association->sa_state = SA_NONE; // Expose SA 4 for testing - sadb_routine->sadb_get_sa_from_spi(4,&test_association); + sadb_routine->sadb_get_sa_from_spi(4, &test_association); test_association->arc_len = 0; - test_association->gvcid_tc_blk.vcid=1; + test_association->gvcid_tc_blk.vcid = 1; test_association->iv[11] = 1; test_association->ast = 1; test_association->est = 1; test_association->sa_state = SA_OPERATIONAL; return_val = Crypto_TC_ProcessSecurity(dec_test_ping_b, &dec_test_ping_len, tc_sdls_processed_frame); - ASSERT_EQ(9,return_val); // 9 is the number of pings in that EP PDU. + ASSERT_EQ(9, return_val); // 9 is the number of pings in that EP PDU. Crypto_Shutdown(); printf("PDU:\n\t"); - for(int i = 0; i < tc_sdls_processed_frame->tc_pdu_len; i++) + for (int i = 0; i < tc_sdls_processed_frame->tc_pdu_len; i++) { printf("%02x", enc_test_ping_b[i]); } printf("\nPF PDU:\n\t"); - for(int i = 0; i < tc_sdls_processed_frame->tc_pdu_len; i++) + for (int i = 0; i < tc_sdls_processed_frame->tc_pdu_len; i++) { printf("%02x", tc_sdls_processed_frame->tc_pdu[i]); } printf("\n"); - for(int i = 0; i < tc_sdls_processed_frame->tc_pdu_len; i++) + for (int i = 0; i < tc_sdls_processed_frame->tc_pdu_len; i++) { ASSERT_EQ(enc_test_ping_b[i], tc_sdls_processed_frame->tc_pdu[i]); } @@ -244,62 +254,65 @@ UTEST(DT_VALIDATION, AUTH_DECRYPTION_TEST) /** * @brief Validation Test: AES-GCM 256 Test Vectors - * Reference: https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip + * Reference: + *https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip **/ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) { uint8_t *ptr_enc_frame = NULL; uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib - //Crypto_Init_Unit_Test(); - Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,1,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); + // Crypto_Init_Unit_Test(); + Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR, + TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, + TC_CHECK_FECF_TRUE, 0x3F); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_NO_SEGMENT_HDRS); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 1, TC_HAS_FECF, TC_NO_SEGMENT_HDRS); Crypto_Init(); SadbRoutine sadb_routine = get_sadb_routine_inmemory(); // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext char *buffer_nist_key_h = "ef9f9284cf599eac3b119905a7d18851e7e374cf63aea04358586b0f757670f8"; - char *buffer_nist_pt_h = "2003001600722ee47da4b77424733546c2d400c4e567a8"; - char *buffer_nist_iv_h = "b6ac8e4963f49207ffd6374c"; - char *buffer_nist_ct_h = "1224dfefb72a20d49e09256908874979"; + char *buffer_nist_pt_h = "2003001600722ee47da4b77424733546c2d400c4e567a8"; + char *buffer_nist_iv_h = "b6ac8e4963f49207ffd6374c"; + char *buffer_nist_ct_h = "1224dfefb72a20d49e09256908874979"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; // Expose/setup SAs for testing - SecurityAssociation_t* test_association = NULL; + SecurityAssociation_t *test_association = NULL; test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 - sadb_routine->sadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->arc_len = 0; test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_ct_h, (char**) &buffer_nist_ct_b, &buffer_nist_ct_len); + hex_conversion(buffer_nist_ct_h, (char **)&buffer_nist_ct_b, &buffer_nist_ct_len); Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) // Calc payload index: total length - pt length uint16_t enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; Crypto_Shutdown(); - for (int i=0; i %02x \n", i, *(ptr_enc_frame+enc_data_idx), buffer_nist_ct_b[i]); - ASSERT_EQ(*(ptr_enc_frame+enc_data_idx), buffer_nist_ct_b[i]); + printf("[%d]: %02x -> %02x \n", i, *(ptr_enc_frame + enc_data_idx), buffer_nist_ct_b[i]); + ASSERT_EQ(*(ptr_enc_frame + enc_data_idx), buffer_nist_ct_b[i]); enc_data_idx++; } free(ptr_enc_frame); @@ -311,64 +324,67 @@ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) /** * @brief Validation Test: AES-GCM 256 Test Vectors - * Reference: https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip + * Reference: + *https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip **/ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) { uint8_t *ptr_enc_frame = NULL; // Setup & Initialize CryptoLib - Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,1,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); + Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR, + TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, + TC_CHECK_FECF_TRUE, 0x3F); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 1, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS); Crypto_Init(); SadbRoutine sadb_routine = get_sadb_routine_inmemory(); // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext char *buffer_nist_key_h = "ef9f9284cf599eac3b119905a7d18851e7e374cf63aea04358586b0f757670f8"; - char *buffer_nist_pt_h = "2003001600722ee47da4b77424733546c2d400c4e567a8"; - char *buffer_nist_iv_h = "b6ac8e4963f49207ffd6374c"; - char *buffer_nist_et_h = "2003002500FF0009B6AC8E4963F49207FFD6374C1224DFEFB72A20D49E09256908874979AD6F"; + char *buffer_nist_pt_h = "2003001600722ee47da4b77424733546c2d400c4e567a8"; + char *buffer_nist_iv_h = "b6ac8e4963f49207ffd6374c"; + char *buffer_nist_et_h = "2003002500FF0009B6AC8E4963F49207FFD6374C1224DFEFB72A20D49E09256908874979AD6F"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_et_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_et_len, buffer_nist_key_len = 0; // Setup Processed Frame For Decryption TC_t *tc_nist_processed_frame; tc_nist_processed_frame = malloc(sizeof(uint8_t) * TC_SIZE); - + // Expose/setup SAs for testing - SecurityAssociation_t* test_association = NULL; + SecurityAssociation_t *test_association = NULL; test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 - sadb_routine->sadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->arc_len = 0; test_association->sa_state = SA_OPERATIONAL; - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); printf("NIST IV LEN: %d\n", buffer_nist_iv_len); // Convert input encryptedtext - hex_conversion(buffer_nist_et_h, (char**) &buffer_nist_et_b, &buffer_nist_et_len); + hex_conversion(buffer_nist_et_h, (char **)&buffer_nist_et_b, &buffer_nist_et_len); Crypto_TC_ProcessSecurity(buffer_nist_et_b, &buffer_nist_et_len, tc_nist_processed_frame); Crypto_Shutdown(); - for(int i = 0; i < tc_nist_processed_frame->tc_pdu_len; i++) + for (int i = 0; i < tc_nist_processed_frame->tc_pdu_len; i++) { - printf("[%d]: %02x -> %02x \n", i, buffer_nist_pt_b[i+5], tc_nist_processed_frame->tc_pdu[i]); - ASSERT_EQ(buffer_nist_pt_b[i+5], tc_nist_processed_frame->tc_pdu[i]); + printf("[%d]: %02x -> %02x \n", i, buffer_nist_pt_b[i + 5], tc_nist_processed_frame->tc_pdu[i]); + ASSERT_EQ(buffer_nist_pt_b[i + 5], tc_nist_processed_frame->tc_pdu[i]); } free(ptr_enc_frame); @@ -380,60 +396,63 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) /** * @brief Validation Test: AES-GCM 256 Test Vectors - * Reference: https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip + * Reference: + *https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip **/ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) { uint8_t *ptr_enc_frame = NULL; uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib - Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,1,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); + Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR, + TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, + TC_CHECK_FECF_TRUE, 0x3F); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_NO_SEGMENT_HDRS); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 1, TC_HAS_FECF, TC_NO_SEGMENT_HDRS); Crypto_Init(); SadbRoutine sadb_routine = get_sadb_routine_inmemory(); // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext char *buffer_nist_key_h = "e9ccd6eef27f740d1d5c70b187734e11e76a8ac0ad1702ff02180c5c1c9e5399"; - char *buffer_nist_pt_h = "2003001600419635e6e12b257a8ecae411f94480ff56be"; - char *buffer_nist_iv_h = "1af2613c4184dbd101fcedce"; - char *buffer_nist_ct_h = "9cd21f414f1f54d5f6f58b1f2f77e5b6"; + char *buffer_nist_pt_h = "2003001600419635e6e12b257a8ecae411f94480ff56be"; + char *buffer_nist_iv_h = "1af2613c4184dbd101fcedce"; + char *buffer_nist_ct_h = "9cd21f414f1f54d5f6f58b1f2f77e5b6"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; // Expose/setup SAs for testing - SecurityAssociation_t* test_association = NULL; + SecurityAssociation_t *test_association = NULL; test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 - sadb_routine->sadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->arc_len = 0; test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_ct_h, (char**) &buffer_nist_ct_b, &buffer_nist_ct_len); + hex_conversion(buffer_nist_ct_h, (char **)&buffer_nist_ct_b, &buffer_nist_ct_len); Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) // Calc payload index: total length - pt length uint16_t enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; Crypto_Shutdown(); - for (int i=0; isadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->arc_len = 0; test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_et_h, (char**) &buffer_nist_et_b, &buffer_nist_et_len); + hex_conversion(buffer_nist_et_h, (char **)&buffer_nist_et_b, &buffer_nist_et_len); Crypto_TC_ProcessSecurity(buffer_nist_et_b, &buffer_nist_et_len, tc_nist_processed_frame); Crypto_Shutdown(); - for(int i = 0; i < tc_nist_processed_frame->tc_pdu_len; i++) + for (int i = 0; i < tc_nist_processed_frame->tc_pdu_len; i++) { - ASSERT_EQ(buffer_nist_pt_b[i+5], tc_nist_processed_frame->tc_pdu[i]); + ASSERT_EQ(buffer_nist_pt_b[i + 5], tc_nist_processed_frame->tc_pdu[i]); } free(ptr_enc_frame); @@ -511,60 +533,63 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_1) /** * @brief Validation Test: AES-GCM 256 Test Vectors - * Reference: https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip + * Reference: + *https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip **/ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_2) { uint8_t *ptr_enc_frame = NULL; uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib - Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,1,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); + Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR, + TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, + TC_CHECK_FECF_TRUE, 0x3F); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_NO_SEGMENT_HDRS); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 1, TC_HAS_FECF, TC_NO_SEGMENT_HDRS); Crypto_Init(); SadbRoutine sadb_routine = get_sadb_routine_inmemory(); // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext char *buffer_nist_key_h = "7ecc9dcb3d5b413cadc3af7b7812758bd869295f8aaf611ba9935de76bd87013"; - char *buffer_nist_pt_h = "200300160073d4d7984ce422ac983797c0526ac6f9446b"; - char *buffer_nist_iv_h = "6805be41e983717bf6781052"; - char *buffer_nist_ct_h = "487211dd440f4d09d00bc5c3158a822c"; + char *buffer_nist_pt_h = "200300160073d4d7984ce422ac983797c0526ac6f9446b"; + char *buffer_nist_iv_h = "6805be41e983717bf6781052"; + char *buffer_nist_ct_h = "487211dd440f4d09d00bc5c3158a822c"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; // Expose/setup SAs for testing - SecurityAssociation_t* test_association = NULL; + SecurityAssociation_t *test_association = NULL; test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 - sadb_routine->sadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->arc_len = 0; test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_ct_h, (char**) &buffer_nist_ct_b, &buffer_nist_ct_len); + hex_conversion(buffer_nist_ct_h, (char **)&buffer_nist_ct_b, &buffer_nist_ct_len); Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) // Calc payload index: total length - pt length uint16_t enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; Crypto_Shutdown(); - for (int i=0; isadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->arc_len = 0; test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_et_h, (char**) &buffer_nist_et_b, &buffer_nist_et_len); + hex_conversion(buffer_nist_et_h, (char **)&buffer_nist_et_b, &buffer_nist_et_len); Crypto_TC_ProcessSecurity(buffer_nist_et_b, &buffer_nist_et_len, tc_nist_processed_frame); Crypto_Shutdown(); - for(int i = 0; i < tc_nist_processed_frame->tc_pdu_len; i++) + for (int i = 0; i < tc_nist_processed_frame->tc_pdu_len; i++) { - ASSERT_EQ(buffer_nist_pt_b[i+5], tc_nist_processed_frame->tc_pdu[i]); + ASSERT_EQ(buffer_nist_pt_b[i + 5], tc_nist_processed_frame->tc_pdu[i]); } free(ptr_enc_frame); @@ -642,60 +670,63 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_2) /** * @brief Validation Test: AES-GCM 256 Test Vectors - * Reference: https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip + * Reference: + *https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip **/ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_3) { uint8_t *ptr_enc_frame = NULL; uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib - Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,1,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); + Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR, + TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, + TC_CHECK_FECF_TRUE, 0x3F); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_NO_SEGMENT_HDRS); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 1, TC_HAS_FECF, TC_NO_SEGMENT_HDRS); Crypto_Init(); SadbRoutine sadb_routine = get_sadb_routine_inmemory(); // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext char *buffer_nist_key_h = "a881373e248615e3d6576f5a5fb68883515ae72d6a2938e3a6f0b8dcb639c9c0"; - char *buffer_nist_pt_h = "200300160007d1dc9930e710b1ebe533c81f671101e43c"; - char *buffer_nist_iv_h = "f0b744f157087df4e41818a9"; - char *buffer_nist_ct_h = "b65a2878b9dddbd4a0204dae6a6a6fc0"; + char *buffer_nist_pt_h = "200300160007d1dc9930e710b1ebe533c81f671101e43c"; + char *buffer_nist_iv_h = "f0b744f157087df4e41818a9"; + char *buffer_nist_ct_h = "b65a2878b9dddbd4a0204dae6a6a6fc0"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; // Expose/setup SAs for testing - SecurityAssociation_t* test_association = NULL; + SecurityAssociation_t *test_association = NULL; test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 - sadb_routine->sadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->arc_len = 0; test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_ct_h, (char**) &buffer_nist_ct_b, &buffer_nist_ct_len); + hex_conversion(buffer_nist_ct_h, (char **)&buffer_nist_ct_b, &buffer_nist_ct_len); Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) // Calc payload index: total length - pt length uint16_t enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; Crypto_Shutdown(); - for (int i=0; isadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->arc_len = 0; test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_et_h, (char**) &buffer_nist_et_b, &buffer_nist_et_len); + hex_conversion(buffer_nist_et_h, (char **)&buffer_nist_et_b, &buffer_nist_et_len); Crypto_TC_ProcessSecurity(buffer_nist_et_b, &buffer_nist_et_len, tc_nist_processed_frame); Crypto_Shutdown(); - for(int i = 0; i < tc_nist_processed_frame->tc_pdu_len; i++) + for (int i = 0; i < tc_nist_processed_frame->tc_pdu_len; i++) { - ASSERT_EQ(buffer_nist_pt_b[i+5], tc_nist_processed_frame->tc_pdu[i]); + ASSERT_EQ(buffer_nist_pt_b[i + 5], tc_nist_processed_frame->tc_pdu[i]); } free(ptr_enc_frame); @@ -773,60 +807,63 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_3) /** * @brief Validation Test: AES-GCM 256 Test Vectors - * Reference: https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip + * Reference: + *https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip **/ UTEST(NIST_ENC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_4) { uint8_t *ptr_enc_frame = NULL; uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib - Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,1,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); + Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR, + TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, + TC_CHECK_FECF_TRUE, 0x3F); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_NO_SEGMENT_HDRS); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 1, TC_HAS_FECF, TC_NO_SEGMENT_HDRS); Crypto_Init(); SadbRoutine sadb_routine = get_sadb_routine_inmemory(); // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext char *buffer_nist_key_h = "84c90349539c2a7989cb24dfae5e4182382ae94ba717d385977017f74f0d87d6"; - char *buffer_nist_pt_h = "200300160031c4e1d0ccece6b7a999bfc31f38559af5dd"; - char *buffer_nist_iv_h = "eeddeaf4355c826dfd153393"; - char *buffer_nist_ct_h = "5c6cfbdd06c19445ecf500c21aeca173"; + char *buffer_nist_pt_h = "200300160031c4e1d0ccece6b7a999bfc31f38559af5dd"; + char *buffer_nist_iv_h = "eeddeaf4355c826dfd153393"; + char *buffer_nist_ct_h = "5c6cfbdd06c19445ecf500c21aeca173"; uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_ct_b, *buffer_nist_key_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_ct_len, buffer_nist_key_len = 0; // Expose/setup SAs for testing - SecurityAssociation_t* test_association = NULL; + SecurityAssociation_t *test_association = NULL; test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 - sadb_routine->sadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->arc_len = 0; test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_ct_h, (char**) &buffer_nist_ct_b, &buffer_nist_ct_len); + hex_conversion(buffer_nist_ct_h, (char **)&buffer_nist_ct_b, &buffer_nist_ct_len); Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) // Calc payload index: total length - pt length uint16_t enc_data_idx = enc_frame_len - buffer_nist_ct_len - 2; Crypto_Shutdown(); - for (int i=0; isadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->arc_len = 0; test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input ciphertext - hex_conversion(buffer_nist_et_h, (char**) &buffer_nist_et_b, &buffer_nist_et_len); + hex_conversion(buffer_nist_et_h, (char **)&buffer_nist_et_b, &buffer_nist_et_len); Crypto_TC_ProcessSecurity(buffer_nist_et_b, &buffer_nist_et_len, tc_nist_processed_frame); Crypto_Shutdown(); - for(int i = 0; i < tc_nist_processed_frame->tc_pdu_len; i++) + for (int i = 0; i < tc_nist_processed_frame->tc_pdu_len; i++) { - ASSERT_EQ(buffer_nist_pt_b[i+5], tc_nist_processed_frame->tc_pdu[i]); + ASSERT_EQ(buffer_nist_pt_b[i + 5], tc_nist_processed_frame->tc_pdu[i]); } free(ptr_enc_frame); @@ -904,8 +944,10 @@ UTEST(NIST_DEC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_4) /** * @brief Validation Test: MAC - * Reference 1: https://gchq.github.io/CyberChef/#recipe=AES_Encrypt(%7B'option':'Hex','string':''%7D,%7B'option':'Hex','string':''%7D,'GCM','Hex','Hex',%7B'option':'Hex','string':''%7D) - * Reference 2: https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip + * Reference 1: + *https://gchq.github.io/CyberChef/#recipe=AES_Encrypt(%7B'option':'Hex','string':''%7D,%7B'option':'Hex','string':''%7D,'GCM','Hex','Hex',%7B'option':'Hex','string':''%7D) + * Reference 2: + *https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip * Spot check of MAC tags assuming no plaintext payload * Accomplished by a multi-step process: * 1) Ensure a valid implementation - Utilize Cyberchef's AES Encrypt to re-create a NIST test vector with AAD @@ -921,30 +963,33 @@ UTEST(NIST_ENC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) uint8_t *ptr_enc_frame = NULL; uint16_t enc_frame_len = 0; // Setup & Initialize CryptoLib - Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,1,TC_HAS_FECF,TC_NO_SEGMENT_HDRS); + Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR, + TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, + TC_CHECK_FECF_TRUE, 0x3F); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_NO_SEGMENT_HDRS); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 1, TC_HAS_FECF, TC_NO_SEGMENT_HDRS); Crypto_Init(); SadbRoutine sadb_routine = get_sadb_routine_inmemory(); // NIST supplied vectors // NOTE: Added Transfer Frame header to the plaintext char *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; - char *buffer_nist_pt_h = "200300060028C2"; // Empty Transfer frame - char *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; + char *buffer_nist_pt_h = "200300060028C2"; // Empty Transfer frame + char *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; char *buffer_nist_aad_h = "b96baa8c1c75a671bfb2d08d06be5f36"; // Zeroed out by abm char *buffer_cyber_chef_mac_h = "77e98911a1704df3d9745bc7b97cc66d"; - uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_key_b, *buffer_nist_aad_b, *buffer_cyber_chef_mac_b = NULL; + uint8_t *buffer_nist_pt_b, *buffer_nist_iv_b, *buffer_nist_key_b, *buffer_nist_aad_b, + *buffer_cyber_chef_mac_b = NULL; int buffer_nist_pt_len, buffer_nist_iv_len, buffer_nist_key_len, buffer_nist_aad_len, buffer_cyber_chef_mac_len = 0; // Expose/setup SAs for testing - SecurityAssociation_t* test_association = NULL; + SecurityAssociation_t *test_association = NULL; test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 - sadb_routine->sadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->ast = 1; test_association->est = 0; test_association->arc_len = 0; @@ -954,29 +999,30 @@ UTEST(NIST_ENC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input aad - hex_conversion(buffer_nist_aad_h, (char**) &buffer_nist_aad_b, &buffer_nist_aad_len); + hex_conversion(buffer_nist_aad_h, (char **)&buffer_nist_aad_b, &buffer_nist_aad_len); // Convert input mac - hex_conversion(buffer_cyber_chef_mac_h, (char**) &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); + hex_conversion(buffer_cyber_chef_mac_h, (char **)&buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); // Note: For comparison, interested in the TF payload (exclude headers and FECF if present) // Calc payload index: total length - pt length uint16_t enc_data_idx = enc_frame_len - buffer_cyber_chef_mac_len - 2; Crypto_Shutdown(); - for (int i=0; isadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->ast = 1; test_association->est = 0; test_association->arc_len = 0; test_association->shivf_len = 12; test_association->abm_len = 1024; - memset(test_association->abm, 0xFF, (test_association->abm_len*sizeof(uint8_t))); // Bitmask + memset(test_association->abm, 0xFF, (test_association->abm_len * sizeof(uint8_t))); // Bitmask test_association->stmacf_len = 16; test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input mac - hex_conversion(buffer_cyber_chef_mac_h, (char**) &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); + hex_conversion(buffer_cyber_chef_mac_h, (char **)&buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); Crypto_TC_ApplySecurity(buffer_nist_pt_b, buffer_nist_pt_len, &ptr_enc_frame, &enc_frame_len); - + // Note: For comparison, primarily interested in the MAC // Calc payload index: total length - pt length uint16_t enc_data_idx = enc_frame_len - buffer_cyber_chef_mac_len - 2; Crypto_Shutdown(); - for (int i=0; isadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->ast = 1; test_association->est = 0; test_association->arc_len = 0; test_association->abm_len = 1024; - memset(test_association->abm, 0xFF, (test_association->abm_len*sizeof(uint8_t))); + memset(test_association->abm, 0xFF, (test_association->abm_len * sizeof(uint8_t))); test_association->shivf_len = 12; test_association->stmacf_len = 16; test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input mac - hex_conversion(buffer_cyber_chef_mac_h, (char**) &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); + hex_conversion(buffer_cyber_chef_mac_h, (char **)&buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); // Convert mac frame - hex_conversion(buffer_nist_mac_frame_h, (char**) &buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len); + hex_conversion(buffer_nist_mac_frame_h, (char **)&buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len); status = Crypto_TC_ProcessSecurity(buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len, tc_nist_processed_frame); printf("TC_Process returned status %d\n", status); @@ -1144,20 +1197,20 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0) // for (int i=0; istmacf_len; i++) // { // printf("%02x ", tc_nist_processed_frame->tc_sec_trailer.mac[i]); - // } + // } // printf("\n"); // #endif Crypto_Shutdown(); // Verify the MAC - for (int i=0; i < test_association->stmacf_len; i++) + for (int i = 0; i < test_association->stmacf_len; i++) { - ASSERT_EQ(tc_nist_processed_frame->tc_sec_trailer.mac[i], buffer_cyber_chef_mac_b[i]); + ASSERT_EQ(tc_nist_processed_frame->tc_sec_trailer.mac[i], buffer_cyber_chef_mac_b[i]); } - for (int i=0; i < tc_nist_processed_frame->tc_pdu_len; i++) + for (int i = 0; i < tc_nist_processed_frame->tc_pdu_len; i++) // Verify the PDU Data is present and not stomped { - ASSERT_EQ(tc_nist_processed_frame->tc_pdu[i], buffer_nist_pt_b[i]); + ASSERT_EQ(tc_nist_processed_frame->tc_pdu[i], buffer_nist_pt_b[i]); } ASSERT_EQ(CRYPTO_LIB_SUCCESS, status); free(buffer_nist_iv_b); @@ -1174,61 +1227,66 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_DATA) { // Setup & Initialize CryptoLib int32_t status; - Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,1,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); + Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR, + TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, + TC_CHECK_FECF_TRUE, 0x3F); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 1, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS); Crypto_Init(); SadbRoutine sadb_routine = get_sadb_routine_inmemory(); // NIST supplied vectors char *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; - char *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; - //char *buffer_cyber_chef_mac_h = "99eff39be8327e6950f03a329209d577"; + char *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; + // char *buffer_cyber_chef_mac_h = "99eff39be8327e6950f03a329209d577"; char *buffer_cyber_chef_mac_h = "34d0e323f5e4b80426401d4aa37930da"; char *buffer_nist_pt_h = "722ee47da4b77424733546c2d400c4e5"; // Create a MAC'd frame by adding our headers and a fecf - // | Header | SPI | iv | plaintext | mac |fecf| - char *buffer_nist_mac_frame_h = "2003003500FF0009D79CF22D504CC793C3FB6C8A722ee47da4b77424733546c2d400c40034d0e323f5e4b80426401d4aa37930da123b"; + // | Header | SPI | iv | plaintext | mac |fecf| + char *buffer_nist_mac_frame_h = + "2003003500FF0009D79CF22D504CC793C3FB6C8A722ee47da4b77424733546c2d400c40034d0e323f5e4b80426401d4aa37930da123b"; - uint8_t *buffer_nist_iv_b, *buffer_nist_pt_b, *buffer_nist_key_b, *buffer_cyber_chef_mac_b , *buffer_nist_mac_frame_b, *buffer_nist_cp_b = NULL; - int buffer_nist_iv_len, buffer_nist_pt_len, buffer_nist_key_len, buffer_cyber_chef_mac_len , buffer_nist_mac_frame_len= 0; + uint8_t *buffer_nist_iv_b, *buffer_nist_pt_b, *buffer_nist_key_b, *buffer_cyber_chef_mac_b, + *buffer_nist_mac_frame_b, *buffer_nist_cp_b = NULL; + int buffer_nist_iv_len, buffer_nist_pt_len, buffer_nist_key_len, buffer_cyber_chef_mac_len, + buffer_nist_mac_frame_len = 0; // Setup Processed Frame For Decryption TC_t *tc_nist_processed_frame; tc_nist_processed_frame = malloc(sizeof(uint8_t) * TC_SIZE); // Expose/setup SAs for testing - SecurityAssociation_t* test_association = NULL; + SecurityAssociation_t *test_association = NULL; test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 - sadb_routine->sadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->ast = 1; test_association->est = 0; test_association->arc_len = 0; test_association->abm_len = 1024; - memset(test_association->abm, 0xFF, (test_association->abm_len*sizeof(uint8_t))); + memset(test_association->abm, 0xFF, (test_association->abm_len * sizeof(uint8_t))); test_association->shivf_len = 12; test_association->stmacf_len = 16; test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input mac - hex_conversion(buffer_cyber_chef_mac_h, (char**) &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); + hex_conversion(buffer_cyber_chef_mac_h, (char **)&buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); // Convert mac frame - hex_conversion(buffer_nist_mac_frame_h, (char**) &buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len); + hex_conversion(buffer_nist_mac_frame_h, (char **)&buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len); status = Crypto_TC_ProcessSecurity(buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len, tc_nist_processed_frame); printf("TC_Process returned status %d\n", status); @@ -1245,7 +1303,7 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_DATA) // for (int i=0; istmacf_len; i++) // { // printf("%02x ", tc_nist_processed_frame->tc_sec_trailer.mac[i]); - // } + // } // printf("\n"); // #endif @@ -1265,61 +1323,66 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_MAC) { // Setup & Initialize CryptoLib int32_t status; - Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, TC_CHECK_FECF_TRUE, 0x3F); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,1,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); + Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR, + TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, + TC_CHECK_FECF_TRUE, 0x3F); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 1, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS); Crypto_Init(); SadbRoutine sadb_routine = get_sadb_routine_inmemory(); // NIST supplied vectors char *buffer_nist_key_h = "78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223"; - char *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; - //char *buffer_cyber_chef_mac_h = "99eff39be8327e6950f03a329209d577"; + char *buffer_nist_iv_h = "d79cf22d504cc793c3fb6c8a"; + // char *buffer_cyber_chef_mac_h = "99eff39be8327e6950f03a329209d577"; char *buffer_cyber_chef_mac_h = "34d0e323f5e4b80426401d4aa37930da"; char *buffer_nist_pt_h = "722ee47da4b77424733546c2d400c4e5"; // Create a MAC'd frame by adding our headers and a fecf - // | Header | SPI | iv | plaintext | mac |fecf| - char *buffer_nist_mac_frame_h = "2003003500FF0009D79CF22D504CC793C3FB6C8A722ee47da4b77424733546c2d400c4e534d0e323f5e4b80426401d4aa37930009f68"; + // | Header | SPI | iv | plaintext | mac |fecf| + char *buffer_nist_mac_frame_h = + "2003003500FF0009D79CF22D504CC793C3FB6C8A722ee47da4b77424733546c2d400c4e534d0e323f5e4b80426401d4aa37930009f68"; - uint8_t *buffer_nist_iv_b, *buffer_nist_pt_b, *buffer_nist_key_b, *buffer_cyber_chef_mac_b , *buffer_nist_mac_frame_b, *buffer_nist_cp_b = NULL; - int buffer_nist_iv_len, buffer_nist_pt_len, buffer_nist_key_len, buffer_cyber_chef_mac_len , buffer_nist_mac_frame_len= 0; + uint8_t *buffer_nist_iv_b, *buffer_nist_pt_b, *buffer_nist_key_b, *buffer_cyber_chef_mac_b, + *buffer_nist_mac_frame_b, *buffer_nist_cp_b = NULL; + int buffer_nist_iv_len, buffer_nist_pt_len, buffer_nist_key_len, buffer_cyber_chef_mac_len, + buffer_nist_mac_frame_len = 0; // Setup Processed Frame For Decryption TC_t *tc_nist_processed_frame; tc_nist_processed_frame = malloc(sizeof(uint8_t) * TC_SIZE); // Expose/setup SAs for testing - SecurityAssociation_t* test_association = NULL; + SecurityAssociation_t *test_association = NULL; test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); // Deactivate SA 1 - sadb_routine->sadb_get_sa_from_spi(1,&test_association); + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; // Activate SA 9 - sadb_routine->sadb_get_sa_from_spi(9,&test_association); + sadb_routine->sadb_get_sa_from_spi(9, &test_association); test_association->ast = 1; test_association->est = 0; test_association->arc_len = 0; test_association->abm_len = 1024; - memset(test_association->abm, 0xFF, (test_association->abm_len*sizeof(uint8_t))); + memset(test_association->abm, 0xFF, (test_association->abm_len * sizeof(uint8_t))); test_association->shivf_len = 12; test_association->stmacf_len = 16; test_association->sa_state = SA_OPERATIONAL; // Insert key into keyring of SA 9 - hex_conversion(buffer_nist_key_h, (char**) &buffer_nist_key_b, &buffer_nist_key_len); + hex_conversion(buffer_nist_key_h, (char **)&buffer_nist_key_b, &buffer_nist_key_len); memcpy(ek_ring[test_association->ekid].value, buffer_nist_key_b, buffer_nist_key_len); // Convert input plaintext // TODO: Account for length of header and FECF (5+2) - hex_conversion(buffer_nist_pt_h, (char**) &buffer_nist_pt_b, &buffer_nist_pt_len); + hex_conversion(buffer_nist_pt_h, (char **)&buffer_nist_pt_b, &buffer_nist_pt_len); // Convert/Set input IV - hex_conversion(buffer_nist_iv_h, (char**) &buffer_nist_iv_b, &buffer_nist_iv_len); + hex_conversion(buffer_nist_iv_h, (char **)&buffer_nist_iv_b, &buffer_nist_iv_len); memcpy(test_association->iv, buffer_nist_iv_b, buffer_nist_iv_len); // Convert input mac - hex_conversion(buffer_cyber_chef_mac_h, (char**) &buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); + hex_conversion(buffer_cyber_chef_mac_h, (char **)&buffer_cyber_chef_mac_b, &buffer_cyber_chef_mac_len); // Convert mac frame - hex_conversion(buffer_nist_mac_frame_h, (char**) &buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len); + hex_conversion(buffer_nist_mac_frame_h, (char **)&buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len); status = Crypto_TC_ProcessSecurity(buffer_nist_mac_frame_b, &buffer_nist_mac_frame_len, tc_nist_processed_frame); printf("TC_Process returned status %d\n", status); @@ -1336,7 +1399,7 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_MAC) // for (int i=0; istmacf_len; i++) // { // printf("%02x ", tc_nist_processed_frame->tc_sec_trailer.mac[i]); - // } + // } // printf("\n"); // #endif @@ -1348,5 +1411,5 @@ UTEST(NIST_DEC_MAC_VALIDATION, AES_GCM_256_IV_96_PT_128_TEST_0_BAD_MAC) free(buffer_nist_mac_frame_b); free(buffer_nist_cp_b); } - + UTEST_MAIN(); diff --git a/util/src_util/process_security.c b/util/src_util/process_security.c index b997ec41..7fb71a5c 100644 --- a/util/src_util/process_security.c +++ b/util/src_util/process_security.c @@ -1,64 +1,75 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V jstar-development-team@mail.nasa.gov */ - /* - * Simple Process security program that reads a file into memory and calls the Crypto_TC_ProcessSecurity function on the data. + * Simple Process security program that reads a file into memory and calls the Crypto_TC_ProcessSecurity function on + * the data. */ #include "process_security.h" -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]) +{ char *buffer; const char *filename; long buffer_size; char *security_type; - if (argc == 3) { + if (argc == 3) + { security_type = argv[1]; filename = argv[2]; - } else { - fprintf(stderr,"Command line usage: \n"\ - "\t%s \n"\ - " : Process TeleCommand (tc) | Telemetry (tm) | Advanced Orbiting Systems (aos) Security T\n"\ - " : binary file with telecommand transfer frame bits\n",argv[0]); + } + else + { + fprintf(stderr, + "Command line usage: \n" + "\t%s \n" + " : Process TeleCommand (tc) | Telemetry (tm) | Advanced Orbiting Systems (aos) Security T\n" + " : binary file with telecommand transfer frame bits\n", + argv[0]); return CRYPTO_LIB_ERROR; } - buffer = c_read_file(filename,&buffer_size); - debug_printf("File buffer size:%lu\n",buffer_size); - int buffer_size_i = (int) buffer_size; - debug_printf("File buffer size int:%d\n",buffer_size_i); + buffer = c_read_file(filename, &buffer_size); + debug_printf("File buffer size:%lu\n", buffer_size); + int buffer_size_i = (int)buffer_size; + debug_printf("File buffer size int:%d\n", buffer_size_i); debug_printf("File content: \n"); - debug_hexprintf(buffer,buffer_size_i); - + debug_hexprintf(buffer, buffer_size_i); - //Setup & Initialize CryptoLib + // Setup & Initialize CryptoLib Crypto_Init(); - //Call ProcessSecurity on buffer contents depending on type. - if (strcmp(security_type,"tc")==0){ - TC_t* tc_sdls_processed_frame = malloc(sizeof(TC_t)); - Crypto_TC_ProcessSecurity((uint8_t*) buffer, &buffer_size_i,tc_sdls_processed_frame); + // Call ProcessSecurity on buffer contents depending on type. + if (strcmp(security_type, "tc") == 0) + { + TC_t *tc_sdls_processed_frame = malloc(sizeof(TC_t)); + Crypto_TC_ProcessSecurity((uint8_t *)buffer, &buffer_size_i, tc_sdls_processed_frame); free(tc_sdls_processed_frame); - } else if (strcmp(security_type,"tm")==0){ - Crypto_TM_ProcessSecurity((uint8_t*) buffer, &buffer_size_i); - } else if (strcmp(security_type,"aos")==0){ - Crypto_AOS_ProcessSecurity((uint8_t*) buffer, &buffer_size_i); + } + else if (strcmp(security_type, "tm") == 0) + { + Crypto_TM_ProcessSecurity((uint8_t *)buffer, &buffer_size_i); + } + else if (strcmp(security_type, "aos") == 0) + { + Crypto_AOS_ProcessSecurity((uint8_t *)buffer, &buffer_size_i); } free(buffer); diff --git a/util/src_util/ut_tc_apply.c b/util/src_util/ut_tc_apply.c index 4acb9313..3667a480 100644 --- a/util/src_util/ut_tc_apply.c +++ b/util/src_util/ut_tc_apply.c @@ -1,14 +1,15 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. ITC Team NASA IV&V @@ -19,15 +20,14 @@ * Unit Tests that macke use of TC_ApplySecurity function on the data. **/ #include "ut_tc_apply.h" -#include "utest.h" #include "crypto.h" #include "crypto_error.h" #include "sadb_routine.h" - +#include "utest.h" /** * @brief Unit Test: No Crypto_Init() - * + * * TC_ApplySecurity should reject functionality if the Crypto_Init() function has not been called. **/ UTEST(TC_APPLY_SECURITY, NO_CRYPTO_INIT) @@ -38,14 +38,17 @@ UTEST(TC_APPLY_SECURITY, NO_CRYPTO_INIT) int raw_tc_sdls_ping_len = 0; hex_conversion(raw_tc_sdls_ping_h, &raw_tc_sdls_ping_b, &raw_tc_sdls_ping_len); - Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY,CRYPTO_TC_CREATE_FECF_TRUE,TC_PROCESS_SDLS_PDUS_TRUE,TC_HAS_PUS_HDR,TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_TRUE, TC_CHECK_FECF_TRUE, 0x3F); - Crypto_Config_Add_Gvcid_Managed_Parameter(0,0x0003,0,TC_HAS_FECF,TC_HAS_SEGMENT_HDRS); + Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR, + TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_TRUE, + TC_CHECK_FECF_TRUE, 0x3F); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS); uint8_t *ptr_enc_frame = NULL; uint16_t enc_frame_len = 0; int32_t return_val = CRYPTO_LIB_ERROR; - return_val = Crypto_TC_ApplySecurity((uint8_t*) raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); + return_val = + Crypto_TC_ApplySecurity((uint8_t *)raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); ASSERT_EQ(CRYPTO_LIB_ERR_NO_INIT, return_val); free(raw_tc_sdls_ping_b); Crypto_Shutdown(); @@ -57,7 +60,7 @@ UTEST(TC_APPLY_SECURITY, NO_CRYPTO_INIT) **/ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_CLEAR) { - //Setup & Initialize CryptoLib + // Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); char *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; char *raw_tc_sdls_ping_b = NULL; @@ -70,7 +73,8 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_CLEAR) int32_t return_val = CRYPTO_LIB_ERROR; - return_val = Crypto_TC_ApplySecurity((uint8_t*) raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); + return_val = + Crypto_TC_ApplySecurity((uint8_t *)raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); Crypto_Shutdown(); free(raw_tc_sdls_ping_b); free(ptr_enc_frame); @@ -82,7 +86,7 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_CLEAR) **/ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_ENC) { - //Setup & Initialize CryptoLib + // Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); char *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; char *raw_tc_sdls_ping_b = NULL; @@ -96,15 +100,16 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_ENC) int32_t return_val = CRYPTO_LIB_ERROR; - SecurityAssociation_t* test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); - //Expose the SADB Security Association for test edits. - sadb_routine->sadb_get_sa_from_spi(1,&test_association); + SecurityAssociation_t *test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); + // Expose the SADB Security Association for test edits. + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; - sadb_routine->sadb_get_sa_from_spi(4,&test_association); + sadb_routine->sadb_get_sa_from_spi(4, &test_association); test_association->sa_state = SA_OPERATIONAL; - test_association->ast=0; + test_association->ast = 0; - return_val = Crypto_TC_ApplySecurity((uint8_t*) raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); + return_val = + Crypto_TC_ApplySecurity((uint8_t *)raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); Crypto_Shutdown(); free(raw_tc_sdls_ping_b); free(ptr_enc_frame); @@ -116,7 +121,7 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_ENC) **/ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_AUTH_ENC) { - //Setup & Initialize CryptoLib + // Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); char *raw_tc_sdls_ping_h = "20030015000080d2c70008197f0b00310000b1fe3128"; char *raw_tc_sdls_ping_b = NULL; @@ -130,14 +135,15 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_AUTH_ENC) int32_t return_val = CRYPTO_LIB_ERROR; - SecurityAssociation_t* test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); - //Expose the SADB Security Association for test edits. - sadb_routine->sadb_get_sa_from_spi(1,&test_association); + SecurityAssociation_t *test_association = malloc(sizeof(SecurityAssociation_t) * sizeof(uint8_t)); + // Expose the SADB Security Association for test edits. + sadb_routine->sadb_get_sa_from_spi(1, &test_association); test_association->sa_state = SA_NONE; - sadb_routine->sadb_get_sa_from_spi(4,&test_association); + sadb_routine->sadb_get_sa_from_spi(4, &test_association); test_association->sa_state = SA_OPERATIONAL; - return_val = Crypto_TC_ApplySecurity((uint8_t*) raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); + return_val = + Crypto_TC_ApplySecurity((uint8_t *)raw_tc_sdls_ping_b, raw_tc_sdls_ping_len, &ptr_enc_frame, &enc_frame_len); Crypto_Shutdown(); free(raw_tc_sdls_ping_b); free(ptr_enc_frame); @@ -148,10 +154,10 @@ UTEST(TC_APPLY_SECURITY, HAPPY_PATH_AUTH_ENC) * @brief Unit Test: Bad Spacecraft ID * This should pass the flawed hex string, and return CRYPTO_LIB_ERR_INVALID_SCID * Bad Space Craft ID. This should pass the flawed .dat file, and return MANAGED_PARAMETERS_FOR_GVCID_NOT_FOUND -**/ + **/ UTEST(TC_APPLY_SECURITY, BAD_SPACE_CRAFT_ID) { - //Setup & Initialize CryptoLib + // Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); char *raw_tc_sdls_ping_bad_scid_h = "20010015000080d2c70008197f0b00310000b1fe3128"; char *raw_tc_sdls_ping_bad_scid_b = NULL; @@ -160,9 +166,10 @@ UTEST(TC_APPLY_SECURITY, BAD_SPACE_CRAFT_ID) hex_conversion(raw_tc_sdls_ping_bad_scid_h, &raw_tc_sdls_ping_bad_scid_b, &raw_tc_sdls_ping_bad_scid_len); uint8_t *ptr_enc_frame = NULL; - uint16_t enc_frame_len = 0; + uint16_t enc_frame_len = 0; - int32_t return_val = Crypto_TC_ApplySecurity((uint8_t*) raw_tc_sdls_ping_bad_scid_b, raw_tc_sdls_ping_bad_scid_len, &ptr_enc_frame, &enc_frame_len); + int32_t return_val = Crypto_TC_ApplySecurity((uint8_t *)raw_tc_sdls_ping_bad_scid_b, raw_tc_sdls_ping_bad_scid_len, + &ptr_enc_frame, &enc_frame_len); free(raw_tc_sdls_ping_bad_scid_b); free(ptr_enc_frame); Crypto_Shutdown(); @@ -171,11 +178,12 @@ UTEST(TC_APPLY_SECURITY, BAD_SPACE_CRAFT_ID) /** * @brief Unit Test: Bad Virtual Channel ID - * This will be passed a flawed hex string with an invalid virtual channel ID. CRYPTO_LIB_ERR_INVALID_VCID should be returned. + * This will be passed a flawed hex string with an invalid virtual channel ID. CRYPTO_LIB_ERR_INVALID_VCID should be + *returned. **/ UTEST(TC_APPLY_SECURITY, BAD_VIRTUAL_CHANNEL_ID) { - //Setup & Initialize CryptoLib + // Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); char *raw_tc_sdls_ping_bad_vcid_h = "20032015000080d2c70008197f0b00310000b1fe3128"; char *raw_tc_sdls_ping_bad_vcid_b = NULL; @@ -187,7 +195,8 @@ UTEST(TC_APPLY_SECURITY, BAD_VIRTUAL_CHANNEL_ID) uint16_t enc_frame_len = 0; int32_t return_val = CRYPTO_LIB_ERROR; - return_val = Crypto_TC_ApplySecurity((uint8_t*) raw_tc_sdls_ping_bad_vcid_b, raw_tc_sdls_ping_bad_vcid_len, &ptr_enc_frame, &enc_frame_len); + return_val = Crypto_TC_ApplySecurity((uint8_t *)raw_tc_sdls_ping_bad_vcid_b, raw_tc_sdls_ping_bad_vcid_len, + &ptr_enc_frame, &enc_frame_len); free(raw_tc_sdls_ping_bad_vcid_b); free(ptr_enc_frame); Crypto_Shutdown(); @@ -196,15 +205,16 @@ UTEST(TC_APPLY_SECURITY, BAD_VIRTUAL_CHANNEL_ID) /** * @brief Unit Test: Null Buffer -> TC_ApplySecurity - * Tests how ApplySecurity function handles a null buffer. Should reject functionality, and return CRYPTO_LIB_ERR_NULL_BUFFER + * Tests how ApplySecurity function handles a null buffer. Should reject functionality, and return + *CRYPTO_LIB_ERR_NULL_BUFFER **/ UTEST(TC_APPLY_SECURITY, NULL_BUFFER) { - //Setup & Initialize CryptoLib + // Setup & Initialize CryptoLib Crypto_Init_Unit_Test(); long buffer_size = 0; uint8_t *buffer = NULL; - uint16_t buffer_size_i = (uint16_t) buffer_size; + uint16_t buffer_size_i = (uint16_t)buffer_size; uint8_t *ptr_enc_frame = NULL; uint16_t enc_frame_len = 0; @@ -216,7 +226,7 @@ UTEST(TC_APPLY_SECURITY, NULL_BUFFER) ASSERT_EQ(CRYPTO_LIB_ERR_NULL_BUFFER, return_val); } -//TODO: +// TODO: /* What should be returned if something goes wrong with Control Command Flag? Should a NULL pointer be returned....The original pointer? We need to decide on this functionality and write a test for this From db218bbb398e063ab7bbfd657ece462037e06e55 Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 13:14:43 -0500 Subject: [PATCH 14/18] #1 - Expand crypto.c into multiple files for better tracking, but exposing functions; --- include/crypto.h | 112 +- src/src_main/crypto.c | 2788 ++--------------- src/src_main/crypto_aos.c | 74 + src/src_main/crypto_key_mgmt.c | 435 +++ src/src_main/crypto_mc.c | 248 ++ src/src_main/crypto_tc.c | 1030 ++++++ src/src_main/crypto_tm.c | 349 +++ src/src_main/sadb_routine_inmemory.template.c | 36 +- util/CMakeLists.txt | 2 +- 9 files changed, 2577 insertions(+), 2497 deletions(-) create mode 100644 src/src_main/crypto_aos.c create mode 100644 src/src_main/crypto_key_mgmt.c create mode 100644 src/src_main/crypto_mc.c create mode 100644 src/src_main/crypto_tc.c create mode 100644 src/src_main/crypto_tm.c diff --git a/include/crypto.h b/include/crypto.h index ec4bdd16..3362e136 100644 --- a/include/crypto.h +++ b/include/crypto.h @@ -22,7 +22,6 @@ /* ** Crypto Includes */ - #ifdef NOS3 // NOS3/cFS build is ready #include "cfe.h" #else // Assume build outside of NOS3/cFS infrastructure @@ -31,16 +30,26 @@ #include #endif +#include + +#include "crypto_config.h" #include "crypto_config_structs.h" +#include "crypto_error.h" +#include "crypto_events.h" +#include "crypto_print.h" #include "crypto_structs.h" +#include "sadb_routine.h" +/* +** Crypto Version +*/ #define CRYPTO_LIB_MAJOR_VERSION 1 #define CRYPTO_LIB_MINOR_VERSION 0 #define CRYPTO_LIB_REVISION 1 #define CRYPTO_LIB_MISSION_REV 0 /* -** Prototypes +** User Prototypes */ // Crypto Library Configuration functions @@ -72,22 +81,107 @@ extern int32_t Crypto_TM_ProcessSecurity(uint8_t *ingest, int *len_ingest); // Advanced Orbiting Systems (AOS) extern int32_t Crypto_AOS_ApplySecurity(uint8_t *ingest, int *len_ingest); extern int32_t Crypto_AOS_ProcessSecurity(uint8_t *ingest, int *len_ingest); -// Security Functions -extern int32_t Crypto_ApplySecurity(uint8_t *ingest, int *len_ingest); -extern int32_t Crypto_ProcessSecurity(uint8_t *ingest, int *len_ingest); +/* +** Internal Prototypes +*/ +extern uint8_t Crypto_Prep_Reply(uint8_t *ingest, uint8_t appID); +extern int32_t Crypto_increment(uint8_t *num, int length); +// int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr); +int32_t Crypto_Get_tmLength(int len); +uint8_t Crypto_Is_AEAD_Algorithm(uint32_t cipher_suite_id); +uint8_t *Crypto_Prepare_TC_AAD(uint8_t *buffer, uint16_t len_aad, uint8_t *abm_buffer); +void Crypto_TM_updatePDU(uint8_t *ingest, int len_ingest); +void Crypto_TM_updateOCF(void); +void Crypto_Local_Config(void); +void Crypto_Local_Init(void); +// int32_t Crypto_gcm_err(int gcm_err); +int32_t Crypto_window(uint8_t *actual, uint8_t *expected, int length, int window); +// int32_t Crypto_compare_less_equal(uint8_t *actual, uint8_t *expected, int length); +// int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_frame); +uint16_t Crypto_Calc_FECF(uint8_t *ingest, int len_ingest); +void Crypto_Calc_CRC_Init_Table(void); +uint16_t Crypto_Calc_CRC16(uint8_t *data, int size); + +// Key Management Functions +int32_t Crypto_Key_OTAR(void); +int32_t Crypto_Key_update(uint8_t state); +int32_t Crypto_Key_inventory(uint8_t *); +int32_t Crypto_Key_verify(uint8_t *, TC_t *tc_frame); + +// Security Monitoring & Control Procedure +int32_t Crypto_MC_ping(uint8_t *ingest); +int32_t Crypto_MC_status(uint8_t *ingest); +int32_t Crypto_MC_dump(uint8_t *ingest); +int32_t Crypto_MC_erase(uint8_t *ingest); +int32_t Crypto_MC_selftest(uint8_t *ingest); +int32_t Crypto_SA_readARSN(uint8_t *ingest); +int32_t Crypto_MC_resetalarm(void); + +// User Functions +int32_t Crypto_User_IdleTrigger(uint8_t *ingest); +int32_t Crypto_User_BadSPI(void); +int32_t Crypto_User_BadIV(void); +int32_t Crypto_User_BadMAC(void); +int32_t Crypto_User_BadFECF(void); +int32_t Crypto_User_ModifyKey(void); +int32_t Crypto_User_ModifyActiveTM(void); +int32_t Crypto_User_ModifyVCID(void); + +// Determine Payload Data Unit +int32_t Crypto_Process_Extended_Procedure_Pdu(TC_t *tc_sdls_processed_frame, uint8_t *ingest); +int32_t Crypto_PDU(uint8_t *ingest, TC_t *tc_frame); + +// Managed Parameter Functions +int32_t Crypto_Get_Managed_Parameters_For_Gvcid(uint8_t tfvn, uint16_t scid, uint8_t vcid, + GvcidManagedParameters_t *managed_parameters_in, + GvcidManagedParameters_t **managed_parameters_out); +int32_t crypto_config_add_gvcid_managed_parameter_recursion(uint8_t tfvn, uint16_t scid, uint8_t vcid, + uint8_t has_fecf, uint8_t has_segmentation_hdr, + GvcidManagedParameters_t *managed_parameter); +void Crypto_Free_Managed_Parameters(GvcidManagedParameters_t *managed_parameters); + + + +/* +** Extern Global Variables +*/ // Data stores used in multiple components extern CCSDS_t sdls_frame; extern TM_t tm_frame; extern crypto_key_t ek_ring[NUM_KEYS]; -// Assisting functions used in multiple components -extern uint8_t Crypto_Prep_Reply(uint8_t *ingest, uint8_t appID); -extern int32_t Crypto_increment(uint8_t *num, int length); // Global configuration structs extern CryptoConfig_t *crypto_config; extern SadbMariaDBConfig_t *sadb_mariadb_config; extern GvcidManagedParameters_t *gvcid_managed_parameters; extern GvcidManagedParameters_t *current_managed_parameters; +extern SadbRoutine sadb_routine; -#endif \ No newline at end of file +extern crypto_key_t ek_ring[NUM_KEYS]; +// extern crypto_key_t ak_ring[NUM_KEYS]; +extern CCSDS_t sdls_frame; +extern TM_t tm_frame; +extern CryptoConfig_t *crypto_config; +extern SadbMariaDBConfig_t *sadb_mariadb_config; +extern GvcidManagedParameters_t *gvcid_managed_parameters; +extern GvcidManagedParameters_t *current_managed_parameters; +// OCF +extern uint8_t ocf; +extern SDLS_FSR_t report; +extern TM_FrameCLCW_t clcw; +// Flags +extern SDLS_MC_LOG_RPLY_t log_summary; +extern SDLS_MC_DUMP_BLK_RPLY_t mc_log; +extern uint8_t log_count; +extern uint16_t tm_offset; +// ESA Testing - 0 = disabled, 1 = enabled +extern uint8_t badSPI; +extern uint8_t badIV; +extern uint8_t badMAC; +extern uint8_t badFECF; +// CRC +extern uint32_t crc32Table[256]; +extern uint16_t crc16Table[256]; + +#endif // _crypto_h_ \ No newline at end of file diff --git a/src/src_main/crypto.c b/src/src_main/crypto.c index 73a203f8..d745a16c 100644 --- a/src/src_main/crypto.c +++ b/src/src_main/crypto.c @@ -15,23 +15,11 @@ NASA IV&V jstar-development-team@mail.nasa.gov */ -#ifndef _crypto_c_ -#define _crypto_c_ /* ** Includes */ #include "crypto.h" -#include "sadb_routine.h" - -#include "crypto_config.h" -#include "crypto_config_structs.h" -#include "crypto_error.h" -#include "crypto_events.h" -#include "crypto_print.h" -#include "crypto_structs.h" - -#include /* ** Static Library Declaration @@ -40,67 +28,13 @@ CFS_MODULE_DECLARE_LIB(crypto); #endif -static SadbRoutine sadb_routine = NULL; - -/* -** Static Prototypes -*/ -// Assisting Functions -// static int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr); -static int32_t Crypto_Get_tmLength(int len); -static uint8_t Crypto_Is_AEAD_Algorithm(uint32_t cipher_suite_id); -static uint8_t *Crypto_Prepare_TC_AAD(uint8_t *buffer, uint16_t len_aad, uint8_t *abm_buffer); -static void Crypto_TM_updatePDU(uint8_t *ingest, int len_ingest); -static void Crypto_TM_updateOCF(void); -static void Crypto_Local_Config(void); -static void Crypto_Local_Init(void); -// static int32_t Crypto_gcm_err(int gcm_err); -static int32_t Crypto_window(uint8_t *actual, uint8_t *expected, int length, int window); -// static int32_t Crypto_compare_less_equal(uint8_t *actual, uint8_t *expected, int length); -// static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_frame); -static uint16_t Crypto_Calc_FECF(uint8_t *ingest, int len_ingest); -static void Crypto_Calc_CRC_Init_Table(void); -static uint16_t Crypto_Calc_CRC16(uint8_t *data, int size); -// Key Management Functions -static int32_t Crypto_Key_OTAR(void); -static int32_t Crypto_Key_update(uint8_t state); -static int32_t Crypto_Key_inventory(uint8_t *); -static int32_t Crypto_Key_verify(uint8_t *, TC_t *tc_frame); -// Security Monitoring & Control Procedure -static int32_t Crypto_MC_ping(uint8_t *ingest); -static int32_t Crypto_MC_status(uint8_t *ingest); -static int32_t Crypto_MC_dump(uint8_t *ingest); -static int32_t Crypto_MC_erase(uint8_t *ingest); -static int32_t Crypto_MC_selftest(uint8_t *ingest); -static int32_t Crypto_SA_readARSN(uint8_t *ingest); -static int32_t Crypto_MC_resetalarm(void); -// User Functions -static int32_t Crypto_User_IdleTrigger(uint8_t *ingest); -static int32_t Crypto_User_BadSPI(void); -static int32_t Crypto_User_BadIV(void); -static int32_t Crypto_User_BadMAC(void); -static int32_t Crypto_User_BadFECF(void); -static int32_t Crypto_User_ModifyKey(void); -static int32_t Crypto_User_ModifyActiveTM(void); -static int32_t Crypto_User_ModifyVCID(void); -// Determine Payload Data Unit -static int32_t Crypto_Process_Extended_Procedure_Pdu(TC_t *tc_sdls_processed_frame, uint8_t *ingest); -static int32_t Crypto_PDU(uint8_t *ingest, TC_t *tc_frame); -// Managed Parameter Functions -static int32_t Crypto_Get_Managed_Parameters_For_Gvcid(uint8_t tfvn, uint16_t scid, uint8_t vcid, - GvcidManagedParameters_t *managed_parameters_in, - GvcidManagedParameters_t **managed_parameters_out); -static int32_t crypto_config_add_gvcid_managed_parameter_recursion(uint8_t tfvn, uint16_t scid, uint8_t vcid, - uint8_t has_fecf, uint8_t has_segmentation_hdr, - GvcidManagedParameters_t *managed_parameter); -static void Crypto_Free_Managed_Parameters(GvcidManagedParameters_t *managed_parameters); - /* ** Global Variables */ +SadbRoutine sadb_routine = NULL; // Security crypto_key_t ek_ring[NUM_KEYS] = {0}; -// static crypto_key_t ak_ring[NUM_KEYS]; +// crypto_key_t ak_ring[NUM_KEYS]; CCSDS_t sdls_frame; TM_t tm_frame; CryptoConfig_t *crypto_config = NULL; @@ -108,22 +42,23 @@ SadbMariaDBConfig_t *sadb_mariadb_config = NULL; GvcidManagedParameters_t *gvcid_managed_parameters = NULL; GvcidManagedParameters_t *current_managed_parameters = NULL; // OCF -static uint8_t ocf = 0; -static SDLS_FSR_t report; -static TM_FrameCLCW_t clcw; +uint8_t ocf = 0; +SDLS_FSR_t report; +TM_FrameCLCW_t clcw; // Flags -static SDLS_MC_LOG_RPLY_t log_summary; -static SDLS_MC_DUMP_BLK_RPLY_t log; -static uint8_t log_count = 0; -static uint16_t tm_offset = 0; +SDLS_MC_LOG_RPLY_t log_summary; +SDLS_MC_DUMP_BLK_RPLY_t mc_log; +uint8_t log_count = 0; +uint16_t tm_offset = 0; // ESA Testing - 0 = disabled, 1 = enabled -static uint8_t badSPI = 0; -static uint8_t badIV = 0; -static uint8_t badMAC = 0; -static uint8_t badFECF = 0; +uint8_t badSPI = 0; +uint8_t badIV = 0; +uint8_t badMAC = 0; +uint8_t badFECF = 0; // CRC -static uint32_t crc32Table[256]; -static uint16_t crc16Table[256]; +uint32_t crc32Table[256]; +uint16_t crc16Table[256]; + /* ** Initialization Functions */ @@ -364,7 +299,7 @@ int32_t Crypto_Config_Add_Gvcid_Managed_Parameter(uint8_t tfvn, uint16_t scid, u * @param managed_parameter: GvcidManagedParameters_t* * @return int32: Success/Failure **/ -static int32_t crypto_config_add_gvcid_managed_parameter_recursion(uint8_t tfvn, uint16_t scid, uint8_t vcid, +int32_t crypto_config_add_gvcid_managed_parameter_recursion(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, uint8_t has_segmentation_hdr, GvcidManagedParameters_t *managed_parameter) { @@ -390,7 +325,7 @@ static int32_t crypto_config_add_gvcid_managed_parameter_recursion(uint8_t tfvn, * @brief Function: Crypto_Local_Config * Initalizes TM Configuration, Log, and Keyrings **/ -static void Crypto_Local_Config(void) +void Crypto_Local_Config(void) { // Initial TM configuration tm_frame.tm_sec_header.spi = 1; @@ -400,19 +335,19 @@ static void Crypto_Local_Config(void) log_summary.rs = LOG_SIZE; // Add a two messages to the log log_summary.rs--; - log.blk[log_count].emt = STARTUP; - log.blk[log_count].emv[0] = 0x4E; - log.blk[log_count].emv[1] = 0x41; - log.blk[log_count].emv[2] = 0x53; - log.blk[log_count].emv[3] = 0x41; - log.blk[log_count++].em_len = 4; + mc_log.blk[log_count].emt = STARTUP; + mc_log.blk[log_count].emv[0] = 0x4E; + mc_log.blk[log_count].emv[1] = 0x41; + mc_log.blk[log_count].emv[2] = 0x53; + mc_log.blk[log_count].emv[3] = 0x41; + mc_log.blk[log_count++].em_len = 4; log_summary.rs--; - log.blk[log_count].emt = STARTUP; - log.blk[log_count].emv[0] = 0x4E; - log.blk[log_count].emv[1] = 0x41; - log.blk[log_count].emv[2] = 0x53; - log.blk[log_count].emv[3] = 0x41; - log.blk[log_count++].em_len = 4; + mc_log.blk[log_count].emt = STARTUP; + mc_log.blk[log_count].emv[0] = 0x4E; + mc_log.blk[log_count].emv[1] = 0x41; + mc_log.blk[log_count].emv[2] = 0x53; + mc_log.blk[log_count].emv[3] = 0x41; + mc_log.blk[log_count++].em_len = 4; // Master Keys // 0 - 000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F -> ACTIVE @@ -835,7 +770,7 @@ static void Crypto_Local_Config(void) * @brief Function: Crypto_Local_Init * Initalize TM Frame, CLCW **/ -static void Crypto_Local_Init(void) +void Crypto_Local_Init(void) { // Initialize TM Frame @@ -904,7 +839,7 @@ static void Crypto_Local_Init(void) * @brief Function: Crypto_Calc_CRC_Init_Table * Initialize CRC Table **/ -static void Crypto_Calc_CRC_Init_Table(void) +void Crypto_Calc_CRC_Init_Table(void) { uint16_t val; uint32_t poly = 0xEDB88320; @@ -958,7 +893,7 @@ static void Crypto_Calc_CRC_Init_Table(void) * @return int32, Length of TCPayload **/ /* -static int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr) +int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr) { int tf_hdr = 5; int seg_hdr = 0;if(current_managed_parameters->has_segmentation_hdr==TC_HAS_SEGMENT_HDRS){seg_hdr=1;} @@ -989,7 +924,7 @@ fecf))); #endif * @param len: int * @return int32_t Length of TM **/ -static int32_t Crypto_Get_tmLength(int len) +int32_t Crypto_Get_tmLength(int len) { #ifdef FILL len = TM_FILL_SIZE; @@ -1005,7 +940,7 @@ static int32_t Crypto_Get_tmLength(int len) * Looks up cipher suite ID and determines if it's an AEAD algorithm. Returns 1 if true, 0 if false; * @param cipher_suite_id: uint32 **/ -static uint8_t Crypto_Is_AEAD_Algorithm(uint32_t cipher_suite_id) +uint8_t Crypto_Is_AEAD_Algorithm(uint32_t cipher_suite_id) { // CryptoLib only supports AES-GCM, which is an AEAD (Authenticated Encryption with Associated Data) algorithm, so // return true/1. @@ -1023,7 +958,7 @@ static uint8_t Crypto_Is_AEAD_Algorithm(uint32_t cipher_suite_id) * @param len_aad: uint16_t * @param abm_buffer: uint8_t* **/ -static uint8_t *Crypto_Prepare_TC_AAD(uint8_t *buffer, uint16_t len_aad, uint8_t *abm_buffer) +uint8_t *Crypto_Prepare_TC_AAD(uint8_t *buffer, uint16_t len_aad, uint8_t *abm_buffer) { uint8_t *aad = (uint8_t *)calloc(1, len_aad * sizeof(uint8_t)); @@ -1051,7 +986,7 @@ static uint8_t *Crypto_Prepare_TC_AAD(uint8_t *buffer, uint16_t len_aad, uint8_t * @param ingest: uint8_t* * @param len_ingest: int **/ -static void Crypto_TM_updatePDU(uint8_t *ingest, int len_ingest) +void Crypto_TM_updatePDU(uint8_t *ingest, int len_ingest) { // Copy ingest to PDU int x = 0; int fill_size = 0; @@ -1194,7 +1129,7 @@ static void Crypto_TM_updatePDU(uint8_t *ingest, int len_ingest) * @brief Function: Crypto_TM_updateOCF * Update the TM OCF **/ -static void Crypto_TM_updateOCF(void) +void Crypto_TM_updateOCF(void) { if (ocf == 0) { // CLCW @@ -1261,7 +1196,7 @@ int32_t Crypto_increment(uint8_t *num, int length) * @param window: int * @return int32: Success/Failure **/ -static int32_t Crypto_window(uint8_t *actual, uint8_t *expected, int length, int window) +int32_t Crypto_window(uint8_t *actual, uint8_t *expected, int length, int window) { int status = CRYPTO_LIB_ERR_BAD_ANTIREPLAY_WINDOW; int result = 0; @@ -1298,7 +1233,7 @@ static int32_t Crypto_window(uint8_t *actual, uint8_t *expected, int length, int * @return int32: Success/Failure **/ /* -static int32_t Crypto_compare_less_equal(uint8_t *actual, uint8_t *expected, int length) +int32_t Crypto_compare_less_equal(uint8_t *actual, uint8_t *expected, int length) { int status = CRYPTO_LIB_ERROR; @@ -1372,7 +1307,7 @@ uint8_t Crypto_Prep_Reply(uint8_t *ingest, uint8_t appID) * @return int32: Success/Failure **/ /* -static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_frame) +int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_frame) { int32_t result = CRYPTO_LIB_SUCCESS; uint16_t calc_fecf = Crypto_Calc_FECF(ingest, len_ingest); @@ -1391,12 +1326,12 @@ static int32_t Crypto_FECF(int fecf, uint8_t* ingest, int len_ingest,TC_t* tc_fr { Crypto_increment((uint8_t*)&log_summary.num_se, 4); log_summary.rs--; - log.blk[log_count].emt = FECF_ERR_EID; - log.blk[log_count].emv[0] = 0x4E; - log.blk[log_count].emv[1] = 0x41; - log.blk[log_count].emv[2] = 0x53; - log.blk[log_count].emv[3] = 0x41; - log.blk[log_count++].em_len = 4; + mc_log.blk[log_count].emt = FECF_ERR_EID; + mc_log.blk[log_count].emv[0] = 0x4E; + mc_log.blk[log_count].emv[1] = 0x41; + mc_log.blk[log_count].emv[2] = 0x53; + mc_log.blk[log_count].emv[3] = 0x41; + mc_log.blk[log_count++].em_len = 4; } #ifdef FECF_DEBUG printf("\t Calculated = 0x%04x \n\t Received = 0x%04x \n", calc_fecf, @@ -1415,7 +1350,7 @@ tc_frame->tc_sec_trailer.fecf); #endif result = CRYPTO_LIB_ERROR; * @param len_ingest: int * @return uint16: FECF **/ -static uint16_t Crypto_Calc_FECF(uint8_t *ingest, int len_ingest) +uint16_t Crypto_Calc_FECF(uint8_t *ingest, int len_ingest) { uint16_t fecf = 0xFFFF; uint16_t poly = 0x1021; // TODO: This polynomial is (CRC-CCITT) for ESA testing, may not match standard protocol @@ -1463,7 +1398,7 @@ static uint16_t Crypto_Calc_FECF(uint8_t *ingest, int len_ingest) * @param size: int * @return uint16: CRC **/ -static uint16_t Crypto_Calc_CRC16(uint8_t *data, int size) +uint16_t Crypto_Calc_CRC16(uint8_t *data, int size) { // Code provided by ESA uint16_t crc = 0xFFFF; @@ -1476,824 +1411,184 @@ static uint16_t Crypto_Calc_CRC16(uint8_t *data, int size) return crc; } -/* -** Key Management Services -*/ /** - * @brief Function: Crypto_Key_OTAR - * The OTAR Rekeying procedure shall have the following Service Parameters: - * a- Key ID of the Master Key (Integer, unmanaged) - * b- Size of set of Upload Keys (Integer, managed) - * c- Set of Upload Keys (Integer[Session Key]; managed) - * NOTE- The size of the session keys is mission specific. - * a- Set of Key IDs of Upload Keys (Integer[Key IDs]; managed) - * b- Set of Encrypted Upload Keys (Integer[Size of set of Key ID]; unmanaged) - * c- Agreed Cryptographic Algorithm (managed) - * @return int32: Success/Failure + * @brief Function: Crypto_User_IdleTrigger + * @param ingest: uint8_t* + * @return int32: count **/ -static int32_t Crypto_Key_OTAR(void) - +int32_t Crypto_User_IdleTrigger(uint8_t *ingest) { - // Local variables - SDLS_OTAR_t packet; - int count = 0; - int x = 0; - int32_t status = CRYPTO_LIB_SUCCESS; - int pdu_keys = (sdls_frame.pdu.pdu_len - 30) / (2 + KEY_SIZE); + uint8_t count = 0; - gcry_cipher_hd_t tmp_hd; - gcry_error_t gcry_error = GPG_ERR_NO_ERROR; + // Prepare for Reply + sdls_frame.pdu.pdu_len = 0; + sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; + count = Crypto_Prep_Reply(ingest, 144); - // Master Key ID - packet.mkid = (sdls_frame.pdu.data[0] << 8) | (sdls_frame.pdu.data[1]); + return count; +} - if (packet.mkid >= 128) +/** + * @brief Function: Crypto_User_BadSPI + * @return int32: Success/Failure + **/ +int32_t Crypto_User_BadSPI(void) +{ + // Toggle Bad Sequence Number + if (badSPI == 0) { - report.af = 1; - if (log_summary.rs > 0) - { - Crypto_increment((uint8_t *)&log_summary.num_se, 4); - log_summary.rs--; - log.blk[log_count].emt = MKID_INVALID_EID; - log.blk[log_count].emv[0] = 0x4E; - log.blk[log_count].emv[1] = 0x41; - log.blk[log_count].emv[2] = 0x53; - log.blk[log_count].emv[3] = 0x41; - log.blk[log_count++].em_len = 4; - } - printf(KRED "Error: MKID is not valid! \n" RESET); - status = CRYPTO_LIB_ERROR; - return status; + badSPI = 1; } - - for (int count = 2; count < (2 + IV_SIZE); count++) - { // Initialization Vector - packet.iv[count - 2] = sdls_frame.pdu.data[count]; - // printf("packet.iv[%d] = 0x%02x\n", count-2, packet.iv[count-2]); + else + { + badSPI = 0; } - count = sdls_frame.pdu.pdu_len - MAC_SIZE; - for (int w = 0; w < 16; w++) - { // MAC - packet.mac[w] = sdls_frame.pdu.data[count + w]; - // printf("packet.mac[%d] = 0x%02x\n", w, packet.mac[w]); - } + return CRYPTO_LIB_SUCCESS; +} - gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[packet.mkid].value[0]), KEY_SIZE); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) +/** + * @brief Function: Crypto_User_BadMAC + * @return int32: Success/Failure + **/ +int32_t Crypto_User_BadMAC(void) +{ + // Toggle Bad MAC + if (badMAC == 0) { - printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; + badMAC = 1; } - gcry_error = gcry_cipher_setiv(tmp_hd, &(packet.iv[0]), IV_SIZE); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + else { - printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; + badMAC = 0; } - gcry_error = gcry_cipher_decrypt(tmp_hd, - &(sdls_frame.pdu.data[14]), // plaintext output - pdu_keys * (2 + KEY_SIZE), // length of data - NULL, // in place decryption - 0 // in data length - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + + return CRYPTO_LIB_SUCCESS; +} + +/** + * @brief Function: Crypto_User_BadIV + * @return int32: Success/Failure + **/ +int32_t Crypto_User_BadIV(void) +{ + // Toggle Bad MAC + if (badIV == 0) { - printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; + badIV = 1; } - gcry_error = gcry_cipher_checktag(tmp_hd, - &(packet.mac[0]), // tag input - MAC_SIZE // tag size - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + else { - printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; + badIV = 0; } - gcry_cipher_close(tmp_hd); - - // Read in Decrypted Data - for (int count = 14; x < pdu_keys; x++) - { // Encrypted Key Blocks - packet.EKB[x].ekid = (sdls_frame.pdu.data[count] << 8) | (sdls_frame.pdu.data[count + 1]); - if (packet.EKB[x].ekid < 128) - { - report.af = 1; - if (log_summary.rs > 0) - { - Crypto_increment((uint8_t *)&log_summary.num_se, 4); - log_summary.rs--; - log.blk[log_count].emt = OTAR_MK_ERR_EID; - log.blk[log_count].emv[0] = 0x4E; // N - log.blk[log_count].emv[1] = 0x41; // A - log.blk[log_count].emv[2] = 0x53; // S - log.blk[log_count].emv[3] = 0x41; // A - log.blk[log_count++].em_len = 4; - } - printf(KRED "Error: Cannot OTAR master key! \n" RESET); - status = CRYPTO_LIB_ERROR; - return status; - } - else - { - count = count + 2; - for (int y = count; y < (KEY_SIZE + count); y++) - { // Encrypted Key - packet.EKB[x].ek[y - count] = sdls_frame.pdu.data[y]; -#ifdef SA_DEBUG - printf("\t packet.EKB[%d].ek[%d] = 0x%02x\n", x, y - count, packet.EKB[x].ek[y - count]); -#endif - // Setup Key Ring - ek_ring[packet.EKB[x].ekid].value[y - count] = sdls_frame.pdu.data[y]; - } - count = count + KEY_SIZE; + return CRYPTO_LIB_SUCCESS; +} - // Set state to PREACTIVE - ek_ring[packet.EKB[x].ekid].key_state = KEY_PREACTIVE; - } +/** + * @brief Function: Crypto_User_BadFECF + * @return int32: Success/Failure + **/ +int32_t Crypto_User_BadFECF(void) +{ + // Toggle Bad FECF + if (badFECF == 0) + { + badFECF = 1; } - -#ifdef PDU_DEBUG - printf("Received %d keys via master key %d: \n", pdu_keys, packet.mkid); - for (int x = 0; x < pdu_keys; x++) + else { - printf("%d) Key ID = %d, 0x", x + 1, packet.EKB[x].ekid); - for (int y = 0; y < KEY_SIZE; y++) - { - printf("%02x", packet.EKB[x].ek[y]); - } - printf("\n"); + badFECF = 0; } -#endif return CRYPTO_LIB_SUCCESS; } + /** - * @brief Function: Crypto_Key_update - * Updates the state of the all keys in the received SDLS EP PDU - * @param state: uint8 - * @return uint32: Success/Failure + * @brief Function: Crypto_User_ModifyKey + * @return int32: Success/Failure **/ -static int32_t Crypto_Key_update(uint8_t state) -{ // Local variables - SDLS_KEY_BLK_t packet; - int count = 0; - int pdu_keys = sdls_frame.pdu.pdu_len / 2; -#ifdef PDU_DEBUG - printf("Keys "); -#endif - // Read in PDU - for (int x = 0; x < pdu_keys; x++) - { - packet.kblk[x].kid = (sdls_frame.pdu.data[count] << 8) | (sdls_frame.pdu.data[count + 1]); - count = count + 2; -#ifdef PDU_DEBUG - if (x != (pdu_keys - 1)) - { - printf("%d, ", packet.kblk[x].kid); - } - else - { - printf("and %d ", packet.kblk[x].kid); - } -#endif - } -#ifdef PDU_DEBUG - printf("changed to state "); - switch (state) +int32_t Crypto_User_ModifyKey(void) +{ + // Local variables + uint16_t kid = ((uint8_t)sdls_frame.pdu.data[0] << 8) | ((uint8_t)sdls_frame.pdu.data[1]); + uint8_t mod = (uint8_t)sdls_frame.pdu.data[2]; + + switch (mod) { - case KEY_PREACTIVE: - printf("PREACTIVE. \n"); - break; - case KEY_ACTIVE: - printf("ACTIVE. \n"); - break; - case KEY_DEACTIVATED: - printf("DEACTIVATED. \n"); - break; - case KEY_DESTROYED: - printf("DESTROYED. \n"); + case 1: // Invalidate Key + ek_ring[kid].value[KEY_SIZE - 1]++; + printf("Key %d value invalidated! \n", kid); break; - case KEY_CORRUPTED: - printf("CORRUPTED. \n"); + case 2: // Modify key state + ek_ring[kid].key_state = (uint8_t)sdls_frame.pdu.data[3] & 0x0F; + printf("Key %d state changed to %d! \n", kid, mod); break; default: - printf("ERROR. \n"); + // Error break; } -#endif - // Update Key State - for (int x = 0; x < pdu_keys; x++) - { - if (packet.kblk[x].kid < 128) - { - report.af = 1; - if (log_summary.rs > 0) - { - Crypto_increment((uint8_t *)&log_summary.num_se, 4); - log_summary.rs--; - log.blk[log_count].emt = MKID_STATE_ERR_EID; - log.blk[log_count].emv[0] = 0x4E; - log.blk[log_count].emv[1] = 0x41; - log.blk[log_count].emv[2] = 0x53; - log.blk[log_count].emv[3] = 0x41; - log.blk[log_count++].em_len = 4; - } - printf(KRED "Error: MKID state cannot be changed! \n" RESET); - // TODO: Exit - } - if (ek_ring[packet.kblk[x].kid].key_state == (state - 1)) - { - ek_ring[packet.kblk[x].kid].key_state = state; -#ifdef PDU_DEBUG - // printf("Key ID %d state changed to ", packet.kblk[x].kid); -#endif - } - else - { - if (log_summary.rs > 0) - { - Crypto_increment((uint8_t *)&log_summary.num_se, 4); - log_summary.rs--; - log.blk[log_count].emt = KEY_TRANSITION_ERR_EID; - log.blk[log_count].emv[0] = 0x4E; - log.blk[log_count].emv[1] = 0x41; - log.blk[log_count].emv[2] = 0x53; - log.blk[log_count].emv[3] = 0x41; - log.blk[log_count++].em_len = 4; - } - printf(KRED "Error: Key %d cannot transition to desired state! \n" RESET, packet.kblk[x].kid); - } - } return CRYPTO_LIB_SUCCESS; } /** - * @brief Function: Crypto_Key_inventory - * @param ingest: uint8_t* - * @return int32: count + * @brief Function: Crypto_User_ModifyActiveTM + * Modifies tm_sec_header.spi based on sdls_frame.pdu.data[0] + * @return int32: Success/Failure **/ -static int32_t Crypto_Key_inventory(uint8_t *ingest) +int32_t Crypto_User_ModifyActiveTM(void) { - // Local variables - SDLS_KEY_INVENTORY_t packet; - int count = 0; - uint16_t range = 0; - - // Read in PDU - packet.kid_first = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count + 1]); - count = count + 2; - packet.kid_last = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count + 1]); - count = count + 2; - - // Prepare for Reply - range = packet.kid_last - packet.kid_first; - sdls_frame.pdu.pdu_len = 2 + (range * (2 + 1)); - sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; - count = Crypto_Prep_Reply(ingest, 128); - ingest[count++] = (range & 0xFF00) >> 8; - ingest[count++] = (range & 0x00FF); - for (uint16_t x = packet.kid_first; x < packet.kid_last; x++) - { // Key ID - ingest[count++] = (x & 0xFF00) >> 8; - ingest[count++] = (x & 0x00FF); - // Key State - ingest[count++] = ek_ring[x].key_state; - } - return count; + tm_frame.tm_sec_header.spi = (uint8_t)sdls_frame.pdu.data[0]; + return CRYPTO_LIB_SUCCESS; } /** - * @brief Function: Crypto_Key_verify - * @param ingest: uint8_t* - * @param tc_frame: TC_t* - * @return int32: count + * @brief Function: Crypto_User_ModifyVCID + * @return int32: Success/Failure **/ -static int32_t Crypto_Key_verify(uint8_t *ingest, TC_t *tc_frame) +int32_t Crypto_User_ModifyVCID(void) { - // Local variables - SDLS_KEYV_CMD_t packet; - int count = 0; - int pdu_keys = sdls_frame.pdu.pdu_len / SDLS_KEYV_CMD_BLK_SIZE; - - gcry_error_t gcry_error = GPG_ERR_NO_ERROR; - gcry_cipher_hd_t tmp_hd; - uint8_t iv_loc; - - // uint8_t tmp_mac[MAC_SIZE]; - -#ifdef PDU_DEBUG - printf("Crypto_Key_verify: Requested %d key(s) to verify \n", pdu_keys); -#endif + tm_frame.tm_header.vcid = (uint8_t)sdls_frame.pdu.data[0]; + SecurityAssociation_t *sa_ptr; - // Read in PDU - for (int x = 0; x < pdu_keys; x++) + for (int i = 0; i < NUM_GVCID; i++) { - // Key ID - packet.blk[x].kid = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count + 1]); - count = count + 2; -#ifdef PDU_DEBUG - printf("Crypto_Key_verify: Block %d Key ID is %d \n", x, packet.blk[x].kid); -#endif - // Key Challenge - for (int y = 0; y < CHALLENGE_SIZE; y++) - { - packet.blk[x].challenge[y] = sdls_frame.pdu.data[count++]; - } -#ifdef PDU_DEBUG - printf("\n"); -#endif - } - - // Prepare for Reply - sdls_frame.pdu.pdu_len = pdu_keys * (2 + IV_SIZE + CHALLENGE_SIZE + CHALLENGE_MAC_SIZE); - sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; - count = Crypto_Prep_Reply(ingest, 128); - - for (int x = 0; x < pdu_keys; x++) - { // Key ID - ingest[count++] = (packet.blk[x].kid & 0xFF00) >> 8; - ingest[count++] = (packet.blk[x].kid & 0x00FF); - - // Initialization Vector - iv_loc = count; - for (int y = 0; y < IV_SIZE; y++) - { - ingest[count++] = *(tc_frame->tc_sec_header.iv + y); - } - ingest[count - 1] = ingest[count - 1] + x + 1; - - // Encrypt challenge - gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - } - gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[packet.blk[x].kid].value[0]), KEY_SIZE); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - } - gcry_error = gcry_cipher_setiv(tmp_hd, &(ingest[iv_loc]), IV_SIZE); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if (sadb_routine->sadb_get_sa_from_spi(i, &sa_ptr) != CRYPTO_LIB_SUCCESS) { - printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + // TODO - Error handling + return CRYPTO_LIB_ERROR; // Error -- unable to get SA from SPI. } - gcry_error = gcry_cipher_encrypt(tmp_hd, - &(ingest[count]), // ciphertext output - CHALLENGE_SIZE, // length of data - &(packet.blk[x].challenge[0]), // plaintext input - CHALLENGE_SIZE // in data length - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + for (int j = 0; j < NUM_SA; j++) { - printf(KRED "ERROR: gcry_cipher_encrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - } - count = count + CHALLENGE_SIZE; // Don't forget to increment count! - gcry_error = gcry_cipher_gettag(tmp_hd, - &(ingest[count]), // tag output - CHALLENGE_MAC_SIZE // tag size - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_gettag error code %d \n" RESET, gcry_error & GPG_ERR_CODE_MASK); + if (sa_ptr->gvcid_tm_blk[j].mapid == TYPE_TM) + { + if (sa_ptr->gvcid_tm_blk[j].vcid == tm_frame.tm_header.vcid) + { + tm_frame.tm_sec_header.spi = i; + printf("TM Frame SPI changed to %d \n", i); + break; + } + } } - count = count + CHALLENGE_MAC_SIZE; // Don't forget to increment count! - - // Copy from tmp_mac into ingest - // for( int y = 0; y < CHALLENGE_MAC_SIZE; y++) - //{ - // ingest[count++] = tmp_mac[y]; - //} - gcry_cipher_close(tmp_hd); } -#ifdef PDU_DEBUG - printf("Crypto_Key_verify: Response is %d bytes \n", count); -#endif - - return count; + return CRYPTO_LIB_SUCCESS; } /* -** Security Association Monitoring and Control +** Procedures Specifications */ /** - * @brief Function: Crypto_MC_ping - * @param ingest: uint8_t* - * return int32: count - **/ -static int32_t Crypto_MC_ping(uint8_t *ingest) -{ - int count = 0; - - // Prepare for Reply - sdls_frame.pdu.pdu_len = 0; - sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; - count = Crypto_Prep_Reply(ingest, 128); - - return count; -} - -/** - * @brief Function: Crypto_MC_status + * @brief Function: Crypto_PDU * @param ingest: uint8_t* - * @return int32: count + * @param tc_frame: TC_t* + * @return int32: Success/Failure **/ -static int32_t Crypto_MC_status(uint8_t *ingest) +int32_t Crypto_PDU(uint8_t *ingest, TC_t *tc_frame) { - int count = 0; - - // TODO: Update log_summary.rs; - - // Prepare for Reply - sdls_frame.pdu.pdu_len = 2; // 4 - sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; - count = Crypto_Prep_Reply(ingest, 128); - - // PDU - // ingest[count++] = (log_summary.num_se & 0xFF00) >> 8; - ingest[count++] = (log_summary.num_se & 0x00FF); - // ingest[count++] = (log_summary.rs & 0xFF00) >> 8; - ingest[count++] = (log_summary.rs & 0x00FF); - -#ifdef PDU_DEBUG - printf("log_summary.num_se = 0x%02x \n", log_summary.num_se); - printf("log_summary.rs = 0x%02x \n", log_summary.rs); -#endif - - return count; -} - -/** - * @brief Function: Crypto_MC_dump - * @param ingest: uint8_t* - * @return int32: Count - **/ -static int32_t Crypto_MC_dump(uint8_t *ingest) -{ - int count = 0; - - // Prepare for Reply - sdls_frame.pdu.pdu_len = (log_count * 6); // SDLS_MC_DUMP_RPLY_SIZE - sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; - count = Crypto_Prep_Reply(ingest, 128); - - // PDU - for (int x = 0; x < log_count; x++) - { - ingest[count++] = log.blk[x].emt; - // ingest[count++] = (log.blk[x].em_len & 0xFF00) >> 8; - ingest[count++] = (log.blk[x].em_len & 0x00FF); - for (int y = 0; y < EMV_SIZE; y++) - { - ingest[count++] = log.blk[x].emv[y]; - } - } - -#ifdef PDU_DEBUG - printf("log_count = %d \n", log_count); - printf("log_summary.num_se = 0x%02x \n", log_summary.num_se); - printf("log_summary.rs = 0x%02x \n", log_summary.rs); -#endif - - return count; -} - -/** - * @brief Function: Crypto_MC_erase - * @param ingest: uint8_t* - * @return int32: count - **/ -static int32_t Crypto_MC_erase(uint8_t *ingest) -{ - int count = 0; - - // Zero Logs - for (int x = 0; x < LOG_SIZE; x++) - { - log.blk[x].emt = 0; - log.blk[x].em_len = 0; - for (int y = 0; y < EMV_SIZE; y++) - { - log.blk[x].emv[y] = 0; - } - } - - // Compute Summary - log_count = 0; - log_summary.num_se = 0; - log_summary.rs = LOG_SIZE; - - // Prepare for Reply - sdls_frame.pdu.pdu_len = 2; // 4 - sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; - count = Crypto_Prep_Reply(ingest, 128); - - // PDU - // ingest[count++] = (log_summary.num_se & 0xFF00) >> 8; - ingest[count++] = (log_summary.num_se & 0x00FF); - // ingest[count++] = (log_summary.rs & 0xFF00) >> 8; - ingest[count++] = (log_summary.rs & 0x00FF); - - return count; -} - -/** - * @brief Function: Crypto_MC_selftest - * @param ingest: uint8_t* - * @return int32: Count - **/ -static int32_t Crypto_MC_selftest(uint8_t *ingest) -{ - uint8_t count = 0; - uint8_t result = ST_OK; - - // TODO: Perform test - - // Prepare for Reply - sdls_frame.pdu.pdu_len = 1; - sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; - count = Crypto_Prep_Reply(ingest, 128); - - ingest[count++] = result; - - return count; -} - -/** - * @brief Function: Crypto_SA_readASRN - * @param ingest: uint8_t* - * @return int32: Count - **/ -static int32_t Crypto_SA_readARSN(uint8_t *ingest) -{ - uint8_t count = 0; - uint16_t spi = 0x0000; - SecurityAssociation_t *sa_ptr; - - // Read ingest - spi = ((uint8_t)sdls_frame.pdu.data[0] << 8) | (uint8_t)sdls_frame.pdu.data[1]; - - // Prepare for Reply - sdls_frame.pdu.pdu_len = 2 + IV_SIZE; - sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; - count = Crypto_Prep_Reply(ingest, 128); - - // Write SPI to reply - ingest[count++] = (spi & 0xFF00) >> 8; - ingest[count++] = (spi & 0x00FF); - - if (sadb_routine->sadb_get_sa_from_spi(spi, &sa_ptr) != CRYPTO_LIB_SUCCESS) - { - // TODO - Error handling - return CRYPTO_LIB_ERROR; // Error -- unable to get SA from SPI. - } - - if (sa_ptr->shivf_len > 0) - { // Set IV - authenticated encryption - for (int x = 0; x < sa_ptr->shivf_len - 1; x++) - { - ingest[count++] = *(sa_ptr->iv + x); - } - - // TODO: Do we need this? - if (*(sa_ptr->iv + sa_ptr->shivf_len - 1) > 0) - { // Adjust to report last received, not expected - ingest[count++] = *(sa_ptr->iv + sa_ptr->shivf_len - 1) - 1; - } - else - { - ingest[count++] = *(sa_ptr->iv + sa_ptr->shivf_len - 1); - } - } - else - { - // TODO - } - -#ifdef PDU_DEBUG - printf("spi = %d \n", spi); - if (sa_ptr->shivf_len > 0) - { - printf("ARSN = 0x"); - for (int x = 0; x < sa_ptr->shivf_len; x++) - { - printf("%02x", *(sa_ptr->iv + x)); - } - printf("\n"); - } -#endif - - return count; -} - -/** - * @brief Function: Crypto_MC_resetalarm - * @return int32: Success/Failure - **/ -static int32_t Crypto_MC_resetalarm(void) -{ // Reset all alarm flags - report.af = 0; - report.bsnf = 0; - report.bmacf = 0; - report.ispif = 0; - return CRYPTO_LIB_SUCCESS; -} - -/** - * @brief Function: Crypto_User_IdleTrigger - * @param ingest: uint8_t* - * @return int32: count - **/ -static int32_t Crypto_User_IdleTrigger(uint8_t *ingest) -{ - uint8_t count = 0; - - // Prepare for Reply - sdls_frame.pdu.pdu_len = 0; - sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; - count = Crypto_Prep_Reply(ingest, 144); - - return count; -} - -/** - * @brief Function: Crypto_User_BadSPI - * @return int32: Success/Failure - **/ -static int32_t Crypto_User_BadSPI(void) -{ - // Toggle Bad Sequence Number - if (badSPI == 0) - { - badSPI = 1; - } - else - { - badSPI = 0; - } - - return CRYPTO_LIB_SUCCESS; -} - -/** - * @brief Function: Crypto_User_BadMAC - * @return int32: Success/Failure - **/ -static int32_t Crypto_User_BadMAC(void) -{ - // Toggle Bad MAC - if (badMAC == 0) - { - badMAC = 1; - } - else - { - badMAC = 0; - } - - return CRYPTO_LIB_SUCCESS; -} - -/** - * @brief Function: Crypto_User_BadIV - * @return int32: Success/Failure - **/ -static int32_t Crypto_User_BadIV(void) -{ - // Toggle Bad MAC - if (badIV == 0) - { - badIV = 1; - } - else - { - badIV = 0; - } - - return CRYPTO_LIB_SUCCESS; -} - -/** - * @brief Function: Crypto_User_BadFECF - * @return int32: Success/Failure - **/ -static int32_t Crypto_User_BadFECF(void) -{ - // Toggle Bad FECF - if (badFECF == 0) - { - badFECF = 1; - } - else - { - badFECF = 0; - } - - return CRYPTO_LIB_SUCCESS; -} - -/** - * @brief Function: Crypto_User_ModifyKey - * @return int32: Success/Failure - **/ -static int32_t Crypto_User_ModifyKey(void) -{ - // Local variables - uint16_t kid = ((uint8_t)sdls_frame.pdu.data[0] << 8) | ((uint8_t)sdls_frame.pdu.data[1]); - uint8_t mod = (uint8_t)sdls_frame.pdu.data[2]; - - switch (mod) - { - case 1: // Invalidate Key - ek_ring[kid].value[KEY_SIZE - 1]++; - printf("Key %d value invalidated! \n", kid); - break; - case 2: // Modify key state - ek_ring[kid].key_state = (uint8_t)sdls_frame.pdu.data[3] & 0x0F; - printf("Key %d state changed to %d! \n", kid, mod); - break; - default: - // Error - break; - } - - return CRYPTO_LIB_SUCCESS; -} - -/** - * @brief Function: Crypto_User_ModifyActiveTM - * Modifies tm_sec_header.spi based on sdls_frame.pdu.data[0] - * @return int32: Success/Failure - **/ -static int32_t Crypto_User_ModifyActiveTM(void) -{ - tm_frame.tm_sec_header.spi = (uint8_t)sdls_frame.pdu.data[0]; - return CRYPTO_LIB_SUCCESS; -} - -/** - * @brief Function: Crypto_User_ModifyVCID - * @return int32: Success/Failure - **/ -static int32_t Crypto_User_ModifyVCID(void) -{ - tm_frame.tm_header.vcid = (uint8_t)sdls_frame.pdu.data[0]; - SecurityAssociation_t *sa_ptr; - - for (int i = 0; i < NUM_GVCID; i++) - { - if (sadb_routine->sadb_get_sa_from_spi(i, &sa_ptr) != CRYPTO_LIB_SUCCESS) - { - // TODO - Error handling - return CRYPTO_LIB_ERROR; // Error -- unable to get SA from SPI. - } - for (int j = 0; j < NUM_SA; j++) - { - - if (sa_ptr->gvcid_tm_blk[j].mapid == TYPE_TM) - { - if (sa_ptr->gvcid_tm_blk[j].vcid == tm_frame.tm_header.vcid) - { - tm_frame.tm_sec_header.spi = i; - printf("TM Frame SPI changed to %d \n", i); - break; - } - } - } - } - - return CRYPTO_LIB_SUCCESS; -} - -/* -** Procedures Specifications -*/ -/** - * @brief Function: Crypto_PDU - * @param ingest: uint8_t* - * @param tc_frame: TC_t* - * @return int32: Success/Failure - **/ -static int32_t Crypto_PDU(uint8_t *ingest, TC_t *tc_frame) -{ - int32_t status = CRYPTO_LIB_SUCCESS; + int32_t status = CRYPTO_LIB_SUCCESS; switch (sdls_frame.pdu.type) { @@ -2391,1226 +1686,218 @@ static int32_t Crypto_PDU(uint8_t *ingest, TC_t *tc_frame) #ifdef PDU_DEBUG printf(KGRN "SA Start\n" RESET); #endif - status = sadb_routine->sadb_sa_start(tc_frame); - break; - case PID_STOP_SA: -#ifdef PDU_DEBUG - printf(KGRN "SA Stop\n" RESET); -#endif - status = sadb_routine->sadb_sa_stop(); - break; - case PID_READ_ARSN: -#ifdef PDU_DEBUG - printf(KGRN "SA readARSN\n" RESET); -#endif - status = Crypto_SA_readARSN(ingest); - break; - case PID_SA_STATUS: -#ifdef PDU_DEBUG - printf(KGRN "SA Status\n" RESET); -#endif - status = sadb_routine->sadb_sa_status(ingest); - break; - default: - printf(KRED "Error: Crypto_PDU failed interpreting SA Procedure Identification Field! \n" RESET); - break; - } - break; - case SG_SEC_MON_CTRL: // Security Monitoring & Control Procedure - switch (sdls_frame.pdu.pid) - { - case PID_PING: -#ifdef PDU_DEBUG - printf(KGRN "MC Ping\n" RESET); -#endif - status = Crypto_MC_ping(ingest); - break; - case PID_LOG_STATUS: -#ifdef PDU_DEBUG - printf(KGRN "MC Status\n" RESET); -#endif - status = Crypto_MC_status(ingest); - break; - case PID_DUMP_LOG: -#ifdef PDU_DEBUG - printf(KGRN "MC Dump\n" RESET); -#endif - status = Crypto_MC_dump(ingest); - break; - case PID_ERASE_LOG: -#ifdef PDU_DEBUG - printf(KGRN "MC Erase\n" RESET); -#endif - status = Crypto_MC_erase(ingest); - break; - case PID_SELF_TEST: -#ifdef PDU_DEBUG - printf(KGRN "MC Selftest\n" RESET); -#endif - status = Crypto_MC_selftest(ingest); - break; - case PID_ALARM_FLAG: -#ifdef PDU_DEBUG - printf(KGRN "MC Reset Alarm\n" RESET); -#endif - status = Crypto_MC_resetalarm(); - break; - default: - printf(KRED "Error: Crypto_PDU failed interpreting MC Procedure Identification Field! \n" RESET); - break; - } - break; - default: // ERROR - printf(KRED "Error: Crypto_PDU failed interpreting Service Group! \n" RESET); - break; - } - break; - - case 1: // User Defined Command - switch (sdls_frame.pdu.sg) - { - default: - switch (sdls_frame.pdu.pid) - { - case 0: // Idle Frame Trigger -#ifdef PDU_DEBUG - printf(KMAG "User Idle Trigger\n" RESET); -#endif - status = Crypto_User_IdleTrigger(ingest); - break; - case 1: // Toggle Bad SPI -#ifdef PDU_DEBUG - printf(KMAG "User Toggle Bad SPI\n" RESET); -#endif - status = Crypto_User_BadSPI(); - break; - case 2: // Toggle Bad IV -#ifdef PDU_DEBUG - printf(KMAG "User Toggle Bad IV\n" RESET); -#endif - status = Crypto_User_BadIV(); - break; - case 3: // Toggle Bad MAC -#ifdef PDU_DEBUG - printf(KMAG "User Toggle Bad MAC\n" RESET); -#endif - status = Crypto_User_BadMAC(); - break; - case 4: // Toggle Bad FECF -#ifdef PDU_DEBUG - printf(KMAG "User Toggle Bad FECF\n" RESET); -#endif - status = Crypto_User_BadFECF(); + status = sadb_routine->sadb_sa_start(tc_frame); break; - case 5: // Modify Key + case PID_STOP_SA: #ifdef PDU_DEBUG - printf(KMAG "User Modify Key\n" RESET); + printf(KGRN "SA Stop\n" RESET); #endif - status = Crypto_User_ModifyKey(); + status = sadb_routine->sadb_sa_stop(); break; - case 6: // Modify ActiveTM + case PID_READ_ARSN: #ifdef PDU_DEBUG - printf(KMAG "User Modify Active TM\n" RESET); + printf(KGRN "SA readARSN\n" RESET); #endif - status = Crypto_User_ModifyActiveTM(); + status = Crypto_SA_readARSN(ingest); break; - case 7: // Modify TM VCID + case PID_SA_STATUS: #ifdef PDU_DEBUG - printf(KMAG "User Modify VCID\n" RESET); + printf(KGRN "SA Status\n" RESET); #endif - status = Crypto_User_ModifyVCID(); + status = sadb_routine->sadb_sa_status(ingest); break; default: - printf(KRED "Error: Crypto_PDU received user defined command! \n" RESET); + printf(KRED "Error: Crypto_PDU failed interpreting SA Procedure Identification Field! \n" RESET); break; } - } - break; - } - break; - - case 1: // Reply - printf(KRED "Error: Crypto_PDU failed interpreting PDU Type! Received a Reply!?! \n" RESET); - break; - } - -#ifdef CCSDS_DEBUG - if (status > 0) - { - printf(KMAG "CCSDS message put on software bus: 0x" RESET); - for (int x = 0; x < status; x++) - { - printf(KMAG "%02x" RESET, (uint8_t)ingest[x]); - } - printf("\n"); - } -#endif - - return status; -} - -/** - * @brief Function: Crypto_Get_Managed_Parameters_For_Gvcid - * @param tfvn: uint8 - * @param scid: uint16 - * @param vcid: uint8 - * @param managed_parameters_in: GvcidManagedParameters_t* - * @param managed_parameters_out: GvcidManagedParameters_t** - * @return int32: Success/Failure - **/ -static int32_t Crypto_Get_Managed_Parameters_For_Gvcid(uint8_t tfvn, uint16_t scid, uint8_t vcid, - GvcidManagedParameters_t *managed_parameters_in, - GvcidManagedParameters_t **managed_parameters_out) -{ - int32_t status = MANAGED_PARAMETERS_FOR_GVCID_NOT_FOUND; - - if (managed_parameters_in != NULL) - { - if (managed_parameters_in->tfvn == tfvn && managed_parameters_in->scid == scid && - managed_parameters_in->vcid == vcid) - { - *managed_parameters_out = managed_parameters_in; - status = CRYPTO_LIB_SUCCESS; - return status; - } - else - { - return Crypto_Get_Managed_Parameters_For_Gvcid(tfvn, scid, vcid, managed_parameters_in->next, - managed_parameters_out); - } - } - else - { - printf(KRED "Error: Managed Parameters for GVCID(TFVN: %d, SCID: %d, VCID: %d) not found. \n" RESET, tfvn, scid, - vcid); - return status; - } -} - -/** - * @brief Function: Crypto_Free_Managed_Parameters - * Managed parameters are expected to live the duration of the program, this may not be necessary. - * @param managed_parameters: GvcidManagedParameters_t* - **/ -static void Crypto_Free_Managed_Parameters(GvcidManagedParameters_t *managed_parameters) -{ - if (managed_parameters == NULL) - { - return; // Nothing to free, just return! - } - if (managed_parameters->next != NULL) - { - Crypto_Free_Managed_Parameters(managed_parameters->next); - } - free(managed_parameters); -} - -/** - * @brief Function: Crypto_TC_ApplySecurity - * Applies Security to incoming frame. Encryption, Authentication, and Authenticated Encryption - * @param p_in_frame: uint8* - * @param in_frame_length: uint16 - * @param pp_in_frame: uint8_t** - * @param p_enc_frame_len: uint16 - * @return int32: Success/Failure - **/ -int32_t Crypto_TC_ApplySecurity(const uint8_t *p_in_frame, const uint16_t in_frame_length, uint8_t **pp_in_frame, - uint16_t *p_enc_frame_len) -{ - // Local Variables - int32_t status = CRYPTO_LIB_SUCCESS; - TC_FramePrimaryHeader_t temp_tc_header; - SecurityAssociation_t *sa_ptr = NULL; - uint8_t *p_new_enc_frame = NULL; - uint8_t sa_service_type = -1; - uint16_t mac_loc = 0; - uint16_t tf_payload_len = 0x0000; - uint16_t new_fecf = 0x0000; - uint8_t *aad; - gcry_cipher_hd_t tmp_hd; - gcry_error_t gcry_error = GPG_ERR_NO_ERROR; - uint16_t new_enc_frame_header_field_length = 0; - uint32_t encryption_cipher; - uint8_t ecs_is_aead_algorithm; - -#ifdef DEBUG - printf(KYEL "\n----- Crypto_TC_ApplySecurity START -----\n" RESET); -#endif - - if (p_in_frame == NULL) - { - status = CRYPTO_LIB_ERR_NULL_BUFFER; - printf(KRED "Error: Input Buffer NULL! \n" RESET); - return status; // Just return here, nothing can be done. - } - -#ifdef DEBUG - printf("%d TF Bytes received\n", in_frame_length); - printf("DEBUG - "); - for (int i = 0; i < in_frame_length; i++) - { - printf("%02X", ((uint8_t *)&*p_in_frame)[i]); - } - printf("\nPrinted %d bytes\n", in_frame_length); -#endif - - if (crypto_config == NULL) - { - printf(KRED "ERROR: CryptoLib Configuration Not Set! -- CRYPTO_LIB_ERR_NO_CONFIG, Will Exit\n" RESET); - status = CRYPTO_LIB_ERR_NO_CONFIG; - } - - // Primary Header - temp_tc_header.tfvn = ((uint8_t)p_in_frame[0] & 0xC0) >> 6; - temp_tc_header.bypass = ((uint8_t)p_in_frame[0] & 0x20) >> 5; - temp_tc_header.cc = ((uint8_t)p_in_frame[0] & 0x10) >> 4; - temp_tc_header.spare = ((uint8_t)p_in_frame[0] & 0x0C) >> 2; - temp_tc_header.scid = ((uint8_t)p_in_frame[0] & 0x03) << 8; - temp_tc_header.scid = temp_tc_header.scid | (uint8_t)p_in_frame[1]; - temp_tc_header.vcid = ((uint8_t)p_in_frame[2] & 0xFC) >> 2 & crypto_config->vcid_bitmask; - temp_tc_header.fl = ((uint8_t)p_in_frame[2] & 0x03) << 8; - temp_tc_header.fl = temp_tc_header.fl | (uint8_t)p_in_frame[3]; - temp_tc_header.fsn = (uint8_t)p_in_frame[4]; - - // Lookup-retrieve managed parameters for frame via gvcid: - status = Crypto_Get_Managed_Parameters_For_Gvcid(temp_tc_header.tfvn, temp_tc_header.scid, temp_tc_header.vcid, - gvcid_managed_parameters, ¤t_managed_parameters); - if (status != CRYPTO_LIB_SUCCESS) - { - return status; - } // Unable to get necessary Managed Parameters for TC TF -- return with error. - - uint8_t segmentation_hdr = 0x00; - uint8_t map_id = 0; - if (current_managed_parameters->has_segmentation_hdr == TC_HAS_SEGMENT_HDRS) - { - segmentation_hdr = p_in_frame[5]; - map_id = segmentation_hdr & 0x3F; - } - - // Check if command frame flag set - if ((temp_tc_header.cc == 1) && (status == CRYPTO_LIB_SUCCESS)) - { -/* -** CCSDS 232.0-B-3 -** Section 6.3.1 -** "Type-C frames do not have the Security Header and Security Trailer." -*/ -#ifdef TC_DEBUG - printf(KYEL "DEBUG - Received Control/Command frame - nothing to do.\n" RESET); -#endif - status = CRYPTO_LIB_ERR_INVALID_CC_FLAG; - } - - if (status == CRYPTO_LIB_SUCCESS) - { - // Query SA DB for active SA / SDLS parameters - if (sadb_routine == NULL) // This should not happen, but tested here for safety - { - printf(KRED "ERROR: SA DB Not initalized! -- CRYPTO_LIB_ERR_NO_INIT, Will Exit\n" RESET); - status = CRYPTO_LIB_ERR_NO_INIT; - } - else - { - status = sadb_routine->sadb_get_operational_sa_from_gvcid(temp_tc_header.tfvn, temp_tc_header.scid, - temp_tc_header.vcid, map_id, &sa_ptr); - } - - // If unable to get operational SA, can return - if (status != CRYPTO_LIB_SUCCESS) - { - return status; - } - -#ifdef SA_DEBUG - printf(KYEL "DEBUG - Printing SA Entry for current frame.\n" RESET); - Crypto_saPrint(sa_ptr); -#endif - - // Determine SA Service Type - if ((sa_ptr->est == 0) && (sa_ptr->ast == 0)) - { - sa_service_type = SA_PLAINTEXT; - } - else if ((sa_ptr->est == 0) && (sa_ptr->ast == 1)) - { - sa_service_type = SA_AUTHENTICATION; - } - else if ((sa_ptr->est == 1) && (sa_ptr->ast == 0)) - { - sa_service_type = SA_ENCRYPTION; - } - else if ((sa_ptr->est == 1) && (sa_ptr->ast == 1)) - { - sa_service_type = SA_AUTHENTICATED_ENCRYPTION; - } - else - { - // Probably unnecessary check - // Leaving for now as it would be cleaner in SA to have an association enum returned I believe - printf(KRED "Error: SA Service Type is not defined! \n" RESET); - status = CRYPTO_LIB_ERROR; - return status; - } - - // Determine Algorithm cipher & mode. // TODO - Parse authentication_cipher, and handle AEAD cases properly - if (sa_service_type != SA_PLAINTEXT) - { - encryption_cipher = - (sa_ptr->ecs[0] << 24) | (sa_ptr->ecs[1] << 16) | (sa_ptr->ecs[2] << 8) | sa_ptr->ecs[3]; - ecs_is_aead_algorithm = Crypto_Is_AEAD_Algorithm(encryption_cipher); - } - -#ifdef TC_DEBUG - switch (sa_service_type) - { - case SA_PLAINTEXT: - printf(KBLU "Creating a TC - CLEAR!\n" RESET); - break; - case SA_AUTHENTICATION: - printf(KBLU "Creating a TC - AUTHENTICATED!\n" RESET); - break; - case SA_ENCRYPTION: - printf(KBLU "Creating a TC - ENCRYPTED!\n" RESET); - break; - case SA_AUTHENTICATED_ENCRYPTION: - printf(KBLU "Creating a TC - AUTHENTICATED ENCRYPTION!\n" RESET); - break; - } -#endif - - // Determine length of buffer to be malloced - // TODO: Determine TC_PAD_SIZE - // TODO: Note: Currently assumes ciphertext output length is same as ciphertext input length - switch (sa_service_type) - { - case SA_PLAINTEXT: - // Ingest length + spi_index (2) + some variable length fields - *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shplf_len; - new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; - break; - case SA_AUTHENTICATION: - // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) - // + shplf_len + arc_len + pad_size + stmacf_len - *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + - sa_ptr->arc_len + TC_PAD_SIZE + sa_ptr->stmacf_len; - new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; - break; - case SA_ENCRYPTION: - // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) - // + shplf_len + arc_len + pad_size - *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + - sa_ptr->arc_len + TC_PAD_SIZE; - new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; - break; - case SA_AUTHENTICATED_ENCRYPTION: - // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) - // + shplf_len + arc_len + pad_size + stmacf_len - *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + - sa_ptr->arc_len + TC_PAD_SIZE + sa_ptr->stmacf_len; - new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; - break; - default: - printf(KRED "Unknown SA Service Type Detected!" RESET); - break; - } - -#ifdef TC_DEBUG - printf(KYEL "DEBUG - Total TC Buffer to be malloced is: %d bytes\n" RESET, *p_enc_frame_len); - printf(KYEL "\tlen of TF\t = %d\n" RESET, temp_tc_header.fl); - // printf(KYEL "\tsegment hdr\t = 1\n" RESET); // TODO: Determine presence of this so not hard-coded - printf(KYEL "\tspi len\t\t = 2\n" RESET); - printf(KYEL "\tshivf_len\t = %d\n" RESET, sa_ptr->shivf_len); - printf(KYEL "\tshsnf_len\t = %d\n" RESET, sa_ptr->shsnf_len); - printf(KYEL "\tshplf len\t = %d\n" RESET, sa_ptr->shplf_len); - printf(KYEL "\tarc_len\t\t = %d\n" RESET, sa_ptr->arc_len); - printf(KYEL "\tpad_size\t = %d\n" RESET, TC_PAD_SIZE); - printf(KYEL "\tstmacf_len\t = %d\n" RESET, sa_ptr->stmacf_len); -#endif - - // Accio buffer - p_new_enc_frame = (uint8_t *)malloc((*p_enc_frame_len) * sizeof(uint8_t)); - if (!p_new_enc_frame) - { - printf(KRED "Error: Malloc for encrypted output buffer failed! \n" RESET); - status = CRYPTO_LIB_ERROR; - return status; - } - memset(p_new_enc_frame, 0, *p_enc_frame_len); - - // Copy original TF header - memcpy(p_new_enc_frame, p_in_frame, TC_FRAME_PRIMARYHEADER_STRUCT_SIZE); - - // Set new TF Header length - // Recall: Length field is one minus total length per spec - *(p_new_enc_frame + 2) = - ((*(p_new_enc_frame + 2) & 0xFC) | (((new_enc_frame_header_field_length) & (0x0300)) >> 8)); - *(p_new_enc_frame + 3) = ((new_enc_frame_header_field_length) & (0x00FF)); - -#ifdef TC_DEBUG - printf(KYEL "Printing updated TF Header:\n\t"); - for (int i = 0; i < TC_FRAME_HEADER_SIZE; i++) - { - printf("%02X", *(p_new_enc_frame + i)); - } - // Recall: The buffer length is 1 greater than the field value set in the TCTF - printf("\n\tLength set to 0x%02X\n" RESET, new_enc_frame_header_field_length); -#endif - - /* - ** Start variable length fields - */ - uint16_t index = TC_FRAME_HEADER_SIZE; // Frame header is 5 bytes - - if (current_managed_parameters->has_segmentation_hdr == TC_HAS_SEGMENT_HDRS) - { - index++; // Add 1 byte to index because segmentation header used for this gvcid. - } - - /* - ** Begin Security Header Fields - ** Reference CCSDS SDLP 3550b1 4.1.1.1.3 - */ - // Set SPI - *(p_new_enc_frame + index) = ((sa_ptr->spi & 0xFF00) >> 8); - *(p_new_enc_frame + index + 1) = (sa_ptr->spi & 0x00FF); - index += 2; - - // Set initialization vector if specified - if ((sa_service_type == SA_AUTHENTICATION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || - (sa_service_type == SA_ENCRYPTION)) - { -#ifdef SA_DEBUG - printf(KYEL "Using IV value:\n\t"); - for (int i = 0; i < sa_ptr->shivf_len; i++) - { - printf("%02x", *(sa_ptr->iv + i)); - } - printf("\n" RESET); -#endif - - for (int i = 0; i < sa_ptr->shivf_len; i++) - { - // TODO: Likely API call - // Copy in IV from SA - *(p_new_enc_frame + index) = *(sa_ptr->iv + i); - index++; - } - } - - // Set anti-replay sequence number if specified - /* - ** See also: 4.1.1.4.2 - ** 4.1.1.4.4 If authentication or authenticated encryption is not selected - ** for an SA, the Sequence Number field shall be zero octets in length. - ** Reference CCSDS 3550b1 - */ - // Determine if seq num field is needed - // TODO: Likely SA API Call - if (sa_ptr->shsnf_len > 0) - { - // If using anti-replay counter, increment it - // TODO: API call instead? - // TODO: Check return code - Crypto_increment(sa_ptr->arc, sa_ptr->shsnf_len); - for (int i = 0; i < sa_ptr->shsnf_len; i++) - { - *(p_new_enc_frame + index) = *(sa_ptr->arc + i); - index++; - } - } - - // Set security header padding if specified - /* - ** 4.2.3.4 h) if the algorithm and mode selected for the SA require the use of - ** fill padding, place the number of fill bytes used into the Pad Length field - ** of the Security Header - Reference CCSDS 3550b1 - */ - // TODO: Revisit this - // TODO: Likely SA API Call - for (int i = 0; i < sa_ptr->shplf_len; i++) - { - /* 4.1.1.5.2 The Pad Length field shall contain the count of fill bytes used in the - ** cryptographic process, consisting of an integral number of octets. - CCSDS 3550b1 - */ - // TODO: Set this depending on crypto cipher used - *(p_new_enc_frame + index) = 0x00; - index++; - } - - /* - ** End Security Header Fields - */ - - uint8_t fecf_len = FECF_SIZE; - if (current_managed_parameters->has_fecf == TC_NO_FECF) - { - fecf_len = 0; - } - uint8_t segment_hdr_len = SEGMENT_HDR_SIZE; - if (current_managed_parameters->has_segmentation_hdr == TC_NO_SEGMENT_HDRS) - { - segment_hdr_len = 0; - } - // Copy in original TF data - except FECF - // Will be over-written if using encryption later - // and if it was present in the original TCTF - // if FECF - // Even though FECF is not part of apply_security payload, we still have to subtract the length from the - // temp_tc_header.fl since that includes FECF length & segment header length. - tf_payload_len = temp_tc_header.fl - TC_FRAME_HEADER_SIZE - segment_hdr_len - fecf_len + 1; - // if no FECF - // tf_payload_len = temp_tc_header.fl - TC_FRAME_PRIMARYHEADER_STRUCT_SIZE; - memcpy((p_new_enc_frame + index), (p_in_frame + TC_FRAME_PRIMARYHEADER_STRUCT_SIZE), tf_payload_len); - // index += tf_payload_len; - - /* - ** Begin Security Trailer Fields - */ - - // Set MAC Field if present - /* - ** May be present and unused if switching between clear and authenticated - ** CCSDS 3550b1 4.1.2.3 - */ - // By leaving MAC as zeros, can use index for encryption output - // for (int i=0; i < temp_SA.stmacf_len; i++) - // { - // // Temp fill MAC - // *(p_new_enc_frame + index) = 0x00; - // index++; - // } - - /* - ** End Security Trailer Fields - */ - - /* - ** Begin Authentication / Encryption - */ - - if (sa_service_type != SA_PLAINTEXT) - { - gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[sa_ptr->ekid].value[0]), - KEY_SIZE // TODO: look into this - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_setiv(tmp_hd, sa_ptr->iv, sa_ptr->shivf_len); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - - if ((sa_service_type == SA_ENCRYPTION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION)) - { -// TODO: More robust calculation of this location -// uint16_t output_loc = TC_FRAME_PRIMARYHEADER_STRUCT_SIZE + 1 + 2 + temp_SA.shivf_len + temp_SA.shsnf_len + -// temp_SA.shplf_len; -#ifdef TC_DEBUG - printf("Encrypted bytes output_loc is %d\n", index); - printf("tf_payload_len is %d\n", tf_payload_len); - printf(KYEL "Printing TC Frame prior to encryption:\n\t"); - for (int i = 0; i < *p_enc_frame_len; i++) - { - printf("%02X", *(p_new_enc_frame + i)); - } - printf("\n"); -#endif - - if (sa_service_type == SA_AUTHENTICATED_ENCRYPTION && - ecs_is_aead_algorithm == CRYPTO_TRUE) // Algorithm is AEAD algorithm, Add AAD before encrypt! - { - // Prepare the Header AAD (CCSDS 335.0-B-1 4.2.3.2.2.3) - uint16_t aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + - sa_ptr->shsnf_len + sa_ptr->shplf_len; - if (sa_ptr->abm_len < aad_len) - { - return CRYPTO_LIB_ERR_ABM_TOO_SHORT_FOR_AAD; - } - aad = Crypto_Prepare_TC_AAD(p_new_enc_frame, aad_len, sa_ptr->abm); - - // Add the AAD to the libgcrypt cipher handle - gcry_error = gcry_cipher_authenticate(tmp_hd, - aad, // additional authenticated data - aad_len // length of AAD - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET, - gcry_error & GPG_ERR_CODE_MASK); - printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error), gcry_strerror(gcry_error)); - status = CRYPTO_LIB_ERR_AUTHENTICATION_ERROR; - return status; - } - - free(aad); - } - - gcry_error = - gcry_cipher_encrypt(tmp_hd, - &p_new_enc_frame[index], // ciphertext output - tf_payload_len, // length of data - (p_in_frame + TC_FRAME_HEADER_SIZE + segment_hdr_len), // plaintext input - tf_payload_len // in data length - ); - - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_encrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - -#ifdef TC_DEBUG - printf("Encrypted bytes output_loc is %d\n", index); - printf("tf_payload_len is %d\n", tf_payload_len); - printf(KYEL "Printing TC Frame after encryption:\n\t"); - for (int i = 0; i < *p_enc_frame_len; i++) + break; + case SG_SEC_MON_CTRL: // Security Monitoring & Control Procedure + switch (sdls_frame.pdu.pid) { - printf("%02X", *(p_new_enc_frame + i)); - } - printf("\n"); + case PID_PING: +#ifdef PDU_DEBUG + printf(KGRN "MC Ping\n" RESET); #endif - - // Get MAC & insert into p_new_enc_frame - if (sa_service_type == SA_AUTHENTICATED_ENCRYPTION && ecs_is_aead_algorithm == CRYPTO_TRUE) - { - mac_loc = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + - sa_ptr->shplf_len + tf_payload_len; -#ifdef MAC_DEBUG - printf(KYEL "MAC location is: %d\n" RESET, mac_loc); - printf(KYEL "MAC size is: %d\n" RESET, MAC_SIZE); + status = Crypto_MC_ping(ingest); + break; + case PID_LOG_STATUS: +#ifdef PDU_DEBUG + printf(KGRN "MC Status\n" RESET); #endif - gcry_error = gcry_cipher_gettag( - tmp_hd, - &p_new_enc_frame[mac_loc], // tag output - MAC_SIZE // tag size // TODO - use sa_ptr->abm_len instead of hardcoded mac size? - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, - gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERR_MAC_RETRIEVAL_ERROR; - return status; - } - } - - // Close cipher, so we can authenticate encrypted data - gcry_cipher_close(tmp_hd); - } - - // Prepare additional authenticated data, if needed - if ((sa_service_type == SA_AUTHENTICATION) || - ((sa_service_type == SA_AUTHENTICATED_ENCRYPTION) && - ecs_is_aead_algorithm == CRYPTO_FALSE)) // Authenticated Encryption without AEAD algorithm, AEAD - // algorithms handled in encryption block! - { - gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[sa_ptr->ekid].value[0]), - KEY_SIZE // TODO: look into this - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_setiv(tmp_hd, sa_ptr->iv, sa_ptr->shivf_len); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - - uint16_t aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + - sa_ptr->shsnf_len + sa_ptr->shplf_len + tf_payload_len; - if (sa_ptr->abm_len < aad_len) - { - return CRYPTO_LIB_ERR_ABM_TOO_SHORT_FOR_AAD; - } - aad = Crypto_Prepare_TC_AAD(p_new_enc_frame, aad_len, sa_ptr->abm); - - gcry_error = gcry_cipher_authenticate(tmp_hd, - aad, // additional authenticated data - aad_len // length of AAD - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET, - gcry_error & GPG_ERR_CODE_MASK); - printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error), gcry_strerror(gcry_error)); - status = CRYPTO_LIB_ERROR; - return status; - } - - mac_loc = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + - sa_ptr->shplf_len + tf_payload_len; -#ifdef MAC_DEBUG - printf(KYEL "MAC location is: %d\n" RESET, mac_loc); - printf(KYEL "MAC size is: %d\n" RESET, MAC_SIZE); + status = Crypto_MC_status(ingest); + break; + case PID_DUMP_LOG: +#ifdef PDU_DEBUG + printf(KGRN "MC Dump\n" RESET); #endif - gcry_error = - gcry_cipher_gettag(tmp_hd, - &p_new_enc_frame[mac_loc], // tag output - MAC_SIZE // tag size // TODO - use sa_ptr->abm_len instead of hardcoded mac size? - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERR_MAC_RETRIEVAL_ERROR; - return status; + status = Crypto_MC_dump(ingest); + break; + case PID_ERASE_LOG: +#ifdef PDU_DEBUG + printf(KGRN "MC Erase\n" RESET); +#endif + status = Crypto_MC_erase(ingest); + break; + case PID_SELF_TEST: +#ifdef PDU_DEBUG + printf(KGRN "MC Selftest\n" RESET); +#endif + status = Crypto_MC_selftest(ingest); + break; + case PID_ALARM_FLAG: +#ifdef PDU_DEBUG + printf(KGRN "MC Reset Alarm\n" RESET); +#endif + status = Crypto_MC_resetalarm(); + break; + default: + printf(KRED "Error: Crypto_PDU failed interpreting MC Procedure Identification Field! \n" RESET); + break; } - // Zeroise any sensitive information - gcry_cipher_close(tmp_hd); + break; + default: // ERROR + printf(KRED "Error: Crypto_PDU failed interpreting Service Group! \n" RESET); + break; } - } + break; - if (sa_service_type != SA_PLAINTEXT) - { -#ifdef INCREMENT - if (sa_ptr->iv == NULL) - { - printf("\n\nNULL\n\n"); - } - Crypto_increment(sa_ptr->iv, sa_ptr->shivf_len); -#ifdef SA_DEBUG - printf(KYEL "Next IV value is:\n\t"); - for (int i = 0; i < sa_ptr->shivf_len; i++) + case 1: // User Defined Command + switch (sdls_frame.pdu.sg) { - printf("%02x", *(sa_ptr->iv + i)); - } - printf("\n" RESET); + default: + switch (sdls_frame.pdu.pid) + { + case 0: // Idle Frame Trigger +#ifdef PDU_DEBUG + printf(KMAG "User Idle Trigger\n" RESET); #endif + status = Crypto_User_IdleTrigger(ingest); + break; + case 1: // Toggle Bad SPI +#ifdef PDU_DEBUG + printf(KMAG "User Toggle Bad SPI\n" RESET); #endif - } - /* - ** End Authentication / Encryption - */ - - // Only calculate & insert FECF if CryptoLib is configured to do so & gvcid includes FECF. - if (current_managed_parameters->has_fecf == TC_HAS_FECF) - { -// Set FECF Field if present -#ifdef FECF_DEBUG - printf(KCYN "Calcing FECF over %d bytes\n" RESET, new_enc_frame_header_field_length - 1); + status = Crypto_User_BadSPI(); + break; + case 2: // Toggle Bad IV +#ifdef PDU_DEBUG + printf(KMAG "User Toggle Bad IV\n" RESET); #endif - if (crypto_config->crypto_create_fecf == CRYPTO_TC_CREATE_FECF_TRUE) - { - new_fecf = Crypto_Calc_FECF(p_new_enc_frame, new_enc_frame_header_field_length - 1); - *(p_new_enc_frame + new_enc_frame_header_field_length - 1) = (uint8_t)((new_fecf & 0xFF00) >> 8); - *(p_new_enc_frame + new_enc_frame_header_field_length) = (uint8_t)(new_fecf & 0x00FF); - } - else // CRYPTO_TC_CREATE_FECF_FALSE - { - *(p_new_enc_frame + new_enc_frame_header_field_length - 1) = (uint8_t)0x00; - *(p_new_enc_frame + new_enc_frame_header_field_length) = (uint8_t)0x00; - } - - index += 2; - } - -#ifdef TC_DEBUG - printf(KYEL "Printing new TC Frame:\n\t"); - for (int i = 0; i < *p_enc_frame_len; i++) - { - printf("%02X", *(p_new_enc_frame + i)); - } - printf("\n\tThe returned length is: %d\n" RESET, new_enc_frame_header_field_length); + status = Crypto_User_BadIV(); + break; + case 3: // Toggle Bad MAC +#ifdef PDU_DEBUG + printf(KMAG "User Toggle Bad MAC\n" RESET); #endif - - *pp_in_frame = p_new_enc_frame; - } - - status = sadb_routine->sadb_save_sa(sa_ptr); - -#ifdef DEBUG - printf(KYEL "----- Crypto_TC_ApplySecurity END -----\n" RESET); + status = Crypto_User_BadMAC(); + break; + case 4: // Toggle Bad FECF +#ifdef PDU_DEBUG + printf(KMAG "User Toggle Bad FECF\n" RESET); #endif - - return status; -} - -/** - * @brief Function: Crypto_TC_ProcessSecurity - * Performs Authenticated decryption, decryption, and authentication - * @param ingest: uint8_t* - * @param len_ingest: int* - * @param tc_sdls_processed_frame: TC_t* - * @return int32: Success/Failure - **/ -int32_t Crypto_TC_ProcessSecurity(uint8_t *ingest, int *len_ingest, TC_t *tc_sdls_processed_frame) -// Loads the ingest frame into the global tc_frame while performing decryption -{ - // Local Variables - int32_t status = CRYPTO_LIB_SUCCESS; - gcry_cipher_hd_t tmp_hd; - gcry_error_t gcry_error = GPG_ERR_NO_ERROR; - SecurityAssociation_t *sa_ptr = NULL; - uint8_t sa_service_type = -1; - uint8_t *aad; - uint32_t encryption_cipher; - uint8_t ecs_is_aead_algorithm; - - if (crypto_config == NULL) - { - printf(KRED "ERROR: CryptoLib Configuration Not Set! -- CRYPTO_LIB_ERR_NO_CONFIG, Will Exit\n" RESET); - status = CRYPTO_LIB_ERR_NO_CONFIG; - return status; - } - -#ifdef DEBUG - printf(KYEL "\n----- Crypto_TC_ProcessSecurity START -----\n" RESET); + status = Crypto_User_BadFECF(); + break; + case 5: // Modify Key +#ifdef PDU_DEBUG + printf(KMAG "User Modify Key\n" RESET); #endif - - int byte_idx = 0; - // Primary Header - tc_sdls_processed_frame->tc_header.tfvn = ((uint8_t)ingest[byte_idx] & 0xC0) >> 6; - tc_sdls_processed_frame->tc_header.bypass = ((uint8_t)ingest[byte_idx] & 0x20) >> 5; - tc_sdls_processed_frame->tc_header.cc = ((uint8_t)ingest[byte_idx] & 0x10) >> 4; - tc_sdls_processed_frame->tc_header.spare = ((uint8_t)ingest[byte_idx] & 0x0C) >> 2; - tc_sdls_processed_frame->tc_header.scid = ((uint8_t)ingest[byte_idx] & 0x03) << 8; - byte_idx++; - tc_sdls_processed_frame->tc_header.scid = tc_sdls_processed_frame->tc_header.scid | (uint8_t)ingest[byte_idx]; - byte_idx++; - tc_sdls_processed_frame->tc_header.vcid = (((uint8_t)ingest[byte_idx] & 0xFC) >> 2) & crypto_config->vcid_bitmask; - tc_sdls_processed_frame->tc_header.fl = ((uint8_t)ingest[byte_idx] & 0x03) << 8; - byte_idx++; - tc_sdls_processed_frame->tc_header.fl = tc_sdls_processed_frame->tc_header.fl | (uint8_t)ingest[byte_idx]; - byte_idx++; - tc_sdls_processed_frame->tc_header.fsn = (uint8_t)ingest[byte_idx]; - byte_idx++; - - // Lookup-retrieve managed parameters for frame via gvcid: - status = Crypto_Get_Managed_Parameters_For_Gvcid( - tc_sdls_processed_frame->tc_header.tfvn, tc_sdls_processed_frame->tc_header.scid, - tc_sdls_processed_frame->tc_header.vcid, gvcid_managed_parameters, ¤t_managed_parameters); - - if (status != CRYPTO_LIB_SUCCESS) - { - return status; - } // Unable to get necessary Managed Parameters for TC TF -- return with error. - - // Segment Header - if (current_managed_parameters->has_segmentation_hdr == TC_HAS_SEGMENT_HDRS) - { - tc_sdls_processed_frame->tc_sec_header.sh = (uint8_t)ingest[byte_idx]; - byte_idx++; - } - // Security Header - tc_sdls_processed_frame->tc_sec_header.spi = ((uint8_t)ingest[byte_idx] << 8) | (uint8_t)ingest[byte_idx + 1]; - byte_idx += 2; -#ifdef TC_DEBUG - printf("vcid = %d \n", tc_sdls_processed_frame->tc_header.vcid); - printf("spi = %d \n", tc_sdls_processed_frame->tc_sec_header.spi); + status = Crypto_User_ModifyKey(); + break; + case 6: // Modify ActiveTM +#ifdef PDU_DEBUG + printf(KMAG "User Modify Active TM\n" RESET); #endif - - status = sadb_routine->sadb_get_sa_from_spi(tc_sdls_processed_frame->tc_sec_header.spi, &sa_ptr); - // If no valid SPI, return - if (status != CRYPTO_LIB_SUCCESS) - { - return status; - } - - encryption_cipher = (sa_ptr->ecs[0] << 24) | (sa_ptr->ecs[1] << 16) | (sa_ptr->ecs[2] << 8) | sa_ptr->ecs[3]; - ecs_is_aead_algorithm = Crypto_Is_AEAD_Algorithm(encryption_cipher); - - // Determine SA Service Type - if ((sa_ptr->est == 0) && (sa_ptr->ast == 0)) - { - sa_service_type = SA_PLAINTEXT; - } - else if ((sa_ptr->est == 0) && (sa_ptr->ast == 1)) - { - sa_service_type = SA_AUTHENTICATION; - } - else if ((sa_ptr->est == 1) && (sa_ptr->ast == 0)) - { - sa_service_type = SA_ENCRYPTION; - } - else if ((sa_ptr->est == 1) && (sa_ptr->ast == 1)) - { - sa_service_type = SA_AUTHENTICATED_ENCRYPTION; - } - else - { - // Probably unnecessary check - // Leaving for now as it would be cleaner in SA to have an association enum returned I believe - printf(KRED "Error: SA Service Type is not defined! \n" RESET); - status = CRYPTO_LIB_ERROR; - return status; - } - - // Determine Algorithm cipher & mode. // TODO - Parse authentication_cipher, and handle AEAD cases properly - if (sa_service_type != SA_PLAINTEXT) - { - encryption_cipher = (sa_ptr->ecs[0] << 24) | (sa_ptr->ecs[1] << 16) | (sa_ptr->ecs[2] << 8) | sa_ptr->ecs[3]; - ecs_is_aead_algorithm = Crypto_Is_AEAD_Algorithm(encryption_cipher); - } - -#ifdef TC_DEBUG - switch (sa_service_type) - { - case SA_PLAINTEXT: - printf(KBLU "Processing a TC - CLEAR!\n" RESET); - break; - case SA_AUTHENTICATION: - printf(KBLU "Processing a TC - AUTHENTICATED!\n" RESET); - break; - case SA_ENCRYPTION: - printf(KBLU "Processing a TC - ENCRYPTED!\n" RESET); - break; - case SA_AUTHENTICATED_ENCRYPTION: - printf(KBLU "Processing a TC - AUTHENTICATED ENCRYPTION!\n" RESET); - break; - } + status = Crypto_User_ModifyActiveTM(); + break; + case 7: // Modify TM VCID +#ifdef PDU_DEBUG + printf(KMAG "User Modify VCID\n" RESET); #endif - - // TODO: Calculate lengths when needed - uint8_t fecf_len = FECF_SIZE; - if (current_managed_parameters->has_fecf == TC_NO_FECF) - { - fecf_len = 0; - } - - uint8_t segment_hdr_len = SEGMENT_HDR_SIZE; - if (current_managed_parameters->has_segmentation_hdr == TC_NO_SEGMENT_HDRS) - { - segment_hdr_len = 0; - } - - // Check FECF - if (current_managed_parameters->has_fecf == TC_HAS_FECF) - { - if (crypto_config->crypto_check_fecf == TC_CHECK_FECF_TRUE) - { - uint16_t received_fecf = (((ingest[tc_sdls_processed_frame->tc_header.fl - 1] << 8) & 0xFF00) | - (ingest[tc_sdls_processed_frame->tc_header.fl] & 0x00FF)); - // Calculate our own - uint16_t calculated_fecf = Crypto_Calc_FECF(ingest, *len_ingest - 2); - // Compare - if (received_fecf != calculated_fecf) - { - status = CRYPTO_LIB_ERR_INVALID_FECF; - return status; + status = Crypto_User_ModifyVCID(); + break; + default: + printf(KRED "Error: Crypto_PDU received user defined command! \n" RESET); + break; + } } + break; } - } + break; - // Parse the security header - tc_sdls_processed_frame->tc_sec_header.spi = - (uint16_t)((uint8_t)ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len] | - (uint8_t)ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + 1]); - // Get SA via SPI - status = sadb_routine->sadb_get_sa_from_spi(tc_sdls_processed_frame->tc_sec_header.spi, &sa_ptr); - if (status != CRYPTO_LIB_SUCCESS) - { - return status; + case 1: // Reply + printf(KRED "Error: Crypto_PDU failed interpreting PDU Type! Received a Reply!?! \n" RESET); + break; } - // Parse IV - memcpy((tc_sdls_processed_frame->tc_sec_header.iv), &(ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN]), - sa_ptr->shivf_len); - // Parse Sequence Number - memcpy((tc_sdls_processed_frame->tc_sec_header.sn) + (TC_SN_SIZE - sa_ptr->shsnf_len), - &(ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len]), sa_ptr->shsnf_len); - // Parse pad length - memcpy((tc_sdls_processed_frame->tc_sec_header.pad) + (TC_PAD_SIZE - sa_ptr->shplf_len), - &(ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len]), - sa_ptr->shplf_len); - if ((sa_service_type == SA_AUTHENTICATION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || - (sa_service_type == SA_ENCRYPTION)) +#ifdef CCSDS_DEBUG + if (status > 0) { - gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERR_LIBGCRYPT_ERROR; - return status; - } - gcry_error = gcry_cipher_setkey(tmp_hd, ek_ring[sa_ptr->ekid].value, KEY_SIZE); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERR_LIBGCRYPT_ERROR; - return status; - } - gcry_error = gcry_cipher_setiv(tmp_hd, tc_sdls_processed_frame->tc_sec_header.iv, sa_ptr->shivf_len); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + printf(KMAG "CCSDS message put on software bus: 0x" RESET); + for (int x = 0; x < status; x++) { - printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERR_LIBGCRYPT_ERROR; - return status; + printf(KMAG "%02x" RESET, (uint8_t)ingest[x]); } + printf("\n"); } - - // Check MAC, if applicable - if ((sa_service_type == SA_AUTHENTICATION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION)) - { - uint16_t tc_mac_start_index = tc_sdls_processed_frame->tc_header.fl + 1 - fecf_len - sa_ptr->stmacf_len; - // Parse the received MAC - memcpy((tc_sdls_processed_frame->tc_sec_trailer.mac) + (MAC_SIZE - sa_ptr->stmacf_len), - &(ingest[tc_mac_start_index]), sa_ptr->stmacf_len); - if (crypto_config->ignore_anti_replay == TC_IGNORE_ANTI_REPLAY_FALSE) - { - // If sequence number field is greater than zero, use as arsn - if (sa_ptr->shsnf_len > 0) - { - // Check Sequence Number is in ARCW - status = Crypto_window(tc_sdls_processed_frame->tc_sec_header.sn, sa_ptr->arc, sa_ptr->shsnf_len, - sa_ptr->arcw); - if (status != CRYPTO_LIB_SUCCESS) - { - return status; - } - // TODO: Update SA ARC through SADB_Routine function call - } - else - { - // Check IV is in ARCW - status = Crypto_window(tc_sdls_processed_frame->tc_sec_header.iv, sa_ptr->iv, sa_ptr->shivf_len, - sa_ptr->arcw); -#ifdef DEBUG - printf("Received IV is\n\t"); - for (int i = 0; i < sa_ptr->shivf_len; i++) - // for(int i=0; itc_sec_header.iv + i)); - } - printf("\nSA IV is\n\t"); - for (int i = 0; i < sa_ptr->shivf_len; i++) - { - printf("%02x", *(sa_ptr->iv + i)); - } - printf("\nARCW is: %d\n", sa_ptr->arcw); #endif - if (status != CRYPTO_LIB_SUCCESS) - { - return status; - } - // TODO: Update SA IV through SADB_Routine function call - } - } - uint16_t aad_len = tc_mac_start_index; - if ((sa_service_type == SA_AUTHENTICATED_ENCRYPTION) && (ecs_is_aead_algorithm == CRYPTO_TRUE)) - { - aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + - sa_ptr->shplf_len; - } - aad = Crypto_Prepare_TC_AAD(ingest, aad_len, sa_ptr->abm); + return status; +} - gcry_error = gcry_cipher_authenticate(tmp_hd, - aad, // additional authenticated data - aad_len // length of AAD - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error), gcry_strerror(gcry_error)); - status = CRYPTO_LIB_ERR_AUTHENTICATION_ERROR; - return status; - } - } +/** + * @brief Function: Crypto_Get_Managed_Parameters_For_Gvcid + * @param tfvn: uint8 + * @param scid: uint16 + * @param vcid: uint8 + * @param managed_parameters_in: GvcidManagedParameters_t* + * @param managed_parameters_out: GvcidManagedParameters_t** + * @return int32: Success/Failure + **/ +int32_t Crypto_Get_Managed_Parameters_For_Gvcid(uint8_t tfvn, uint16_t scid, uint8_t vcid, + GvcidManagedParameters_t *managed_parameters_in, + GvcidManagedParameters_t **managed_parameters_out) +{ + int32_t status = MANAGED_PARAMETERS_FOR_GVCID_NOT_FOUND; - // Decrypt, if applicable - if ((sa_service_type == SA_ENCRYPTION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || - (sa_service_type == SA_AUTHENTICATION)) + if (managed_parameters_in != NULL) { - uint16_t tc_enc_payload_start_index = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + - sa_ptr->shsnf_len + sa_ptr->shplf_len; - tc_sdls_processed_frame->tc_pdu_len = - tc_sdls_processed_frame->tc_header.fl + 1 - tc_enc_payload_start_index - sa_ptr->stmacf_len - fecf_len; - - if (sa_service_type == SA_AUTHENTICATION) - { // Authenticate only! No input data passed into decryption function, only AAD. - gcry_error = gcry_cipher_decrypt(tmp_hd, - NULL, // plaintext output - 0, // length of data - NULL, // ciphertext input - 0 // in data length - ); - // If authentication only, don't decrypt the data. Just pass the data PDU through. - memcpy(tc_sdls_processed_frame->tc_pdu, &(ingest[tc_enc_payload_start_index]), - tc_sdls_processed_frame->tc_pdu_len); - } - else - { // Decrypt - gcry_error = gcry_cipher_decrypt(tmp_hd, - tc_sdls_processed_frame->tc_pdu, // plaintext output - tc_sdls_processed_frame->tc_pdu_len, // length of data - &(ingest[tc_enc_payload_start_index]), // ciphertext input - tc_sdls_processed_frame->tc_pdu_len // in data length - ); - } - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + if (managed_parameters_in->tfvn == tfvn && managed_parameters_in->scid == scid && + managed_parameters_in->vcid == vcid) { - printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERR_DECRYPT_ERROR; + *managed_parameters_out = managed_parameters_in; + status = CRYPTO_LIB_SUCCESS; return status; } - - if ((sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || (sa_service_type == SA_AUTHENTICATION)) + else { - - gcry_error = gcry_cipher_checktag(tmp_hd, - tc_sdls_processed_frame->tc_sec_trailer.mac, // Frame Expected Tag - sa_ptr->stmacf_len // tag size - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - fprintf(stderr, "gcry_cipher_decrypt failed: %s\n", gpg_strerror(gcry_error)); - status = CRYPTO_LIB_ERR_MAC_VALIDATION_ERROR; - return status; - } + return Crypto_Get_Managed_Parameters_For_Gvcid(tfvn, scid, vcid, managed_parameters_in->next, + managed_parameters_out); } } - - if (sa_service_type != SA_PLAINTEXT) + else { - gcry_cipher_close(tmp_hd); + printf(KRED "Error: Managed Parameters for GVCID(TFVN: %d, SCID: %d, VCID: %d) not found. \n" RESET, tfvn, scid, + vcid); + return status; } +} - if (sa_service_type == SA_PLAINTEXT) +/** + * @brief Function: Crypto_Free_Managed_Parameters + * Managed parameters are expected to live the duration of the program, this may not be necessary. + * @param managed_parameters: GvcidManagedParameters_t* + **/ +void Crypto_Free_Managed_Parameters(GvcidManagedParameters_t *managed_parameters) +{ + if (managed_parameters == NULL) { - // TODO: Plaintext ARSN - - uint16_t tc_enc_payload_start_index = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + - sa_ptr->shsnf_len + sa_ptr->shplf_len; - tc_sdls_processed_frame->tc_pdu_len = - tc_sdls_processed_frame->tc_header.fl + 1 - tc_enc_payload_start_index - sa_ptr->stmacf_len - fecf_len; - memcpy(tc_sdls_processed_frame->tc_pdu, &(ingest[tc_enc_payload_start_index]), - tc_sdls_processed_frame->tc_pdu_len); + return; // Nothing to free, just return! } - - // Extended PDU processing, if applicable - if (crypto_config->process_sdls_pdus == TC_PROCESS_SDLS_PDUS_TRUE) + if (managed_parameters->next != NULL) { - status = Crypto_Process_Extended_Procedure_Pdu(tc_sdls_processed_frame, ingest); + Crypto_Free_Managed_Parameters(managed_parameters->next); } - - return status; + free(managed_parameters); } /** @@ -3619,7 +1906,7 @@ int32_t Crypto_TC_ProcessSecurity(uint8_t *ingest, int *len_ingest, TC_t *tc_sdl * @param ingest: uint8_t* * @note TODO - Actually update based on variable config * */ -static int32_t Crypto_Process_Extended_Procedure_Pdu(TC_t *tc_sdls_processed_frame, uint8_t *ingest) +int32_t Crypto_Process_Extended_Procedure_Pdu(TC_t *tc_sdls_processed_frame, uint8_t *ingest) { int32_t status = CRYPTO_LIB_SUCCESS; if (crypto_config->has_pus_hdr == TC_HAS_PUS_HDR) @@ -3701,437 +1988,4 @@ static int32_t Crypto_Process_Extended_Procedure_Pdu(TC_t *tc_sdls_processed_fra } return status; -} // End Process SDLS PDU - -/** - * @brief Function: Crypto_TM_ApplySecurity - * @param ingest: uint8_t* - * @param len_ingest: int* - * @return int32: Success/Failure - **/ -int32_t Crypto_TM_ApplySecurity(uint8_t *ingest, int *len_ingest) -// Accepts CCSDS message in ingest, and packs into TM before encryption -{ - int32_t status = CRYPTO_LIB_SUCCESS; - int count = 0; - int pdu_loc = 0; - int pdu_len = *len_ingest - TM_MIN_SIZE; - int pad_len = 0; - int mac_loc = 0; - int fecf_loc = 0; - uint8_t tempTM[TM_SIZE]; - int x = 0; - int y = 0; - uint8_t aad[20]; - uint16_t spi = tm_frame.tm_sec_header.spi; - uint16_t spp_crc = 0x0000; - SecurityAssociation_t sa; - SecurityAssociation_t *sa_ptr = &sa; - - gcry_cipher_hd_t tmp_hd; - gcry_error_t gcry_error = GPG_ERR_NO_ERROR; - memset(&tempTM, 0, TM_SIZE); - -#ifdef DEBUG - printf(KYEL "\n----- Crypto_TM_ApplySecurity START -----\n" RESET); -#endif - - // Check for idle frame trigger - if (((uint8_t)ingest[0] == 0x08) && ((uint8_t)ingest[1] == 0x90)) - { // Zero ingest - for (x = 0; x < *len_ingest; x++) - { - ingest[x] = 0; - } - // Update TM First Header Pointer - tm_frame.tm_header.fhp = 0xFE; - } - else - { // Update the length of the ingest from the CCSDS header - *len_ingest = (ingest[4] << 8) | ingest[5]; - ingest[5] = ingest[5] - 5; - // Remove outgoing secondary space packet header flag - ingest[0] = 0x00; - // Change sequence flags to 0xFFFF - ingest[2] = 0xFF; - ingest[3] = 0xFF; - // Add 2 bytes of CRC to space packet - spp_crc = Crypto_Calc_CRC16((uint8_t *)ingest, *len_ingest); - ingest[*len_ingest] = (spp_crc & 0xFF00) >> 8; - ingest[*len_ingest + 1] = (spp_crc & 0x00FF); - *len_ingest = *len_ingest + 2; - // Update TM First Header Pointer - tm_frame.tm_header.fhp = tm_offset; -#ifdef TM_DEBUG - printf("tm_offset = %d \n", tm_offset); -#endif - } - - // Update Current Telemetry Frame in Memory - // Counters - tm_frame.tm_header.mcfc++; - tm_frame.tm_header.vcfc++; - // Operational Control Field - Crypto_TM_updateOCF(); - // Payload Data Unit - Crypto_TM_updatePDU(ingest, *len_ingest); - - if (sadb_routine->sadb_get_sa_from_spi(spi, &sa_ptr) != CRYPTO_LIB_SUCCESS) - { - // TODO - Error handling - return CRYPTO_LIB_ERROR; // Error -- unable to get SA from SPI. - } - - // Check test flags - if (badSPI == 1) - { - tm_frame.tm_sec_header.spi++; - } - if (badIV == 1) - { - *(sa_ptr->iv + sa_ptr->shivf_len - 1) = *(sa_ptr->iv + sa_ptr->shivf_len - 1) + 1; - } - if (badMAC == 1) - { - tm_frame.tm_sec_trailer.mac[MAC_SIZE - 1]++; - } - - // Initialize the temporary TM frame - // Header - tempTM[count++] = (uint8_t)((tm_frame.tm_header.tfvn << 6) | ((tm_frame.tm_header.scid & 0x3F0) >> 4)); - tempTM[count++] = (uint8_t)(((tm_frame.tm_header.scid & 0x00F) << 4) | (tm_frame.tm_header.vcid << 1) | - (tm_frame.tm_header.ocff)); - tempTM[count++] = (uint8_t)(tm_frame.tm_header.mcfc); - tempTM[count++] = (uint8_t)(tm_frame.tm_header.vcfc); - tempTM[count++] = - (uint8_t)((tm_frame.tm_header.tfsh << 7) | (tm_frame.tm_header.sf << 6) | (tm_frame.tm_header.pof << 5) | - (tm_frame.tm_header.slid << 3) | ((tm_frame.tm_header.fhp & 0x700) >> 8)); - tempTM[count++] = (uint8_t)(tm_frame.tm_header.fhp & 0x0FF); - // tempTM[count++] = (uint8_t) ((tm_frame.tm_header.tfshvn << 6) | tm_frame.tm_header.tfshlen); - // Security Header - tempTM[count++] = (uint8_t)((spi & 0xFF00) >> 8); - tempTM[count++] = (uint8_t)((spi & 0x00FF)); - memcpy(tm_frame.tm_sec_header.iv, sa_ptr->iv, sa_ptr->shivf_len); - - // Padding Length - pad_len = Crypto_Get_tmLength(*len_ingest) - TM_MIN_SIZE + IV_SIZE + TM_PAD_SIZE - *len_ingest; - - // Only add IV for authenticated encryption - if ((sa_ptr->est == 1) && (sa_ptr->ast == 1)) - { // Initialization Vector -#ifdef INCREMENT - Crypto_increment(sa_ptr->iv, sa_ptr->shivf_len); -#endif - if ((sa_ptr->est == 1) || (sa_ptr->ast == 1)) - { - for (x = 0; x < IV_SIZE; x++) - { - tempTM[count++] = *(sa_ptr->iv + x); - } - } - pdu_loc = count; - pad_len = pad_len - IV_SIZE - TM_PAD_SIZE + OCF_SIZE; - pdu_len = *len_ingest + pad_len; - } - else - { // Include padding length bytes - hard coded per ESA testing - tempTM[count++] = 0x00; // pad_len >> 8; - tempTM[count++] = 0x1A; // pad_len - pdu_loc = count; - pdu_len = *len_ingest + pad_len; - } - - // Payload Data Unit - for (x = 0; x < (pdu_len); x++) - { - tempTM[count++] = (uint8_t)tm_frame.tm_pdu[x]; - } - // Message Authentication Code - mac_loc = count; - for (x = 0; x < MAC_SIZE; x++) - { - tempTM[count++] = 0x00; - } - // Operational Control Field - for (x = 0; x < OCF_SIZE; x++) - { - tempTM[count++] = (uint8_t)tm_frame.tm_sec_trailer.ocf[x]; - } - // Frame Error Control Field - fecf_loc = count; - tm_frame.tm_sec_trailer.fecf = Crypto_Calc_FECF((uint8_t *)tempTM, count); - tempTM[count++] = (uint8_t)((tm_frame.tm_sec_trailer.fecf & 0xFF00) >> 8); - tempTM[count++] = (uint8_t)(tm_frame.tm_sec_trailer.fecf & 0x00FF); - - // Determine Mode - // Clear - if ((sa_ptr->est == 0) && (sa_ptr->ast == 0)) - { -#ifdef DEBUG - printf(KBLU "Creating a TM - CLEAR! \n" RESET); -#endif - // Copy temporary frame to ingest - memcpy(ingest, tempTM, count); - } - // Authenticated Encryption - else if ((sa_ptr->est == 1) && (sa_ptr->ast == 1)) - { -#ifdef DEBUG - printf(KBLU "Creating a TM - AUTHENTICATED ENCRYPTION! \n" RESET); -#endif - - // Copy TM to ingest - memcpy(ingest, tempTM, pdu_loc); - -#ifdef MAC_DEBUG - printf("AAD = 0x"); -#endif - // Prepare additional authenticated data - for (y = 0; y < sa_ptr->abm_len; y++) - { - aad[y] = ingest[y] & *(sa_ptr->abm + y); -#ifdef MAC_DEBUG - printf("%02x", aad[y]); -#endif - } -#ifdef MAC_DEBUG - printf("\n"); -#endif - - gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[sa_ptr->ekid].value[0]), KEY_SIZE); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_setiv(tmp_hd, sa_ptr->iv, sa_ptr->shivf_len); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_encrypt(tmp_hd, - &(ingest[pdu_loc]), // ciphertext output - pdu_len, // length of data - &(tempTM[pdu_loc]), // plaintext input - pdu_len // in data length - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_authenticate(tmp_hd, - &(aad[0]), // additional authenticated data - sa_ptr->abm_len // length of AAD - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - gcry_error = gcry_cipher_gettag(tmp_hd, - &(ingest[mac_loc]), // tag output - MAC_SIZE // tag size - ); - if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); - status = CRYPTO_LIB_ERROR; - return status; - } - -#ifdef MAC_DEBUG - printf("MAC = 0x"); - for (x = 0; x < MAC_SIZE; x++) - { - printf("%02x", (uint8_t)ingest[x + mac_loc]); - } - printf("\n"); -#endif - - // Update OCF - y = 0; - for (x = OCF_SIZE; x > 0; x--) - { - ingest[fecf_loc - x] = tm_frame.tm_sec_trailer.ocf[y++]; - } - - // Update FECF - tm_frame.tm_sec_trailer.fecf = Crypto_Calc_FECF((uint8_t *)ingest, fecf_loc - 1); - ingest[fecf_loc] = (uint8_t)((tm_frame.tm_sec_trailer.fecf & 0xFF00) >> 8); - ingest[fecf_loc + 1] = (uint8_t)(tm_frame.tm_sec_trailer.fecf & 0x00FF); - } - // Authentication - else if ((sa_ptr->est == 0) && (sa_ptr->ast == 1)) - { -#ifdef DEBUG - printf(KBLU "Creating a TM - AUTHENTICATED! \n" RESET); -#endif - // TODO: Future work. Operationally same as clear. - memcpy(ingest, tempTM, count); - } - // Encryption - else if ((sa_ptr->est == 1) && (sa_ptr->ast == 0)) - { -#ifdef DEBUG - printf(KBLU "Creating a TM - ENCRYPTED! \n" RESET); -#endif - // TODO: Future work. Operationally same as clear. - memcpy(ingest, tempTM, count); - } - -#ifdef TM_DEBUG - Crypto_tmPrint(&tm_frame); -#endif - -#ifdef DEBUG - printf(KYEL "----- Crypto_TM_ApplySecurity END -----\n" RESET); -#endif - - *len_ingest = count; - return status; -} - -/** - * @brief Function: Crypto_TM_ProcessSecurity - * @param ingest: uint8_t* - * @param len_ingest: int* - * @return int32: Success/Failure - **/ -int32_t Crypto_TM_ProcessSecurity(uint8_t *ingest, int *len_ingest) -{ - // Local Variables - int32_t status = CRYPTO_LIB_SUCCESS; - -#ifdef DEBUG - printf(KYEL "\n----- Crypto_TM_ProcessSecurity START -----\n" RESET); -#endif - - // TODO: This whole function! - len_ingest = len_ingest; - ingest[0] = ingest[0]; - -#ifdef DEBUG - printf(KYEL "----- Crypto_TM_ProcessSecurity END -----\n" RESET); -#endif - - return status; -} - -/** - * @brief Function: Crypto_AOS_ApplySecurity - * @param ingest: uint8_t* - * @param len_ingest: int* - * @return int32: Success/Failure - **/ -int32_t Crypto_AOS_ApplySecurity(uint8_t *ingest, int *len_ingest) -{ - // Local Variables - int32_t status = CRYPTO_LIB_SUCCESS; - -#ifdef DEBUG - printf(KYEL "\n----- Crypto_AOS_ApplySecurity START -----\n" RESET); -#endif - - // TODO: This whole function! - len_ingest = len_ingest; - ingest[0] = ingest[0]; - -#ifdef DEBUG - printf(KYEL "----- Crypto_AOS_ApplySecurity END -----\n" RESET); -#endif - - return status; -} - -/** - * @brief Function: Crypto_AOS_ProcessSecurity - * @param ingest: uint8_t* - * @param len_ingest: int* - * @return int32: Success/Failure - **/ -int32_t Crypto_AOS_ProcessSecurity(uint8_t *ingest, int *len_ingest) -{ - // Local Variables - int32_t status = CRYPTO_LIB_SUCCESS; - -#ifdef DEBUG - printf(KYEL "\n----- Crypto_AOS_ProcessSecurity START -----\n" RESET); -#endif - - // TODO: This whole function! - len_ingest = len_ingest; - ingest[0] = ingest[0]; - -#ifdef DEBUG - printf(KYEL "----- Crypto_AOS_ProcessSecurity END -----\n" RESET); -#endif - - return status; -} - -/** - * @brief Function: Crypto_ApplySecurity - * @param ingest: uint8_t* - * @param len_ingest: int* - * @return int32: Success/Failure - **/ -int32_t Crypto_ApplySecurity(uint8_t *ingest, int *len_ingest) -{ - // Local Variables - int32_t status = CRYPTO_LIB_SUCCESS; - -#ifdef DEBUG - printf(KYEL "\n----- Crypto_ApplySecurity START -----\n" RESET); -#endif - - // TODO: This whole function! - len_ingest = len_ingest; - ingest[0] = ingest[0]; - -#ifdef DEBUG - printf(KYEL "----- Crypto_ApplySecurity END -----\n" RESET); -#endif - - return status; -} - -/** - * @brief Function: Crypto_ProcessSecurity - * @param ingest: uint8_t* - * @param len_ingest: int* - * @return int32: Success/Failure - **/ -int32_t Crypto_ProcessSecurity(uint8_t *ingest, int *len_ingest) -{ - // Local Variables - int32_t status = CRYPTO_LIB_SUCCESS; - -#ifdef DEBUG - printf(KYEL "\n----- Crypto_ProcessSecurity START -----\n" RESET); -#endif - - // TODO: This whole function! - len_ingest = len_ingest; - ingest[0] = ingest[0]; - -#ifdef DEBUG - printf(KYEL "----- Crypto_ProcessSecurity END -----\n" RESET); -#endif - - return status; -} - -#endif \ No newline at end of file +} // End Process SDLS PDU \ No newline at end of file diff --git a/src/src_main/crypto_aos.c b/src/src_main/crypto_aos.c new file mode 100644 index 00000000..7f3346ac --- /dev/null +++ b/src/src_main/crypto_aos.c @@ -0,0 +1,74 @@ +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. + + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. + + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. + + ITC Team + NASA IV&V + jstar-development-team@mail.nasa.gov +*/ + +/* +** Includes +*/ +#include "crypto.h" + +/** + * @brief Function: Crypto_AOS_ApplySecurity + * @param ingest: uint8_t* + * @param len_ingest: int* + * @return int32: Success/Failure + **/ +int32_t Crypto_AOS_ApplySecurity(uint8_t *ingest, int *len_ingest) +{ + // Local Variables + int32_t status = CRYPTO_LIB_SUCCESS; + +#ifdef DEBUG + printf(KYEL "\n----- Crypto_AOS_ApplySecurity START -----\n" RESET); +#endif + + // TODO: This whole function! + len_ingest = len_ingest; + ingest[0] = ingest[0]; + +#ifdef DEBUG + printf(KYEL "----- Crypto_AOS_ApplySecurity END -----\n" RESET); +#endif + + return status; +} + +/** + * @brief Function: Crypto_AOS_ProcessSecurity + * @param ingest: uint8_t* + * @param len_ingest: int* + * @return int32: Success/Failure + **/ +int32_t Crypto_AOS_ProcessSecurity(uint8_t *ingest, int *len_ingest) +{ + // Local Variables + int32_t status = CRYPTO_LIB_SUCCESS; + +#ifdef DEBUG + printf(KYEL "\n----- Crypto_AOS_ProcessSecurity START -----\n" RESET); +#endif + + // TODO: This whole function! + len_ingest = len_ingest; + ingest[0] = ingest[0]; + +#ifdef DEBUG + printf(KYEL "----- Crypto_AOS_ProcessSecurity END -----\n" RESET); +#endif + + return status; +} \ No newline at end of file diff --git a/src/src_main/crypto_key_mgmt.c b/src/src_main/crypto_key_mgmt.c new file mode 100644 index 00000000..e79c3fc6 --- /dev/null +++ b/src/src_main/crypto_key_mgmt.c @@ -0,0 +1,435 @@ +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. + + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. + + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. + + ITC Team + NASA IV&V + jstar-development-team@mail.nasa.gov +*/ + +/* +** Includes +*/ +#include "crypto.h" + +/* +** Key Management Services +*/ +/** + * @brief Function: Crypto_Key_OTAR + * The OTAR Rekeying procedure shall have the following Service Parameters: + * a- Key ID of the Master Key (Integer, unmanaged) + * b- Size of set of Upload Keys (Integer, managed) + * c- Set of Upload Keys (Integer[Session Key]; managed) + * NOTE- The size of the session keys is mission specific. + * a- Set of Key IDs of Upload Keys (Integer[Key IDs]; managed) + * b- Set of Encrypted Upload Keys (Integer[Size of set of Key ID]; unmanaged) + * c- Agreed Cryptographic Algorithm (managed) + * @return int32: Success/Failure + **/ +int32_t Crypto_Key_OTAR(void) +{ + // Local variables + SDLS_OTAR_t packet; + int count = 0; + int x = 0; + int32_t status = CRYPTO_LIB_SUCCESS; + int pdu_keys = (sdls_frame.pdu.pdu_len - 30) / (2 + KEY_SIZE); + + gcry_cipher_hd_t tmp_hd; + gcry_error_t gcry_error = GPG_ERR_NO_ERROR; + + // Master Key ID + packet.mkid = (sdls_frame.pdu.data[0] << 8) | (sdls_frame.pdu.data[1]); + + if (packet.mkid >= 128) + { + report.af = 1; + if (log_summary.rs > 0) + { + Crypto_increment((uint8_t *)&log_summary.num_se, 4); + log_summary.rs--; + mc_log.blk[log_count].emt = MKID_INVALID_EID; + mc_log.blk[log_count].emv[0] = 0x4E; + mc_log.blk[log_count].emv[1] = 0x41; + mc_log.blk[log_count].emv[2] = 0x53; + mc_log.blk[log_count].emv[3] = 0x41; + mc_log.blk[log_count++].em_len = 4; + } + printf(KRED "Error: MKID is not valid! \n" RESET); + status = CRYPTO_LIB_ERROR; + return status; + } + + for (int count = 2; count < (2 + IV_SIZE); count++) + { // Initialization Vector + packet.iv[count - 2] = sdls_frame.pdu.data[count]; + // printf("packet.iv[%d] = 0x%02x\n", count-2, packet.iv[count-2]); + } + + count = sdls_frame.pdu.pdu_len - MAC_SIZE; + for (int w = 0; w < 16; w++) + { // MAC + packet.mac[w] = sdls_frame.pdu.data[count + w]; + // printf("packet.mac[%d] = 0x%02x\n", w, packet.mac[w]); + } + + gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[packet.mkid].value[0]), KEY_SIZE); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + gcry_error = gcry_cipher_setiv(tmp_hd, &(packet.iv[0]), IV_SIZE); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + gcry_error = gcry_cipher_decrypt(tmp_hd, + &(sdls_frame.pdu.data[14]), // plaintext output + pdu_keys * (2 + KEY_SIZE), // length of data + NULL, // in place decryption + 0 // in data length + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + gcry_error = gcry_cipher_checktag(tmp_hd, + &(packet.mac[0]), // tag input + MAC_SIZE // tag size + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + gcry_cipher_close(tmp_hd); + + // Read in Decrypted Data + for (int count = 14; x < pdu_keys; x++) + { // Encrypted Key Blocks + packet.EKB[x].ekid = (sdls_frame.pdu.data[count] << 8) | (sdls_frame.pdu.data[count + 1]); + if (packet.EKB[x].ekid < 128) + { + report.af = 1; + if (log_summary.rs > 0) + { + Crypto_increment((uint8_t *)&log_summary.num_se, 4); + log_summary.rs--; + mc_log.blk[log_count].emt = OTAR_MK_ERR_EID; + mc_log.blk[log_count].emv[0] = 0x4E; // N + mc_log.blk[log_count].emv[1] = 0x41; // A + mc_log.blk[log_count].emv[2] = 0x53; // S + mc_log.blk[log_count].emv[3] = 0x41; // A + mc_log.blk[log_count++].em_len = 4; + } + printf(KRED "Error: Cannot OTAR master key! \n" RESET); + status = CRYPTO_LIB_ERROR; + return status; + } + else + { + count = count + 2; + for (int y = count; y < (KEY_SIZE + count); y++) + { // Encrypted Key + packet.EKB[x].ek[y - count] = sdls_frame.pdu.data[y]; +#ifdef SA_DEBUG + printf("\t packet.EKB[%d].ek[%d] = 0x%02x\n", x, y - count, packet.EKB[x].ek[y - count]); +#endif + + // Setup Key Ring + ek_ring[packet.EKB[x].ekid].value[y - count] = sdls_frame.pdu.data[y]; + } + count = count + KEY_SIZE; + + // Set state to PREACTIVE + ek_ring[packet.EKB[x].ekid].key_state = KEY_PREACTIVE; + } + } + +#ifdef PDU_DEBUG + printf("Received %d keys via master key %d: \n", pdu_keys, packet.mkid); + for (int x = 0; x < pdu_keys; x++) + { + printf("%d) Key ID = %d, 0x", x + 1, packet.EKB[x].ekid); + for (int y = 0; y < KEY_SIZE; y++) + { + printf("%02x", packet.EKB[x].ek[y]); + } + printf("\n"); + } +#endif + + return CRYPTO_LIB_SUCCESS; +} +/** + * @brief Function: Crypto_Key_update + * Updates the state of the all keys in the received SDLS EP PDU + * @param state: uint8 + * @return uint32: Success/Failure + **/ +int32_t Crypto_Key_update(uint8_t state) +{ // Local variables + SDLS_KEY_BLK_t packet; + int count = 0; + int pdu_keys = sdls_frame.pdu.pdu_len / 2; +#ifdef PDU_DEBUG + printf("Keys "); +#endif + // Read in PDU + for (int x = 0; x < pdu_keys; x++) + { + packet.kblk[x].kid = (sdls_frame.pdu.data[count] << 8) | (sdls_frame.pdu.data[count + 1]); + count = count + 2; +#ifdef PDU_DEBUG + if (x != (pdu_keys - 1)) + { + printf("%d, ", packet.kblk[x].kid); + } + else + { + printf("and %d ", packet.kblk[x].kid); + } +#endif + } +#ifdef PDU_DEBUG + printf("changed to state "); + switch (state) + { + case KEY_PREACTIVE: + printf("PREACTIVE. \n"); + break; + case KEY_ACTIVE: + printf("ACTIVE. \n"); + break; + case KEY_DEACTIVATED: + printf("DEACTIVATED. \n"); + break; + case KEY_DESTROYED: + printf("DESTROYED. \n"); + break; + case KEY_CORRUPTED: + printf("CORRUPTED. \n"); + break; + default: + printf("ERROR. \n"); + break; + } +#endif + // Update Key State + for (int x = 0; x < pdu_keys; x++) + { + if (packet.kblk[x].kid < 128) + { + report.af = 1; + if (log_summary.rs > 0) + { + Crypto_increment((uint8_t *)&log_summary.num_se, 4); + log_summary.rs--; + mc_log.blk[log_count].emt = MKID_STATE_ERR_EID; + mc_log.blk[log_count].emv[0] = 0x4E; + mc_log.blk[log_count].emv[1] = 0x41; + mc_log.blk[log_count].emv[2] = 0x53; + mc_log.blk[log_count].emv[3] = 0x41; + mc_log.blk[log_count++].em_len = 4; + } + printf(KRED "Error: MKID state cannot be changed! \n" RESET); + // TODO: Exit + } + + if (ek_ring[packet.kblk[x].kid].key_state == (state - 1)) + { + ek_ring[packet.kblk[x].kid].key_state = state; +#ifdef PDU_DEBUG + // printf("Key ID %d state changed to ", packet.kblk[x].kid); +#endif + } + else + { + if (log_summary.rs > 0) + { + Crypto_increment((uint8_t *)&log_summary.num_se, 4); + log_summary.rs--; + mc_log.blk[log_count].emt = KEY_TRANSITION_ERR_EID; + mc_log.blk[log_count].emv[0] = 0x4E; + mc_log.blk[log_count].emv[1] = 0x41; + mc_log.blk[log_count].emv[2] = 0x53; + mc_log.blk[log_count].emv[3] = 0x41; + mc_log.blk[log_count++].em_len = 4; + } + printf(KRED "Error: Key %d cannot transition to desired state! \n" RESET, packet.kblk[x].kid); + } + } + return CRYPTO_LIB_SUCCESS; +} + +/** + * @brief Function: Crypto_Key_inventory + * @param ingest: uint8_t* + * @return int32: count + **/ +int32_t Crypto_Key_inventory(uint8_t *ingest) +{ + // Local variables + SDLS_KEY_INVENTORY_t packet; + int count = 0; + uint16_t range = 0; + + // Read in PDU + packet.kid_first = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count + 1]); + count = count + 2; + packet.kid_last = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count + 1]); + count = count + 2; + + // Prepare for Reply + range = packet.kid_last - packet.kid_first; + sdls_frame.pdu.pdu_len = 2 + (range * (2 + 1)); + sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; + count = Crypto_Prep_Reply(ingest, 128); + ingest[count++] = (range & 0xFF00) >> 8; + ingest[count++] = (range & 0x00FF); + for (uint16_t x = packet.kid_first; x < packet.kid_last; x++) + { // Key ID + ingest[count++] = (x & 0xFF00) >> 8; + ingest[count++] = (x & 0x00FF); + // Key State + ingest[count++] = ek_ring[x].key_state; + } + return count; +} + +/** + * @brief Function: Crypto_Key_verify + * @param ingest: uint8_t* + * @param tc_frame: TC_t* + * @return int32: count + **/ +int32_t Crypto_Key_verify(uint8_t *ingest, TC_t *tc_frame) +{ + // Local variables + SDLS_KEYV_CMD_t packet; + int count = 0; + int pdu_keys = sdls_frame.pdu.pdu_len / SDLS_KEYV_CMD_BLK_SIZE; + + gcry_error_t gcry_error = GPG_ERR_NO_ERROR; + gcry_cipher_hd_t tmp_hd; + uint8_t iv_loc; + + // uint8_t tmp_mac[MAC_SIZE]; + +#ifdef PDU_DEBUG + printf("Crypto_Key_verify: Requested %d key(s) to verify \n", pdu_keys); +#endif + + // Read in PDU + for (int x = 0; x < pdu_keys; x++) + { + // Key ID + packet.blk[x].kid = ((uint8_t)sdls_frame.pdu.data[count] << 8) | ((uint8_t)sdls_frame.pdu.data[count + 1]); + count = count + 2; +#ifdef PDU_DEBUG + printf("Crypto_Key_verify: Block %d Key ID is %d \n", x, packet.blk[x].kid); +#endif + // Key Challenge + for (int y = 0; y < CHALLENGE_SIZE; y++) + { + packet.blk[x].challenge[y] = sdls_frame.pdu.data[count++]; + } +#ifdef PDU_DEBUG + printf("\n"); +#endif + } + + // Prepare for Reply + sdls_frame.pdu.pdu_len = pdu_keys * (2 + IV_SIZE + CHALLENGE_SIZE + CHALLENGE_MAC_SIZE); + sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; + count = Crypto_Prep_Reply(ingest, 128); + + for (int x = 0; x < pdu_keys; x++) + { // Key ID + ingest[count++] = (packet.blk[x].kid & 0xFF00) >> 8; + ingest[count++] = (packet.blk[x].kid & 0x00FF); + + // Initialization Vector + iv_loc = count; + for (int y = 0; y < IV_SIZE; y++) + { + ingest[count++] = *(tc_frame->tc_sec_header.iv + y); + } + ingest[count - 1] = ingest[count - 1] + x + 1; + + // Encrypt challenge + gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + } + gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[packet.blk[x].kid].value[0]), KEY_SIZE); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + } + gcry_error = gcry_cipher_setiv(tmp_hd, &(ingest[iv_loc]), IV_SIZE); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + } + gcry_error = gcry_cipher_encrypt(tmp_hd, + &(ingest[count]), // ciphertext output + CHALLENGE_SIZE, // length of data + &(packet.blk[x].challenge[0]), // plaintext input + CHALLENGE_SIZE // in data length + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_encrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + } + count = count + CHALLENGE_SIZE; // Don't forget to increment count! + + gcry_error = gcry_cipher_gettag(tmp_hd, + &(ingest[count]), // tag output + CHALLENGE_MAC_SIZE // tag size + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_gettag error code %d \n" RESET, gcry_error & GPG_ERR_CODE_MASK); + } + count = count + CHALLENGE_MAC_SIZE; // Don't forget to increment count! + + // Copy from tmp_mac into ingest + // for( int y = 0; y < CHALLENGE_MAC_SIZE; y++) + //{ + // ingest[count++] = tmp_mac[y]; + //} + gcry_cipher_close(tmp_hd); + } + +#ifdef PDU_DEBUG + printf("Crypto_Key_verify: Response is %d bytes \n", count); +#endif + + return count; +} \ No newline at end of file diff --git a/src/src_main/crypto_mc.c b/src/src_main/crypto_mc.c new file mode 100644 index 00000000..faf8d08b --- /dev/null +++ b/src/src_main/crypto_mc.c @@ -0,0 +1,248 @@ +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. + + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. + + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. + + ITC Team + NASA IV&V + jstar-development-team@mail.nasa.gov +*/ + +/* +** Includes +*/ +#include "crypto.h" + +/* +** Security Association Monitoring and Control +*/ +/** + * @brief Function: Crypto_MC_ping + * @param ingest: uint8_t* + * return int32: count + **/ +int32_t Crypto_MC_ping(uint8_t *ingest) +{ + int count = 0; + + // Prepare for Reply + sdls_frame.pdu.pdu_len = 0; + sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; + count = Crypto_Prep_Reply(ingest, 128); + + return count; +} + +/** + * @brief Function: Crypto_MC_status + * @param ingest: uint8_t* + * @return int32: count + **/ +int32_t Crypto_MC_status(uint8_t *ingest) +{ + int count = 0; + + // TODO: Update log_summary.rs; + + // Prepare for Reply + sdls_frame.pdu.pdu_len = 2; // 4 + sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; + count = Crypto_Prep_Reply(ingest, 128); + + // PDU + // ingest[count++] = (log_summary.num_se & 0xFF00) >> 8; + ingest[count++] = (log_summary.num_se & 0x00FF); + // ingest[count++] = (log_summary.rs & 0xFF00) >> 8; + ingest[count++] = (log_summary.rs & 0x00FF); + +#ifdef PDU_DEBUG + printf("log_summary.num_se = 0x%02x \n", log_summary.num_se); + printf("log_summary.rs = 0x%02x \n", log_summary.rs); +#endif + + return count; +} + +/** + * @brief Function: Crypto_MC_dump + * @param ingest: uint8_t* + * @return int32: Count + **/ +int32_t Crypto_MC_dump(uint8_t *ingest) +{ + int count = 0; + + // Prepare for Reply + sdls_frame.pdu.pdu_len = (log_count * 6); // SDLS_MC_DUMP_RPLY_SIZE + sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; + count = Crypto_Prep_Reply(ingest, 128); + + // PDU + for (int x = 0; x < log_count; x++) + { + ingest[count++] = mc_log.blk[x].emt; + // ingest[count++] = (mc_log.blk[x].em_len & 0xFF00) >> 8; + ingest[count++] = (mc_log.blk[x].em_len & 0x00FF); + for (int y = 0; y < EMV_SIZE; y++) + { + ingest[count++] = mc_log.blk[x].emv[y]; + } + } + +#ifdef PDU_DEBUG + printf("log_count = %d \n", log_count); + printf("log_summary.num_se = 0x%02x \n", log_summary.num_se); + printf("log_summary.rs = 0x%02x \n", log_summary.rs); +#endif + + return count; +} + +/** + * @brief Function: Crypto_MC_erase + * @param ingest: uint8_t* + * @return int32: count + **/ +int32_t Crypto_MC_erase(uint8_t *ingest) +{ + int count = 0; + + // Zero Logs + for (int x = 0; x < LOG_SIZE; x++) + { + mc_log.blk[x].emt = 0; + mc_log.blk[x].em_len = 0; + for (int y = 0; y < EMV_SIZE; y++) + { + mc_log.blk[x].emv[y] = 0; + } + } + + // Compute Summary + log_count = 0; + log_summary.num_se = 0; + log_summary.rs = LOG_SIZE; + + // Prepare for Reply + sdls_frame.pdu.pdu_len = 2; // 4 + sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; + count = Crypto_Prep_Reply(ingest, 128); + + // PDU + // ingest[count++] = (log_summary.num_se & 0xFF00) >> 8; + ingest[count++] = (log_summary.num_se & 0x00FF); + // ingest[count++] = (log_summary.rs & 0xFF00) >> 8; + ingest[count++] = (log_summary.rs & 0x00FF); + + return count; +} + +/** + * @brief Function: Crypto_MC_selftest + * @param ingest: uint8_t* + * @return int32: Count + **/ +int32_t Crypto_MC_selftest(uint8_t *ingest) +{ + uint8_t count = 0; + uint8_t result = ST_OK; + + // TODO: Perform test + + // Prepare for Reply + sdls_frame.pdu.pdu_len = 1; + sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; + count = Crypto_Prep_Reply(ingest, 128); + + ingest[count++] = result; + + return count; +} + +/** + * @brief Function: Crypto_SA_readASRN + * @param ingest: uint8_t* + * @return int32: Count + **/ +int32_t Crypto_SA_readARSN(uint8_t *ingest) +{ + uint8_t count = 0; + uint16_t spi = 0x0000; + SecurityAssociation_t *sa_ptr; + + // Read ingest + spi = ((uint8_t)sdls_frame.pdu.data[0] << 8) | (uint8_t)sdls_frame.pdu.data[1]; + + // Prepare for Reply + sdls_frame.pdu.pdu_len = 2 + IV_SIZE; + sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; + count = Crypto_Prep_Reply(ingest, 128); + + // Write SPI to reply + ingest[count++] = (spi & 0xFF00) >> 8; + ingest[count++] = (spi & 0x00FF); + + if (sadb_routine->sadb_get_sa_from_spi(spi, &sa_ptr) != CRYPTO_LIB_SUCCESS) + { + // TODO - Error handling + return CRYPTO_LIB_ERROR; // Error -- unable to get SA from SPI. + } + + if (sa_ptr->shivf_len > 0) + { // Set IV - authenticated encryption + for (int x = 0; x < sa_ptr->shivf_len - 1; x++) + { + ingest[count++] = *(sa_ptr->iv + x); + } + + // TODO: Do we need this? + if (*(sa_ptr->iv + sa_ptr->shivf_len - 1) > 0) + { // Adjust to report last received, not expected + ingest[count++] = *(sa_ptr->iv + sa_ptr->shivf_len - 1) - 1; + } + else + { + ingest[count++] = *(sa_ptr->iv + sa_ptr->shivf_len - 1); + } + } + else + { + // TODO + } + +#ifdef PDU_DEBUG + printf("spi = %d \n", spi); + if (sa_ptr->shivf_len > 0) + { + printf("ARSN = 0x"); + for (int x = 0; x < sa_ptr->shivf_len; x++) + { + printf("%02x", *(sa_ptr->iv + x)); + } + printf("\n"); + } +#endif + + return count; +} + +/** + * @brief Function: Crypto_MC_resetalarm + * @return int32: Success/Failure + **/ +int32_t Crypto_MC_resetalarm(void) +{ // Reset all alarm flags + report.af = 0; + report.bsnf = 0; + report.bmacf = 0; + report.ispif = 0; + return CRYPTO_LIB_SUCCESS; +} diff --git a/src/src_main/crypto_tc.c b/src/src_main/crypto_tc.c new file mode 100644 index 00000000..aba9c86c --- /dev/null +++ b/src/src_main/crypto_tc.c @@ -0,0 +1,1030 @@ +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. + + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. + + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. + + ITC Team + NASA IV&V + jstar-development-team@mail.nasa.gov +*/ + +/* +** Includes +*/ +#include "crypto.h" + +/** + * @brief Function: Crypto_TC_ApplySecurity + * Applies Security to incoming frame. Encryption, Authentication, and Authenticated Encryption + * @param p_in_frame: uint8* + * @param in_frame_length: uint16 + * @param pp_in_frame: uint8_t** + * @param p_enc_frame_len: uint16 + * @return int32: Success/Failure + **/ +int32_t Crypto_TC_ApplySecurity(const uint8_t *p_in_frame, const uint16_t in_frame_length, uint8_t **pp_in_frame, + uint16_t *p_enc_frame_len) +{ + // Local Variables + int32_t status = CRYPTO_LIB_SUCCESS; + TC_FramePrimaryHeader_t temp_tc_header; + SecurityAssociation_t *sa_ptr = NULL; + uint8_t *p_new_enc_frame = NULL; + uint8_t sa_service_type = -1; + uint16_t mac_loc = 0; + uint16_t tf_payload_len = 0x0000; + uint16_t new_fecf = 0x0000; + uint8_t *aad; + gcry_cipher_hd_t tmp_hd; + gcry_error_t gcry_error = GPG_ERR_NO_ERROR; + uint16_t new_enc_frame_header_field_length = 0; + uint32_t encryption_cipher; + uint8_t ecs_is_aead_algorithm; + +#ifdef DEBUG + printf(KYEL "\n----- Crypto_TC_ApplySecurity START -----\n" RESET); +#endif + + if (p_in_frame == NULL) + { + status = CRYPTO_LIB_ERR_NULL_BUFFER; + printf(KRED "Error: Input Buffer NULL! \n" RESET); + return status; // Just return here, nothing can be done. + } + +#ifdef DEBUG + printf("%d TF Bytes received\n", in_frame_length); + printf("DEBUG - "); + for (int i = 0; i < in_frame_length; i++) + { + printf("%02X", ((uint8_t *)&*p_in_frame)[i]); + } + printf("\nPrinted %d bytes\n", in_frame_length); +#endif + + if (crypto_config == NULL) + { + printf(KRED "ERROR: CryptoLib Configuration Not Set! -- CRYPTO_LIB_ERR_NO_CONFIG, Will Exit\n" RESET); + status = CRYPTO_LIB_ERR_NO_CONFIG; + } + + // Primary Header + temp_tc_header.tfvn = ((uint8_t)p_in_frame[0] & 0xC0) >> 6; + temp_tc_header.bypass = ((uint8_t)p_in_frame[0] & 0x20) >> 5; + temp_tc_header.cc = ((uint8_t)p_in_frame[0] & 0x10) >> 4; + temp_tc_header.spare = ((uint8_t)p_in_frame[0] & 0x0C) >> 2; + temp_tc_header.scid = ((uint8_t)p_in_frame[0] & 0x03) << 8; + temp_tc_header.scid = temp_tc_header.scid | (uint8_t)p_in_frame[1]; + temp_tc_header.vcid = ((uint8_t)p_in_frame[2] & 0xFC) >> 2 & crypto_config->vcid_bitmask; + temp_tc_header.fl = ((uint8_t)p_in_frame[2] & 0x03) << 8; + temp_tc_header.fl = temp_tc_header.fl | (uint8_t)p_in_frame[3]; + temp_tc_header.fsn = (uint8_t)p_in_frame[4]; + + // Lookup-retrieve managed parameters for frame via gvcid: + status = Crypto_Get_Managed_Parameters_For_Gvcid(temp_tc_header.tfvn, temp_tc_header.scid, temp_tc_header.vcid, + gvcid_managed_parameters, ¤t_managed_parameters); + if (status != CRYPTO_LIB_SUCCESS) + { + return status; + } // Unable to get necessary Managed Parameters for TC TF -- return with error. + + uint8_t segmentation_hdr = 0x00; + uint8_t map_id = 0; + if (current_managed_parameters->has_segmentation_hdr == TC_HAS_SEGMENT_HDRS) + { + segmentation_hdr = p_in_frame[5]; + map_id = segmentation_hdr & 0x3F; + } + + // Check if command frame flag set + if ((temp_tc_header.cc == 1) && (status == CRYPTO_LIB_SUCCESS)) + { +/* +** CCSDS 232.0-B-3 +** Section 6.3.1 +** "Type-C frames do not have the Security Header and Security Trailer." +*/ +#ifdef TC_DEBUG + printf(KYEL "DEBUG - Received Control/Command frame - nothing to do.\n" RESET); +#endif + status = CRYPTO_LIB_ERR_INVALID_CC_FLAG; + } + + if (status == CRYPTO_LIB_SUCCESS) + { + // Query SA DB for active SA / SDLS parameters + if (sadb_routine == NULL) // This should not happen, but tested here for safety + { + printf(KRED "ERROR: SA DB Not initalized! -- CRYPTO_LIB_ERR_NO_INIT, Will Exit\n" RESET); + status = CRYPTO_LIB_ERR_NO_INIT; + } + else + { + status = sadb_routine->sadb_get_operational_sa_from_gvcid(temp_tc_header.tfvn, temp_tc_header.scid, + temp_tc_header.vcid, map_id, &sa_ptr); + } + + // If unable to get operational SA, can return + if (status != CRYPTO_LIB_SUCCESS) + { + return status; + } + +#ifdef SA_DEBUG + printf(KYEL "DEBUG - Printing SA Entry for current frame.\n" RESET); + Crypto_saPrint(sa_ptr); +#endif + + // Determine SA Service Type + if ((sa_ptr->est == 0) && (sa_ptr->ast == 0)) + { + sa_service_type = SA_PLAINTEXT; + } + else if ((sa_ptr->est == 0) && (sa_ptr->ast == 1)) + { + sa_service_type = SA_AUTHENTICATION; + } + else if ((sa_ptr->est == 1) && (sa_ptr->ast == 0)) + { + sa_service_type = SA_ENCRYPTION; + } + else if ((sa_ptr->est == 1) && (sa_ptr->ast == 1)) + { + sa_service_type = SA_AUTHENTICATED_ENCRYPTION; + } + else + { + // Probably unnecessary check + // Leaving for now as it would be cleaner in SA to have an association enum returned I believe + printf(KRED "Error: SA Service Type is not defined! \n" RESET); + status = CRYPTO_LIB_ERROR; + return status; + } + + // Determine Algorithm cipher & mode. // TODO - Parse authentication_cipher, and handle AEAD cases properly + if (sa_service_type != SA_PLAINTEXT) + { + encryption_cipher = + (sa_ptr->ecs[0] << 24) | (sa_ptr->ecs[1] << 16) | (sa_ptr->ecs[2] << 8) | sa_ptr->ecs[3]; + ecs_is_aead_algorithm = Crypto_Is_AEAD_Algorithm(encryption_cipher); + } + +#ifdef TC_DEBUG + switch (sa_service_type) + { + case SA_PLAINTEXT: + printf(KBLU "Creating a TC - CLEAR!\n" RESET); + break; + case SA_AUTHENTICATION: + printf(KBLU "Creating a TC - AUTHENTICATED!\n" RESET); + break; + case SA_ENCRYPTION: + printf(KBLU "Creating a TC - ENCRYPTED!\n" RESET); + break; + case SA_AUTHENTICATED_ENCRYPTION: + printf(KBLU "Creating a TC - AUTHENTICATED ENCRYPTION!\n" RESET); + break; + } +#endif + + // Determine length of buffer to be malloced + // TODO: Determine TC_PAD_SIZE + // TODO: Note: Currently assumes ciphertext output length is same as ciphertext input length + switch (sa_service_type) + { + case SA_PLAINTEXT: + // Ingest length + spi_index (2) + some variable length fields + *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shplf_len; + new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; + break; + case SA_AUTHENTICATION: + // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) + // + shplf_len + arc_len + pad_size + stmacf_len + *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + + sa_ptr->arc_len + TC_PAD_SIZE + sa_ptr->stmacf_len; + new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; + break; + case SA_ENCRYPTION: + // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) + // + shplf_len + arc_len + pad_size + *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + + sa_ptr->arc_len + TC_PAD_SIZE; + new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; + break; + case SA_AUTHENTICATED_ENCRYPTION: + // Ingest length + spi_index (2) + shivf_len (varies) + shsnf_len (varies) + // + shplf_len + arc_len + pad_size + stmacf_len + *p_enc_frame_len = temp_tc_header.fl + 1 + 2 + sa_ptr->shivf_len + sa_ptr->shsnf_len + sa_ptr->shplf_len + + sa_ptr->arc_len + TC_PAD_SIZE + sa_ptr->stmacf_len; + new_enc_frame_header_field_length = (*p_enc_frame_len) - 1; + break; + default: + printf(KRED "Unknown SA Service Type Detected!" RESET); + break; + } + +#ifdef TC_DEBUG + printf(KYEL "DEBUG - Total TC Buffer to be malloced is: %d bytes\n" RESET, *p_enc_frame_len); + printf(KYEL "\tlen of TF\t = %d\n" RESET, temp_tc_header.fl); + // printf(KYEL "\tsegment hdr\t = 1\n" RESET); // TODO: Determine presence of this so not hard-coded + printf(KYEL "\tspi len\t\t = 2\n" RESET); + printf(KYEL "\tshivf_len\t = %d\n" RESET, sa_ptr->shivf_len); + printf(KYEL "\tshsnf_len\t = %d\n" RESET, sa_ptr->shsnf_len); + printf(KYEL "\tshplf len\t = %d\n" RESET, sa_ptr->shplf_len); + printf(KYEL "\tarc_len\t\t = %d\n" RESET, sa_ptr->arc_len); + printf(KYEL "\tpad_size\t = %d\n" RESET, TC_PAD_SIZE); + printf(KYEL "\tstmacf_len\t = %d\n" RESET, sa_ptr->stmacf_len); +#endif + + // Accio buffer + p_new_enc_frame = (uint8_t *)malloc((*p_enc_frame_len) * sizeof(uint8_t)); + if (!p_new_enc_frame) + { + printf(KRED "Error: Malloc for encrypted output buffer failed! \n" RESET); + status = CRYPTO_LIB_ERROR; + return status; + } + memset(p_new_enc_frame, 0, *p_enc_frame_len); + + // Copy original TF header + memcpy(p_new_enc_frame, p_in_frame, TC_FRAME_PRIMARYHEADER_STRUCT_SIZE); + + // Set new TF Header length + // Recall: Length field is one minus total length per spec + *(p_new_enc_frame + 2) = + ((*(p_new_enc_frame + 2) & 0xFC) | (((new_enc_frame_header_field_length) & (0x0300)) >> 8)); + *(p_new_enc_frame + 3) = ((new_enc_frame_header_field_length) & (0x00FF)); + +#ifdef TC_DEBUG + printf(KYEL "Printing updated TF Header:\n\t"); + for (int i = 0; i < TC_FRAME_HEADER_SIZE; i++) + { + printf("%02X", *(p_new_enc_frame + i)); + } + // Recall: The buffer length is 1 greater than the field value set in the TCTF + printf("\n\tLength set to 0x%02X\n" RESET, new_enc_frame_header_field_length); +#endif + + /* + ** Start variable length fields + */ + uint16_t index = TC_FRAME_HEADER_SIZE; // Frame header is 5 bytes + + if (current_managed_parameters->has_segmentation_hdr == TC_HAS_SEGMENT_HDRS) + { + index++; // Add 1 byte to index because segmentation header used for this gvcid. + } + + /* + ** Begin Security Header Fields + ** Reference CCSDS SDLP 3550b1 4.1.1.1.3 + */ + // Set SPI + *(p_new_enc_frame + index) = ((sa_ptr->spi & 0xFF00) >> 8); + *(p_new_enc_frame + index + 1) = (sa_ptr->spi & 0x00FF); + index += 2; + + // Set initialization vector if specified + if ((sa_service_type == SA_AUTHENTICATION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || + (sa_service_type == SA_ENCRYPTION)) + { +#ifdef SA_DEBUG + printf(KYEL "Using IV value:\n\t"); + for (int i = 0; i < sa_ptr->shivf_len; i++) + { + printf("%02x", *(sa_ptr->iv + i)); + } + printf("\n" RESET); +#endif + + for (int i = 0; i < sa_ptr->shivf_len; i++) + { + // TODO: Likely API call + // Copy in IV from SA + *(p_new_enc_frame + index) = *(sa_ptr->iv + i); + index++; + } + } + + // Set anti-replay sequence number if specified + /* + ** See also: 4.1.1.4.2 + ** 4.1.1.4.4 If authentication or authenticated encryption is not selected + ** for an SA, the Sequence Number field shall be zero octets in length. + ** Reference CCSDS 3550b1 + */ + // Determine if seq num field is needed + // TODO: Likely SA API Call + if (sa_ptr->shsnf_len > 0) + { + // If using anti-replay counter, increment it + // TODO: API call instead? + // TODO: Check return code + Crypto_increment(sa_ptr->arc, sa_ptr->shsnf_len); + for (int i = 0; i < sa_ptr->shsnf_len; i++) + { + *(p_new_enc_frame + index) = *(sa_ptr->arc + i); + index++; + } + } + + // Set security header padding if specified + /* + ** 4.2.3.4 h) if the algorithm and mode selected for the SA require the use of + ** fill padding, place the number of fill bytes used into the Pad Length field + ** of the Security Header - Reference CCSDS 3550b1 + */ + // TODO: Revisit this + // TODO: Likely SA API Call + for (int i = 0; i < sa_ptr->shplf_len; i++) + { + /* 4.1.1.5.2 The Pad Length field shall contain the count of fill bytes used in the + ** cryptographic process, consisting of an integral number of octets. - CCSDS 3550b1 + */ + // TODO: Set this depending on crypto cipher used + *(p_new_enc_frame + index) = 0x00; + index++; + } + + /* + ** End Security Header Fields + */ + + uint8_t fecf_len = FECF_SIZE; + if (current_managed_parameters->has_fecf == TC_NO_FECF) + { + fecf_len = 0; + } + uint8_t segment_hdr_len = SEGMENT_HDR_SIZE; + if (current_managed_parameters->has_segmentation_hdr == TC_NO_SEGMENT_HDRS) + { + segment_hdr_len = 0; + } + // Copy in original TF data - except FECF + // Will be over-written if using encryption later + // and if it was present in the original TCTF + // if FECF + // Even though FECF is not part of apply_security payload, we still have to subtract the length from the + // temp_tc_header.fl since that includes FECF length & segment header length. + tf_payload_len = temp_tc_header.fl - TC_FRAME_HEADER_SIZE - segment_hdr_len - fecf_len + 1; + // if no FECF + // tf_payload_len = temp_tc_header.fl - TC_FRAME_PRIMARYHEADER_STRUCT_SIZE; + memcpy((p_new_enc_frame + index), (p_in_frame + TC_FRAME_PRIMARYHEADER_STRUCT_SIZE), tf_payload_len); + // index += tf_payload_len; + + /* + ** Begin Security Trailer Fields + */ + + // Set MAC Field if present + /* + ** May be present and unused if switching between clear and authenticated + ** CCSDS 3550b1 4.1.2.3 + */ + // By leaving MAC as zeros, can use index for encryption output + // for (int i=0; i < temp_SA.stmacf_len; i++) + // { + // // Temp fill MAC + // *(p_new_enc_frame + index) = 0x00; + // index++; + // } + + /* + ** End Security Trailer Fields + */ + + /* + ** Begin Authentication / Encryption + */ + + if (sa_service_type != SA_PLAINTEXT) + { + gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[sa_ptr->ekid].value[0]), + KEY_SIZE // TODO: look into this + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + gcry_error = gcry_cipher_setiv(tmp_hd, sa_ptr->iv, sa_ptr->shivf_len); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + + if ((sa_service_type == SA_ENCRYPTION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION)) + { +// TODO: More robust calculation of this location +// uint16_t output_loc = TC_FRAME_PRIMARYHEADER_STRUCT_SIZE + 1 + 2 + temp_SA.shivf_len + temp_SA.shsnf_len + +// temp_SA.shplf_len; +#ifdef TC_DEBUG + printf("Encrypted bytes output_loc is %d\n", index); + printf("tf_payload_len is %d\n", tf_payload_len); + printf(KYEL "Printing TC Frame prior to encryption:\n\t"); + for (int i = 0; i < *p_enc_frame_len; i++) + { + printf("%02X", *(p_new_enc_frame + i)); + } + printf("\n"); +#endif + + if (sa_service_type == SA_AUTHENTICATED_ENCRYPTION && + ecs_is_aead_algorithm == CRYPTO_TRUE) // Algorithm is AEAD algorithm, Add AAD before encrypt! + { + // Prepare the Header AAD (CCSDS 335.0-B-1 4.2.3.2.2.3) + uint16_t aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + + sa_ptr->shsnf_len + sa_ptr->shplf_len; + if (sa_ptr->abm_len < aad_len) + { + return CRYPTO_LIB_ERR_ABM_TOO_SHORT_FOR_AAD; + } + aad = Crypto_Prepare_TC_AAD(p_new_enc_frame, aad_len, sa_ptr->abm); + + // Add the AAD to the libgcrypt cipher handle + gcry_error = gcry_cipher_authenticate(tmp_hd, + aad, // additional authenticated data + aad_len // length of AAD + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET, + gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error), gcry_strerror(gcry_error)); + status = CRYPTO_LIB_ERR_AUTHENTICATION_ERROR; + return status; + } + + free(aad); + } + + gcry_error = + gcry_cipher_encrypt(tmp_hd, + &p_new_enc_frame[index], // ciphertext output + tf_payload_len, // length of data + (p_in_frame + TC_FRAME_HEADER_SIZE + segment_hdr_len), // plaintext input + tf_payload_len // in data length + ); + + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_encrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + +#ifdef TC_DEBUG + printf("Encrypted bytes output_loc is %d\n", index); + printf("tf_payload_len is %d\n", tf_payload_len); + printf(KYEL "Printing TC Frame after encryption:\n\t"); + for (int i = 0; i < *p_enc_frame_len; i++) + { + printf("%02X", *(p_new_enc_frame + i)); + } + printf("\n"); +#endif + + // Get MAC & insert into p_new_enc_frame + if (sa_service_type == SA_AUTHENTICATED_ENCRYPTION && ecs_is_aead_algorithm == CRYPTO_TRUE) + { + mac_loc = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + + sa_ptr->shplf_len + tf_payload_len; +#ifdef MAC_DEBUG + printf(KYEL "MAC location is: %d\n" RESET, mac_loc); + printf(KYEL "MAC size is: %d\n" RESET, MAC_SIZE); +#endif + gcry_error = gcry_cipher_gettag( + tmp_hd, + &p_new_enc_frame[mac_loc], // tag output + MAC_SIZE // tag size // TODO - use sa_ptr->abm_len instead of hardcoded mac size? + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, + gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERR_MAC_RETRIEVAL_ERROR; + return status; + } + } + + // Close cipher, so we can authenticate encrypted data + gcry_cipher_close(tmp_hd); + } + + // Prepare additional authenticated data, if needed + if ((sa_service_type == SA_AUTHENTICATION) || + ((sa_service_type == SA_AUTHENTICATED_ENCRYPTION) && + ecs_is_aead_algorithm == CRYPTO_FALSE)) // Authenticated Encryption without AEAD algorithm, AEAD + // algorithms handled in encryption block! + { + gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[sa_ptr->ekid].value[0]), + KEY_SIZE // TODO: look into this + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + gcry_error = gcry_cipher_setiv(tmp_hd, sa_ptr->iv, sa_ptr->shivf_len); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + + uint16_t aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + + sa_ptr->shsnf_len + sa_ptr->shplf_len + tf_payload_len; + if (sa_ptr->abm_len < aad_len) + { + return CRYPTO_LIB_ERR_ABM_TOO_SHORT_FOR_AAD; + } + aad = Crypto_Prepare_TC_AAD(p_new_enc_frame, aad_len, sa_ptr->abm); + + gcry_error = gcry_cipher_authenticate(tmp_hd, + aad, // additional authenticated data + aad_len // length of AAD + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET, + gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error), gcry_strerror(gcry_error)); + status = CRYPTO_LIB_ERROR; + return status; + } + + mac_loc = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + + sa_ptr->shplf_len + tf_payload_len; +#ifdef MAC_DEBUG + printf(KYEL "MAC location is: %d\n" RESET, mac_loc); + printf(KYEL "MAC size is: %d\n" RESET, MAC_SIZE); +#endif + gcry_error = + gcry_cipher_gettag(tmp_hd, + &p_new_enc_frame[mac_loc], // tag output + MAC_SIZE // tag size // TODO - use sa_ptr->abm_len instead of hardcoded mac size? + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERR_MAC_RETRIEVAL_ERROR; + return status; + } + // Zeroise any sensitive information + gcry_cipher_close(tmp_hd); + } + } + + if (sa_service_type != SA_PLAINTEXT) + { +#ifdef INCREMENT + if (sa_ptr->iv == NULL) + { + printf("\n\nNULL\n\n"); + } + Crypto_increment(sa_ptr->iv, sa_ptr->shivf_len); +#ifdef SA_DEBUG + printf(KYEL "Next IV value is:\n\t"); + for (int i = 0; i < sa_ptr->shivf_len; i++) + { + printf("%02x", *(sa_ptr->iv + i)); + } + printf("\n" RESET); +#endif +#endif + } + /* + ** End Authentication / Encryption + */ + + // Only calculate & insert FECF if CryptoLib is configured to do so & gvcid includes FECF. + if (current_managed_parameters->has_fecf == TC_HAS_FECF) + { +// Set FECF Field if present +#ifdef FECF_DEBUG + printf(KCYN "Calcing FECF over %d bytes\n" RESET, new_enc_frame_header_field_length - 1); +#endif + if (crypto_config->crypto_create_fecf == CRYPTO_TC_CREATE_FECF_TRUE) + { + new_fecf = Crypto_Calc_FECF(p_new_enc_frame, new_enc_frame_header_field_length - 1); + *(p_new_enc_frame + new_enc_frame_header_field_length - 1) = (uint8_t)((new_fecf & 0xFF00) >> 8); + *(p_new_enc_frame + new_enc_frame_header_field_length) = (uint8_t)(new_fecf & 0x00FF); + } + else // CRYPTO_TC_CREATE_FECF_FALSE + { + *(p_new_enc_frame + new_enc_frame_header_field_length - 1) = (uint8_t)0x00; + *(p_new_enc_frame + new_enc_frame_header_field_length) = (uint8_t)0x00; + } + + index += 2; + } + +#ifdef TC_DEBUG + printf(KYEL "Printing new TC Frame:\n\t"); + for (int i = 0; i < *p_enc_frame_len; i++) + { + printf("%02X", *(p_new_enc_frame + i)); + } + printf("\n\tThe returned length is: %d\n" RESET, new_enc_frame_header_field_length); +#endif + + *pp_in_frame = p_new_enc_frame; + } + + status = sadb_routine->sadb_save_sa(sa_ptr); + +#ifdef DEBUG + printf(KYEL "----- Crypto_TC_ApplySecurity END -----\n" RESET); +#endif + + return status; +} + +/** + * @brief Function: Crypto_TC_ProcessSecurity + * Performs Authenticated decryption, decryption, and authentication + * @param ingest: uint8_t* + * @param len_ingest: int* + * @param tc_sdls_processed_frame: TC_t* + * @return int32: Success/Failure + **/ +int32_t Crypto_TC_ProcessSecurity(uint8_t *ingest, int *len_ingest, TC_t *tc_sdls_processed_frame) +// Loads the ingest frame into the global tc_frame while performing decryption +{ + // Local Variables + int32_t status = CRYPTO_LIB_SUCCESS; + gcry_cipher_hd_t tmp_hd; + gcry_error_t gcry_error = GPG_ERR_NO_ERROR; + SecurityAssociation_t *sa_ptr = NULL; + uint8_t sa_service_type = -1; + uint8_t *aad; + uint32_t encryption_cipher; + uint8_t ecs_is_aead_algorithm; + + if (crypto_config == NULL) + { + printf(KRED "ERROR: CryptoLib Configuration Not Set! -- CRYPTO_LIB_ERR_NO_CONFIG, Will Exit\n" RESET); + status = CRYPTO_LIB_ERR_NO_CONFIG; + return status; + } + +#ifdef DEBUG + printf(KYEL "\n----- Crypto_TC_ProcessSecurity START -----\n" RESET); +#endif + + int byte_idx = 0; + // Primary Header + tc_sdls_processed_frame->tc_header.tfvn = ((uint8_t)ingest[byte_idx] & 0xC0) >> 6; + tc_sdls_processed_frame->tc_header.bypass = ((uint8_t)ingest[byte_idx] & 0x20) >> 5; + tc_sdls_processed_frame->tc_header.cc = ((uint8_t)ingest[byte_idx] & 0x10) >> 4; + tc_sdls_processed_frame->tc_header.spare = ((uint8_t)ingest[byte_idx] & 0x0C) >> 2; + tc_sdls_processed_frame->tc_header.scid = ((uint8_t)ingest[byte_idx] & 0x03) << 8; + byte_idx++; + tc_sdls_processed_frame->tc_header.scid = tc_sdls_processed_frame->tc_header.scid | (uint8_t)ingest[byte_idx]; + byte_idx++; + tc_sdls_processed_frame->tc_header.vcid = (((uint8_t)ingest[byte_idx] & 0xFC) >> 2) & crypto_config->vcid_bitmask; + tc_sdls_processed_frame->tc_header.fl = ((uint8_t)ingest[byte_idx] & 0x03) << 8; + byte_idx++; + tc_sdls_processed_frame->tc_header.fl = tc_sdls_processed_frame->tc_header.fl | (uint8_t)ingest[byte_idx]; + byte_idx++; + tc_sdls_processed_frame->tc_header.fsn = (uint8_t)ingest[byte_idx]; + byte_idx++; + + // Lookup-retrieve managed parameters for frame via gvcid: + status = Crypto_Get_Managed_Parameters_For_Gvcid( + tc_sdls_processed_frame->tc_header.tfvn, tc_sdls_processed_frame->tc_header.scid, + tc_sdls_processed_frame->tc_header.vcid, gvcid_managed_parameters, ¤t_managed_parameters); + + if (status != CRYPTO_LIB_SUCCESS) + { + return status; + } // Unable to get necessary Managed Parameters for TC TF -- return with error. + + // Segment Header + if (current_managed_parameters->has_segmentation_hdr == TC_HAS_SEGMENT_HDRS) + { + tc_sdls_processed_frame->tc_sec_header.sh = (uint8_t)ingest[byte_idx]; + byte_idx++; + } + // Security Header + tc_sdls_processed_frame->tc_sec_header.spi = ((uint8_t)ingest[byte_idx] << 8) | (uint8_t)ingest[byte_idx + 1]; + byte_idx += 2; +#ifdef TC_DEBUG + printf("vcid = %d \n", tc_sdls_processed_frame->tc_header.vcid); + printf("spi = %d \n", tc_sdls_processed_frame->tc_sec_header.spi); +#endif + + status = sadb_routine->sadb_get_sa_from_spi(tc_sdls_processed_frame->tc_sec_header.spi, &sa_ptr); + // If no valid SPI, return + if (status != CRYPTO_LIB_SUCCESS) + { + return status; + } + + encryption_cipher = (sa_ptr->ecs[0] << 24) | (sa_ptr->ecs[1] << 16) | (sa_ptr->ecs[2] << 8) | sa_ptr->ecs[3]; + ecs_is_aead_algorithm = Crypto_Is_AEAD_Algorithm(encryption_cipher); + + // Determine SA Service Type + if ((sa_ptr->est == 0) && (sa_ptr->ast == 0)) + { + sa_service_type = SA_PLAINTEXT; + } + else if ((sa_ptr->est == 0) && (sa_ptr->ast == 1)) + { + sa_service_type = SA_AUTHENTICATION; + } + else if ((sa_ptr->est == 1) && (sa_ptr->ast == 0)) + { + sa_service_type = SA_ENCRYPTION; + } + else if ((sa_ptr->est == 1) && (sa_ptr->ast == 1)) + { + sa_service_type = SA_AUTHENTICATED_ENCRYPTION; + } + else + { + // Probably unnecessary check + // Leaving for now as it would be cleaner in SA to have an association enum returned I believe + printf(KRED "Error: SA Service Type is not defined! \n" RESET); + status = CRYPTO_LIB_ERROR; + return status; + } + + // Determine Algorithm cipher & mode. // TODO - Parse authentication_cipher, and handle AEAD cases properly + if (sa_service_type != SA_PLAINTEXT) + { + encryption_cipher = (sa_ptr->ecs[0] << 24) | (sa_ptr->ecs[1] << 16) | (sa_ptr->ecs[2] << 8) | sa_ptr->ecs[3]; + ecs_is_aead_algorithm = Crypto_Is_AEAD_Algorithm(encryption_cipher); + } + +#ifdef TC_DEBUG + switch (sa_service_type) + { + case SA_PLAINTEXT: + printf(KBLU "Processing a TC - CLEAR!\n" RESET); + break; + case SA_AUTHENTICATION: + printf(KBLU "Processing a TC - AUTHENTICATED!\n" RESET); + break; + case SA_ENCRYPTION: + printf(KBLU "Processing a TC - ENCRYPTED!\n" RESET); + break; + case SA_AUTHENTICATED_ENCRYPTION: + printf(KBLU "Processing a TC - AUTHENTICATED ENCRYPTION!\n" RESET); + break; + } +#endif + + // TODO: Calculate lengths when needed + uint8_t fecf_len = FECF_SIZE; + if (current_managed_parameters->has_fecf == TC_NO_FECF) + { + fecf_len = 0; + } + + uint8_t segment_hdr_len = SEGMENT_HDR_SIZE; + if (current_managed_parameters->has_segmentation_hdr == TC_NO_SEGMENT_HDRS) + { + segment_hdr_len = 0; + } + + // Check FECF + if (current_managed_parameters->has_fecf == TC_HAS_FECF) + { + if (crypto_config->crypto_check_fecf == TC_CHECK_FECF_TRUE) + { + uint16_t received_fecf = (((ingest[tc_sdls_processed_frame->tc_header.fl - 1] << 8) & 0xFF00) | + (ingest[tc_sdls_processed_frame->tc_header.fl] & 0x00FF)); + // Calculate our own + uint16_t calculated_fecf = Crypto_Calc_FECF(ingest, *len_ingest - 2); + // Compare + if (received_fecf != calculated_fecf) + { + status = CRYPTO_LIB_ERR_INVALID_FECF; + return status; + } + } + } + + // Parse the security header + tc_sdls_processed_frame->tc_sec_header.spi = + (uint16_t)((uint8_t)ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len] | + (uint8_t)ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + 1]); + // Get SA via SPI + status = sadb_routine->sadb_get_sa_from_spi(tc_sdls_processed_frame->tc_sec_header.spi, &sa_ptr); + if (status != CRYPTO_LIB_SUCCESS) + { + return status; + } + // Parse IV + memcpy((tc_sdls_processed_frame->tc_sec_header.iv), &(ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN]), + sa_ptr->shivf_len); + // Parse Sequence Number + memcpy((tc_sdls_processed_frame->tc_sec_header.sn) + (TC_SN_SIZE - sa_ptr->shsnf_len), + &(ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len]), sa_ptr->shsnf_len); + // Parse pad length + memcpy((tc_sdls_processed_frame->tc_sec_header.pad) + (TC_PAD_SIZE - sa_ptr->shplf_len), + &(ingest[TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len]), + sa_ptr->shplf_len); + + if ((sa_service_type == SA_AUTHENTICATION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || + (sa_service_type == SA_ENCRYPTION)) + { + gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERR_LIBGCRYPT_ERROR; + return status; + } + gcry_error = gcry_cipher_setkey(tmp_hd, ek_ring[sa_ptr->ekid].value, KEY_SIZE); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERR_LIBGCRYPT_ERROR; + return status; + } + gcry_error = gcry_cipher_setiv(tmp_hd, tc_sdls_processed_frame->tc_sec_header.iv, sa_ptr->shivf_len); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERR_LIBGCRYPT_ERROR; + return status; + } + } + + // Check MAC, if applicable + if ((sa_service_type == SA_AUTHENTICATION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION)) + { + uint16_t tc_mac_start_index = tc_sdls_processed_frame->tc_header.fl + 1 - fecf_len - sa_ptr->stmacf_len; + // Parse the received MAC + memcpy((tc_sdls_processed_frame->tc_sec_trailer.mac) + (MAC_SIZE - sa_ptr->stmacf_len), + &(ingest[tc_mac_start_index]), sa_ptr->stmacf_len); + if (crypto_config->ignore_anti_replay == TC_IGNORE_ANTI_REPLAY_FALSE) + { + // If sequence number field is greater than zero, use as arsn + if (sa_ptr->shsnf_len > 0) + { + // Check Sequence Number is in ARCW + status = Crypto_window(tc_sdls_processed_frame->tc_sec_header.sn, sa_ptr->arc, sa_ptr->shsnf_len, + sa_ptr->arcw); + if (status != CRYPTO_LIB_SUCCESS) + { + return status; + } + // TODO: Update SA ARC through SADB_Routine function call + } + else + { + // Check IV is in ARCW + status = Crypto_window(tc_sdls_processed_frame->tc_sec_header.iv, sa_ptr->iv, sa_ptr->shivf_len, + sa_ptr->arcw); +#ifdef DEBUG + printf("Received IV is\n\t"); + for (int i = 0; i < sa_ptr->shivf_len; i++) + // for(int i=0; itc_sec_header.iv + i)); + } + printf("\nSA IV is\n\t"); + for (int i = 0; i < sa_ptr->shivf_len; i++) + { + printf("%02x", *(sa_ptr->iv + i)); + } + printf("\nARCW is: %d\n", sa_ptr->arcw); +#endif + if (status != CRYPTO_LIB_SUCCESS) + { + return status; + } + // TODO: Update SA IV through SADB_Routine function call + } + } + + uint16_t aad_len = tc_mac_start_index; + if ((sa_service_type == SA_AUTHENTICATED_ENCRYPTION) && (ecs_is_aead_algorithm == CRYPTO_TRUE)) + { + aad_len = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + sa_ptr->shsnf_len + + sa_ptr->shplf_len; + } + aad = Crypto_Prepare_TC_AAD(ingest, aad_len, sa_ptr->abm); + + gcry_error = gcry_cipher_authenticate(tmp_hd, + aad, // additional authenticated data + aad_len // length of AAD + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + printf(KRED "Failure: %s/%s\n", gcry_strsource(gcry_error), gcry_strerror(gcry_error)); + status = CRYPTO_LIB_ERR_AUTHENTICATION_ERROR; + return status; + } + } + + // Decrypt, if applicable + if ((sa_service_type == SA_ENCRYPTION) || (sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || + (sa_service_type == SA_AUTHENTICATION)) + { + uint16_t tc_enc_payload_start_index = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + + sa_ptr->shsnf_len + sa_ptr->shplf_len; + tc_sdls_processed_frame->tc_pdu_len = + tc_sdls_processed_frame->tc_header.fl + 1 - tc_enc_payload_start_index - sa_ptr->stmacf_len - fecf_len; + + if (sa_service_type == SA_AUTHENTICATION) + { // Authenticate only! No input data passed into decryption function, only AAD. + gcry_error = gcry_cipher_decrypt(tmp_hd, + NULL, // plaintext output + 0, // length of data + NULL, // ciphertext input + 0 // in data length + ); + // If authentication only, don't decrypt the data. Just pass the data PDU through. + memcpy(tc_sdls_processed_frame->tc_pdu, &(ingest[tc_enc_payload_start_index]), + tc_sdls_processed_frame->tc_pdu_len); + } + else + { // Decrypt + gcry_error = gcry_cipher_decrypt(tmp_hd, + tc_sdls_processed_frame->tc_pdu, // plaintext output + tc_sdls_processed_frame->tc_pdu_len, // length of data + &(ingest[tc_enc_payload_start_index]), // ciphertext input + tc_sdls_processed_frame->tc_pdu_len // in data length + ); + } + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERR_DECRYPT_ERROR; + return status; + } + + if ((sa_service_type == SA_AUTHENTICATED_ENCRYPTION) || (sa_service_type == SA_AUTHENTICATION)) + { + + gcry_error = gcry_cipher_checktag(tmp_hd, + tc_sdls_processed_frame->tc_sec_trailer.mac, // Frame Expected Tag + sa_ptr->stmacf_len // tag size + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + fprintf(stderr, "gcry_cipher_decrypt failed: %s\n", gpg_strerror(gcry_error)); + status = CRYPTO_LIB_ERR_MAC_VALIDATION_ERROR; + return status; + } + } + } + + if (sa_service_type != SA_PLAINTEXT) + { + gcry_cipher_close(tmp_hd); + } + + if (sa_service_type == SA_PLAINTEXT) + { + // TODO: Plaintext ARSN + + uint16_t tc_enc_payload_start_index = TC_FRAME_HEADER_SIZE + segment_hdr_len + SPI_LEN + sa_ptr->shivf_len + + sa_ptr->shsnf_len + sa_ptr->shplf_len; + tc_sdls_processed_frame->tc_pdu_len = + tc_sdls_processed_frame->tc_header.fl + 1 - tc_enc_payload_start_index - sa_ptr->stmacf_len - fecf_len; + memcpy(tc_sdls_processed_frame->tc_pdu, &(ingest[tc_enc_payload_start_index]), + tc_sdls_processed_frame->tc_pdu_len); + } + + // Extended PDU processing, if applicable + if (crypto_config->process_sdls_pdus == TC_PROCESS_SDLS_PDUS_TRUE) + { + status = Crypto_Process_Extended_Procedure_Pdu(tc_sdls_processed_frame, ingest); + } + + return status; +} \ No newline at end of file diff --git a/src/src_main/crypto_tm.c b/src/src_main/crypto_tm.c new file mode 100644 index 00000000..7df98daf --- /dev/null +++ b/src/src_main/crypto_tm.c @@ -0,0 +1,349 @@ +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. + + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. + + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. + + ITC Team + NASA IV&V + jstar-development-team@mail.nasa.gov +*/ + +/* +** Includes +*/ +#include "crypto.h" + +/** + * @brief Function: Crypto_TM_ApplySecurity + * @param ingest: uint8_t* + * @param len_ingest: int* + * @return int32: Success/Failure + **/ +int32_t Crypto_TM_ApplySecurity(uint8_t *ingest, int *len_ingest) +// Accepts CCSDS message in ingest, and packs into TM before encryption +{ + int32_t status = CRYPTO_LIB_SUCCESS; + int count = 0; + int pdu_loc = 0; + int pdu_len = *len_ingest - TM_MIN_SIZE; + int pad_len = 0; + int mac_loc = 0; + int fecf_loc = 0; + uint8_t tempTM[TM_SIZE]; + int x = 0; + int y = 0; + uint8_t aad[20]; + uint16_t spi = tm_frame.tm_sec_header.spi; + uint16_t spp_crc = 0x0000; + SecurityAssociation_t sa; + SecurityAssociation_t *sa_ptr = &sa; + + gcry_cipher_hd_t tmp_hd; + gcry_error_t gcry_error = GPG_ERR_NO_ERROR; + memset(&tempTM, 0, TM_SIZE); + +#ifdef DEBUG + printf(KYEL "\n----- Crypto_TM_ApplySecurity START -----\n" RESET); +#endif + + // Check for idle frame trigger + if (((uint8_t)ingest[0] == 0x08) && ((uint8_t)ingest[1] == 0x90)) + { // Zero ingest + for (x = 0; x < *len_ingest; x++) + { + ingest[x] = 0; + } + // Update TM First Header Pointer + tm_frame.tm_header.fhp = 0xFE; + } + else + { // Update the length of the ingest from the CCSDS header + *len_ingest = (ingest[4] << 8) | ingest[5]; + ingest[5] = ingest[5] - 5; + // Remove outgoing secondary space packet header flag + ingest[0] = 0x00; + // Change sequence flags to 0xFFFF + ingest[2] = 0xFF; + ingest[3] = 0xFF; + // Add 2 bytes of CRC to space packet + spp_crc = Crypto_Calc_CRC16((uint8_t *)ingest, *len_ingest); + ingest[*len_ingest] = (spp_crc & 0xFF00) >> 8; + ingest[*len_ingest + 1] = (spp_crc & 0x00FF); + *len_ingest = *len_ingest + 2; + // Update TM First Header Pointer + tm_frame.tm_header.fhp = tm_offset; +#ifdef TM_DEBUG + printf("tm_offset = %d \n", tm_offset); +#endif + } + + // Update Current Telemetry Frame in Memory + // Counters + tm_frame.tm_header.mcfc++; + tm_frame.tm_header.vcfc++; + // Operational Control Field + Crypto_TM_updateOCF(); + // Payload Data Unit + Crypto_TM_updatePDU(ingest, *len_ingest); + + if (sadb_routine->sadb_get_sa_from_spi(spi, &sa_ptr) != CRYPTO_LIB_SUCCESS) + { + // TODO - Error handling + return CRYPTO_LIB_ERROR; // Error -- unable to get SA from SPI. + } + + // Check test flags + if (badSPI == 1) + { + tm_frame.tm_sec_header.spi++; + } + if (badIV == 1) + { + *(sa_ptr->iv + sa_ptr->shivf_len - 1) = *(sa_ptr->iv + sa_ptr->shivf_len - 1) + 1; + } + if (badMAC == 1) + { + tm_frame.tm_sec_trailer.mac[MAC_SIZE - 1]++; + } + + // Initialize the temporary TM frame + // Header + tempTM[count++] = (uint8_t)((tm_frame.tm_header.tfvn << 6) | ((tm_frame.tm_header.scid & 0x3F0) >> 4)); + tempTM[count++] = (uint8_t)(((tm_frame.tm_header.scid & 0x00F) << 4) | (tm_frame.tm_header.vcid << 1) | + (tm_frame.tm_header.ocff)); + tempTM[count++] = (uint8_t)(tm_frame.tm_header.mcfc); + tempTM[count++] = (uint8_t)(tm_frame.tm_header.vcfc); + tempTM[count++] = + (uint8_t)((tm_frame.tm_header.tfsh << 7) | (tm_frame.tm_header.sf << 6) | (tm_frame.tm_header.pof << 5) | + (tm_frame.tm_header.slid << 3) | ((tm_frame.tm_header.fhp & 0x700) >> 8)); + tempTM[count++] = (uint8_t)(tm_frame.tm_header.fhp & 0x0FF); + // tempTM[count++] = (uint8_t) ((tm_frame.tm_header.tfshvn << 6) | tm_frame.tm_header.tfshlen); + // Security Header + tempTM[count++] = (uint8_t)((spi & 0xFF00) >> 8); + tempTM[count++] = (uint8_t)((spi & 0x00FF)); + memcpy(tm_frame.tm_sec_header.iv, sa_ptr->iv, sa_ptr->shivf_len); + + // Padding Length + pad_len = Crypto_Get_tmLength(*len_ingest) - TM_MIN_SIZE + IV_SIZE + TM_PAD_SIZE - *len_ingest; + + // Only add IV for authenticated encryption + if ((sa_ptr->est == 1) && (sa_ptr->ast == 1)) + { // Initialization Vector +#ifdef INCREMENT + Crypto_increment(sa_ptr->iv, sa_ptr->shivf_len); +#endif + if ((sa_ptr->est == 1) || (sa_ptr->ast == 1)) + { + for (x = 0; x < IV_SIZE; x++) + { + tempTM[count++] = *(sa_ptr->iv + x); + } + } + pdu_loc = count; + pad_len = pad_len - IV_SIZE - TM_PAD_SIZE + OCF_SIZE; + pdu_len = *len_ingest + pad_len; + } + else + { // Include padding length bytes - hard coded per ESA testing + tempTM[count++] = 0x00; // pad_len >> 8; + tempTM[count++] = 0x1A; // pad_len + pdu_loc = count; + pdu_len = *len_ingest + pad_len; + } + + // Payload Data Unit + for (x = 0; x < (pdu_len); x++) + { + tempTM[count++] = (uint8_t)tm_frame.tm_pdu[x]; + } + // Message Authentication Code + mac_loc = count; + for (x = 0; x < MAC_SIZE; x++) + { + tempTM[count++] = 0x00; + } + // Operational Control Field + for (x = 0; x < OCF_SIZE; x++) + { + tempTM[count++] = (uint8_t)tm_frame.tm_sec_trailer.ocf[x]; + } + // Frame Error Control Field + fecf_loc = count; + tm_frame.tm_sec_trailer.fecf = Crypto_Calc_FECF((uint8_t *)tempTM, count); + tempTM[count++] = (uint8_t)((tm_frame.tm_sec_trailer.fecf & 0xFF00) >> 8); + tempTM[count++] = (uint8_t)(tm_frame.tm_sec_trailer.fecf & 0x00FF); + + // Determine Mode + // Clear + if ((sa_ptr->est == 0) && (sa_ptr->ast == 0)) + { +#ifdef DEBUG + printf(KBLU "Creating a TM - CLEAR! \n" RESET); +#endif + // Copy temporary frame to ingest + memcpy(ingest, tempTM, count); + } + // Authenticated Encryption + else if ((sa_ptr->est == 1) && (sa_ptr->ast == 1)) + { +#ifdef DEBUG + printf(KBLU "Creating a TM - AUTHENTICATED ENCRYPTION! \n" RESET); +#endif + + // Copy TM to ingest + memcpy(ingest, tempTM, pdu_loc); + +#ifdef MAC_DEBUG + printf("AAD = 0x"); +#endif + // Prepare additional authenticated data + for (y = 0; y < sa_ptr->abm_len; y++) + { + aad[y] = ingest[y] & *(sa_ptr->abm + y); +#ifdef MAC_DEBUG + printf("%02x", aad[y]); +#endif + } +#ifdef MAC_DEBUG + printf("\n"); +#endif + + gcry_error = gcry_cipher_open(&(tmp_hd), GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_open error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + gcry_error = gcry_cipher_setkey(tmp_hd, &(ek_ring[sa_ptr->ekid].value[0]), KEY_SIZE); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_setkey error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + gcry_error = gcry_cipher_setiv(tmp_hd, sa_ptr->iv, sa_ptr->shivf_len); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_setiv error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + gcry_error = gcry_cipher_encrypt(tmp_hd, + &(ingest[pdu_loc]), // ciphertext output + pdu_len, // length of data + &(tempTM[pdu_loc]), // plaintext input + pdu_len // in data length + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_decrypt error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + gcry_error = gcry_cipher_authenticate(tmp_hd, + &(aad[0]), // additional authenticated data + sa_ptr->abm_len // length of AAD + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_authenticate error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + gcry_error = gcry_cipher_gettag(tmp_hd, + &(ingest[mac_loc]), // tag output + MAC_SIZE // tag size + ); + if ((gcry_error & GPG_ERR_CODE_MASK) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcry_cipher_checktag error code %d\n" RESET, gcry_error & GPG_ERR_CODE_MASK); + status = CRYPTO_LIB_ERROR; + return status; + } + +#ifdef MAC_DEBUG + printf("MAC = 0x"); + for (x = 0; x < MAC_SIZE; x++) + { + printf("%02x", (uint8_t)ingest[x + mac_loc]); + } + printf("\n"); +#endif + + // Update OCF + y = 0; + for (x = OCF_SIZE; x > 0; x--) + { + ingest[fecf_loc - x] = tm_frame.tm_sec_trailer.ocf[y++]; + } + + // Update FECF + tm_frame.tm_sec_trailer.fecf = Crypto_Calc_FECF((uint8_t *)ingest, fecf_loc - 1); + ingest[fecf_loc] = (uint8_t)((tm_frame.tm_sec_trailer.fecf & 0xFF00) >> 8); + ingest[fecf_loc + 1] = (uint8_t)(tm_frame.tm_sec_trailer.fecf & 0x00FF); + } + // Authentication + else if ((sa_ptr->est == 0) && (sa_ptr->ast == 1)) + { +#ifdef DEBUG + printf(KBLU "Creating a TM - AUTHENTICATED! \n" RESET); +#endif + // TODO: Future work. Operationally same as clear. + memcpy(ingest, tempTM, count); + } + // Encryption + else if ((sa_ptr->est == 1) && (sa_ptr->ast == 0)) + { +#ifdef DEBUG + printf(KBLU "Creating a TM - ENCRYPTED! \n" RESET); +#endif + // TODO: Future work. Operationally same as clear. + memcpy(ingest, tempTM, count); + } + +#ifdef TM_DEBUG + Crypto_tmPrint(&tm_frame); +#endif + +#ifdef DEBUG + printf(KYEL "----- Crypto_TM_ApplySecurity END -----\n" RESET); +#endif + + *len_ingest = count; + return status; +} + +/** + * @brief Function: Crypto_TM_ProcessSecurity + * @param ingest: uint8_t* + * @param len_ingest: int* + * @return int32: Success/Failure + **/ +int32_t Crypto_TM_ProcessSecurity(uint8_t *ingest, int *len_ingest) +{ + // Local Variables + int32_t status = CRYPTO_LIB_SUCCESS; + +#ifdef DEBUG + printf(KYEL "\n----- Crypto_TM_ProcessSecurity START -----\n" RESET); +#endif + + // TODO: This whole function! + len_ingest = len_ingest; + ingest[0] = ingest[0]; + +#ifdef DEBUG + printf(KYEL "----- Crypto_TM_ProcessSecurity END -----\n" RESET); +#endif + + return status; +} \ No newline at end of file diff --git a/src/src_main/sadb_routine_inmemory.template.c b/src/src_main/sadb_routine_inmemory.template.c index 26af9fcd..fe4488ea 100644 --- a/src/src_main/sadb_routine_inmemory.template.c +++ b/src/src_main/sadb_routine_inmemory.template.c @@ -13,10 +13,6 @@ */ #include "crypto.h" -#include "crypto_error.h" -#include "crypto_print.h" -#include "crypto_structs.h" -#include "sadb_routine.h" // Security Association Initialization Functions int32_t sadb_config(void); @@ -40,7 +36,7 @@ int32_t sadb_sa_delete(void); ** Global Variables */ // Security -static SadbRoutineStruct sadb_routine; +static SadbRoutineStruct sadb_routine_struct; static SecurityAssociation_t sa[NUM_SA]; /** @@ -49,21 +45,21 @@ static SecurityAssociation_t sa[NUM_SA]; **/ SadbRoutine get_sadb_routine_inmemory(void) { - sadb_routine.sadb_config = sadb_config; - sadb_routine.sadb_init = sadb_init; - sadb_routine.sadb_close = sadb_close; - sadb_routine.sadb_get_sa_from_spi = sadb_get_sa_from_spi; - sadb_routine.sadb_get_operational_sa_from_gvcid = sadb_get_operational_sa_from_gvcid; - sadb_routine.sadb_save_sa = sadb_save_sa; - sadb_routine.sadb_sa_start = sadb_sa_start; - sadb_routine.sadb_sa_expire = sadb_sa_expire; - sadb_routine.sadb_sa_rekey = sadb_sa_rekey; - sadb_routine.sadb_sa_status = sadb_sa_status; - sadb_routine.sadb_sa_create = sadb_sa_create; - sadb_routine.sadb_sa_setARSN = sadb_sa_setARSN; - sadb_routine.sadb_sa_setARSNW = sadb_sa_setARSNW; - sadb_routine.sadb_sa_delete = sadb_sa_delete; - return &sadb_routine; + sadb_routine_struct.sadb_config = sadb_config; + sadb_routine_struct.sadb_init = sadb_init; + sadb_routine_struct.sadb_close = sadb_close; + sadb_routine_struct.sadb_get_sa_from_spi = sadb_get_sa_from_spi; + sadb_routine_struct.sadb_get_operational_sa_from_gvcid = sadb_get_operational_sa_from_gvcid; + sadb_routine_struct.sadb_save_sa = sadb_save_sa; + sadb_routine_struct.sadb_sa_start = sadb_sa_start; + sadb_routine_struct.sadb_sa_expire = sadb_sa_expire; + sadb_routine_struct.sadb_sa_rekey = sadb_sa_rekey; + sadb_routine_struct.sadb_sa_status = sadb_sa_status; + sadb_routine_struct.sadb_sa_create = sadb_sa_create; + sadb_routine_struct.sadb_sa_setARSN = sadb_sa_setARSN; + sadb_routine_struct.sadb_sa_setARSNW = sadb_sa_setARSNW; + sadb_routine_struct.sadb_sa_delete = sadb_sa_delete; + return &sadb_routine_struct; } /** diff --git a/util/CMakeLists.txt b/util/CMakeLists.txt index 960b3cc9..d0b8eb33 100644 --- a/util/CMakeLists.txt +++ b/util/CMakeLists.txt @@ -16,7 +16,7 @@ # jstar-development-team@mail.nasa.gov include_directories(include) -include_directories(../crypto/public_inc) +include_directories(../include) if(${ENCTEST}) find_package (Python3 REQUIRED COMPONENTS Interpreter Development) From 41ac423410eacb16e629682eacfbc1b6763486cd Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 14:00:03 -0500 Subject: [PATCH 15/18] #1 - Additional expandsion of crypto.c into crypto_config and crypto_user files; --- src/src_main/crypto.c | 1253 +--------------------------------- src/src_main/crypto_config.c | 845 +++++++++++++++++++++++ src/src_main/crypto_tc.c | 65 +- src/src_main/crypto_tm.c | 201 +++++- src/src_main/crypto_user.c | 188 +++++ 5 files changed, 1299 insertions(+), 1253 deletions(-) create mode 100644 src/src_main/crypto_config.c create mode 100644 src/src_main/crypto_user.c diff --git a/src/src_main/crypto.c b/src/src_main/crypto.c index d745a16c..f9617cb0 100644 --- a/src/src_main/crypto.c +++ b/src/src_main/crypto.c @@ -59,881 +59,9 @@ uint8_t badFECF = 0; uint32_t crc32Table[256]; uint16_t crc16Table[256]; -/* -** Initialization Functions -*/ - -/** - * @brief Function: Crypto_Init_Unit_test - * @return int32: status - **/ -int32_t Crypto_Init_Unit_Test(void) -{ - int32_t status = CRYPTO_LIB_SUCCESS; - Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR, - TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, - TC_CHECK_FECF_TRUE, 0x3F); - Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS); - Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 1, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS); - status = Crypto_Init(); - return status; -} - -/** - * @brief Function: Crypto_Init_With_Configs - * @param crypto_config_p: CryptoConfig_t* - * @param gvcid_managed_parameters_p: GvcidManagedParameters_t* - * @param sadb_mariadb_config_p: SadbMariaDBConfig_t* - * @return int32: Success/Failure - **/ -int32_t Crypto_Init_With_Configs(CryptoConfig_t *crypto_config_p, GvcidManagedParameters_t *gvcid_managed_parameters_p, - SadbMariaDBConfig_t *sadb_mariadb_config_p) -{ - int32_t status = CRYPTO_LIB_SUCCESS; - crypto_config = crypto_config_p; - gvcid_managed_parameters = gvcid_managed_parameters_p; - sadb_mariadb_config = sadb_mariadb_config_p; - status = Crypto_Init(); - return status; -} - -/** - * @brief Function Crypto_Init - * Initializes libgcrypt, Security Associations - **/ -int32_t Crypto_Init(void) -{ - int32_t status = CRYPTO_LIB_SUCCESS; - - if (crypto_config == NULL) - { - status = CRYPTO_CONFIGURATION_NOT_COMPLETE; - printf(KRED "ERROR: CryptoLib must be configured before intializing!\n" RESET); - return status; // No configuration set -- return! - } - if (gvcid_managed_parameters == NULL) - { - status = CRYPTO_MANAGED_PARAM_CONFIGURATION_NOT_COMPLETE; - printf(KRED "ERROR: CryptoLib Managed Parameters must be configured before intializing!\n" RESET); - return status; // No Managed Parameter configuration set -- return! - } - -#ifdef TC_DEBUG - Crypto_mpPrint(gvcid_managed_parameters, 1); -#endif - - // Prepare SADB type from config - if (crypto_config->sadb_type == SADB_TYPE_INMEMORY) - { - sadb_routine = get_sadb_routine_inmemory(); - } - else if (crypto_config->sadb_type == SADB_TYPE_MARIADB) - { - if (sadb_mariadb_config == NULL) - { - status = CRYPTO_MARIADB_CONFIGURATION_NOT_COMPLETE; - printf(KRED "ERROR: CryptoLib MariaDB must be configured before intializing!\n" RESET); - return status; // MariaDB connection specified but no configuration exists, return! - } - sadb_routine = get_sadb_routine_mariadb(); - } - else - { - status = SADB_INVALID_SADB_TYPE; - return status; - } // TODO: Error stack - - // Initialize libgcrypt - if (!gcry_check_version(GCRYPT_VERSION)) - { - fprintf(stderr, "Gcrypt Version: %s", GCRYPT_VERSION); - printf(KRED "\tERROR: gcrypt version mismatch! \n" RESET); - } - if (gcry_control(GCRYCTL_SELFTEST) != GPG_ERR_NO_ERROR) - { - printf(KRED "ERROR: gcrypt self test failed\n" RESET); - } - gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); - - // Init Security Associations - status = sadb_routine->sadb_init(); - status = sadb_routine->sadb_config(); - - Crypto_Local_Init(); - Crypto_Local_Config(); - - // TODO - Add error checking - - // Init table for CRC calculations - Crypto_Calc_CRC_Init_Table(); - - // cFS Standard Initialized Message - printf(KBLU "Crypto Lib Intialized. Version %d.%d.%d.%d\n" RESET, CRYPTO_LIB_MAJOR_VERSION, - CRYPTO_LIB_MINOR_VERSION, CRYPTO_LIB_REVISION, CRYPTO_LIB_MISSION_REV); - - return status; -} - -/** - * @brief Function: Crypto_Shutdown - * Free memory objects & restore pointers to NULL for re-initialization - * @return int32: Success/Failure - **/ -int32_t Crypto_Shutdown(void) -{ - int32_t status = CRYPTO_LIB_SUCCESS; - - if (crypto_config != NULL) - { - free(crypto_config); - crypto_config = NULL; - } - if (sadb_mariadb_config != NULL) - { - free(sadb_mariadb_config); - sadb_mariadb_config = NULL; - } - current_managed_parameters = NULL; - - if (gvcid_managed_parameters != NULL) - { - Crypto_Free_Managed_Parameters(gvcid_managed_parameters); - gvcid_managed_parameters = NULL; - } - - return status; -} - -/** - * @brief Function: Crypto_Config_CryptoLib - * @param sadb_type: uint8 - * @param crypto_create_fecf: uint8 - * @param process_sdls_pdus: uint8 - * @param has_pus_hdr: uint8 - * @param ignore_sa_state: uint8 - * @param ignore_anti_replay: uint8 - * @param unique_sa_per_mapid: uint8 - * @param crypto_check_fecf: uint8 - * @param vcid_bitmask: uint8 - * @return int32: Success/Failure - **/ -int32_t Crypto_Config_CryptoLib(uint8_t sadb_type, uint8_t crypto_create_fecf, uint8_t process_sdls_pdus, - uint8_t has_pus_hdr, uint8_t ignore_sa_state, uint8_t ignore_anti_replay, - uint8_t unique_sa_per_mapid, uint8_t crypto_check_fecf, uint8_t vcid_bitmask) -{ - int32_t status = CRYPTO_LIB_SUCCESS; - crypto_config = (CryptoConfig_t *)calloc(1, CRYPTO_CONFIG_SIZE); - crypto_config->sadb_type = sadb_type; - crypto_config->crypto_create_fecf = crypto_create_fecf; - crypto_config->process_sdls_pdus = process_sdls_pdus; - crypto_config->has_pus_hdr = has_pus_hdr; - crypto_config->ignore_sa_state = ignore_sa_state; - crypto_config->ignore_anti_replay = ignore_anti_replay; - crypto_config->unique_sa_per_mapid = unique_sa_per_mapid; - crypto_config->crypto_check_fecf = crypto_check_fecf; - crypto_config->vcid_bitmask = vcid_bitmask; - return status; -} - -/** - * @brief Function: Crypto_Config_MariaDB - * @param mysql_username: uint8_t* - * @param mysql_password: uint8_t* - * @param mysql_hostname: uint8_t* - * @param mysql_database: uint8_t* - * @param mysql_port: uint16 - * @return int32: Success/Failure - **/ -int32_t Crypto_Config_MariaDB(uint8_t *mysql_username, uint8_t *mysql_password, uint8_t *mysql_hostname, - uint8_t *mysql_database, uint16_t mysql_port) -{ - int32_t status = CRYPTO_LIB_SUCCESS; - sadb_mariadb_config = (SadbMariaDBConfig_t *)calloc(1, SADB_MARIADB_CONFIG_SIZE); - sadb_mariadb_config->mysql_username = mysql_username; - sadb_mariadb_config->mysql_password = mysql_password; - sadb_mariadb_config->mysql_hostname = mysql_hostname; - sadb_mariadb_config->mysql_database = mysql_database; - sadb_mariadb_config->mysql_port = mysql_port; - return status; -} - -/** - * @brief Function: Crypto_Config_Add_Gvcid_Managed_Parameter - * @param tfvn: uint8 - * @param scid: uint16 - * @param vcid: uint8 - * @param has_fecf: uint8 - * @param has_segmentation_hdr: uint8 - * @return int32: Success/Failure - **/ -int32_t Crypto_Config_Add_Gvcid_Managed_Parameter(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, - uint8_t has_segmentation_hdr) -{ - int32_t status = CRYPTO_LIB_SUCCESS; - - if (gvcid_managed_parameters == NULL) - { // case: Global Root Node not Set - gvcid_managed_parameters = (GvcidManagedParameters_t *)calloc(1, GVCID_MANAGED_PARAMETERS_SIZE); - gvcid_managed_parameters->tfvn = tfvn; - gvcid_managed_parameters->scid = scid; - gvcid_managed_parameters->vcid = vcid; - gvcid_managed_parameters->has_fecf = has_fecf; - gvcid_managed_parameters->has_segmentation_hdr = has_segmentation_hdr; - gvcid_managed_parameters->next = NULL; - return status; - } - else - { // Recurse through nodes and add at end - return crypto_config_add_gvcid_managed_parameter_recursion(tfvn, scid, vcid, has_fecf, has_segmentation_hdr, - gvcid_managed_parameters); - } -} - -/** - * @brief Function: crypto_config_add_gvcid_managed_parameter_recursion - * @param tfvn: uint8 - * @param scid: uint16 - * @param vcid: uint8 - * @param has_fecf: uint8 - * @param has_segmentation_hdr: uint8 - * @param managed_parameter: GvcidManagedParameters_t* - * @return int32: Success/Failure - **/ -int32_t crypto_config_add_gvcid_managed_parameter_recursion(uint8_t tfvn, uint16_t scid, uint8_t vcid, - uint8_t has_fecf, uint8_t has_segmentation_hdr, - GvcidManagedParameters_t *managed_parameter) -{ - if (managed_parameter->next != NULL) - { - return crypto_config_add_gvcid_managed_parameter_recursion(tfvn, scid, vcid, has_fecf, has_segmentation_hdr, - managed_parameter->next); - } - else - { - managed_parameter->next = (GvcidManagedParameters_t *)calloc(1, GVCID_MANAGED_PARAMETERS_SIZE); - managed_parameter->next->tfvn = tfvn; - managed_parameter->next->scid = scid; - managed_parameter->next->vcid = vcid; - managed_parameter->next->has_fecf = has_fecf; - managed_parameter->next->has_segmentation_hdr = has_segmentation_hdr; - managed_parameter->next->next = NULL; - return CRYPTO_LIB_SUCCESS; - } -} - -/** - * @brief Function: Crypto_Local_Config - * Initalizes TM Configuration, Log, and Keyrings - **/ -void Crypto_Local_Config(void) -{ - // Initial TM configuration - tm_frame.tm_sec_header.spi = 1; - - // Initialize Log - log_summary.num_se = 2; - log_summary.rs = LOG_SIZE; - // Add a two messages to the log - log_summary.rs--; - mc_log.blk[log_count].emt = STARTUP; - mc_log.blk[log_count].emv[0] = 0x4E; - mc_log.blk[log_count].emv[1] = 0x41; - mc_log.blk[log_count].emv[2] = 0x53; - mc_log.blk[log_count].emv[3] = 0x41; - mc_log.blk[log_count++].em_len = 4; - log_summary.rs--; - mc_log.blk[log_count].emt = STARTUP; - mc_log.blk[log_count].emv[0] = 0x4E; - mc_log.blk[log_count].emv[1] = 0x41; - mc_log.blk[log_count].emv[2] = 0x53; - mc_log.blk[log_count].emv[3] = 0x41; - mc_log.blk[log_count++].em_len = 4; - - // Master Keys - // 0 - 000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F -> ACTIVE - ek_ring[0].value[0] = 0x00; - ek_ring[0].value[1] = 0x01; - ek_ring[0].value[2] = 0x02; - ek_ring[0].value[3] = 0x03; - ek_ring[0].value[4] = 0x04; - ek_ring[0].value[5] = 0x05; - ek_ring[0].value[6] = 0x06; - ek_ring[0].value[7] = 0x07; - ek_ring[0].value[8] = 0x08; - ek_ring[0].value[9] = 0x09; - ek_ring[0].value[10] = 0x0A; - ek_ring[0].value[11] = 0x0B; - ek_ring[0].value[12] = 0x0C; - ek_ring[0].value[13] = 0x0D; - ek_ring[0].value[14] = 0x0E; - ek_ring[0].value[15] = 0x0F; - ek_ring[0].value[16] = 0x00; - ek_ring[0].value[17] = 0x01; - ek_ring[0].value[18] = 0x02; - ek_ring[0].value[19] = 0x03; - ek_ring[0].value[20] = 0x04; - ek_ring[0].value[21] = 0x05; - ek_ring[0].value[22] = 0x06; - ek_ring[0].value[23] = 0x07; - ek_ring[0].value[24] = 0x08; - ek_ring[0].value[25] = 0x09; - ek_ring[0].value[26] = 0x0A; - ek_ring[0].value[27] = 0x0B; - ek_ring[0].value[28] = 0x0C; - ek_ring[0].value[29] = 0x0D; - ek_ring[0].value[30] = 0x0E; - ek_ring[0].value[31] = 0x0F; - ek_ring[0].key_state = KEY_ACTIVE; - // 1 - 101112131415161718191A1B1C1D1E1F101112131415161718191A1B1C1D1E1F -> ACTIVE - ek_ring[1].value[0] = 0x10; - ek_ring[1].value[1] = 0x11; - ek_ring[1].value[2] = 0x12; - ek_ring[1].value[3] = 0x13; - ek_ring[1].value[4] = 0x14; - ek_ring[1].value[5] = 0x15; - ek_ring[1].value[6] = 0x16; - ek_ring[1].value[7] = 0x17; - ek_ring[1].value[8] = 0x18; - ek_ring[1].value[9] = 0x19; - ek_ring[1].value[10] = 0x1A; - ek_ring[1].value[11] = 0x1B; - ek_ring[1].value[12] = 0x1C; - ek_ring[1].value[13] = 0x1D; - ek_ring[1].value[14] = 0x1E; - ek_ring[1].value[15] = 0x1F; - ek_ring[1].value[16] = 0x10; - ek_ring[1].value[17] = 0x11; - ek_ring[1].value[18] = 0x12; - ek_ring[1].value[19] = 0x13; - ek_ring[1].value[20] = 0x14; - ek_ring[1].value[21] = 0x15; - ek_ring[1].value[22] = 0x16; - ek_ring[1].value[23] = 0x17; - ek_ring[1].value[24] = 0x18; - ek_ring[1].value[25] = 0x19; - ek_ring[1].value[26] = 0x1A; - ek_ring[1].value[27] = 0x1B; - ek_ring[1].value[28] = 0x1C; - ek_ring[1].value[29] = 0x1D; - ek_ring[1].value[30] = 0x1E; - ek_ring[1].value[31] = 0x1F; - ek_ring[1].key_state = KEY_ACTIVE; - // 2 - 202122232425262728292A2B2C2D2E2F202122232425262728292A2B2C2D2E2F -> ACTIVE - ek_ring[2].value[0] = 0x20; - ek_ring[2].value[1] = 0x21; - ek_ring[2].value[2] = 0x22; - ek_ring[2].value[3] = 0x23; - ek_ring[2].value[4] = 0x24; - ek_ring[2].value[5] = 0x25; - ek_ring[2].value[6] = 0x26; - ek_ring[2].value[7] = 0x27; - ek_ring[2].value[8] = 0x28; - ek_ring[2].value[9] = 0x29; - ek_ring[2].value[10] = 0x2A; - ek_ring[2].value[11] = 0x2B; - ek_ring[2].value[12] = 0x2C; - ek_ring[2].value[13] = 0x2D; - ek_ring[2].value[14] = 0x2E; - ek_ring[2].value[15] = 0x2F; - ek_ring[2].value[16] = 0x20; - ek_ring[2].value[17] = 0x21; - ek_ring[2].value[18] = 0x22; - ek_ring[2].value[19] = 0x23; - ek_ring[2].value[20] = 0x24; - ek_ring[2].value[21] = 0x25; - ek_ring[2].value[22] = 0x26; - ek_ring[2].value[23] = 0x27; - ek_ring[2].value[24] = 0x28; - ek_ring[2].value[25] = 0x29; - ek_ring[2].value[26] = 0x2A; - ek_ring[2].value[27] = 0x2B; - ek_ring[2].value[28] = 0x2C; - ek_ring[2].value[29] = 0x2D; - ek_ring[2].value[30] = 0x2E; - ek_ring[2].value[31] = 0x2F; - ek_ring[2].key_state = KEY_ACTIVE; - - // Session Keys - // 128 - 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF -> ACTIVE - ek_ring[128].value[0] = 0x01; - ek_ring[128].value[1] = 0x23; - ek_ring[128].value[2] = 0x45; - ek_ring[128].value[3] = 0x67; - ek_ring[128].value[4] = 0x89; - ek_ring[128].value[5] = 0xAB; - ek_ring[128].value[6] = 0xCD; - ek_ring[128].value[7] = 0xEF; - ek_ring[128].value[8] = 0x01; - ek_ring[128].value[9] = 0x23; - ek_ring[128].value[10] = 0x45; - ek_ring[128].value[11] = 0x67; - ek_ring[128].value[12] = 0x89; - ek_ring[128].value[13] = 0xAB; - ek_ring[128].value[14] = 0xCD; - ek_ring[128].value[15] = 0xEF; - ek_ring[128].value[16] = 0x01; - ek_ring[128].value[17] = 0x23; - ek_ring[128].value[18] = 0x45; - ek_ring[128].value[19] = 0x67; - ek_ring[128].value[20] = 0x89; - ek_ring[128].value[21] = 0xAB; - ek_ring[128].value[22] = 0xCD; - ek_ring[128].value[23] = 0xEF; - ek_ring[128].value[24] = 0x01; - ek_ring[128].value[25] = 0x23; - ek_ring[128].value[26] = 0x45; - ek_ring[128].value[27] = 0x67; - ek_ring[128].value[28] = 0x89; - ek_ring[128].value[29] = 0xAB; - ek_ring[128].value[30] = 0xCD; - ek_ring[128].value[31] = 0xEF; - ek_ring[128].key_state = KEY_ACTIVE; - // 129 - ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789 -> ACTIVE - ek_ring[129].value[0] = 0xAB; - ek_ring[129].value[1] = 0xCD; - ek_ring[129].value[2] = 0xEF; - ek_ring[129].value[3] = 0x01; - ek_ring[129].value[4] = 0x23; - ek_ring[129].value[5] = 0x45; - ek_ring[129].value[6] = 0x67; - ek_ring[129].value[7] = 0x89; - ek_ring[129].value[8] = 0xAB; - ek_ring[129].value[9] = 0xCD; - ek_ring[129].value[10] = 0xEF; - ek_ring[129].value[11] = 0x01; - ek_ring[129].value[12] = 0x23; - ek_ring[129].value[13] = 0x45; - ek_ring[129].value[14] = 0x67; - ek_ring[129].value[15] = 0x89; - ek_ring[129].value[16] = 0xAB; - ek_ring[129].value[17] = 0xCD; - ek_ring[129].value[18] = 0xEF; - ek_ring[129].value[19] = 0x01; - ek_ring[129].value[20] = 0x23; - ek_ring[129].value[21] = 0x45; - ek_ring[129].value[22] = 0x67; - ek_ring[129].value[23] = 0x89; - ek_ring[129].value[24] = 0xAB; - ek_ring[129].value[25] = 0xCD; - ek_ring[129].value[26] = 0xEF; - ek_ring[129].value[27] = 0x01; - ek_ring[129].value[28] = 0x23; - ek_ring[129].value[29] = 0x45; - ek_ring[129].value[30] = 0x67; - ek_ring[129].value[31] = 0x89; - ek_ring[129].key_state = KEY_ACTIVE; - // 130 - FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210 -> ACTIVE - ek_ring[130].value[0] = 0xFE; - ek_ring[130].value[1] = 0xDC; - ek_ring[130].value[2] = 0xBA; - ek_ring[130].value[3] = 0x98; - ek_ring[130].value[4] = 0x76; - ek_ring[130].value[5] = 0x54; - ek_ring[130].value[6] = 0x32; - ek_ring[130].value[7] = 0x10; - ek_ring[130].value[8] = 0xFE; - ek_ring[130].value[9] = 0xDC; - ek_ring[130].value[10] = 0xBA; - ek_ring[130].value[11] = 0x98; - ek_ring[130].value[12] = 0x76; - ek_ring[130].value[13] = 0x54; - ek_ring[130].value[14] = 0x32; - ek_ring[130].value[15] = 0x10; - ek_ring[130].value[16] = 0xFE; - ek_ring[130].value[17] = 0xDC; - ek_ring[130].value[18] = 0xBA; - ek_ring[130].value[19] = 0x98; - ek_ring[130].value[20] = 0x76; - ek_ring[130].value[21] = 0x54; - ek_ring[130].value[22] = 0x32; - ek_ring[130].value[23] = 0x10; - ek_ring[130].value[24] = 0xFE; - ek_ring[130].value[25] = 0xDC; - ek_ring[130].value[26] = 0xBA; - ek_ring[130].value[27] = 0x98; - ek_ring[130].value[28] = 0x76; - ek_ring[130].value[29] = 0x54; - ek_ring[130].value[30] = 0x32; - ek_ring[130].value[31] = 0x10; - ek_ring[130].key_state = KEY_ACTIVE; - // 131 - 9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA -> ACTIVE - ek_ring[131].value[0] = 0x98; - ek_ring[131].value[1] = 0x76; - ek_ring[131].value[2] = 0x54; - ek_ring[131].value[3] = 0x32; - ek_ring[131].value[4] = 0x10; - ek_ring[131].value[5] = 0xFE; - ek_ring[131].value[6] = 0xDC; - ek_ring[131].value[7] = 0xBA; - ek_ring[131].value[8] = 0x98; - ek_ring[131].value[9] = 0x76; - ek_ring[131].value[10] = 0x54; - ek_ring[131].value[11] = 0x32; - ek_ring[131].value[12] = 0x10; - ek_ring[131].value[13] = 0xFE; - ek_ring[131].value[14] = 0xDC; - ek_ring[131].value[15] = 0xBA; - ek_ring[131].value[16] = 0x98; - ek_ring[131].value[17] = 0x76; - ek_ring[131].value[18] = 0x54; - ek_ring[131].value[19] = 0x32; - ek_ring[131].value[20] = 0x10; - ek_ring[131].value[21] = 0xFE; - ek_ring[131].value[22] = 0xDC; - ek_ring[131].value[23] = 0xBA; - ek_ring[131].value[24] = 0x98; - ek_ring[131].value[25] = 0x76; - ek_ring[131].value[26] = 0x54; - ek_ring[131].value[27] = 0x32; - ek_ring[131].value[28] = 0x10; - ek_ring[131].value[29] = 0xFE; - ek_ring[131].value[30] = 0xDC; - ek_ring[131].value[31] = 0xBA; - ek_ring[131].key_state = KEY_ACTIVE; - // 132 - 0123456789ABCDEFABCDEF01234567890123456789ABCDEFABCDEF0123456789 -> PRE_ACTIVATION - ek_ring[132].value[0] = 0x01; - ek_ring[132].value[1] = 0x23; - ek_ring[132].value[2] = 0x45; - ek_ring[132].value[3] = 0x67; - ek_ring[132].value[4] = 0x89; - ek_ring[132].value[5] = 0xAB; - ek_ring[132].value[6] = 0xCD; - ek_ring[132].value[7] = 0xEF; - ek_ring[132].value[8] = 0xAB; - ek_ring[132].value[9] = 0xCD; - ek_ring[132].value[10] = 0xEF; - ek_ring[132].value[11] = 0x01; - ek_ring[132].value[12] = 0x23; - ek_ring[132].value[13] = 0x45; - ek_ring[132].value[14] = 0x67; - ek_ring[132].value[15] = 0x89; - ek_ring[132].value[16] = 0x01; - ek_ring[132].value[17] = 0x23; - ek_ring[132].value[18] = 0x45; - ek_ring[132].value[19] = 0x67; - ek_ring[132].value[20] = 0x89; - ek_ring[132].value[21] = 0xAB; - ek_ring[132].value[22] = 0xCD; - ek_ring[132].value[23] = 0xEF; - ek_ring[132].value[24] = 0xAB; - ek_ring[132].value[25] = 0xCD; - ek_ring[132].value[26] = 0xEF; - ek_ring[132].value[27] = 0x01; - ek_ring[132].value[28] = 0x23; - ek_ring[132].value[29] = 0x45; - ek_ring[132].value[30] = 0x67; - ek_ring[132].value[31] = 0x89; - ek_ring[132].key_state = KEY_PREACTIVE; - // 133 - ABCDEF01234567890123456789ABCDEFABCDEF01234567890123456789ABCDEF -> ACTIVE - ek_ring[133].value[0] = 0xAB; - ek_ring[133].value[1] = 0xCD; - ek_ring[133].value[2] = 0xEF; - ek_ring[133].value[3] = 0x01; - ek_ring[133].value[4] = 0x23; - ek_ring[133].value[5] = 0x45; - ek_ring[133].value[6] = 0x67; - ek_ring[133].value[7] = 0x89; - ek_ring[133].value[8] = 0x01; - ek_ring[133].value[9] = 0x23; - ek_ring[133].value[10] = 0x45; - ek_ring[133].value[11] = 0x67; - ek_ring[133].value[12] = 0x89; - ek_ring[133].value[13] = 0xAB; - ek_ring[133].value[14] = 0xCD; - ek_ring[133].value[15] = 0xEF; - ek_ring[133].value[16] = 0xAB; - ek_ring[133].value[17] = 0xCD; - ek_ring[133].value[18] = 0xEF; - ek_ring[133].value[19] = 0x01; - ek_ring[133].value[20] = 0x23; - ek_ring[133].value[21] = 0x45; - ek_ring[133].value[22] = 0x67; - ek_ring[133].value[23] = 0x89; - ek_ring[133].value[24] = 0x01; - ek_ring[133].value[25] = 0x23; - ek_ring[133].value[26] = 0x45; - ek_ring[133].value[27] = 0x67; - ek_ring[133].value[28] = 0x89; - ek_ring[133].value[29] = 0xAB; - ek_ring[133].value[30] = 0xCD; - ek_ring[133].value[31] = 0xEF; - ek_ring[133].key_state = KEY_ACTIVE; - // 134 - ABCDEF0123456789FEDCBA9876543210ABCDEF0123456789FEDCBA9876543210 -> DEACTIVE - ek_ring[134].value[0] = 0xAB; - ek_ring[134].value[1] = 0xCD; - ek_ring[134].value[2] = 0xEF; - ek_ring[134].value[3] = 0x01; - ek_ring[134].value[4] = 0x23; - ek_ring[134].value[5] = 0x45; - ek_ring[134].value[6] = 0x67; - ek_ring[134].value[7] = 0x89; - ek_ring[134].value[8] = 0xFE; - ek_ring[134].value[9] = 0xDC; - ek_ring[134].value[10] = 0xBA; - ek_ring[134].value[11] = 0x98; - ek_ring[134].value[12] = 0x76; - ek_ring[134].value[13] = 0x54; - ek_ring[134].value[14] = 0x32; - ek_ring[134].value[15] = 0x10; - ek_ring[134].value[16] = 0xAB; - ek_ring[134].value[17] = 0xCD; - ek_ring[134].value[18] = 0xEF; - ek_ring[134].value[19] = 0x01; - ek_ring[134].value[20] = 0x23; - ek_ring[134].value[21] = 0x45; - ek_ring[134].value[22] = 0x67; - ek_ring[134].value[23] = 0x89; - ek_ring[134].value[24] = 0xFE; - ek_ring[134].value[25] = 0xDC; - ek_ring[134].value[26] = 0xBA; - ek_ring[134].value[27] = 0x98; - ek_ring[134].value[28] = 0x76; - ek_ring[134].value[29] = 0x54; - ek_ring[134].value[30] = 0x32; - ek_ring[134].value[31] = 0x10; - ek_ring[134].key_state = KEY_DEACTIVATED; - - // 135 - ABCDEF0123456789FEDCBA9876543210ABCDEF0123456789FEDCBA9876543210 -> DEACTIVE - ek_ring[135].value[0] = 0x00; - ek_ring[135].value[1] = 0x00; - ek_ring[135].value[2] = 0x00; - ek_ring[135].value[3] = 0x00; - ek_ring[135].value[4] = 0x00; - ek_ring[135].value[5] = 0x00; - ek_ring[135].value[6] = 0x00; - ek_ring[135].value[7] = 0x00; - ek_ring[135].value[8] = 0x00; - ek_ring[135].value[9] = 0x00; - ek_ring[135].value[10] = 0x00; - ek_ring[135].value[11] = 0x00; - ek_ring[135].value[12] = 0x00; - ek_ring[135].value[13] = 0x00; - ek_ring[135].value[14] = 0x00; - ek_ring[135].value[15] = 0x00; - ek_ring[135].value[16] = 0x00; - ek_ring[135].value[17] = 0x00; - ek_ring[135].value[18] = 0x00; - ek_ring[135].value[19] = 0x00; - ek_ring[135].value[20] = 0x00; - ek_ring[135].value[21] = 0x00; - ek_ring[135].value[22] = 0x00; - ek_ring[135].value[23] = 0x00; - ek_ring[135].value[24] = 0x00; - ek_ring[135].value[25] = 0x00; - ek_ring[135].value[26] = 0x00; - ek_ring[135].value[27] = 0x00; - ek_ring[135].value[28] = 0x00; - ek_ring[135].value[29] = 0x00; - ek_ring[135].value[30] = 0x00; - ek_ring[135].value[31] = 0x00; - ek_ring[135].key_state = KEY_DEACTIVATED; - - // 136 - ef9f9284cf599eac3b119905a7d18851e7e374cf63aea04358586b0f757670f8 - // Reference: - // https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip - ek_ring[136].value[0] = 0xff; - ek_ring[136].value[1] = 0x9f; - ek_ring[136].value[2] = 0x92; - ek_ring[136].value[3] = 0x84; - ek_ring[136].value[4] = 0xcf; - ek_ring[136].value[5] = 0x59; - ek_ring[136].value[6] = 0x9e; - ek_ring[136].value[7] = 0xac; - ek_ring[136].value[8] = 0x3b; - ek_ring[136].value[9] = 0x11; - ek_ring[136].value[10] = 0x99; - ek_ring[136].value[11] = 0x05; - ek_ring[136].value[12] = 0xa7; - ek_ring[136].value[13] = 0xd1; - ek_ring[136].value[14] = 0x88; - ek_ring[136].value[15] = 0x51; - ek_ring[136].value[16] = 0xe7; - ek_ring[136].value[17] = 0xe3; - ek_ring[136].value[18] = 0x74; - ek_ring[136].value[19] = 0xcf; - ek_ring[136].value[20] = 0x63; - ek_ring[136].value[21] = 0xae; - ek_ring[136].value[22] = 0xa0; - ek_ring[136].value[23] = 0x43; - ek_ring[136].value[24] = 0x58; - ek_ring[136].value[25] = 0x58; - ek_ring[136].value[26] = 0x6b; - ek_ring[136].value[27] = 0x0f; - ek_ring[136].value[28] = 0x75; - ek_ring[136].value[29] = 0x76; - ek_ring[136].value[30] = 0x70; - ek_ring[136].value[31] = 0xf9; - ek_ring[135].key_state = KEY_DEACTIVATED; -} - -/** - * @brief Function: Crypto_Local_Init - * Initalize TM Frame, CLCW - **/ -void Crypto_Local_Init(void) -{ - - // Initialize TM Frame - // TM Header - tm_frame.tm_header.tfvn = 0; // Shall be 00 for TM-/TC-SDLP - tm_frame.tm_header.scid = SCID & 0x3FF; - tm_frame.tm_header.vcid = 0; - tm_frame.tm_header.ocff = 1; - tm_frame.tm_header.mcfc = 1; - tm_frame.tm_header.vcfc = 1; - tm_frame.tm_header.tfsh = 0; - tm_frame.tm_header.sf = 0; - tm_frame.tm_header.pof = 0; // Shall be set to 0 - tm_frame.tm_header.slid = 3; // Shall be set to 11 - tm_frame.tm_header.fhp = 0; - // TM Security Header - tm_frame.tm_sec_header.spi = 0x0000; - for (int x = 0; x < IV_SIZE; x++) - { // Initialization Vector - *(tm_frame.tm_sec_header.iv + x) = 0x00; - } - // TM Payload Data Unit - for (int x = 0; x < TM_FRAME_DATA_SIZE; x++) - { // Zero TM PDU - tm_frame.tm_pdu[x] = 0x00; - } - // TM Security Trailer - for (int x = 0; x < MAC_SIZE; x++) - { // Zero TM Message Authentication Code - tm_frame.tm_sec_trailer.mac[x] = 0x00; - } - for (int x = 0; x < OCF_SIZE; x++) - { // Zero TM Operational Control Field - tm_frame.tm_sec_trailer.ocf[x] = 0x00; - } - tm_frame.tm_sec_trailer.fecf = 0xFECF; - - // Initialize CLCW - clcw.cwt = 0; // Control Word Type "0" - clcw.cvn = 0; // CLCW Version Number "00" - clcw.sf = 0; // Status Field - clcw.cie = 1; // COP In Effect - clcw.vci = 0; // Virtual Channel Identification - clcw.spare0 = 0; // Reserved Spare - clcw.nrfa = 0; // No RF Avaliable Flag - clcw.nbl = 0; // No Bit Lock Flag - clcw.lo = 0; // Lock-Out Flag - clcw.wait = 0; // Wait Flag - clcw.rt = 0; // Retransmit Flag - clcw.fbc = 0; // FARM-B Counter - clcw.spare1 = 0; // Reserved Spare - clcw.rv = 0; // Report Value - - // Initialize Frame Security Report - report.cwt = 1; // Control Word Type "0b1"" - report.vnum = 4; // FSR Version "0b100"" - report.af = 0; // Alarm Field - report.bsnf = 0; // Bad SN Flag - report.bmacf = 0; // Bad MAC Flag - report.ispif = 0; // Invalid SPI Flag - report.lspiu = 0; // Last SPI Used - report.snval = 0; // SN Value (LSB) -} - -/** - * @brief Function: Crypto_Calc_CRC_Init_Table - * Initialize CRC Table - **/ -void Crypto_Calc_CRC_Init_Table(void) -{ - uint16_t val; - uint32_t poly = 0xEDB88320; - uint32_t crc; - - // http://create.stephan-brumme.com/crc32/ - for (unsigned int i = 0; i <= 0xFF; i++) - { - crc = i; - for (unsigned int j = 0; j < 8; j++) - { - crc = (crc >> 1) ^ (-(int)(crc & 1) & poly); - } - crc32Table[i] = crc; - // printf("crc32Table[%d] = 0x%08x \n", i, crc32Table[i]); - } - - // Code provided by ESA - for (int i = 0; i < 256; i++) - { - val = 0; - if ((i & 1) != 0) - val ^= 0x1021; - if ((i & 2) != 0) - val ^= 0x2042; - if ((i & 4) != 0) - val ^= 0x4084; - if ((i & 8) != 0) - val ^= 0x8108; - if ((i & 16) != 0) - val ^= 0x1231; - if ((i & 32) != 0) - val ^= 0x2462; - if ((i & 64) != 0) - val ^= 0x48C4; - if ((i & 128) != 0) - val ^= 0x9188; - crc16Table[i] = val; - // printf("crc16Table[%d] = 0x%04x \n", i, crc16Table[i]); - } -} - /* ** Assisting Functions */ -/** - * @brief Function: Crypto_Get_tcPayloadLength - * Returns the payload length of current tc_frame in BYTES! - * @param tc_frame: TC_t* - * @param sa_ptr: SecurityAssociation_t - * @return int32, Length of TCPayload - **/ -/* -int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr) -{ - int tf_hdr = 5; - int seg_hdr = 0;if(current_managed_parameters->has_segmentation_hdr==TC_HAS_SEGMENT_HDRS){seg_hdr=1;} - int fecf = 0;if(current_managed_parameters->has_fecf==TC_HAS_FECF){fecf=FECF_SIZE;} - int spi = 2; - int iv_size = sa_ptr->shivf_len; - int mac_size = sa_ptr->stmacf_len; - - #ifdef TC_DEBUG - printf("Get_tcPayloadLength Debug [byte lengths]:\n"); - printf("\thdr.fl\t%d\n", tc_frame->tc_header.fl); - printf("\ttf_hdr\t%d\n",tf_hdr); - printf("\tSeg hdr\t%d\t\n",seg_hdr); - printf("\tspi \t%d\n",spi); - printf("\tiv_size\t%d\n",iv_size); - printf("\tmac\t%d\n",mac_size); - printf("\tfecf \t%d\n",fecf); - printf("\tTOTAL LENGTH: %d\n", (tc_frame->tc_header.fl - (tf_hdr + seg_hdr + spi + iv_size ) - (mac_size + -fecf))); #endif - - return (tc_frame->tc_header.fl + 1 - (tf_hdr + seg_hdr + spi + iv_size ) - (mac_size + fecf) ); -} -*/ - -/** - * @brief Function: Crypto_Get_tmLength - * Returns the total length of the current tm_frame in BYTES! - * @param len: int - * @return int32_t Length of TM - **/ -int32_t Crypto_Get_tmLength(int len) -{ -#ifdef FILL - len = TM_FILL_SIZE; -#else - len = TM_FRAME_PRIMARYHEADER_SIZE + TM_FRAME_SECHEADER_SIZE + len + TM_FRAME_SECTRAILER_SIZE + TM_FRAME_CLCW_SIZE; -#endif - - return len; -} /** * @brief Function: Crypto_Is_AEAD_Algorithm @@ -950,217 +78,6 @@ uint8_t Crypto_Is_AEAD_Algorithm(uint32_t cipher_suite_id) return CRYPTO_TRUE; } -/** - * @brief Function: Crypto_Prepare_TC_AAD - * Callocs and returns pointer to buffer where AAD is created & bitwise-anded with bitmask! - * Note: Function caller is responsible for freeing the returned buffer! - * @param buffer: uint8_t* - * @param len_aad: uint16_t - * @param abm_buffer: uint8_t* - **/ -uint8_t *Crypto_Prepare_TC_AAD(uint8_t *buffer, uint16_t len_aad, uint8_t *abm_buffer) -{ - uint8_t *aad = (uint8_t *)calloc(1, len_aad * sizeof(uint8_t)); - - for (int i = 0; i < len_aad; i++) - { - aad[i] = buffer[i] & abm_buffer[i]; - } - -#ifdef MAC_DEBUG - printf(KYEL "Preparing AAD:\n"); - printf("\tUsing AAD Length of %d\n\t", len_aad); - for (int i = 0; i < len_aad; i++) - { - printf("%02x", aad[i]); - } - printf("\n" RESET); -#endif - - return aad; -} - -/** - * @brief Function: Crypto_TM_updatePDU - * Update the Telemetry Payload Data Unit - * @param ingest: uint8_t* - * @param len_ingest: int - **/ -void Crypto_TM_updatePDU(uint8_t *ingest, int len_ingest) -{ // Copy ingest to PDU - int x = 0; - int fill_size = 0; - SecurityAssociation_t *sa_ptr; - - if (sadb_routine->sadb_get_sa_from_spi(tm_frame.tm_sec_header.spi, &sa_ptr) != CRYPTO_LIB_SUCCESS) - { - // TODO - Error handling - return; // Error -- unable to get SA from SPI. - } - - if ((sa_ptr->est == 1) && (sa_ptr->ast == 1)) - { - fill_size = 1129 - MAC_SIZE - IV_SIZE + 2; // +2 for padding bytes - } - else - { - fill_size = 1129; - } - -#ifdef TM_ZERO_FILL - for (int x = 0; x < TM_FILL_SIZE; x++) - { - if (x < len_ingest) - { // Fill - tm_frame.tm_pdu[x] = (uint8_t)ingest[x]; - } - else - { // Zero - tm_frame.tm_pdu[x] = 0x00; - } - } -#else - // Pre-append remaining packet if exist - if (tm_offset == 63) - { - tm_frame.tm_pdu[x++] = 0xff; - tm_offset--; - } - if (tm_offset == 62) - { - tm_frame.tm_pdu[x++] = 0x00; - tm_offset--; - } - if (tm_offset == 61) - { - tm_frame.tm_pdu[x++] = 0x00; - tm_offset--; - } - if (tm_offset == 60) - { - tm_frame.tm_pdu[x++] = 0x00; - tm_offset--; - } - if (tm_offset == 59) - { - tm_frame.tm_pdu[x++] = 0x39; - tm_offset--; - } - while (x < tm_offset) - { - tm_frame.tm_pdu[x] = 0x00; - x++; - } - // Copy actual packet - while (x < len_ingest + tm_offset) - { - // printf("ingest[x - tm_offset] = 0x%02x \n", (uint8_t)ingest[x - tm_offset]); - tm_frame.tm_pdu[x] = (uint8_t)ingest[x - tm_offset]; - x++; - } -#ifdef TM_IDLE_FILL - // Check for idle frame trigger - if (((uint8_t)ingest[0] == 0x08) && ((uint8_t)ingest[1] == 0x90)) - { - // Don't fill idle frames - } - else - { - while (x < (fill_size - 64)) - { - tm_frame.tm_pdu[x++] = 0x07; - tm_frame.tm_pdu[x++] = 0xff; - tm_frame.tm_pdu[x++] = 0x00; - tm_frame.tm_pdu[x++] = 0x00; - tm_frame.tm_pdu[x++] = 0x00; - tm_frame.tm_pdu[x++] = 0x39; - for (int y = 0; y < 58; y++) - { - tm_frame.tm_pdu[x++] = 0x00; - } - } - // Add partial packet, if possible, and set offset - if (x < fill_size) - { - tm_frame.tm_pdu[x++] = 0x07; - tm_offset = 63; - } - if (x < fill_size) - { - tm_frame.tm_pdu[x++] = 0xff; - tm_offset--; - } - if (x < fill_size) - { - tm_frame.tm_pdu[x++] = 0x00; - tm_offset--; - } - if (x < fill_size) - { - tm_frame.tm_pdu[x++] = 0x00; - tm_offset--; - } - if (x < fill_size) - { - tm_frame.tm_pdu[x++] = 0x00; - tm_offset--; - } - if (x < fill_size) - { - tm_frame.tm_pdu[x++] = 0x39; - tm_offset--; - } - for (int y = 0; x < fill_size; y++) - { - tm_frame.tm_pdu[x++] = 00; - tm_offset--; - } - } - while (x < TM_FILL_SIZE) - { - tm_frame.tm_pdu[x++] = 0x00; - } -#endif -#endif - - return; -} -/** - * @brief Function: Crypto_TM_updateOCF - * Update the TM OCF - **/ -void Crypto_TM_updateOCF(void) -{ - if (ocf == 0) - { // CLCW - clcw.vci = tm_frame.tm_header.vcid; - - tm_frame.tm_sec_trailer.ocf[0] = (clcw.cwt << 7) | (clcw.cvn << 5) | (clcw.sf << 2) | (clcw.cie); - tm_frame.tm_sec_trailer.ocf[1] = (clcw.vci << 2) | (clcw.spare0); - tm_frame.tm_sec_trailer.ocf[2] = (clcw.nrfa << 7) | (clcw.nbl << 6) | (clcw.lo << 5) | (clcw.wait << 4) | - (clcw.rt << 3) | (clcw.fbc << 1) | (clcw.spare1); - tm_frame.tm_sec_trailer.ocf[3] = (clcw.rv); - // Alternate OCF - ocf = 1; -#ifdef OCF_DEBUG - Crypto_clcwPrint(&clcw); -#endif - } - else - { // FSR - tm_frame.tm_sec_trailer.ocf[0] = (report.cwt << 7) | (report.vnum << 4) | (report.af << 3) | - (report.bsnf << 2) | (report.bmacf << 1) | (report.ispif); - tm_frame.tm_sec_trailer.ocf[1] = (report.lspiu & 0xFF00) >> 8; - tm_frame.tm_sec_trailer.ocf[2] = (report.lspiu & 0x00FF); - tm_frame.tm_sec_trailer.ocf[3] = (report.snval); - // Alternate OCF - ocf = 0; -#ifdef OCF_DEBUG - Crypto_fsrPrint(&report); -#endif - } -} - // TODO - Review this. Not sure it quite works how we think /** * @brief Function: Crypto_increment @@ -1411,172 +328,6 @@ uint16_t Crypto_Calc_CRC16(uint8_t *data, int size) return crc; } -/** - * @brief Function: Crypto_User_IdleTrigger - * @param ingest: uint8_t* - * @return int32: count - **/ -int32_t Crypto_User_IdleTrigger(uint8_t *ingest) -{ - uint8_t count = 0; - - // Prepare for Reply - sdls_frame.pdu.pdu_len = 0; - sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; - count = Crypto_Prep_Reply(ingest, 144); - - return count; -} - -/** - * @brief Function: Crypto_User_BadSPI - * @return int32: Success/Failure - **/ -int32_t Crypto_User_BadSPI(void) -{ - // Toggle Bad Sequence Number - if (badSPI == 0) - { - badSPI = 1; - } - else - { - badSPI = 0; - } - - return CRYPTO_LIB_SUCCESS; -} - -/** - * @brief Function: Crypto_User_BadMAC - * @return int32: Success/Failure - **/ -int32_t Crypto_User_BadMAC(void) -{ - // Toggle Bad MAC - if (badMAC == 0) - { - badMAC = 1; - } - else - { - badMAC = 0; - } - - return CRYPTO_LIB_SUCCESS; -} - -/** - * @brief Function: Crypto_User_BadIV - * @return int32: Success/Failure - **/ -int32_t Crypto_User_BadIV(void) -{ - // Toggle Bad MAC - if (badIV == 0) - { - badIV = 1; - } - else - { - badIV = 0; - } - - return CRYPTO_LIB_SUCCESS; -} - -/** - * @brief Function: Crypto_User_BadFECF - * @return int32: Success/Failure - **/ -int32_t Crypto_User_BadFECF(void) -{ - // Toggle Bad FECF - if (badFECF == 0) - { - badFECF = 1; - } - else - { - badFECF = 0; - } - - return CRYPTO_LIB_SUCCESS; -} - -/** - * @brief Function: Crypto_User_ModifyKey - * @return int32: Success/Failure - **/ -int32_t Crypto_User_ModifyKey(void) -{ - // Local variables - uint16_t kid = ((uint8_t)sdls_frame.pdu.data[0] << 8) | ((uint8_t)sdls_frame.pdu.data[1]); - uint8_t mod = (uint8_t)sdls_frame.pdu.data[2]; - - switch (mod) - { - case 1: // Invalidate Key - ek_ring[kid].value[KEY_SIZE - 1]++; - printf("Key %d value invalidated! \n", kid); - break; - case 2: // Modify key state - ek_ring[kid].key_state = (uint8_t)sdls_frame.pdu.data[3] & 0x0F; - printf("Key %d state changed to %d! \n", kid, mod); - break; - default: - // Error - break; - } - - return CRYPTO_LIB_SUCCESS; -} - -/** - * @brief Function: Crypto_User_ModifyActiveTM - * Modifies tm_sec_header.spi based on sdls_frame.pdu.data[0] - * @return int32: Success/Failure - **/ -int32_t Crypto_User_ModifyActiveTM(void) -{ - tm_frame.tm_sec_header.spi = (uint8_t)sdls_frame.pdu.data[0]; - return CRYPTO_LIB_SUCCESS; -} - -/** - * @brief Function: Crypto_User_ModifyVCID - * @return int32: Success/Failure - **/ -int32_t Crypto_User_ModifyVCID(void) -{ - tm_frame.tm_header.vcid = (uint8_t)sdls_frame.pdu.data[0]; - SecurityAssociation_t *sa_ptr; - - for (int i = 0; i < NUM_GVCID; i++) - { - if (sadb_routine->sadb_get_sa_from_spi(i, &sa_ptr) != CRYPTO_LIB_SUCCESS) - { - // TODO - Error handling - return CRYPTO_LIB_ERROR; // Error -- unable to get SA from SPI. - } - for (int j = 0; j < NUM_SA; j++) - { - - if (sa_ptr->gvcid_tm_blk[j].mapid == TYPE_TM) - { - if (sa_ptr->gvcid_tm_blk[j].vcid == tm_frame.tm_header.vcid) - { - tm_frame.tm_sec_header.spi = i; - printf("TM Frame SPI changed to %d \n", i); - break; - } - } - } - } - - return CRYPTO_LIB_SUCCESS; -} - /* ** Procedures Specifications */ @@ -1854,8 +605,8 @@ int32_t Crypto_PDU(uint8_t *ingest, TC_t *tc_frame) * @return int32: Success/Failure **/ int32_t Crypto_Get_Managed_Parameters_For_Gvcid(uint8_t tfvn, uint16_t scid, uint8_t vcid, - GvcidManagedParameters_t *managed_parameters_in, - GvcidManagedParameters_t **managed_parameters_out) + GvcidManagedParameters_t *managed_parameters_in, + GvcidManagedParameters_t **managed_parameters_out) { int32_t status = MANAGED_PARAMETERS_FOR_GVCID_NOT_FOUND; diff --git a/src/src_main/crypto_config.c b/src/src_main/crypto_config.c new file mode 100644 index 00000000..26e7ef22 --- /dev/null +++ b/src/src_main/crypto_config.c @@ -0,0 +1,845 @@ +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. + + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. + + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. + + ITC Team + NASA IV&V + jstar-development-team@mail.nasa.gov +*/ + +/* +** Includes +*/ +#include "crypto.h" + +/* +** Initialization Functions +*/ + +/** + * @brief Function: Crypto_Init_Unit_test + * @return int32: status + **/ +int32_t Crypto_Init_Unit_Test(void) +{ + int32_t status = CRYPTO_LIB_SUCCESS; + Crypto_Config_CryptoLib(SADB_TYPE_INMEMORY, CRYPTO_TC_CREATE_FECF_TRUE, TC_PROCESS_SDLS_PDUS_TRUE, TC_HAS_PUS_HDR, + TC_IGNORE_SA_STATE_FALSE, TC_IGNORE_ANTI_REPLAY_FALSE, TC_UNIQUE_SA_PER_MAP_ID_FALSE, + TC_CHECK_FECF_TRUE, 0x3F); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 0, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS); + Crypto_Config_Add_Gvcid_Managed_Parameter(0, 0x0003, 1, TC_HAS_FECF, TC_HAS_SEGMENT_HDRS); + status = Crypto_Init(); + return status; +} + +/** + * @brief Function: Crypto_Init_With_Configs + * @param crypto_config_p: CryptoConfig_t* + * @param gvcid_managed_parameters_p: GvcidManagedParameters_t* + * @param sadb_mariadb_config_p: SadbMariaDBConfig_t* + * @return int32: Success/Failure + **/ +int32_t Crypto_Init_With_Configs(CryptoConfig_t *crypto_config_p, GvcidManagedParameters_t *gvcid_managed_parameters_p, + SadbMariaDBConfig_t *sadb_mariadb_config_p) +{ + int32_t status = CRYPTO_LIB_SUCCESS; + crypto_config = crypto_config_p; + gvcid_managed_parameters = gvcid_managed_parameters_p; + sadb_mariadb_config = sadb_mariadb_config_p; + status = Crypto_Init(); + return status; +} + +/** + * @brief Function Crypto_Init + * Initializes libgcrypt, Security Associations + **/ +int32_t Crypto_Init(void) +{ + int32_t status = CRYPTO_LIB_SUCCESS; + + if (crypto_config == NULL) + { + status = CRYPTO_CONFIGURATION_NOT_COMPLETE; + printf(KRED "ERROR: CryptoLib must be configured before intializing!\n" RESET); + return status; // No configuration set -- return! + } + if (gvcid_managed_parameters == NULL) + { + status = CRYPTO_MANAGED_PARAM_CONFIGURATION_NOT_COMPLETE; + printf(KRED "ERROR: CryptoLib Managed Parameters must be configured before intializing!\n" RESET); + return status; // No Managed Parameter configuration set -- return! + } + +#ifdef TC_DEBUG + Crypto_mpPrint(gvcid_managed_parameters, 1); +#endif + + // Prepare SADB type from config + if (crypto_config->sadb_type == SADB_TYPE_INMEMORY) + { + sadb_routine = get_sadb_routine_inmemory(); + } + else if (crypto_config->sadb_type == SADB_TYPE_MARIADB) + { + if (sadb_mariadb_config == NULL) + { + status = CRYPTO_MARIADB_CONFIGURATION_NOT_COMPLETE; + printf(KRED "ERROR: CryptoLib MariaDB must be configured before intializing!\n" RESET); + return status; // MariaDB connection specified but no configuration exists, return! + } + sadb_routine = get_sadb_routine_mariadb(); + } + else + { + status = SADB_INVALID_SADB_TYPE; + return status; + } // TODO: Error stack + + // Initialize libgcrypt + if (!gcry_check_version(GCRYPT_VERSION)) + { + fprintf(stderr, "Gcrypt Version: %s", GCRYPT_VERSION); + printf(KRED "\tERROR: gcrypt version mismatch! \n" RESET); + } + if (gcry_control(GCRYCTL_SELFTEST) != GPG_ERR_NO_ERROR) + { + printf(KRED "ERROR: gcrypt self test failed\n" RESET); + } + gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); + + // Init Security Associations + status = sadb_routine->sadb_init(); + status = sadb_routine->sadb_config(); + + Crypto_Local_Init(); + Crypto_Local_Config(); + + // TODO - Add error checking + + // Init table for CRC calculations + Crypto_Calc_CRC_Init_Table(); + + // cFS Standard Initialized Message + printf(KBLU "Crypto Lib Intialized. Version %d.%d.%d.%d\n" RESET, CRYPTO_LIB_MAJOR_VERSION, + CRYPTO_LIB_MINOR_VERSION, CRYPTO_LIB_REVISION, CRYPTO_LIB_MISSION_REV); + + return status; +} + +/** + * @brief Function: Crypto_Shutdown + * Free memory objects & restore pointers to NULL for re-initialization + * @return int32: Success/Failure + **/ +int32_t Crypto_Shutdown(void) +{ + int32_t status = CRYPTO_LIB_SUCCESS; + + if (crypto_config != NULL) + { + free(crypto_config); + crypto_config = NULL; + } + if (sadb_mariadb_config != NULL) + { + free(sadb_mariadb_config); + sadb_mariadb_config = NULL; + } + current_managed_parameters = NULL; + + if (gvcid_managed_parameters != NULL) + { + Crypto_Free_Managed_Parameters(gvcid_managed_parameters); + gvcid_managed_parameters = NULL; + } + + return status; +} + +/** + * @brief Function: Crypto_Config_CryptoLib + * @param sadb_type: uint8 + * @param crypto_create_fecf: uint8 + * @param process_sdls_pdus: uint8 + * @param has_pus_hdr: uint8 + * @param ignore_sa_state: uint8 + * @param ignore_anti_replay: uint8 + * @param unique_sa_per_mapid: uint8 + * @param crypto_check_fecf: uint8 + * @param vcid_bitmask: uint8 + * @return int32: Success/Failure + **/ +int32_t Crypto_Config_CryptoLib(uint8_t sadb_type, uint8_t crypto_create_fecf, uint8_t process_sdls_pdus, + uint8_t has_pus_hdr, uint8_t ignore_sa_state, uint8_t ignore_anti_replay, + uint8_t unique_sa_per_mapid, uint8_t crypto_check_fecf, uint8_t vcid_bitmask) +{ + int32_t status = CRYPTO_LIB_SUCCESS; + crypto_config = (CryptoConfig_t *)calloc(1, CRYPTO_CONFIG_SIZE); + crypto_config->sadb_type = sadb_type; + crypto_config->crypto_create_fecf = crypto_create_fecf; + crypto_config->process_sdls_pdus = process_sdls_pdus; + crypto_config->has_pus_hdr = has_pus_hdr; + crypto_config->ignore_sa_state = ignore_sa_state; + crypto_config->ignore_anti_replay = ignore_anti_replay; + crypto_config->unique_sa_per_mapid = unique_sa_per_mapid; + crypto_config->crypto_check_fecf = crypto_check_fecf; + crypto_config->vcid_bitmask = vcid_bitmask; + return status; +} + +/** + * @brief Function: Crypto_Config_MariaDB + * @param mysql_username: uint8_t* + * @param mysql_password: uint8_t* + * @param mysql_hostname: uint8_t* + * @param mysql_database: uint8_t* + * @param mysql_port: uint16 + * @return int32: Success/Failure + **/ +int32_t Crypto_Config_MariaDB(uint8_t *mysql_username, uint8_t *mysql_password, uint8_t *mysql_hostname, + uint8_t *mysql_database, uint16_t mysql_port) +{ + int32_t status = CRYPTO_LIB_SUCCESS; + sadb_mariadb_config = (SadbMariaDBConfig_t *)calloc(1, SADB_MARIADB_CONFIG_SIZE); + sadb_mariadb_config->mysql_username = mysql_username; + sadb_mariadb_config->mysql_password = mysql_password; + sadb_mariadb_config->mysql_hostname = mysql_hostname; + sadb_mariadb_config->mysql_database = mysql_database; + sadb_mariadb_config->mysql_port = mysql_port; + return status; +} + +/** + * @brief Function: Crypto_Config_Add_Gvcid_Managed_Parameter + * @param tfvn: uint8 + * @param scid: uint16 + * @param vcid: uint8 + * @param has_fecf: uint8 + * @param has_segmentation_hdr: uint8 + * @return int32: Success/Failure + **/ +int32_t Crypto_Config_Add_Gvcid_Managed_Parameter(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, + uint8_t has_segmentation_hdr) +{ + int32_t status = CRYPTO_LIB_SUCCESS; + + if (gvcid_managed_parameters == NULL) + { // case: Global Root Node not Set + gvcid_managed_parameters = (GvcidManagedParameters_t *)calloc(1, GVCID_MANAGED_PARAMETERS_SIZE); + gvcid_managed_parameters->tfvn = tfvn; + gvcid_managed_parameters->scid = scid; + gvcid_managed_parameters->vcid = vcid; + gvcid_managed_parameters->has_fecf = has_fecf; + gvcid_managed_parameters->has_segmentation_hdr = has_segmentation_hdr; + gvcid_managed_parameters->next = NULL; + return status; + } + else + { // Recurse through nodes and add at end + return crypto_config_add_gvcid_managed_parameter_recursion(tfvn, scid, vcid, has_fecf, has_segmentation_hdr, + gvcid_managed_parameters); + } +} + +/** + * @brief Function: crypto_config_add_gvcid_managed_parameter_recursion + * @param tfvn: uint8 + * @param scid: uint16 + * @param vcid: uint8 + * @param has_fecf: uint8 + * @param has_segmentation_hdr: uint8 + * @param managed_parameter: GvcidManagedParameters_t* + * @return int32: Success/Failure + **/ +int32_t crypto_config_add_gvcid_managed_parameter_recursion(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, + uint8_t has_segmentation_hdr, + GvcidManagedParameters_t *managed_parameter) +{ + if (managed_parameter->next != NULL) + { + return crypto_config_add_gvcid_managed_parameter_recursion(tfvn, scid, vcid, has_fecf, has_segmentation_hdr, + managed_parameter->next); + } + else + { + managed_parameter->next = (GvcidManagedParameters_t *)calloc(1, GVCID_MANAGED_PARAMETERS_SIZE); + managed_parameter->next->tfvn = tfvn; + managed_parameter->next->scid = scid; + managed_parameter->next->vcid = vcid; + managed_parameter->next->has_fecf = has_fecf; + managed_parameter->next->has_segmentation_hdr = has_segmentation_hdr; + managed_parameter->next->next = NULL; + return CRYPTO_LIB_SUCCESS; + } +} + +/** + * @brief Function: Crypto_Local_Config + * Initalizes TM Configuration, Log, and Keyrings + **/ +void Crypto_Local_Config(void) +{ + // Initial TM configuration + tm_frame.tm_sec_header.spi = 1; + + // Initialize Log + log_summary.num_se = 2; + log_summary.rs = LOG_SIZE; + // Add a two messages to the log + log_summary.rs--; + mc_log.blk[log_count].emt = STARTUP; + mc_log.blk[log_count].emv[0] = 0x4E; + mc_log.blk[log_count].emv[1] = 0x41; + mc_log.blk[log_count].emv[2] = 0x53; + mc_log.blk[log_count].emv[3] = 0x41; + mc_log.blk[log_count++].em_len = 4; + log_summary.rs--; + mc_log.blk[log_count].emt = STARTUP; + mc_log.blk[log_count].emv[0] = 0x4E; + mc_log.blk[log_count].emv[1] = 0x41; + mc_log.blk[log_count].emv[2] = 0x53; + mc_log.blk[log_count].emv[3] = 0x41; + mc_log.blk[log_count++].em_len = 4; + + // Master Keys + // 0 - 000102030405060708090A0B0C0D0E0F000102030405060708090A0B0C0D0E0F -> ACTIVE + ek_ring[0].value[0] = 0x00; + ek_ring[0].value[1] = 0x01; + ek_ring[0].value[2] = 0x02; + ek_ring[0].value[3] = 0x03; + ek_ring[0].value[4] = 0x04; + ek_ring[0].value[5] = 0x05; + ek_ring[0].value[6] = 0x06; + ek_ring[0].value[7] = 0x07; + ek_ring[0].value[8] = 0x08; + ek_ring[0].value[9] = 0x09; + ek_ring[0].value[10] = 0x0A; + ek_ring[0].value[11] = 0x0B; + ek_ring[0].value[12] = 0x0C; + ek_ring[0].value[13] = 0x0D; + ek_ring[0].value[14] = 0x0E; + ek_ring[0].value[15] = 0x0F; + ek_ring[0].value[16] = 0x00; + ek_ring[0].value[17] = 0x01; + ek_ring[0].value[18] = 0x02; + ek_ring[0].value[19] = 0x03; + ek_ring[0].value[20] = 0x04; + ek_ring[0].value[21] = 0x05; + ek_ring[0].value[22] = 0x06; + ek_ring[0].value[23] = 0x07; + ek_ring[0].value[24] = 0x08; + ek_ring[0].value[25] = 0x09; + ek_ring[0].value[26] = 0x0A; + ek_ring[0].value[27] = 0x0B; + ek_ring[0].value[28] = 0x0C; + ek_ring[0].value[29] = 0x0D; + ek_ring[0].value[30] = 0x0E; + ek_ring[0].value[31] = 0x0F; + ek_ring[0].key_state = KEY_ACTIVE; + // 1 - 101112131415161718191A1B1C1D1E1F101112131415161718191A1B1C1D1E1F -> ACTIVE + ek_ring[1].value[0] = 0x10; + ek_ring[1].value[1] = 0x11; + ek_ring[1].value[2] = 0x12; + ek_ring[1].value[3] = 0x13; + ek_ring[1].value[4] = 0x14; + ek_ring[1].value[5] = 0x15; + ek_ring[1].value[6] = 0x16; + ek_ring[1].value[7] = 0x17; + ek_ring[1].value[8] = 0x18; + ek_ring[1].value[9] = 0x19; + ek_ring[1].value[10] = 0x1A; + ek_ring[1].value[11] = 0x1B; + ek_ring[1].value[12] = 0x1C; + ek_ring[1].value[13] = 0x1D; + ek_ring[1].value[14] = 0x1E; + ek_ring[1].value[15] = 0x1F; + ek_ring[1].value[16] = 0x10; + ek_ring[1].value[17] = 0x11; + ek_ring[1].value[18] = 0x12; + ek_ring[1].value[19] = 0x13; + ek_ring[1].value[20] = 0x14; + ek_ring[1].value[21] = 0x15; + ek_ring[1].value[22] = 0x16; + ek_ring[1].value[23] = 0x17; + ek_ring[1].value[24] = 0x18; + ek_ring[1].value[25] = 0x19; + ek_ring[1].value[26] = 0x1A; + ek_ring[1].value[27] = 0x1B; + ek_ring[1].value[28] = 0x1C; + ek_ring[1].value[29] = 0x1D; + ek_ring[1].value[30] = 0x1E; + ek_ring[1].value[31] = 0x1F; + ek_ring[1].key_state = KEY_ACTIVE; + // 2 - 202122232425262728292A2B2C2D2E2F202122232425262728292A2B2C2D2E2F -> ACTIVE + ek_ring[2].value[0] = 0x20; + ek_ring[2].value[1] = 0x21; + ek_ring[2].value[2] = 0x22; + ek_ring[2].value[3] = 0x23; + ek_ring[2].value[4] = 0x24; + ek_ring[2].value[5] = 0x25; + ek_ring[2].value[6] = 0x26; + ek_ring[2].value[7] = 0x27; + ek_ring[2].value[8] = 0x28; + ek_ring[2].value[9] = 0x29; + ek_ring[2].value[10] = 0x2A; + ek_ring[2].value[11] = 0x2B; + ek_ring[2].value[12] = 0x2C; + ek_ring[2].value[13] = 0x2D; + ek_ring[2].value[14] = 0x2E; + ek_ring[2].value[15] = 0x2F; + ek_ring[2].value[16] = 0x20; + ek_ring[2].value[17] = 0x21; + ek_ring[2].value[18] = 0x22; + ek_ring[2].value[19] = 0x23; + ek_ring[2].value[20] = 0x24; + ek_ring[2].value[21] = 0x25; + ek_ring[2].value[22] = 0x26; + ek_ring[2].value[23] = 0x27; + ek_ring[2].value[24] = 0x28; + ek_ring[2].value[25] = 0x29; + ek_ring[2].value[26] = 0x2A; + ek_ring[2].value[27] = 0x2B; + ek_ring[2].value[28] = 0x2C; + ek_ring[2].value[29] = 0x2D; + ek_ring[2].value[30] = 0x2E; + ek_ring[2].value[31] = 0x2F; + ek_ring[2].key_state = KEY_ACTIVE; + + // Session Keys + // 128 - 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF -> ACTIVE + ek_ring[128].value[0] = 0x01; + ek_ring[128].value[1] = 0x23; + ek_ring[128].value[2] = 0x45; + ek_ring[128].value[3] = 0x67; + ek_ring[128].value[4] = 0x89; + ek_ring[128].value[5] = 0xAB; + ek_ring[128].value[6] = 0xCD; + ek_ring[128].value[7] = 0xEF; + ek_ring[128].value[8] = 0x01; + ek_ring[128].value[9] = 0x23; + ek_ring[128].value[10] = 0x45; + ek_ring[128].value[11] = 0x67; + ek_ring[128].value[12] = 0x89; + ek_ring[128].value[13] = 0xAB; + ek_ring[128].value[14] = 0xCD; + ek_ring[128].value[15] = 0xEF; + ek_ring[128].value[16] = 0x01; + ek_ring[128].value[17] = 0x23; + ek_ring[128].value[18] = 0x45; + ek_ring[128].value[19] = 0x67; + ek_ring[128].value[20] = 0x89; + ek_ring[128].value[21] = 0xAB; + ek_ring[128].value[22] = 0xCD; + ek_ring[128].value[23] = 0xEF; + ek_ring[128].value[24] = 0x01; + ek_ring[128].value[25] = 0x23; + ek_ring[128].value[26] = 0x45; + ek_ring[128].value[27] = 0x67; + ek_ring[128].value[28] = 0x89; + ek_ring[128].value[29] = 0xAB; + ek_ring[128].value[30] = 0xCD; + ek_ring[128].value[31] = 0xEF; + ek_ring[128].key_state = KEY_ACTIVE; + // 129 - ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789 -> ACTIVE + ek_ring[129].value[0] = 0xAB; + ek_ring[129].value[1] = 0xCD; + ek_ring[129].value[2] = 0xEF; + ek_ring[129].value[3] = 0x01; + ek_ring[129].value[4] = 0x23; + ek_ring[129].value[5] = 0x45; + ek_ring[129].value[6] = 0x67; + ek_ring[129].value[7] = 0x89; + ek_ring[129].value[8] = 0xAB; + ek_ring[129].value[9] = 0xCD; + ek_ring[129].value[10] = 0xEF; + ek_ring[129].value[11] = 0x01; + ek_ring[129].value[12] = 0x23; + ek_ring[129].value[13] = 0x45; + ek_ring[129].value[14] = 0x67; + ek_ring[129].value[15] = 0x89; + ek_ring[129].value[16] = 0xAB; + ek_ring[129].value[17] = 0xCD; + ek_ring[129].value[18] = 0xEF; + ek_ring[129].value[19] = 0x01; + ek_ring[129].value[20] = 0x23; + ek_ring[129].value[21] = 0x45; + ek_ring[129].value[22] = 0x67; + ek_ring[129].value[23] = 0x89; + ek_ring[129].value[24] = 0xAB; + ek_ring[129].value[25] = 0xCD; + ek_ring[129].value[26] = 0xEF; + ek_ring[129].value[27] = 0x01; + ek_ring[129].value[28] = 0x23; + ek_ring[129].value[29] = 0x45; + ek_ring[129].value[30] = 0x67; + ek_ring[129].value[31] = 0x89; + ek_ring[129].key_state = KEY_ACTIVE; + // 130 - FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210 -> ACTIVE + ek_ring[130].value[0] = 0xFE; + ek_ring[130].value[1] = 0xDC; + ek_ring[130].value[2] = 0xBA; + ek_ring[130].value[3] = 0x98; + ek_ring[130].value[4] = 0x76; + ek_ring[130].value[5] = 0x54; + ek_ring[130].value[6] = 0x32; + ek_ring[130].value[7] = 0x10; + ek_ring[130].value[8] = 0xFE; + ek_ring[130].value[9] = 0xDC; + ek_ring[130].value[10] = 0xBA; + ek_ring[130].value[11] = 0x98; + ek_ring[130].value[12] = 0x76; + ek_ring[130].value[13] = 0x54; + ek_ring[130].value[14] = 0x32; + ek_ring[130].value[15] = 0x10; + ek_ring[130].value[16] = 0xFE; + ek_ring[130].value[17] = 0xDC; + ek_ring[130].value[18] = 0xBA; + ek_ring[130].value[19] = 0x98; + ek_ring[130].value[20] = 0x76; + ek_ring[130].value[21] = 0x54; + ek_ring[130].value[22] = 0x32; + ek_ring[130].value[23] = 0x10; + ek_ring[130].value[24] = 0xFE; + ek_ring[130].value[25] = 0xDC; + ek_ring[130].value[26] = 0xBA; + ek_ring[130].value[27] = 0x98; + ek_ring[130].value[28] = 0x76; + ek_ring[130].value[29] = 0x54; + ek_ring[130].value[30] = 0x32; + ek_ring[130].value[31] = 0x10; + ek_ring[130].key_state = KEY_ACTIVE; + // 131 - 9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA -> ACTIVE + ek_ring[131].value[0] = 0x98; + ek_ring[131].value[1] = 0x76; + ek_ring[131].value[2] = 0x54; + ek_ring[131].value[3] = 0x32; + ek_ring[131].value[4] = 0x10; + ek_ring[131].value[5] = 0xFE; + ek_ring[131].value[6] = 0xDC; + ek_ring[131].value[7] = 0xBA; + ek_ring[131].value[8] = 0x98; + ek_ring[131].value[9] = 0x76; + ek_ring[131].value[10] = 0x54; + ek_ring[131].value[11] = 0x32; + ek_ring[131].value[12] = 0x10; + ek_ring[131].value[13] = 0xFE; + ek_ring[131].value[14] = 0xDC; + ek_ring[131].value[15] = 0xBA; + ek_ring[131].value[16] = 0x98; + ek_ring[131].value[17] = 0x76; + ek_ring[131].value[18] = 0x54; + ek_ring[131].value[19] = 0x32; + ek_ring[131].value[20] = 0x10; + ek_ring[131].value[21] = 0xFE; + ek_ring[131].value[22] = 0xDC; + ek_ring[131].value[23] = 0xBA; + ek_ring[131].value[24] = 0x98; + ek_ring[131].value[25] = 0x76; + ek_ring[131].value[26] = 0x54; + ek_ring[131].value[27] = 0x32; + ek_ring[131].value[28] = 0x10; + ek_ring[131].value[29] = 0xFE; + ek_ring[131].value[30] = 0xDC; + ek_ring[131].value[31] = 0xBA; + ek_ring[131].key_state = KEY_ACTIVE; + // 132 - 0123456789ABCDEFABCDEF01234567890123456789ABCDEFABCDEF0123456789 -> PRE_ACTIVATION + ek_ring[132].value[0] = 0x01; + ek_ring[132].value[1] = 0x23; + ek_ring[132].value[2] = 0x45; + ek_ring[132].value[3] = 0x67; + ek_ring[132].value[4] = 0x89; + ek_ring[132].value[5] = 0xAB; + ek_ring[132].value[6] = 0xCD; + ek_ring[132].value[7] = 0xEF; + ek_ring[132].value[8] = 0xAB; + ek_ring[132].value[9] = 0xCD; + ek_ring[132].value[10] = 0xEF; + ek_ring[132].value[11] = 0x01; + ek_ring[132].value[12] = 0x23; + ek_ring[132].value[13] = 0x45; + ek_ring[132].value[14] = 0x67; + ek_ring[132].value[15] = 0x89; + ek_ring[132].value[16] = 0x01; + ek_ring[132].value[17] = 0x23; + ek_ring[132].value[18] = 0x45; + ek_ring[132].value[19] = 0x67; + ek_ring[132].value[20] = 0x89; + ek_ring[132].value[21] = 0xAB; + ek_ring[132].value[22] = 0xCD; + ek_ring[132].value[23] = 0xEF; + ek_ring[132].value[24] = 0xAB; + ek_ring[132].value[25] = 0xCD; + ek_ring[132].value[26] = 0xEF; + ek_ring[132].value[27] = 0x01; + ek_ring[132].value[28] = 0x23; + ek_ring[132].value[29] = 0x45; + ek_ring[132].value[30] = 0x67; + ek_ring[132].value[31] = 0x89; + ek_ring[132].key_state = KEY_PREACTIVE; + // 133 - ABCDEF01234567890123456789ABCDEFABCDEF01234567890123456789ABCDEF -> ACTIVE + ek_ring[133].value[0] = 0xAB; + ek_ring[133].value[1] = 0xCD; + ek_ring[133].value[2] = 0xEF; + ek_ring[133].value[3] = 0x01; + ek_ring[133].value[4] = 0x23; + ek_ring[133].value[5] = 0x45; + ek_ring[133].value[6] = 0x67; + ek_ring[133].value[7] = 0x89; + ek_ring[133].value[8] = 0x01; + ek_ring[133].value[9] = 0x23; + ek_ring[133].value[10] = 0x45; + ek_ring[133].value[11] = 0x67; + ek_ring[133].value[12] = 0x89; + ek_ring[133].value[13] = 0xAB; + ek_ring[133].value[14] = 0xCD; + ek_ring[133].value[15] = 0xEF; + ek_ring[133].value[16] = 0xAB; + ek_ring[133].value[17] = 0xCD; + ek_ring[133].value[18] = 0xEF; + ek_ring[133].value[19] = 0x01; + ek_ring[133].value[20] = 0x23; + ek_ring[133].value[21] = 0x45; + ek_ring[133].value[22] = 0x67; + ek_ring[133].value[23] = 0x89; + ek_ring[133].value[24] = 0x01; + ek_ring[133].value[25] = 0x23; + ek_ring[133].value[26] = 0x45; + ek_ring[133].value[27] = 0x67; + ek_ring[133].value[28] = 0x89; + ek_ring[133].value[29] = 0xAB; + ek_ring[133].value[30] = 0xCD; + ek_ring[133].value[31] = 0xEF; + ek_ring[133].key_state = KEY_ACTIVE; + // 134 - ABCDEF0123456789FEDCBA9876543210ABCDEF0123456789FEDCBA9876543210 -> DEACTIVE + ek_ring[134].value[0] = 0xAB; + ek_ring[134].value[1] = 0xCD; + ek_ring[134].value[2] = 0xEF; + ek_ring[134].value[3] = 0x01; + ek_ring[134].value[4] = 0x23; + ek_ring[134].value[5] = 0x45; + ek_ring[134].value[6] = 0x67; + ek_ring[134].value[7] = 0x89; + ek_ring[134].value[8] = 0xFE; + ek_ring[134].value[9] = 0xDC; + ek_ring[134].value[10] = 0xBA; + ek_ring[134].value[11] = 0x98; + ek_ring[134].value[12] = 0x76; + ek_ring[134].value[13] = 0x54; + ek_ring[134].value[14] = 0x32; + ek_ring[134].value[15] = 0x10; + ek_ring[134].value[16] = 0xAB; + ek_ring[134].value[17] = 0xCD; + ek_ring[134].value[18] = 0xEF; + ek_ring[134].value[19] = 0x01; + ek_ring[134].value[20] = 0x23; + ek_ring[134].value[21] = 0x45; + ek_ring[134].value[22] = 0x67; + ek_ring[134].value[23] = 0x89; + ek_ring[134].value[24] = 0xFE; + ek_ring[134].value[25] = 0xDC; + ek_ring[134].value[26] = 0xBA; + ek_ring[134].value[27] = 0x98; + ek_ring[134].value[28] = 0x76; + ek_ring[134].value[29] = 0x54; + ek_ring[134].value[30] = 0x32; + ek_ring[134].value[31] = 0x10; + ek_ring[134].key_state = KEY_DEACTIVATED; + + // 135 - ABCDEF0123456789FEDCBA9876543210ABCDEF0123456789FEDCBA9876543210 -> DEACTIVE + ek_ring[135].value[0] = 0x00; + ek_ring[135].value[1] = 0x00; + ek_ring[135].value[2] = 0x00; + ek_ring[135].value[3] = 0x00; + ek_ring[135].value[4] = 0x00; + ek_ring[135].value[5] = 0x00; + ek_ring[135].value[6] = 0x00; + ek_ring[135].value[7] = 0x00; + ek_ring[135].value[8] = 0x00; + ek_ring[135].value[9] = 0x00; + ek_ring[135].value[10] = 0x00; + ek_ring[135].value[11] = 0x00; + ek_ring[135].value[12] = 0x00; + ek_ring[135].value[13] = 0x00; + ek_ring[135].value[14] = 0x00; + ek_ring[135].value[15] = 0x00; + ek_ring[135].value[16] = 0x00; + ek_ring[135].value[17] = 0x00; + ek_ring[135].value[18] = 0x00; + ek_ring[135].value[19] = 0x00; + ek_ring[135].value[20] = 0x00; + ek_ring[135].value[21] = 0x00; + ek_ring[135].value[22] = 0x00; + ek_ring[135].value[23] = 0x00; + ek_ring[135].value[24] = 0x00; + ek_ring[135].value[25] = 0x00; + ek_ring[135].value[26] = 0x00; + ek_ring[135].value[27] = 0x00; + ek_ring[135].value[28] = 0x00; + ek_ring[135].value[29] = 0x00; + ek_ring[135].value[30] = 0x00; + ek_ring[135].value[31] = 0x00; + ek_ring[135].key_state = KEY_DEACTIVATED; + + // 136 - ef9f9284cf599eac3b119905a7d18851e7e374cf63aea04358586b0f757670f8 + // Reference: + // https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/mac/gcmtestvectors.zip + ek_ring[136].value[0] = 0xff; + ek_ring[136].value[1] = 0x9f; + ek_ring[136].value[2] = 0x92; + ek_ring[136].value[3] = 0x84; + ek_ring[136].value[4] = 0xcf; + ek_ring[136].value[5] = 0x59; + ek_ring[136].value[6] = 0x9e; + ek_ring[136].value[7] = 0xac; + ek_ring[136].value[8] = 0x3b; + ek_ring[136].value[9] = 0x11; + ek_ring[136].value[10] = 0x99; + ek_ring[136].value[11] = 0x05; + ek_ring[136].value[12] = 0xa7; + ek_ring[136].value[13] = 0xd1; + ek_ring[136].value[14] = 0x88; + ek_ring[136].value[15] = 0x51; + ek_ring[136].value[16] = 0xe7; + ek_ring[136].value[17] = 0xe3; + ek_ring[136].value[18] = 0x74; + ek_ring[136].value[19] = 0xcf; + ek_ring[136].value[20] = 0x63; + ek_ring[136].value[21] = 0xae; + ek_ring[136].value[22] = 0xa0; + ek_ring[136].value[23] = 0x43; + ek_ring[136].value[24] = 0x58; + ek_ring[136].value[25] = 0x58; + ek_ring[136].value[26] = 0x6b; + ek_ring[136].value[27] = 0x0f; + ek_ring[136].value[28] = 0x75; + ek_ring[136].value[29] = 0x76; + ek_ring[136].value[30] = 0x70; + ek_ring[136].value[31] = 0xf9; + ek_ring[135].key_state = KEY_DEACTIVATED; +} + +/** + * @brief Function: Crypto_Local_Init + * Initalize TM Frame, CLCW + **/ +void Crypto_Local_Init(void) +{ + + // Initialize TM Frame + // TM Header + tm_frame.tm_header.tfvn = 0; // Shall be 00 for TM-/TC-SDLP + tm_frame.tm_header.scid = SCID & 0x3FF; + tm_frame.tm_header.vcid = 0; + tm_frame.tm_header.ocff = 1; + tm_frame.tm_header.mcfc = 1; + tm_frame.tm_header.vcfc = 1; + tm_frame.tm_header.tfsh = 0; + tm_frame.tm_header.sf = 0; + tm_frame.tm_header.pof = 0; // Shall be set to 0 + tm_frame.tm_header.slid = 3; // Shall be set to 11 + tm_frame.tm_header.fhp = 0; + // TM Security Header + tm_frame.tm_sec_header.spi = 0x0000; + for (int x = 0; x < IV_SIZE; x++) + { // Initialization Vector + *(tm_frame.tm_sec_header.iv + x) = 0x00; + } + // TM Payload Data Unit + for (int x = 0; x < TM_FRAME_DATA_SIZE; x++) + { // Zero TM PDU + tm_frame.tm_pdu[x] = 0x00; + } + // TM Security Trailer + for (int x = 0; x < MAC_SIZE; x++) + { // Zero TM Message Authentication Code + tm_frame.tm_sec_trailer.mac[x] = 0x00; + } + for (int x = 0; x < OCF_SIZE; x++) + { // Zero TM Operational Control Field + tm_frame.tm_sec_trailer.ocf[x] = 0x00; + } + tm_frame.tm_sec_trailer.fecf = 0xFECF; + + // Initialize CLCW + clcw.cwt = 0; // Control Word Type "0" + clcw.cvn = 0; // CLCW Version Number "00" + clcw.sf = 0; // Status Field + clcw.cie = 1; // COP In Effect + clcw.vci = 0; // Virtual Channel Identification + clcw.spare0 = 0; // Reserved Spare + clcw.nrfa = 0; // No RF Avaliable Flag + clcw.nbl = 0; // No Bit Lock Flag + clcw.lo = 0; // Lock-Out Flag + clcw.wait = 0; // Wait Flag + clcw.rt = 0; // Retransmit Flag + clcw.fbc = 0; // FARM-B Counter + clcw.spare1 = 0; // Reserved Spare + clcw.rv = 0; // Report Value + + // Initialize Frame Security Report + report.cwt = 1; // Control Word Type "0b1"" + report.vnum = 4; // FSR Version "0b100"" + report.af = 0; // Alarm Field + report.bsnf = 0; // Bad SN Flag + report.bmacf = 0; // Bad MAC Flag + report.ispif = 0; // Invalid SPI Flag + report.lspiu = 0; // Last SPI Used + report.snval = 0; // SN Value (LSB) +} + +/** + * @brief Function: Crypto_Calc_CRC_Init_Table + * Initialize CRC Table + **/ +void Crypto_Calc_CRC_Init_Table(void) +{ + uint16_t val; + uint32_t poly = 0xEDB88320; + uint32_t crc; + + // http://create.stephan-brumme.com/crc32/ + for (unsigned int i = 0; i <= 0xFF; i++) + { + crc = i; + for (unsigned int j = 0; j < 8; j++) + { + crc = (crc >> 1) ^ (-(int)(crc & 1) & poly); + } + crc32Table[i] = crc; + // printf("crc32Table[%d] = 0x%08x \n", i, crc32Table[i]); + } + + // Code provided by ESA + for (int i = 0; i < 256; i++) + { + val = 0; + if ((i & 1) != 0) + val ^= 0x1021; + if ((i & 2) != 0) + val ^= 0x2042; + if ((i & 4) != 0) + val ^= 0x4084; + if ((i & 8) != 0) + val ^= 0x8108; + if ((i & 16) != 0) + val ^= 0x1231; + if ((i & 32) != 0) + val ^= 0x2462; + if ((i & 64) != 0) + val ^= 0x48C4; + if ((i & 128) != 0) + val ^= 0x9188; + crc16Table[i] = val; + // printf("crc16Table[%d] = 0x%04x \n", i, crc16Table[i]); + } +} diff --git a/src/src_main/crypto_tc.c b/src/src_main/crypto_tc.c index aba9c86c..3dc73d95 100644 --- a/src/src_main/crypto_tc.c +++ b/src/src_main/crypto_tc.c @@ -1027,4 +1027,67 @@ int32_t Crypto_TC_ProcessSecurity(uint8_t *ingest, int *len_ingest, TC_t *tc_sdl } return status; -} \ No newline at end of file +} + +/** + * @brief Function: Crypto_Get_tcPayloadLength + * Returns the payload length of current tc_frame in BYTES! + * @param tc_frame: TC_t* + * @param sa_ptr: SecurityAssociation_t + * @return int32, Length of TCPayload + **/ +/* +int32_t Crypto_Get_tcPayloadLength(TC_t* tc_frame, SecurityAssociation_t *sa_ptr) +{ + int tf_hdr = 5; + int seg_hdr = 0;if(current_managed_parameters->has_segmentation_hdr==TC_HAS_SEGMENT_HDRS){seg_hdr=1;} + int fecf = 0;if(current_managed_parameters->has_fecf==TC_HAS_FECF){fecf=FECF_SIZE;} + int spi = 2; + int iv_size = sa_ptr->shivf_len; + int mac_size = sa_ptr->stmacf_len; + + #ifdef TC_DEBUG + printf("Get_tcPayloadLength Debug [byte lengths]:\n"); + printf("\thdr.fl\t%d\n", tc_frame->tc_header.fl); + printf("\ttf_hdr\t%d\n",tf_hdr); + printf("\tSeg hdr\t%d\t\n",seg_hdr); + printf("\tspi \t%d\n",spi); + printf("\tiv_size\t%d\n",iv_size); + printf("\tmac\t%d\n",mac_size); + printf("\tfecf \t%d\n",fecf); + printf("\tTOTAL LENGTH: %d\n", (tc_frame->tc_header.fl - (tf_hdr + seg_hdr + spi + iv_size ) - (mac_size + +fecf))); #endif + + return (tc_frame->tc_header.fl + 1 - (tf_hdr + seg_hdr + spi + iv_size ) - (mac_size + fecf) ); +} +*/ + +/** + * @brief Function: Crypto_Prepare_TC_AAD + * Callocs and returns pointer to buffer where AAD is created & bitwise-anded with bitmask! + * Note: Function caller is responsible for freeing the returned buffer! + * @param buffer: uint8_t* + * @param len_aad: uint16_t + * @param abm_buffer: uint8_t* + **/ +uint8_t *Crypto_Prepare_TC_AAD(uint8_t *buffer, uint16_t len_aad, uint8_t *abm_buffer) +{ + uint8_t *aad = (uint8_t *)calloc(1, len_aad * sizeof(uint8_t)); + + for (int i = 0; i < len_aad; i++) + { + aad[i] = buffer[i] & abm_buffer[i]; + } + +#ifdef MAC_DEBUG + printf(KYEL "Preparing AAD:\n"); + printf("\tUsing AAD Length of %d\n\t", len_aad); + for (int i = 0; i < len_aad; i++) + { + printf("%02x", aad[i]); + } + printf("\n" RESET); +#endif + + return aad; +} diff --git a/src/src_main/crypto_tm.c b/src/src_main/crypto_tm.c index 7df98daf..203b6c31 100644 --- a/src/src_main/crypto_tm.c +++ b/src/src_main/crypto_tm.c @@ -346,4 +346,203 @@ int32_t Crypto_TM_ProcessSecurity(uint8_t *ingest, int *len_ingest) #endif return status; -} \ No newline at end of file +} + +/** + * @brief Function: Crypto_Get_tmLength + * Returns the total length of the current tm_frame in BYTES! + * @param len: int + * @return int32_t Length of TM + **/ +int32_t Crypto_Get_tmLength(int len) +{ +#ifdef FILL + len = TM_FILL_SIZE; +#else + len = TM_FRAME_PRIMARYHEADER_SIZE + TM_FRAME_SECHEADER_SIZE + len + TM_FRAME_SECTRAILER_SIZE + TM_FRAME_CLCW_SIZE; +#endif + + return len; +} + +/** + * @brief Function: Crypto_TM_updatePDU + * Update the Telemetry Payload Data Unit + * @param ingest: uint8_t* + * @param len_ingest: int + **/ +void Crypto_TM_updatePDU(uint8_t *ingest, int len_ingest) +{ // Copy ingest to PDU + int x = 0; + int fill_size = 0; + SecurityAssociation_t *sa_ptr; + + if (sadb_routine->sadb_get_sa_from_spi(tm_frame.tm_sec_header.spi, &sa_ptr) != CRYPTO_LIB_SUCCESS) + { + // TODO - Error handling + return; // Error -- unable to get SA from SPI. + } + + if ((sa_ptr->est == 1) && (sa_ptr->ast == 1)) + { + fill_size = 1129 - MAC_SIZE - IV_SIZE + 2; // +2 for padding bytes + } + else + { + fill_size = 1129; + } + +#ifdef TM_ZERO_FILL + for (int x = 0; x < TM_FILL_SIZE; x++) + { + if (x < len_ingest) + { // Fill + tm_frame.tm_pdu[x] = (uint8_t)ingest[x]; + } + else + { // Zero + tm_frame.tm_pdu[x] = 0x00; + } + } +#else + // Pre-append remaining packet if exist + if (tm_offset == 63) + { + tm_frame.tm_pdu[x++] = 0xff; + tm_offset--; + } + if (tm_offset == 62) + { + tm_frame.tm_pdu[x++] = 0x00; + tm_offset--; + } + if (tm_offset == 61) + { + tm_frame.tm_pdu[x++] = 0x00; + tm_offset--; + } + if (tm_offset == 60) + { + tm_frame.tm_pdu[x++] = 0x00; + tm_offset--; + } + if (tm_offset == 59) + { + tm_frame.tm_pdu[x++] = 0x39; + tm_offset--; + } + while (x < tm_offset) + { + tm_frame.tm_pdu[x] = 0x00; + x++; + } + // Copy actual packet + while (x < len_ingest + tm_offset) + { + // printf("ingest[x - tm_offset] = 0x%02x \n", (uint8_t)ingest[x - tm_offset]); + tm_frame.tm_pdu[x] = (uint8_t)ingest[x - tm_offset]; + x++; + } +#ifdef TM_IDLE_FILL + // Check for idle frame trigger + if (((uint8_t)ingest[0] == 0x08) && ((uint8_t)ingest[1] == 0x90)) + { + // Don't fill idle frames + } + else + { + while (x < (fill_size - 64)) + { + tm_frame.tm_pdu[x++] = 0x07; + tm_frame.tm_pdu[x++] = 0xff; + tm_frame.tm_pdu[x++] = 0x00; + tm_frame.tm_pdu[x++] = 0x00; + tm_frame.tm_pdu[x++] = 0x00; + tm_frame.tm_pdu[x++] = 0x39; + for (int y = 0; y < 58; y++) + { + tm_frame.tm_pdu[x++] = 0x00; + } + } + // Add partial packet, if possible, and set offset + if (x < fill_size) + { + tm_frame.tm_pdu[x++] = 0x07; + tm_offset = 63; + } + if (x < fill_size) + { + tm_frame.tm_pdu[x++] = 0xff; + tm_offset--; + } + if (x < fill_size) + { + tm_frame.tm_pdu[x++] = 0x00; + tm_offset--; + } + if (x < fill_size) + { + tm_frame.tm_pdu[x++] = 0x00; + tm_offset--; + } + if (x < fill_size) + { + tm_frame.tm_pdu[x++] = 0x00; + tm_offset--; + } + if (x < fill_size) + { + tm_frame.tm_pdu[x++] = 0x39; + tm_offset--; + } + for (int y = 0; x < fill_size; y++) + { + tm_frame.tm_pdu[x++] = 00; + tm_offset--; + } + } + while (x < TM_FILL_SIZE) + { + tm_frame.tm_pdu[x++] = 0x00; + } +#endif +#endif + + return; +} + +/** + * @brief Function: Crypto_TM_updateOCF + * Update the TM OCF + **/ +void Crypto_TM_updateOCF(void) +{ + if (ocf == 0) + { // CLCW + clcw.vci = tm_frame.tm_header.vcid; + + tm_frame.tm_sec_trailer.ocf[0] = (clcw.cwt << 7) | (clcw.cvn << 5) | (clcw.sf << 2) | (clcw.cie); + tm_frame.tm_sec_trailer.ocf[1] = (clcw.vci << 2) | (clcw.spare0); + tm_frame.tm_sec_trailer.ocf[2] = (clcw.nrfa << 7) | (clcw.nbl << 6) | (clcw.lo << 5) | (clcw.wait << 4) | + (clcw.rt << 3) | (clcw.fbc << 1) | (clcw.spare1); + tm_frame.tm_sec_trailer.ocf[3] = (clcw.rv); + // Alternate OCF + ocf = 1; +#ifdef OCF_DEBUG + Crypto_clcwPrint(&clcw); +#endif + } + else + { // FSR + tm_frame.tm_sec_trailer.ocf[0] = (report.cwt << 7) | (report.vnum << 4) | (report.af << 3) | + (report.bsnf << 2) | (report.bmacf << 1) | (report.ispif); + tm_frame.tm_sec_trailer.ocf[1] = (report.lspiu & 0xFF00) >> 8; + tm_frame.tm_sec_trailer.ocf[2] = (report.lspiu & 0x00FF); + tm_frame.tm_sec_trailer.ocf[3] = (report.snval); + // Alternate OCF + ocf = 0; +#ifdef OCF_DEBUG + Crypto_fsrPrint(&report); +#endif + } +} diff --git a/src/src_main/crypto_user.c b/src/src_main/crypto_user.c new file mode 100644 index 00000000..58ab005b --- /dev/null +++ b/src/src_main/crypto_user.c @@ -0,0 +1,188 @@ +/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. + All Foreign Rights are Reserved to the U.S. Government. + + This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, + including, but not limited to, any warranty that the software will conform to specifications, any implied warranties + of merchantability, fitness for a particular purpose, and freedom from infringement, and any warranty that the + documentation will conform to the program, or any warranty that the software will be error free. + + In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or + consequential damages, arising out of, resulting from, or in any way connected with the software or its + documentation, whether or not based upon warranty, contract, tort or otherwise, and whether or not loss was sustained + from, or arose out of the results of, or use of, the software, documentation or services provided hereunder. + + ITC Team + NASA IV&V + jstar-development-team@mail.nasa.gov +*/ + +/* +** Includes +*/ +#include "crypto.h" + +/** + * @brief Function: Crypto_User_IdleTrigger + * @param ingest: uint8_t* + * @return int32: count + **/ +int32_t Crypto_User_IdleTrigger(uint8_t *ingest) +{ + uint8_t count = 0; + + // Prepare for Reply + sdls_frame.pdu.pdu_len = 0; + sdls_frame.hdr.pkt_length = sdls_frame.pdu.pdu_len + 9; + count = Crypto_Prep_Reply(ingest, 144); + + return count; +} + +/** + * @brief Function: Crypto_User_BadSPI + * @return int32: Success/Failure + **/ +int32_t Crypto_User_BadSPI(void) +{ + // Toggle Bad Sequence Number + if (badSPI == 0) + { + badSPI = 1; + } + else + { + badSPI = 0; + } + + return CRYPTO_LIB_SUCCESS; +} + +/** + * @brief Function: Crypto_User_BadMAC + * @return int32: Success/Failure + **/ +int32_t Crypto_User_BadMAC(void) +{ + // Toggle Bad MAC + if (badMAC == 0) + { + badMAC = 1; + } + else + { + badMAC = 0; + } + + return CRYPTO_LIB_SUCCESS; +} + +/** + * @brief Function: Crypto_User_BadIV + * @return int32: Success/Failure + **/ +int32_t Crypto_User_BadIV(void) +{ + // Toggle Bad MAC + if (badIV == 0) + { + badIV = 1; + } + else + { + badIV = 0; + } + + return CRYPTO_LIB_SUCCESS; +} + +/** + * @brief Function: Crypto_User_BadFECF + * @return int32: Success/Failure + **/ +int32_t Crypto_User_BadFECF(void) +{ + // Toggle Bad FECF + if (badFECF == 0) + { + badFECF = 1; + } + else + { + badFECF = 0; + } + + return CRYPTO_LIB_SUCCESS; +} + +/** + * @brief Function: Crypto_User_ModifyKey + * @return int32: Success/Failure + **/ +int32_t Crypto_User_ModifyKey(void) +{ + // Local variables + uint16_t kid = ((uint8_t)sdls_frame.pdu.data[0] << 8) | ((uint8_t)sdls_frame.pdu.data[1]); + uint8_t mod = (uint8_t)sdls_frame.pdu.data[2]; + + switch (mod) + { + case 1: // Invalidate Key + ek_ring[kid].value[KEY_SIZE - 1]++; + printf("Key %d value invalidated! \n", kid); + break; + case 2: // Modify key state + ek_ring[kid].key_state = (uint8_t)sdls_frame.pdu.data[3] & 0x0F; + printf("Key %d state changed to %d! \n", kid, mod); + break; + default: + // Error + break; + } + + return CRYPTO_LIB_SUCCESS; +} + +/** + * @brief Function: Crypto_User_ModifyActiveTM + * Modifies tm_sec_header.spi based on sdls_frame.pdu.data[0] + * @return int32: Success/Failure + **/ +int32_t Crypto_User_ModifyActiveTM(void) +{ + tm_frame.tm_sec_header.spi = (uint8_t)sdls_frame.pdu.data[0]; + return CRYPTO_LIB_SUCCESS; +} + +/** + * @brief Function: Crypto_User_ModifyVCID + * @return int32: Success/Failure + **/ +int32_t Crypto_User_ModifyVCID(void) +{ + tm_frame.tm_header.vcid = (uint8_t)sdls_frame.pdu.data[0]; + SecurityAssociation_t *sa_ptr; + + for (int i = 0; i < NUM_GVCID; i++) + { + if (sadb_routine->sadb_get_sa_from_spi(i, &sa_ptr) != CRYPTO_LIB_SUCCESS) + { + // TODO - Error handling + return CRYPTO_LIB_ERROR; // Error -- unable to get SA from SPI. + } + for (int j = 0; j < NUM_SA; j++) + { + + if (sa_ptr->gvcid_tm_blk[j].mapid == TYPE_TM) + { + if (sa_ptr->gvcid_tm_blk[j].vcid == tm_frame.tm_header.vcid) + { + tm_frame.tm_sec_header.spi = i; + printf("TM Frame SPI changed to %d \n", i); + break; + } + } + } + } + + return CRYPTO_LIB_SUCCESS; +} From 9de4d81d8bd8b55379a38dae2bc32b70b528f8c0 Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 14:53:00 -0500 Subject: [PATCH 16/18] #1 - Remove warnings reported as errors to avoid CI panics; --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0fe19e5f..9d43f8b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,7 +40,7 @@ if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) enable_testing() endif() -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra") #-Werror include_directories(include) From a8b5d65a83a17e78a57bcd0e7b63716ad3a822af Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 14:59:43 -0500 Subject: [PATCH 17/18] #1 - After internal tag up decided to fix errors and leave Werror enabled; --- CMakeLists.txt | 2 +- src/src_main/crypto_tc.c | 4 ++++ util/core/shared_util.c | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d43f8b8..0fe19e5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,7 +40,7 @@ if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) enable_testing() endif() -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra") #-Werror +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror") include_directories(include) diff --git a/src/src_main/crypto_tc.c b/src/src_main/crypto_tc.c index 3dc73d95..3253ded4 100644 --- a/src/src_main/crypto_tc.c +++ b/src/src_main/crypto_tc.c @@ -68,6 +68,10 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t *p_in_frame, const uint16_t in_fra printf("%02X", ((uint8_t *)&*p_in_frame)[i]); } printf("\nPrinted %d bytes\n", in_frame_length); +#else + // TODO - Find another way to know this and remove this argument + uint16_t tmp = in_frame_length; + tmp = tmp; #endif if (crypto_config == NULL) diff --git a/util/core/shared_util.c b/util/core/shared_util.c index 4cc829a8..e5377fcc 100644 --- a/util/core/shared_util.c +++ b/util/core/shared_util.c @@ -113,6 +113,7 @@ void debug_printf(const char *format, ...) #else void debug_printf(const char *format, ...) { + format = format; // TODO - is this function / argument necessary? // Do nothing, DEBUG preprocessor disabled. } #endif @@ -141,6 +142,9 @@ void debug_hexprintf(const char *bin_data, int size_bin_data) #else void debug_hexprintf(const char *bin_data, int size_bin_data) { + // TODO - is this function / argument necessary? + bin_data = bin_data; + size_bin_data = size_bin_data; // Do nothing, DEBUG preprocessor disabled. } #endif From 41d85eddeb69d08284572c400005328cc7e43d94 Mon Sep 17 00:00:00 2001 From: Ibraheem Saleh Date: Mon, 20 Dec 2021 16:28:36 -0800 Subject: [PATCH 18/18] Fix MariaDB & related code after refactor --- .gitignore | 1 + include/crypto.h | 4 +- include/crypto_config_structs.h | 8 +- src/src_main/crypto_config.c | 12 +-- src/src_main/crypto_tc.c | 4 - src/src_main/sadb_routine_inmemory.template.c | 56 ++++++------ src/src_mysql/sadb_routine_mariadb.template.c | 90 ++++++++++--------- 7 files changed, 90 insertions(+), 85 deletions(-) diff --git a/.gitignore b/.gitignore index b7590dc8..14dea484 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .idea vgcore* +**core *.so build venv diff --git a/include/crypto.h b/include/crypto.h index 3362e136..27b1a1f1 100644 --- a/include/crypto.h +++ b/include/crypto.h @@ -56,8 +56,8 @@ extern int32_t Crypto_Config_CryptoLib(uint8_t sadb_type, uint8_t crypto_create_fecf, uint8_t process_sdls_pdus, uint8_t has_pus_hdr, uint8_t ignore_sa_state, uint8_t ignore_anti_replay, uint8_t unique_sa_per_mapid, uint8_t crypto_check_fecf, uint8_t vcid_bitmask); -extern int32_t Crypto_Config_MariaDB(uint8_t *mysql_username, uint8_t *mysql_password, uint8_t *mysql_hostname, - uint8_t *mysql_database, uint16_t mysql_port); +extern int32_t Crypto_Config_MariaDB(char *mysql_username, char *mysql_password, char *mysql_hostname, + char *mysql_database, uint16_t mysql_port); extern int32_t Crypto_Config_Add_Gvcid_Managed_Parameter(uint8_t tfvn, uint16_t scid, uint8_t vcid, uint8_t has_fecf, uint8_t has_segmentation_hdr); diff --git a/include/crypto_config_structs.h b/include/crypto_config_structs.h index 97157946..b3d54717 100644 --- a/include/crypto_config_structs.h +++ b/include/crypto_config_structs.h @@ -114,10 +114,10 @@ struct _GvcidManagedParameters_t */ typedef struct { - uint8_t *mysql_username; - uint8_t *mysql_password; - uint8_t *mysql_hostname; - uint8_t *mysql_database; + char *mysql_username; + char *mysql_password; + char *mysql_hostname; + char *mysql_database; uint16_t mysql_port; } SadbMariaDBConfig_t; #define SADB_MARIADB_CONFIG_SIZE (sizeof(SadbMariaDBConfig_t)) diff --git a/src/src_main/crypto_config.c b/src/src_main/crypto_config.c index 26e7ef22..28a1f219 100644 --- a/src/src_main/crypto_config.c +++ b/src/src_main/crypto_config.c @@ -199,15 +199,15 @@ int32_t Crypto_Config_CryptoLib(uint8_t sadb_type, uint8_t crypto_create_fecf, u /** * @brief Function: Crypto_Config_MariaDB - * @param mysql_username: uint8_t* - * @param mysql_password: uint8_t* - * @param mysql_hostname: uint8_t* - * @param mysql_database: uint8_t* + * @param mysql_username: char* + * @param mysql_password: char* + * @param mysql_hostname: char* + * @param mysql_database: char* * @param mysql_port: uint16 * @return int32: Success/Failure **/ -int32_t Crypto_Config_MariaDB(uint8_t *mysql_username, uint8_t *mysql_password, uint8_t *mysql_hostname, - uint8_t *mysql_database, uint16_t mysql_port) +int32_t Crypto_Config_MariaDB(char *mysql_username, char *mysql_password, char *mysql_hostname, + char *mysql_database, uint16_t mysql_port) { int32_t status = CRYPTO_LIB_SUCCESS; sadb_mariadb_config = (SadbMariaDBConfig_t *)calloc(1, SADB_MARIADB_CONFIG_SIZE); diff --git a/src/src_main/crypto_tc.c b/src/src_main/crypto_tc.c index 3253ded4..60496cc8 100644 --- a/src/src_main/crypto_tc.c +++ b/src/src_main/crypto_tc.c @@ -609,10 +609,6 @@ int32_t Crypto_TC_ApplySecurity(const uint8_t *p_in_frame, const uint16_t in_fra if (sa_service_type != SA_PLAINTEXT) { #ifdef INCREMENT - if (sa_ptr->iv == NULL) - { - printf("\n\nNULL\n\n"); - } Crypto_increment(sa_ptr->iv, sa_ptr->shivf_len); #ifdef SA_DEBUG printf(KYEL "Next IV value is:\n\t"); diff --git a/src/src_main/sadb_routine_inmemory.template.c b/src/src_main/sadb_routine_inmemory.template.c index fe4488ea..1b9e612c 100644 --- a/src/src_main/sadb_routine_inmemory.template.c +++ b/src/src_main/sadb_routine_inmemory.template.c @@ -15,22 +15,23 @@ #include "crypto.h" // Security Association Initialization Functions -int32_t sadb_config(void); -int32_t sadb_init(void); -int32_t sadb_close(void); +static int32_t sadb_config(void); +static int32_t sadb_init(void); +static int32_t sadb_close(void); // Security Association Interaction Functions -int32_t sadb_get_sa_from_spi(uint16_t, SecurityAssociation_t **); -int32_t sadb_get_operational_sa_from_gvcid(uint8_t, uint16_t, uint16_t, uint8_t, SecurityAssociation_t **); -int32_t sadb_save_sa(SecurityAssociation_t *sa); +static int32_t sadb_get_sa_from_spi(uint16_t, SecurityAssociation_t **); +static int32_t sadb_get_operational_sa_from_gvcid(uint8_t, uint16_t, uint16_t, uint8_t, SecurityAssociation_t **); +static int32_t sadb_save_sa(SecurityAssociation_t *sa); // Security Association Utility Functions -int32_t sadb_sa_start(TC_t *tc_frame); -int32_t sadb_sa_expire(void); -int32_t sadb_sa_rekey(void); -int32_t sadb_sa_status(uint8_t *); -int32_t sadb_sa_create(void); -int32_t sadb_sa_setARSN(void); -int32_t sadb_sa_setARSNW(void); -int32_t sadb_sa_delete(void); +static int32_t sadb_sa_stop(void); +static int32_t sadb_sa_start(TC_t *tc_frame); +static int32_t sadb_sa_expire(void); +static int32_t sadb_sa_rekey(void); +static int32_t sadb_sa_status(uint8_t *); +static int32_t sadb_sa_create(void); +static int32_t sadb_sa_setARSN(void); +static int32_t sadb_sa_setARSNW(void); +static int32_t sadb_sa_delete(void); /* ** Global Variables @@ -50,6 +51,7 @@ SadbRoutine get_sadb_routine_inmemory(void) sadb_routine_struct.sadb_close = sadb_close; sadb_routine_struct.sadb_get_sa_from_spi = sadb_get_sa_from_spi; sadb_routine_struct.sadb_get_operational_sa_from_gvcid = sadb_get_operational_sa_from_gvcid; + sadb_routine_struct.sadb_sa_stop = sadb_sa_stop; sadb_routine_struct.sadb_save_sa = sadb_save_sa; sadb_routine_struct.sadb_sa_start = sadb_sa_start; sadb_routine_struct.sadb_sa_expire = sadb_sa_expire; @@ -253,7 +255,7 @@ int32_t sadb_init(void) * @brief Function: sadb_close * @return int32: Success/Failure **/ -int32_t sadb_close(void) +static int32_t sadb_close(void) { // closing not necessary for inmemory DB. return CRYPTO_LIB_SUCCESS; @@ -268,7 +270,7 @@ int32_t sadb_close(void) * @param security_association: SecurityAssociation_t** * @return int32: Success/Failure **/ -int32_t sadb_get_sa_from_spi(uint16_t spi, SecurityAssociation_t **security_association) +static int32_t sadb_get_sa_from_spi(uint16_t spi, SecurityAssociation_t **security_association) { int32_t status = CRYPTO_LIB_SUCCESS; if (sa == NULL) @@ -300,7 +302,7 @@ int32_t sadb_get_sa_from_spi(uint16_t spi, SecurityAssociation_t **security_asso * @param security_association: SecurityAssociation_t** * @return int32: Success/Failure **/ -int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn, uint16_t scid, uint16_t vcid, uint8_t mapid, +static int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn, uint16_t scid, uint16_t vcid, uint8_t mapid, SecurityAssociation_t **security_association) { int32_t status = CRYPTO_LIB_ERR_NO_OPERATIONAL_SA; @@ -406,7 +408,7 @@ int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn, uint16_t scid, uint16_t * @return int32: Success/Failure * @note Nothing currently actually happens in this function **/ -int32_t sadb_save_sa(SecurityAssociation_t *sa) +static int32_t sadb_save_sa(SecurityAssociation_t *sa) { int32_t status = CRYPTO_LIB_SUCCESS; sa = sa; // TODO - use argument @@ -424,7 +426,7 @@ int32_t sadb_save_sa(SecurityAssociation_t *sa) * @param tc_frame: TC_t * @return int32: Success/Failure **/ -int32_t sadb_sa_start(TC_t *tc_frame) +static int32_t sadb_sa_start(TC_t *tc_frame) { // Local variables uint8_t count = 0; @@ -553,7 +555,7 @@ int32_t sadb_sa_start(TC_t *tc_frame) * @brief Function: sadb_sa_stop * @return int32: Success/Failure **/ -int32_t sadb_sa_stop(void) +static int32_t sadb_sa_stop(void) { // Local variables uint16_t spi = 0x0000; @@ -612,7 +614,7 @@ int32_t sadb_sa_stop(void) * @brief Function: sadb_sa_rekey * @return int32: Success/Failure **/ -int32_t sadb_sa_rekey(void) +static int32_t sadb_sa_rekey(void) { // Local variables uint16_t spi = 0x0000; @@ -692,7 +694,7 @@ int32_t sadb_sa_rekey(void) * @brief Function: sadb_sa_expire * @return int32: Success/Failure **/ -int32_t sadb_sa_expire(void) +static int32_t sadb_sa_expire(void) { // Local variables uint16_t spi = 0x0000; @@ -732,7 +734,7 @@ int32_t sadb_sa_expire(void) * @brief Function: sadb_sa_create * @return int32: Success/Failure **/ -int32_t sadb_sa_create(void) +static int32_t sadb_sa_create(void) { // Local variables uint8_t count = 6; @@ -811,7 +813,7 @@ int32_t sadb_sa_create(void) * @brief Function: sadb_sa_delete * @return int32: Success/Failure **/ -int32_t sadb_sa_delete(void) +static int32_t sadb_sa_delete(void) { // Local variables uint16_t spi = 0x0000; @@ -853,7 +855,7 @@ int32_t sadb_sa_delete(void) * @brief Function: sadb_sa_setASRN * @return int32: Success/Failure **/ -int32_t sadb_sa_setARSN(void) +static int32_t sadb_sa_setARSN(void) { // Local variables uint16_t spi = 0x0000; @@ -902,7 +904,7 @@ int32_t sadb_sa_setARSN(void) * @brief Function: sadb_sa_setARSNW * @return int32: Success/Failure **/ -int32_t sadb_sa_setARSNW(void) +static int32_t sadb_sa_setARSNW(void) { // Local variables uint16_t spi = 0x0000; @@ -940,7 +942,7 @@ int32_t sadb_sa_setARSNW(void) * @param ingest: uint8_t* * @return int32: count **/ -int32_t sadb_sa_status(uint8_t *ingest) +static int32_t sadb_sa_status(uint8_t *ingest) { // Local variables int count = 0; diff --git a/src/src_mysql/sadb_routine_mariadb.template.c b/src/src_mysql/sadb_routine_mariadb.template.c index c5f89833..9993b4d6 100644 --- a/src/src_mysql/sadb_routine_mariadb.template.c +++ b/src/src_mysql/sadb_routine_mariadb.template.c @@ -28,10 +28,11 @@ static int32_t sadb_config(void); static int32_t sadb_init(void); static int32_t sadb_close(void); // Security Association Interaction Functions -static int32_t sadb_get_sa_from_spi(uint16, SecurityAssociation_t **); -static int32_t sadb_get_operational_sa_from_gvcid(uint8, uint16, uint16, uint8, SecurityAssociation_t **); +static int32_t sadb_get_sa_from_spi(uint16_t, SecurityAssociation_t **); +static int32_t sadb_get_operational_sa_from_gvcid(uint8_t, uint16_t, uint16_t, uint8_t, SecurityAssociation_t **); static int32_t sadb_save_sa(SecurityAssociation_t *sa); // Security Association Utility Functions +static int32_t sadb_sa_stop(void); static int32_t sadb_sa_start(TC_t *tc_frame); static int32_t sadb_sa_expire(void); static int32_t sadb_sa_rekey(void); @@ -43,50 +44,51 @@ static int32_t sadb_sa_delete(void); // MySQL local functions static int32_t finish_with_error(MYSQL *con, int err); // MySQL Queries -const static uint8_t *SQL_SADB_GET_SA_BY_SPI = +static const char *SQL_SADB_GET_SA_BY_SPI = "SELECT " "spi,ekid,akid,sa_state,tfvn,scid,vcid,mapid,lpid,est,ast,shivf_len,shsnf_len,shplf_len,stmacf_len,ecs_len,HEX(ecs)" ",iv_len,HEX(iv),acs_len,acs,abm_len,HEX(abm),arc_len,HEX(arc),arcw_len,HEX(arcw)" " FROM security_associations WHERE spi='%d'"; -const static uint8_t *SQL_SADB_GET_SA_BY_GVCID = +static const char *SQL_SADB_GET_SA_BY_GVCID = "SELECT " "spi,ekid,akid,sa_state,tfvn,scid,vcid,mapid,lpid,est,ast,shivf_len,shsnf_len,shplf_len,stmacf_len,ecs_len,HEX(ecs)" ",iv_len,HEX(iv),acs_len,acs,abm_len,HEX(abm),arc_len,HEX(arc),arcw_len,HEX(arcw)" " FROM security_associations WHERE tfvn='%d' AND scid='%d' AND vcid='%d' AND mapid='%d' AND sa_state='%d'"; -const static uint8_t *SQL_SADB_UPDATE_IV_ARC_BY_SPI = +static const char *SQL_SADB_UPDATE_IV_ARC_BY_SPI = "UPDATE security_associations" " SET iv=X'%s', arc=X'%s'" " WHERE spi='%d' AND tfvn='%d' AND scid='%d' AND vcid='%d' AND mapid='%d'"; // sadb_routine mariaDB private helper functions -static int32_t parse_sa_from_mysql_query(uint8_t *query, SecurityAssociation_t **security_association); -static int32_t convert_hexstring_to_byte_array(uint8_t *hexstr, uint8_t *byte_array); -static uint8_t *convert_byte_array_to_hexstring(void *src_buffer, size_t buffer_length); +static int32_t parse_sa_from_mysql_query(char *query, SecurityAssociation_t **security_association); +static int32_t convert_hexstring_to_byte_array(char *hexstr, uint8_t *byte_array); +static char *convert_byte_array_to_hexstring(void *src_buffer, size_t buffer_length); /* ** Global Variables */ // Security -static SadbRoutineStruct sadb_routine; -static SecurityAssociation_t sa[NUM_SA]; +static SadbRoutineStruct sadb_routine_struct; static MYSQL *con; SadbRoutine get_sadb_routine_mariadb(void) { - sadb_routine.sadb_config = sadb_config; - sadb_routine.sadb_init = sadb_init; - sadb_routine.sadb_get_sa_from_spi = sadb_get_sa_from_spi; - sadb_routine.sadb_get_operational_sa_from_gvcid = sadb_get_operational_sa_from_gvcid; - sadb_routine.sadb_save_sa = sadb_save_sa; - sadb_routine.sadb_sa_start = sadb_sa_start; - sadb_routine.sadb_sa_expire = sadb_sa_expire; - sadb_routine.sadb_sa_rekey = sadb_sa_rekey; - sadb_routine.sadb_sa_status = sadb_sa_status; - sadb_routine.sadb_sa_create = sadb_sa_create; - sadb_routine.sadb_sa_setARSN = sadb_sa_setARSN; - sadb_routine.sadb_sa_setARSNW = sadb_sa_setARSNW; - sadb_routine.sadb_sa_delete = sadb_sa_delete; - return &sadb_routine; + sadb_routine_struct.sadb_config = sadb_config; + sadb_routine_struct.sadb_init = sadb_init; + sadb_routine_struct.sadb_close = sadb_close; + sadb_routine_struct.sadb_get_sa_from_spi = sadb_get_sa_from_spi; + sadb_routine_struct.sadb_get_operational_sa_from_gvcid = sadb_get_operational_sa_from_gvcid; + sadb_routine_struct.sadb_sa_stop = sadb_sa_stop; + sadb_routine_struct.sadb_save_sa = sadb_save_sa; + sadb_routine_struct.sadb_sa_start = sadb_sa_start; + sadb_routine_struct.sadb_sa_expire = sadb_sa_expire; + sadb_routine_struct.sadb_sa_rekey = sadb_sa_rekey; + sadb_routine_struct.sadb_sa_status = sadb_sa_status; + sadb_routine_struct.sadb_sa_create = sadb_sa_create; + sadb_routine_struct.sadb_sa_setARSN = sadb_sa_setARSN; + sadb_routine_struct.sadb_sa_setARSNW = sadb_sa_setARSNW; + sadb_routine_struct.sadb_sa_delete = sadb_sa_delete; + return &sadb_routine_struct; } static int32_t sadb_config(void) @@ -122,7 +124,7 @@ static int32_t sadb_get_sa_from_spi(uint16_t spi, SecurityAssociation_t **securi { int32_t status = CRYPTO_LIB_SUCCESS; - uint8_t spi_query[2048]; + char spi_query[2048]; snprintf(spi_query, sizeof(spi_query), SQL_SADB_GET_SA_BY_SPI, spi); status = parse_sa_from_mysql_query(&spi_query[0], security_association); @@ -134,7 +136,7 @@ static int32_t sadb_get_operational_sa_from_gvcid(uint8_t tfvn, uint16_t scid, u { int32_t status = CRYPTO_LIB_SUCCESS; - uint8_t gvcid_query[2048]; + char gvcid_query[2048]; snprintf(gvcid_query, sizeof(gvcid_query), SQL_SADB_GET_SA_BY_GVCID, tfvn, scid, vcid, mapid, SA_OPERATIONAL); status = parse_sa_from_mysql_query(&gvcid_query[0], security_association); @@ -149,7 +151,7 @@ static int32_t sadb_save_sa(SecurityAssociation_t *sa) return SADB_NULL_SA_USED; } - uint8_t update_sa_query[2048]; + char update_sa_query[2048]; snprintf(update_sa_query, sizeof(update_sa_query), SQL_SADB_UPDATE_IV_ARC_BY_SPI, convert_byte_array_to_hexstring(sa->iv, sa->shivf_len), convert_byte_array_to_hexstring(sa->arc, sa->shsnf_len), sa->spi, sa->gvcid_tc_blk.tfvn, @@ -178,8 +180,13 @@ static int32_t sadb_save_sa(SecurityAssociation_t *sa) return status; } // Security Association Utility Functions +static int32_t sadb_sa_stop(void) +{ + return CRYPTO_LIB_SUCCESS; +} static int32_t sadb_sa_start(TC_t *tc_frame) { + tc_frame = tc_frame; return CRYPTO_LIB_SUCCESS; } static int32_t sadb_sa_expire(void) @@ -192,6 +199,7 @@ static int32_t sadb_sa_rekey(void) } static int32_t sadb_sa_status(uint8_t *ingest) { + ingest = ingest; return CRYPTO_LIB_SUCCESS; } static int32_t sadb_sa_create(void) @@ -212,7 +220,7 @@ static int32_t sadb_sa_delete(void) } // sadb_routine private helper functions -static int32_t parse_sa_from_mysql_query(uint8_t *query, SecurityAssociation_t **security_association) +static int32_t parse_sa_from_mysql_query(char *query, SecurityAssociation_t **security_association) { int32_t status = CRYPTO_LIB_SUCCESS; SecurityAssociation_t *sa = malloc(sizeof(SecurityAssociation_t)); @@ -240,13 +248,13 @@ static int32_t parse_sa_from_mysql_query(uint8_t *query, SecurityAssociation_t * MYSQL_ROW row; MYSQL_FIELD *field; - uint8_t *field_names[num_fields]; //[64]; 64 == max length of column name in MySQL + char *field_names[num_fields]; //[64]; 64 == max length of column name in MySQL // TODO -- Need to store mysql query hex string and then malloc sa->iv according to size. // TODO -- IV && arc && abm as uint8_t* instead of uint8[]!!! - uint8_t *iv_byte_str; - uint8_t *arc_byte_str; - uint8_t *abm_byte_str; + char *iv_byte_str; + char *arc_byte_str; + char *abm_byte_str; while ((row = mysql_fetch_row(result))) { for (int i = 0; i < num_fields; i++) @@ -255,15 +263,13 @@ static int32_t parse_sa_from_mysql_query(uint8_t *query, SecurityAssociation_t * if (i == 0) { int field_idx = 0; - while (field = mysql_fetch_field(result)) + while ((field = mysql_fetch_field(result))) { field_names[field_idx] = field->name; field_idx++; } } // Handle query results - int spi; - uint8_t tmp_uint8; if (row[i] == NULL) { continue; @@ -417,12 +423,12 @@ static int32_t parse_sa_from_mysql_query(uint8_t *query, SecurityAssociation_t * return status; } -static int32_t convert_hexstring_to_byte_array(uint8_t *source_str, uint8_t *dest_buffer) +static int32_t convert_hexstring_to_byte_array(char *source_str, uint8_t *dest_buffer) { // https://stackoverflow.com/questions/3408706/hexadecimal-string-to-byte-array-in-c/56247335#56247335 - uint8_t *line = source_str; - uint8_t *data = line; + char *line = source_str; + char *data = line; int offset; - uint8_t read_byte; + unsigned int read_byte; uint8_t data_len = 0; while (sscanf(data, " %02x%n", &read_byte, &offset) == 1) @@ -433,15 +439,15 @@ static int32_t convert_hexstring_to_byte_array(uint8_t *source_str, uint8_t *des return data_len; } -static uint8_t *convert_byte_array_to_hexstring(void *src_buffer, size_t buffer_length) +static char *convert_byte_array_to_hexstring(void *src_buffer, size_t buffer_length) { if (buffer_length == 0) { // Return empty string (with null char!) if buffer is empty return ""; } - unsigned uint8_t *bytes = src_buffer; - unsigned uint8_t *hexstr = malloc(buffer_length * 2 + 1); + unsigned char *bytes = src_buffer; + char *hexstr = malloc(buffer_length * 2 + 1); if (src_buffer == NULL) return NULL;

    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%0D>LN*nS07t&R$+eR%QaKJ`pL7>> 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 g|2>`H>|*5P;^Fk2K49Zu=3rxkCL Date: Fri, 17 Dec 2021 07:02:20 -0500 Subject: [PATCH 02/18] #1 - Removed library installation from readme in favor of Wiki; --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 601cf169..a14efcf6 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,5 @@ Provide a software-only solution using the CCSDS Space Data Link Security Protocol - Extended Procedures (SDLS-EP) to secure communications between a spacecraft running the core Flight System (cFS) and a ground station. -In order to build crypto the following must be installed assuming Ubuntu 18.04 LTS: -* `sudo apt install libgpg-error-dev libgcrypt20-dev` - - More information about building and usage of CryptoLib can be found within the repository Wiki: https://github.com/nasa/CryptoLib/wiki From 44db429d480678eb4de42998bd3a59215479677a Mon Sep 17 00:00:00 2001 From: "Lucas, John P" Date: Fri, 17 Dec 2021 07:05:13 -0500 Subject: [PATCH 03/18] #1 - Removed unused itc_*128 crypto files and references; --- fsw/public_inc/itc_aes128.h | 52 - fsw/public_inc/itc_cmac128.h | 50 - fsw/public_inc/itc_gcm128.h | 185 - fsw/src/crypto.c | 5 - fsw/src/itc_aes128.c | 562 --- fsw/src/itc_cmac128.c | 135 - fsw/src/itc_gcm128.c | 409 --- fsw/src/sadb_routine_inmemory.template.c | 1 - unit_test/ciphers/Makefile | 32 - .../ciphers/cmactestvectors/CMACVerAES128.rsp | 2165 ----------- .../CMACVerAES128_stripped.rsp | 1079 ------ .../Decrypt128/gcmDecrypt128_stripped.rsp | 3150 ----------------- .../gcmtestvectors/Decrypt128/test1.txt | 126 - .../gcmtestvectors/Decrypt128/test10.txt | 126 - .../gcmtestvectors/Decrypt128/test11.txt | 126 - .../gcmtestvectors/Decrypt128/test12.txt | 126 - .../gcmtestvectors/Decrypt128/test13.txt | 126 - .../gcmtestvectors/Decrypt128/test14.txt | 126 - .../gcmtestvectors/Decrypt128/test15.txt | 126 - .../gcmtestvectors/Decrypt128/test16.txt | 126 - .../gcmtestvectors/Decrypt128/test17.txt | 126 - .../gcmtestvectors/Decrypt128/test18.txt | 126 - .../gcmtestvectors/Decrypt128/test19.txt | 126 - .../gcmtestvectors/Decrypt128/test2.txt | 126 - .../gcmtestvectors/Decrypt128/test20.txt | 126 - .../gcmtestvectors/Decrypt128/test21.txt | 126 - .../gcmtestvectors/Decrypt128/test22.txt | 126 - .../gcmtestvectors/Decrypt128/test23.txt | 126 - .../gcmtestvectors/Decrypt128/test24.txt | 126 - .../gcmtestvectors/Decrypt128/test25.txt | 126 - .../gcmtestvectors/Decrypt128/test3.txt | 126 - .../gcmtestvectors/Decrypt128/test4.txt | 126 - .../gcmtestvectors/Decrypt128/test5.txt | 126 - .../gcmtestvectors/Decrypt128/test6.txt | 126 - .../gcmtestvectors/Decrypt128/test7.txt | 126 - .../gcmtestvectors/Decrypt128/test8.txt | 126 - .../gcmtestvectors/Decrypt128/test9.txt | 126 - .../gcmEncryptExtIV128_stripped.rsp | 3150 ----------------- .../gcmtestvectors/Encrypt128/test1.txt | 126 - .../gcmtestvectors/Encrypt128/test10.txt | 126 - .../gcmtestvectors/Encrypt128/test11.txt | 126 - .../gcmtestvectors/Encrypt128/test12.txt | 126 - .../gcmtestvectors/Encrypt128/test13.txt | 126 - .../gcmtestvectors/Encrypt128/test14.txt | 126 - .../gcmtestvectors/Encrypt128/test15.txt | 126 - .../gcmtestvectors/Encrypt128/test16.txt | 126 - .../gcmtestvectors/Encrypt128/test17.txt | 126 - .../gcmtestvectors/Encrypt128/test18.txt | 126 - .../gcmtestvectors/Encrypt128/test19.txt | 126 - .../gcmtestvectors/Encrypt128/test2.txt | 126 - .../gcmtestvectors/Encrypt128/test20.txt | 126 - .../gcmtestvectors/Encrypt128/test21.txt | 126 - .../gcmtestvectors/Encrypt128/test22.txt | 126 - .../gcmtestvectors/Encrypt128/test23.txt | 126 - .../gcmtestvectors/Encrypt128/test24.txt | 126 - .../gcmtestvectors/Encrypt128/test25.txt | 126 - .../gcmtestvectors/Encrypt128/test3.txt | 126 - .../gcmtestvectors/Encrypt128/test4.txt | 126 - .../gcmtestvectors/Encrypt128/test5.txt | 126 - .../gcmtestvectors/Encrypt128/test6.txt | 126 - .../gcmtestvectors/Encrypt128/test7.txt | 126 - .../gcmtestvectors/Encrypt128/test8.txt | 126 - .../gcmtestvectors/Encrypt128/test9.txt | 126 - .../gcmtestvectors/gcmDecrypt128_stripped.rsp | 3150 ----------------- .../gcmEncryptExtIV128_stripped.rsp | 3150 ----------------- unit_test/ciphers/itc_aes128_test | Bin 18032 -> 0 bytes unit_test/ciphers/itc_aes128_test.c | 150 - unit_test/ciphers/itc_cmac128_test | Bin 27536 -> 0 bytes unit_test/ciphers/itc_cmac128_test.c | 403 --- unit_test/ciphers/itc_gcm128_test | Bin 32488 -> 0 bytes unit_test/ciphers/itc_gcm128_test.c | 701 ---- 71 files changed, 24829 deletions(-) delete mode 100644 fsw/public_inc/itc_aes128.h delete mode 100644 fsw/public_inc/itc_cmac128.h delete mode 100644 fsw/public_inc/itc_gcm128.h delete mode 100644 fsw/src/itc_aes128.c delete mode 100644 fsw/src/itc_cmac128.c delete mode 100644 fsw/src/itc_gcm128.c delete mode 100644 unit_test/ciphers/Makefile delete mode 100644 unit_test/ciphers/cmactestvectors/CMACVerAES128.rsp delete mode 100644 unit_test/ciphers/cmactestvectors/CMACVerAES128_stripped.rsp delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/gcmDecrypt128_stripped.rsp delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test1.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test10.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test11.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test12.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test13.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test14.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test15.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test16.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test17.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test18.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test19.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test2.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test20.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test21.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test22.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test23.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test24.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test25.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test3.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test4.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test5.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test6.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test7.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test8.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Decrypt128/test9.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/gcmEncryptExtIV128_stripped.rsp delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test1.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test10.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test11.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test12.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test13.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test14.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test15.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test16.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test17.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test18.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test19.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test2.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test20.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test21.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test22.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test23.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test24.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test25.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test3.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test4.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test5.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test6.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test7.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test8.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/Encrypt128/test9.txt delete mode 100644 unit_test/ciphers/gcmtestvectors/gcmDecrypt128_stripped.rsp delete mode 100644 unit_test/ciphers/gcmtestvectors/gcmEncryptExtIV128_stripped.rsp delete mode 100644 unit_test/ciphers/itc_aes128_test delete mode 100644 unit_test/ciphers/itc_aes128_test.c delete mode 100644 unit_test/ciphers/itc_cmac128_test delete mode 100644 unit_test/ciphers/itc_cmac128_test.c delete mode 100644 unit_test/ciphers/itc_gcm128_test delete mode 100644 unit_test/ciphers/itc_gcm128_test.c diff --git a/fsw/public_inc/itc_aes128.h b/fsw/public_inc/itc_aes128.h deleted file mode 100644 index 20feda12..00000000 --- a/fsw/public_inc/itc_aes128.h +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. - - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. - - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. - - ITC Team - NASA IV&V - jstar-development-team@mail.nasa.gov -*/ - -#ifndef ITC_AES128_H -#define ITC_AES128_H - -#define KS_LENGTH 176 /* key schedule length for 128-bit AES */ - -/******************************************************************************* -* -* A lightweight implementation of AES 128-bit encryption. -* -* This code is meant for prototyping, and has not undergone any efforts -* to be safe from any side channel or timing attacks. It merely provides -* correct output in a small package. -* -* This library will likely misbehave if the target platform implements -* unsigned char with a size not equal to 8 bits. -*******************************************************************************/ - -struct itc_aes128_context -{ - unsigned char key_schedule[KS_LENGTH]; -}; - -/* Takes a 128-bit key and creates the expanded key schedule. -** The key pointer must reference a a valid 16-byte block. -*/ -void itc_aes128_init(struct itc_aes128_context *ctx, const unsigned char *key); - -/* Methods for encrypting and decrypting a 128-bit (16 byte) block. -** The input and output pointers must reference a valid 16-byte block. Input same as output is allowed. -** The context pointer must have previously been initialized with a key. -*/ -void itc_aes128_encrypt(const struct itc_aes128_context *ctx, const unsigned char *input, unsigned char *output); -void itc_aes128_decrypt(const struct itc_aes128_context *ctx, const unsigned char *input, unsigned char *output); - -#endif /* ITC_AES128_H */ diff --git a/fsw/public_inc/itc_cmac128.h b/fsw/public_inc/itc_cmac128.h deleted file mode 100644 index e6c1145f..00000000 --- a/fsw/public_inc/itc_cmac128.h +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (C) 2009 - 2015 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. - - This software is provided "as is" without any warranty of any, kind either express, implied, or statutory, including, but not - limited to, any warranty that the software will conform to, specifications any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. - - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation. Whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder - - ITC Team - NASA IV&V - ivv-itc@lists.nasa.gov -*/ - -#ifndef ITC_CMAC128_H -#define ITC_CMAC128_H - -#include -#include "itc_aes128.h" - -#define ITC_CMAC128_SUCCESS 0 -#define ITC_CMAC128_BAD_TAG -10011 - -struct itc_cmac128_context -{ - struct itc_aes128_context aes_ctx; - unsigned char k1[16]; - unsigned char k2[16]; -}; - -void itc_cmac128_init(struct itc_cmac128_context * ctx, const unsigned char * key); - -int itc_cmac128_generate_tag( struct itc_cmac128_context *ctx, - size_t length, - const unsigned char * message, - unsigned char *tag ); - -int itc_cmac128_validate( struct itc_cmac128_context *ctx, - size_t length, - const unsigned char * message, - const unsigned char *tag ); - -// todo : methods for streaming tagging/validation - - - -#endif /* ITC_CMAC128_H */ \ No newline at end of file diff --git a/fsw/public_inc/itc_gcm128.h b/fsw/public_inc/itc_gcm128.h deleted file mode 100644 index c85fe8bd..00000000 --- a/fsw/public_inc/itc_gcm128.h +++ /dev/null @@ -1,185 +0,0 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. - - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. - - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. - - ITC Team - NASA IV&V - jstar-development-team@mail.nasa.gov -*/ - -#ifndef ITC_GCM128_H -#define ITC_GCM128_H - -// CFS Includes -#ifdef NOS3 //NOS3/cFS build is ready -#include "common_types.h" -#else //Assume build outside of NOS3/cFS infrastructure -#include "common_types_minimum.h" -#endif -// Standard Includes -#include "itc_aes128.h" - -/* A lightweight implementation of Galois Counter Mode Authenticated Encryption. - Supports the following: - - 128-bit key - - AES block cipher - - 96-bit IV - - 128-bit MAC tag - - size of AAD limited to 2^32-1 bytes - - size of Data limited to 2^32-1 bytes - - authenticated data - will not require it to be block-divisible - encrypted data - will not require it to be block-divisible - need to bounds check lengths of aad/plaintext -*/ - - - -/********************** Error Codes **************************/ - -/* Notice: No error codes for NULL parameters (NULL's are assert-checked) */ -#define ITC_GCM128_SUCCESS 0 -#define ITC_GCM128_BAD_TAG -10001 /* Tag is invalid for message */ -#define ITC_GCM128_OUT_OF_RANGE -10002 /* AAD/Data Length is too large */ - -/********************** Structs & Stuff **************************/ - -/* Context object for GCM operations. - * Must be initialized before use! - * Context should never be manually manipulated - use only the library operations! -*/ -struct itc_gcm128_context -{ - /* First two fields are constant for any fixed key */ - struct itc_aes128_context aes_ctx; /* for use with AES cipher */ - unsigned char h[16]; /* H subkey for use in GHASH */ - - /* Variable fields: */ - unsigned char iv_ctr[16]; /* IV (first 12 bytes) + Counter (last 4, Big-endian) */ - unsigned char base_ectr[16]; /* Encrypted base counter block (needed at end for computing tag) */ - unsigned char ghash[16]; /* running ghash value */ - uint32 aad_length; /* length of AAD (in bytes) */ - uint32 length; /* data length */ -}; - -/********************** Operations **************************/ - -/* Initializes the context for use with GCM. - * key must be 128-bit (16 byte). - * A context should be unique to the key. It can be re-used for multiple messages. - * A context object is not thread-safe though! - * -*/ -void itc_gcm128_init(struct itc_gcm128_context *ctx, const unsigned char * key); - -/* All-in-one method for encryption and tagging. - * - * \note One of AAD or the plaintext must have size greater than zero - * \return ITC_GCM128_SUCCESS if successful - * \return ITC_GCM128_OUT_OF_RANGE if aad or data length is too long -*/ -int itc_gcm128_encrypt_and_tag( struct itc_gcm128_context *ctx, - const unsigned char * iv, /* must be 96-bit */ - size_t aad_length, /* length of AAD */ - const unsigned char * aad, /* additional authenticated data */ - size_t length, /* length of data */ - const unsigned char * plaintext, /* plaintext input */ - unsigned char * ciphertext, /* ciphertext output (buffer must have size >= plaintext) */ - unsigned char * tag ); /* tag output (128-bit) */ - -/* Performs authenticated decryption. - * - * \return ITC_GCM128_SUCCESS if successful and tag matches - * \return ITC_GCM128_BAD_TAG if tag is invalid for the message - * \return ITC_GCM128_OUT_OF_RANGE if aad or data length is too long -*/ -int itc_gcm128_decrypt( struct itc_gcm128_context *ctx, - const unsigned char * iv, /* must be 96-bit */ - size_t aad_length, /* length of AAD */ - const unsigned char * aad, /* additional authenticated data */ - size_t length, /* length of data */ - const unsigned char * ciphertext, /* ciphertext input */ - const unsigned char * tag, /* tag input (128-bit) */ - unsigned char * plaintext ); /* plaintext output */ - -/* Streaming functions for encryption: - - These are to provide flexibility when the plaintext for the message may be fragmented - - Per message: - - Call itc_gcm128_encrypt_start first (and only once) with the AAD - - Call itc_gcm128_encrypt_update repeatedly with the plaintext as needed. - For each call to update, plaintext must be divisible by 16 bytes, except for the last call (if a partial block). - - Call itc_gcm128_encrypt_finish to compute the tag. -*/ - -/* Begin encrypting a message with the Additional Authenticated Data (AAD). - * - * - * \return ITC_GCM128_SUCCESS if successful - * \return ITC_GCM128_OUT_OF_RANGE if aad length is too long -*/ -int itc_gcm128_encrypt_start( struct itc_gcm128_context *ctx, - const unsigned char * iv, /* must be 96-bit */ - size_t aad_length, /* length of AAD */ - const unsigned char * aad ); /* additional authenticated data */ - - -/* Used for streaming encryption. - * - * \note Per message, plaintext must be divisible by 16 bytes for each call except for the final update. - * - * \return ITC_GCM128_SUCCESS if successful - * \return ITC_GCM128_OUT_OF_RANGE if cumulative data length is too long -*/ -int itc_gcm128_encrypt_update( struct itc_gcm128_context *ctx, - size_t length, /* length of data */ - const unsigned char * plaintext, /* plaintext input */ - unsigned char * ciphertext ); /* ciphertext output */ - -/* Used for streaming encryption. Finishes encryption procedure and computes tag. - * - * \return ITC_GCM128_SUCCESS if successful -*/ -int itc_gcm128_encrypt_finish(struct itc_gcm128_context *ctx, unsigned char * tag); - - -/* Begin decrypting a message with the Additional Authenticated Data (AAD). - * - * - * \return ITC_GCM128_SUCCESS if successful - * \return ITC_GCM128_OUT_OF_RANGE if aad length is too long -*/ -int itc_gcm128_decrypt_start( struct itc_gcm128_context *ctx, - const unsigned char * iv, /* must be 96-bit */ - size_t aad_length, /* length of AAD */ - const unsigned char * aad ); /* additional authenticated data */ - - -/* Used for streaming decryption. - * - * \note Per message, plaintext must be divisible by 16 bytes for each call except for the final update. - * - * \return ITC_GCM128_SUCCESS if successful - * \return ITC_GCM128_OUT_OF_RANGE if cumulative data length is too long -*/ -int itc_gcm128_decrypt_update( struct itc_gcm128_context *ctx, - size_t length, /* length of data */ - const unsigned char * ciphertext, /* ciphertext input */ - unsigned char * plaintext ); /* plaintext output */ - -/* Used for streaming encryption. Finishes encryption procedure and computes tag. - * - * \return ITC_GCM128_SUCCESS if successful - * \return ITC_GCM128_BAD_TAG if tag is invalid -*/ -int itc_gcm128_decrypt_finish(struct itc_gcm128_context *ctx, const unsigned char * tag); - - -#endif /* ITC_GCM128_H */ diff --git a/fsw/src/crypto.c b/fsw/src/crypto.c index f037a0e8..ccbd9247 100644 --- a/fsw/src/crypto.c +++ b/fsw/src/crypto.c @@ -23,9 +23,6 @@ #include "crypto.h" #include "sadb_routine.h" -// #include "itc_aes128.h" -// #include "itc_gcm128.h" - #include "crypto_structs.h" #include "crypto_config_structs.h" #include "crypto_print.h" @@ -33,8 +30,6 @@ #include "crypto_events.h" #include "crypto_error.h" - - #include diff --git a/fsw/src/itc_aes128.c b/fsw/src/itc_aes128.c deleted file mode 100644 index 3fda3282..00000000 --- a/fsw/src/itc_aes128.c +++ /dev/null @@ -1,562 +0,0 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. - - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. - - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. - - ITC Team - NASA IV&V - jstar-development-team@mail.nasa.gov -*/ - -#ifndef ITC_AES128_C -#define ITC_AES128_C - -#include -#include -#include -#include "itc_aes128.h" - -#define NB 4 /* Number of columns in state */ -#define NK 4 /* Number of 32-bit words in key */ -#define KEY_LENGTH 16 /* Key length in bytes */ -#define NR 10 /* Number of rounds */ - -/* Comments: -** - Many of the areas that could use loops have been unrolled manually. -** This should improve performance at the cost of code size. -*/ - -/******************************************************************************* -* -* Substitution Tables -* -*******************************************************************************/ - -static const unsigned char sbox[256] = -{ - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, - 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, - 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, - 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, - 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, - 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, - 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, - 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, - 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, - 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, - 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 -}; - -static const unsigned char inverse_sbox[256] = -{ - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, - 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, - 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, - 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, - 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, - 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, - 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, - 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, - 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, - 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, - 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d -}; - -/* note: rcon[0] is never used */ -static const unsigned char rcon[11] = -{ - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 -}; - -/* TODO: could add lookup tables for multiplication (tables for 2,3,9,11,13,14) */ - -/* Rotate a word (4 bytes) to the left by 1: {1, 2, 3, 4 } => {2, 3, 4, 1} -** Used for key expansion. -*/ -static void rotate_word_left(unsigned char *word) -{ - unsigned char temp; - temp = word[0]; - word[0] = word[1]; - word[1] = word[2]; - word[2] = word[3]; - word[3] = temp; -} - -void itc_aes128_init(struct itc_aes128_context *ctx, const unsigned char *key) -{ - unsigned char temp[4]; - int rcon_iteration = 0; - int currentSize; - - assert(key != NULL); - assert(ctx != NULL); - - /* first part is the key itself */ - memcpy(ctx->key_schedule, key, KEY_LENGTH * sizeof(unsigned char)); - - currentSize = KEY_LENGTH; - while(currentSize < KS_LENGTH) - { - /* store previous 4 bytes in temp array */ - memcpy(temp, ctx->key_schedule + (currentSize - 4), 4 * sizeof(unsigned char)); - - /* every 16 bytes, apply core schedule */ - if(currentSize % KEY_LENGTH == 0) - { - rotate_word_left(temp); - - temp[0] = sbox[temp[0]]; - temp[1] = sbox[temp[1]]; - temp[2] = sbox[temp[2]]; - temp[3] = sbox[temp[3]]; - - temp[0] ^= rcon[++rcon_iteration]; - } - - /* next 4 bytes of key are the temp array XOR'd with 4 byte block 16 bytes back */ - ctx->key_schedule[currentSize + 0] = ctx->key_schedule[currentSize - KEY_LENGTH + 0] ^ temp[0]; - ctx->key_schedule[currentSize + 1] = ctx->key_schedule[currentSize - KEY_LENGTH + 1] ^ temp[1]; - ctx->key_schedule[currentSize + 2] = ctx->key_schedule[currentSize - KEY_LENGTH + 2] ^ temp[2]; - ctx->key_schedule[currentSize + 3] = ctx->key_schedule[currentSize - KEY_LENGTH + 3] ^ temp[3]; - currentSize += 4; - } -} - -/******************************************************************************* -* -* State Array Mapping -* -* col 0 col 1 col 2 col 3 -* -------------------------------- -* row 0 | 0 | 4 | 8 | 12 | -* |-------|-------|-------|--------| -* row 1 | 1 | 5 | 9 | 13 | -* |-------|-------|-------|--------| -* row 2 | 2 | 6 | 10 | 14 | -* |-------|-------|-------|--------| -* row 3 | 3 | 7 | 11 | 15 | -* -------------------------------- -* -*******************************************************************************/ - -/* Thank you Sam Trenholme */ -static unsigned char g_multiply(unsigned char a, unsigned char b) -{ - unsigned char p = 0; - int counter; - unsigned char hi_bit_set; - - for(counter = 0; counter < 8; ++counter) - { - /* if(b == 0) break; //if b has no more bits set, p is finalized */ - if((b & 1) == 1) - p ^= a; - hi_bit_set = (a & 0x80); - a <<= 1; - if(hi_bit_set == 0x80) - a ^= 0x1b; - b >>= 1; - } - return p; - -/* - alternative form - while ( b != 0) - { - if((b & 1) == 1) - p ^= a; - hi_bit_set = (a & 0x80); - a <<= 1; - if(hi_bit_set == 0x80) - a ^= 0x1b; - b >>= 1; - } - return p; -*/ - -} - -static void sub_bytes(unsigned char state[4][4]) -{ - state[0][0] = sbox[ state[0][0] ]; - state[0][1] = sbox[ state[0][1] ]; - state[0][2] = sbox[ state[0][2] ]; - state[0][3] = sbox[ state[0][3] ]; - state[1][0] = sbox[ state[1][0] ]; - state[1][1] = sbox[ state[1][1] ]; - state[1][2] = sbox[ state[1][2] ]; - state[1][3] = sbox[ state[1][3] ]; - state[2][0] = sbox[ state[2][0] ]; - state[2][1] = sbox[ state[2][1] ]; - state[2][2] = sbox[ state[2][2] ]; - state[2][3] = sbox[ state[2][3] ]; - state[3][0] = sbox[ state[3][0] ]; - state[3][1] = sbox[ state[3][1] ]; - state[3][2] = sbox[ state[3][2] ]; - state[3][3] = sbox[ state[3][3] ]; -} - -static void inverse_sub_bytes(unsigned char state[4][4]) -{ - state[0][0] = inverse_sbox[ state[0][0] ]; - state[0][1] = inverse_sbox[ state[0][1] ]; - state[0][2] = inverse_sbox[ state[0][2] ]; - state[0][3] = inverse_sbox[ state[0][3] ]; - state[1][0] = inverse_sbox[ state[1][0] ]; - state[1][1] = inverse_sbox[ state[1][1] ]; - state[1][2] = inverse_sbox[ state[1][2] ]; - state[1][3] = inverse_sbox[ state[1][3] ]; - state[2][0] = inverse_sbox[ state[2][0] ]; - state[2][1] = inverse_sbox[ state[2][1] ]; - state[2][2] = inverse_sbox[ state[2][2] ]; - state[2][3] = inverse_sbox[ state[2][3] ]; - state[3][0] = inverse_sbox[ state[3][0] ]; - state[3][1] = inverse_sbox[ state[3][1] ]; - state[3][2] = inverse_sbox[ state[3][2] ]; - state[3][3] = inverse_sbox[ state[3][3] ]; -} - -static void shift_rows(unsigned char state[4][4]) -{ - unsigned char temp; - /* row 0 is not shifted */ - /* row 1 is shifted 1 to the left */ - temp = state[1][0]; - state[1][0] = state[1][1]; - state[1][1] = state[1][2]; - state[1][2] = state[1][3]; - state[1][3] = temp; - - /* row 2 is shifted 2 to the left */ - temp = state[2][0]; - state[2][0] = state[2][2]; - state[2][2] = temp; - temp = state[2][1]; - state[2][1] = state[2][3]; - state[2][3] = temp; - - /* row 3 is shifted 3 to the left */ - temp = state[3][0]; - state[3][0] = state[3][3]; - state[3][3] = state[3][2]; - state[3][2] = state[3][1]; - state[3][1] = temp; -} - -static void inverse_shift_rows(unsigned char state[4][4]) -{ - unsigned char temp; - /* row 0 is not shifted */ - /* row 1 is shifted 1 to the right */ - temp = state[1][3]; - state[1][3] = state[1][2]; - state[1][2] = state[1][1]; - state[1][1] = state[1][0]; - state[1][0] = temp; - - /* row 2 is shifted 2 to the right */ - temp = state[2][0]; - state[2][0] = state[2][2]; - state[2][2] = temp; - temp = state[2][1]; - state[2][1] = state[2][3]; - state[2][3] = temp; - - /* row 3 is shifted 3 to the right */ - temp = state[3][0]; - state[3][0] = state[3][1]; - state[3][1] = state[3][2]; - state[3][2] = state[3][3]; - state[3][3] = temp; -} - -/* Mix column multiplies a magic matrix by the column. -** -** Magic matrix: -** 2 3 1 1 -** 1 2 3 1 -** 1 1 2 3 -** 3 1 1 1 -*/ -static void mix_column(unsigned char *column) -{ - /* in the galois world, addition is done by XOR */ - /* multiplying n by 1 results in n */ - /* multipling n by 2 can be shortened to special case of galois_multiply */ - /* multiplying n by 3 is same as 2*n ^ n */ - unsigned char a[4]; - unsigned char b[4]; - int i; - - /* copy column to temp array a */ - memcpy(a, column, 4 * sizeof(unsigned char)); - - /* this loop calculates 2*n (in galois field) for all values in column a */ - for(i=0; i<4; i++) - { - b[i] = a[i] << 1; - if((a[i] & 0x80) == 0x80) - b[i] ^= 0x1b; - } - - /* 2*a0 + ( 3*a1 ) + a2 + a3 */ - column[0] = b[0] ^ b[1] ^ a[1] ^ a[2] ^ a[3]; - - /* a0 + 2*a1 + ( 3*a2 ) + a3 */ - column[1] = a[0] ^ b[1] ^ b[2] ^ a[2] ^ a[3]; - - /* a0 + a1 + 2*a2 + ( 3*a3 ) */ - column[2] = a[0] ^ a[1] ^ b[2] ^ b[3] ^ a[3]; - - /* ( 3*a0 ) + a1 + a2 + 2*a3 */ - column[3] = b[0] ^ a[0] ^ a[1] ^ a[2] ^ b[3]; -} - -static void mix_columns(unsigned char state[4][4]) -{ - unsigned char column[4]; - int i; - - for(i = 0; i < 4; ++i) /* for each column... */ - { - column[0] = state[0][i]; - column[1] = state[1][i]; - column[2] = state[2][i]; - column[3] = state[3][i]; - - mix_column(column); - - state[0][i] = column[0]; - state[1][i] = column[1]; - state[2][i] = column[2]; - state[3][i] = column[3]; - } - -} - -/* Inverse mix column multiplies a magic matrix by the column. -** -** Magic matrix: -** 14 11 13 9 -** 9 14 11 13 -** 13 9 14 11 -** 11 13 9 14 -*/ -static void inverse_mix_columns(unsigned char state[4][4]) -{ - int i; - - for(i = 0; i < 4; ++i) /* for each column... */ - { - unsigned char a0, a1, a2, a3; - a0 = state[0][i]; - a1 = state[1][i]; - a2 = state[2][i]; - a3 = state[3][i]; - - /* ( 14 * a0 ) + ( 11 * a1 ) + ( 13 * a2 ) + ( 9 * a3 ) */ - state[0][i] = g_multiply(a0, 14) ^ g_multiply(a1, 11) ^ g_multiply(a2, 13) ^ g_multiply(a3, 9); - - /* ( 9 * a0 ) + ( 14 * a1 ) + ( 11 * a2 ) + ( 13 * a3 ) */ - state[1][i] = g_multiply(a0, 9) ^ g_multiply(a1, 14) ^ g_multiply(a2, 11) ^ g_multiply(a3, 13); - - /* ( 13 * a0 ) + ( 9 * a1 ) + ( 14 * a2 ) + ( 11 * a3 ) */ - state[2][i] = g_multiply(a0, 13) ^ g_multiply(a1, 9) ^ g_multiply(a2, 14) ^ g_multiply(a3, 11); - - /* ( 11 * a0 ) + ( 13 * a1 ) + ( 9 * a2 ) + ( 14 * a3 ) */ - state[3][i] = g_multiply(a0, 11) ^ g_multiply(a1, 13) ^ g_multiply(a2, 9) ^ g_multiply(a3, 14); - } -} - -/* key_schedule_segment points to beginning of the round key within the key schedule */ -static void add_round_key(unsigned char state[4][4], const unsigned char *key_schedule_segment) -{ - /* The round key is a 16-byte block from the key_schedule. */ - /* have to use the same column-wise mapping */ - state[0][0] ^= key_schedule_segment[0]; - state[0][1] ^= key_schedule_segment[4]; - state[0][2] ^= key_schedule_segment[8]; - state[0][3] ^= key_schedule_segment[12]; - state[1][0] ^= key_schedule_segment[1]; - state[1][1] ^= key_schedule_segment[5]; - state[1][2] ^= key_schedule_segment[9]; - state[1][3] ^= key_schedule_segment[13]; - state[2][0] ^= key_schedule_segment[2]; - state[2][1] ^= key_schedule_segment[6]; - state[2][2] ^= key_schedule_segment[10]; - state[2][3] ^= key_schedule_segment[14]; - state[3][0] ^= key_schedule_segment[3]; - state[3][1] ^= key_schedule_segment[7]; - state[3][2] ^= key_schedule_segment[11]; - state[3][3] ^= key_schedule_segment[15]; -} - -static void aes_round(unsigned char state[4][4], const unsigned char *key_schedule_segment) -{ - sub_bytes(state); - shift_rows(state); - mix_columns(state); - add_round_key(state, key_schedule_segment); -} - -static void aes_inverse_round(unsigned char state[4][4], const unsigned char *key_schedule_segment) -{ - inverse_shift_rows(state); - inverse_sub_bytes(state); - add_round_key(state, key_schedule_segment); - inverse_mix_columns(state); -} - -/* TODO: use restrict keyword? */ -void itc_aes128_encrypt(const struct itc_aes128_context *ctx, const unsigned char *input, unsigned char *output) -{ - assert(ctx != NULL); - assert(input != NULL); - assert(output != NULL); - - unsigned char state[4][4]; - int i; - - { /* copy input block to state in column-wise order */ - - state[0][0] = input[0]; - state[0][1] = input[4]; - state[0][2] = input[8]; - state[0][3] = input[12]; - state[1][0] = input[1]; - state[1][1] = input[5]; - state[1][2] = input[9]; - state[1][3] = input[13]; - state[2][0] = input[2]; - state[2][1] = input[6]; - state[2][2] = input[10]; - state[2][3] = input[14]; - state[3][0] = input[3]; - state[3][1] = input[7]; - state[3][2] = input[11]; - state[3][3] = input[15]; - } - - /********************* Start AES Encryption Algorithm **********************/ - - /* add round key */ - add_round_key(state, ctx->key_schedule); - - /* perform the first (n-1) rounds */ - for(i = 1; i < NR; ++i) - { - aes_round(state, ctx->key_schedule + ((i * KEY_LENGTH) * sizeof(unsigned char)) ); - } - - /* ...and then last special round */ - sub_bytes(state); - shift_rows(state); - add_round_key(state, ctx->key_schedule + ((NR * KEY_LENGTH) * sizeof(unsigned char)) ); - - /********************** End AES Encryption Algorithm ***********************/ - - { /* copy state out */ - output[0] = state[0][0]; - output[4] = state[0][1]; - output[8] = state[0][2]; - output[12] = state[0][3]; - output[1] = state[1][0]; - output[5] = state[1][1]; - output[9] = state[1][2]; - output[13] = state[1][3]; - output[2] = state[2][0]; - output[6] = state[2][1]; - output[10] = state[2][2]; - output[14] = state[2][3]; - output[3] = state[3][0]; - output[7] = state[3][1]; - output[11] = state[3][2]; - output[15] = state[3][3]; - } -} - - -void itc_aes128_decrypt(const struct itc_aes128_context *ctx, const unsigned char *input, unsigned char *output) -{ - assert(ctx != NULL); - assert(input != NULL); - assert(output != NULL); - - unsigned char state[4][4]; - int i; - - { /* copy input block to state in column-wise order */ - - state[0][0] = input[0]; - state[0][1] = input[4]; - state[0][2] = input[8]; - state[0][3] = input[12]; - state[1][0] = input[1]; - state[1][1] = input[5]; - state[1][2] = input[9]; - state[1][3] = input[13]; - state[2][0] = input[2]; - state[2][1] = input[6]; - state[2][2] = input[10]; - state[2][3] = input[14]; - state[3][0] = input[3]; - state[3][1] = input[7]; - state[3][2] = input[11]; - state[3][3] = input[15]; - } - - /********************* Start AES Decryption Algorithm **********************/ - add_round_key(state, ctx->key_schedule + ((NR * KEY_LENGTH) * sizeof(unsigned char))); - - /* perform rounds in reverse */ - for(i = NR-1; i > 0; --i) - { - aes_inverse_round(state, ctx->key_schedule + ((i * KEY_LENGTH) * sizeof(unsigned char)) ); - } - inverse_shift_rows(state); - inverse_sub_bytes(state); - add_round_key(state, ctx->key_schedule); - - - /********************** End AES Decryption Algorithm ***********************/ - - { - /* copy state out */ - output[0] = state[0][0]; - output[4] = state[0][1]; - output[8] = state[0][2]; - output[12] = state[0][3]; - output[1] = state[1][0]; - output[5] = state[1][1]; - output[9] = state[1][2]; - output[13] = state[1][3]; - output[2] = state[2][0]; - output[6] = state[2][1]; - output[10] = state[2][2]; - output[14] = state[2][3]; - output[3] = state[3][0]; - output[7] = state[3][1]; - output[11] = state[3][2]; - output[15] = state[3][3]; - } -} - -#endif /* ITC_AES128_C */ \ No newline at end of file diff --git a/fsw/src/itc_cmac128.c b/fsw/src/itc_cmac128.c deleted file mode 100644 index 78c1be7f..00000000 --- a/fsw/src/itc_cmac128.c +++ /dev/null @@ -1,135 +0,0 @@ -#include -#include -#include "itc_cmac128.h" - -void itc_cmac128_init(struct itc_cmac128_context * ctx, const unsigned char * key) -{ - assert(ctx != NULL); - assert(key != NULL); - - static const unsigned char zero_block[16] = { 0 }; - unsigned char temp[16]; - size_t i; - - itc_aes128_init(&(ctx->aes_ctx), key); - - // Calculate intermediate value 'L' - itc_aes128_encrypt(&(ctx->aes_ctx), zero_block, temp); - - // left-shift L 1-bit and copy to k1 - for(i = 0; i < 15; ++i) - { - ctx->k1[i] = (temp[i] << 1) | ( ( temp[i+1] & 0x80 ) >> 7 ); - } - ctx->k1[15] = temp[15] << 1; - - if( (temp[0] & 0x80) != 0 ) - { - ctx->k1[15] ^= 0x87; - } - - // left-shift k1 1-bit and copy to k2 - for(i = 0; i < 15; ++i) - { - ctx->k2[i] = (ctx->k1[i] << 1) | ( ( ctx->k1[i+1] & 0x80 ) >> 7 ); - } - ctx->k2[15] = ctx->k1[15] << 1; - - if( (ctx->k1[0] & 0x80) != 0 ) - { - ctx->k2[15] ^= 0x87; - } -} - -int itc_cmac128_generate_tag( struct itc_cmac128_context *ctx, - size_t length, - const unsigned char * message, - unsigned char * tag ) -{ - assert(ctx != NULL); - assert(tag != NULL); - if(length > 0) assert(message != NULL); - - unsigned char temp_tag[16] = { 0 }; - unsigned char last_block[16]; - - size_t i; - - while(length > 16) - { - for(i = 0; i < 16; ++i) - { - temp_tag[i] ^= message[i]; - } - itc_aes128_encrypt(&(ctx->aes_ctx), temp_tag, temp_tag); - - message += 16; - length -= 16; - } - - // Somewhere between 0 and 16 bytes remains: 0 if empty message, 1-16 for partial/full-block - if(length == 16) //full block! - { - // last_block = last_block ^ K1 - for(i = 0; i < 16; ++i) - { - last_block[i] = ctx->k1[i] ^ message[i]; - } - } - else //partial block! Up to 15 bytes (0 if empty message) - { - // copy the bytes of the partial block - if(length > 0) - memcpy(last_block, message, length * sizeof(unsigned char)); - - // fill remaining bytes - last_block[length] = 0x80; - for(i = length+1; i < 16; ++i) - { - last_block[i] = 0x00; - } - - for(i = 0; i < 16; ++i) - { - last_block[i] ^= ctx->k2[i]; - } - } - - for(i = 0; i < 16; ++i) - { - temp_tag[i] ^= last_block[i]; - } - itc_aes128_encrypt(&(ctx->aes_ctx), temp_tag, tag); - - return ITC_CMAC128_SUCCESS; -} - -int itc_cmac128_validate( struct itc_cmac128_context *ctx, - size_t length, - const unsigned char * message, - const unsigned char *tag ) -{ - assert(ctx != NULL); - assert(tag != NULL); - if(length > 0) assert(message != NULL); - - int returnCode; - unsigned char temp_tag[16]; - size_t i; - - returnCode = itc_cmac128_generate_tag(ctx, length, message, temp_tag); - - if(returnCode == ITC_CMAC128_SUCCESS) - { - for(i = 0; i < 16; ++i) - { - if(tag[i] != temp_tag[i]) - { - returnCode = ITC_CMAC128_BAD_TAG; - break; - } - } - } - - return returnCode; -} \ No newline at end of file diff --git a/fsw/src/itc_gcm128.c b/fsw/src/itc_gcm128.c deleted file mode 100644 index 66982fb8..00000000 --- a/fsw/src/itc_gcm128.c +++ /dev/null @@ -1,409 +0,0 @@ -/* Copyright (C) 2009 - 2022 National Aeronautics and Space Administration. All Foreign Rights are Reserved to the U.S. Government. - - This software is provided "as is" without any warranty of any kind, either expressed, implied, or statutory, including, but not - limited to, any warranty that the software will conform to specifications, any implied warranties of merchantability, fitness - for a particular purpose, and freedom from infringement, and any warranty that the documentation will conform to the program, or - any warranty that the software will be error free. - - In no event shall NASA be liable for any damages, including, but not limited to direct, indirect, special or consequential damages, - arising out of, resulting from, or in any way connected with the software or its documentation, whether or not based upon warranty, - contract, tort or otherwise, and whether or not loss was sustained from, or arose out of the results of, or use of, the software, - documentation or services provided hereunder. - - ITC Team - NASA IV&V - jstar-development-team@mail.nasa.gov -*/ - -#ifndef ITC_GCM128_C -#define ITC_GCM128_C - -#include -#include -#include -#include "itc_gcm128.h" - -/* Representation of 128-bit blocks: - * To be as portable as possible, a 128-bit block will be represented as - * a 16-byte unsigned char array. - * - * MSB LSB - * Bit string: b0 ,b1, b2, ... , b126, 127 - * where b0-b7 would be the bits of block[0], with b0 the MSB and b7 the LSB - * -*/ - - /* todo: get rid of asserts and use error returns for NULL parameters? */ - -enum itc_gcm128_mode -{ - ITC_GCM128_ENCRYPT, - ITC_GCM128_DECRYPT -}; - -/* compare in constant time. Return zero if equal, non-zero otherwise */ -static int compare(const unsigned char * a, const unsigned char * b, size_t length) -{ - size_t i; - int differ = 0; - - for(i = 0; i < length; ++i) - { - differ |= a[i] ^ b[i]; - } - - return differ; -} - -static void pack_uint32_big_endian(uint32 x, unsigned char *dest) -{ - dest[0] = (unsigned char) ((x >> 24) & 0xff); - dest[1] = (unsigned char) ((x >> 16) & 0xff); - dest[2] = (unsigned char) ((x >> 8) & 0xff); - dest[3] = (unsigned char) ((x) & 0xff); -} - -/* get the value of a certain bit ( 0 through 127) from a 128-bit block */ -static unsigned char get_bit(const unsigned char *block, unsigned char bit) -{ - assert(bit < 128); - - if( ( block[bit/8] & (0x01 << (7-(bit%8))) ) > 0) - return 1; - else - return 0; -} - -/* -static void set_bit(unsigned char *block, unsigned char bit, unsigned char value) -{ - assert(bit < 128); - assert(value < 2); - - block[bit/8] |= ( value << (7-(bit%8)) ); -} -*/ - -/* - GCM multiplication. x, y, and result must point to valid 16-byte arrays - It is OK to re-use x or y buffer as the result buffer - TODO: there are ways to speed up using tables (more memory but faster) - */ -static void gcm_multiply(const unsigned char * x, const unsigned char * y, unsigned char * result) -{ - assert(x != NULL); - assert(y != NULL); - assert(result != NULL); - - unsigned char z[16] = { 0 }; - unsigned char v[16]; - - memcpy(v, y, 16 * sizeof(unsigned char)); - - int i, j; - unsigned char v_lsb; - for(i = 0; i < 128; ++i) - { - if(get_bit(x, i) == 1) - { - for(j = 0; j < 16; ++j) - { - z[j] ^= v[j]; - } - } - - v_lsb = (v[15] & 0x01); - - /* v >> 1 */ - for(j = 15; j > 0; --j) - { - v[j] = (v[j] >> 1) | ( (v[j-1] & 0x01) << 7 ); - } - v[0] >>= 1; - - if(v_lsb) - { - v[0] ^= 0xe1; - } - } - - memcpy(result, z, 16 * sizeof(unsigned char)); -} - -/* same function for either encrypt or decrypt */ -static int gcm128_crypt_start( struct itc_gcm128_context *ctx, - const unsigned char * iv, - size_t aad_length, - const unsigned char * aad ) -{ - assert(ctx != NULL); - assert(iv != NULL); - if(aad_length > 0) assert(aad != NULL); - - if(aad_length > 0xffffffff) - return ITC_GCM128_OUT_OF_RANGE; - - /* zero-out elements for a new message */ - memset(ctx->iv_ctr, 0x00, sizeof(ctx->iv_ctr)); - memset(ctx->ghash, 0x00, sizeof(ctx->ghash)); - ctx->aad_length = 0; - ctx->length = 0; - size_t i, temp_length; - const unsigned char * p; - - /* generate initial counter block (ICB): IV || 31 0's || 1 */ - memcpy(ctx->iv_ctr, iv, 12 * sizeof(unsigned char)); - ctx->iv_ctr[15] = 0x01; - - /* compute base ECNTR (needed to compute tag in last step of algorithm) */ - itc_aes128_encrypt(&(ctx->aes_ctx), ctx->iv_ctr, ctx->base_ectr); - - /* process the AAD */ - ctx->aad_length = (uint32)aad_length; - p = aad; - - while(aad_length > 0) - { - temp_length = (aad_length < 16) ? aad_length : 16; - - /* if temp_length is < 16, algorithm says to pad with zeros to fill block */ - /* zero's would have no effect on the XOR op, so just skip it instead */ - for(i = 0; i < temp_length; ++i) - { - ctx->ghash[i] ^= p[i]; - } - - gcm_multiply(ctx->ghash, ctx->h, ctx->ghash); - - p += temp_length; - aad_length -= temp_length; - } - - return ITC_GCM128_SUCCESS; -} - -static int gcm128_crypt_update( struct itc_gcm128_context *ctx, - enum itc_gcm128_mode mode, - size_t length, - const unsigned char * input, - unsigned char * output ) -{ - unsigned char ectr[16]; - size_t i, temp_length; - const unsigned char *in_p = input; - unsigned char *out_p = output; - assert(ctx != NULL); - if(length > 0) - { - assert(input != NULL); - assert(output != NULL); - } - - if( (0xffffffff - ctx->length) < length ) - return ITC_GCM128_OUT_OF_RANGE; - /* - Note: - if mode == ENCRYPT, input is plaintext, output is ciphertext - if mode == DECRYPT, input is ciphertext, output is plaintext - */ - - ctx->length += (uint32)length; - while(length > 0) - { - temp_length = (length < 16) ? length : 16; - - /* increment ctr here; take advantage of unsigned int wrap-around on overflow */ - for(i = 16; i > 12; --i) - { - /* increment byte; if equals zero (overflowed), then also have to increment next byte to account for carry */ - if( ++(ctx->iv_ctr[i-1]) != 0) - break; - } - - itc_aes128_encrypt(&(ctx->aes_ctx), ctx->iv_ctr, ectr); - - for(i = 0; i < temp_length; ++i) - { - /* check if DECRYPT first in case in_p == out_p */ - if(mode == ITC_GCM128_DECRYPT) /* in_p is ciphertext */ - ctx->ghash[i] ^= in_p[i]; - - out_p[i] = ectr[i] ^ in_p[i]; - - if(mode == ITC_GCM128_ENCRYPT) /* out_p is ciphertext */ - ctx->ghash[i] ^= out_p[i]; - } - - gcm_multiply(ctx->ghash, ctx->h, ctx->ghash); - - in_p += temp_length; - out_p += temp_length; - length -= temp_length; - } - return ITC_GCM128_SUCCESS; - -} - -static void gcm128_crypt_finish(struct itc_gcm128_context *ctx, unsigned char * tag) -{ - /* at this point, all data has been encrypted/decrypted and the ghash has been computed through AAD & data */ - /* Need to finish ghash computation with AAD/Data length members, then compute/verify tag */ - assert(ctx != NULL); - assert(tag != NULL); - - unsigned char buffer[16] = { 0 }; - size_t i; - uint32 aad_length = ctx->aad_length * 8; - uint32 data_length = ctx->length * 8; - - /* copy base ectr to tag */ - memcpy(tag, ctx->base_ectr, sizeof(ctx->base_ectr)); - - /* - pack AAD length and data length into two consecutive 64-bit words. - Since uint32 was chosen as the limit, the upper 32-bits of each 64-bit word are zero - Combined, looks like this: - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - ------------------------------------------------ - 0 0 0 0 x x x x 0 0 0 0 y y y y - - Where xxxx is big-endian representation of aad length, - and yyyy is big-endian representation of data length - */ - pack_uint32_big_endian(aad_length, buffer+4); - pack_uint32_big_endian(data_length, buffer+12); - - /* finish hash */ - for(i = 0; i < 16; ++i) - ctx->ghash[i] ^= buffer[i]; - - gcm_multiply(ctx->ghash, ctx->h, ctx->ghash); - - for(i = 0; i < 16; ++i) - { - tag[i] ^= ctx->ghash[i]; - } -} - -void itc_gcm128_init(struct itc_gcm128_context *ctx, const unsigned char * key) -{ - assert(ctx != NULL); - assert(key != NULL); - static const unsigned char zero_block[16] = { 0 }; - - /* initialize AES context */ - itc_aes128_init(&(ctx->aes_ctx), key); - - /* calculate GHASH subkey (H) */ - itc_aes128_encrypt(&(ctx->aes_ctx), zero_block, ctx->h); -} - -int itc_gcm128_encrypt_start( struct itc_gcm128_context *ctx, - const unsigned char * iv, - size_t aad_length, - const unsigned char * aad ) -{ - return gcm128_crypt_start(ctx, iv, aad_length, aad); -} - -int itc_gcm128_encrypt_update( struct itc_gcm128_context *ctx, - size_t length, - const unsigned char * plaintext, - unsigned char * ciphertext ) -{ - return gcm128_crypt_update(ctx, ITC_GCM128_ENCRYPT, length, plaintext, ciphertext); -} - -int itc_gcm128_encrypt_finish(struct itc_gcm128_context *ctx, unsigned char * tag) -{ - gcm128_crypt_finish(ctx, tag); - return ITC_GCM128_SUCCESS; -} - -int itc_gcm128_encrypt_and_tag( struct itc_gcm128_context *ctx, - const unsigned char * iv, - size_t aad_length, - const unsigned char * aad, - size_t length, - const unsigned char * plaintext, - unsigned char * ciphertext, - unsigned char * tag ) -{ - int returnCode; - - returnCode = itc_gcm128_encrypt_start(ctx, iv, aad_length, aad); - - if(returnCode == ITC_GCM128_SUCCESS) - { - returnCode = itc_gcm128_encrypt_update(ctx, length, plaintext, ciphertext); - } - - if(returnCode == ITC_GCM128_SUCCESS) - { - returnCode = itc_gcm128_encrypt_finish(ctx, tag); - } - - return returnCode; -} - -int itc_gcm128_decrypt_start( struct itc_gcm128_context *ctx, - const unsigned char * iv, - size_t aad_length, - const unsigned char * aad ) -{ - return gcm128_crypt_start(ctx, iv, (uint32)aad_length, aad); -} - -int itc_gcm128_decrypt_update( struct itc_gcm128_context *ctx, - size_t length, - const unsigned char * ciphertext, - unsigned char * plaintext ) -{ - return gcm128_crypt_update(ctx, ITC_GCM128_DECRYPT, length, ciphertext, plaintext); -} - -int itc_gcm128_decrypt_finish(struct itc_gcm128_context *ctx, const unsigned char * tag) -{ - unsigned char computed_tag[16]; - gcm128_crypt_finish(ctx, computed_tag); - - /* compare tags */ - if(compare(tag, computed_tag, sizeof(computed_tag)) == 0) - { - return ITC_GCM128_SUCCESS; - } - else - { - return ITC_GCM128_BAD_TAG; - } - -} - -int itc_gcm128_decrypt( struct itc_gcm128_context *ctx, - const unsigned char * iv, - size_t aad_length, - const unsigned char * aad, - size_t length, - const unsigned char * ciphertext, - const unsigned char * tag, - unsigned char * plaintext ) -{ - int returnCode; - - returnCode = itc_gcm128_decrypt_start(ctx, iv, aad_length, aad); - - if(returnCode == ITC_GCM128_SUCCESS) - { - returnCode = itc_gcm128_decrypt_update(ctx, length, ciphertext, plaintext); - } - - if(returnCode == ITC_GCM128_SUCCESS) - { - returnCode = itc_gcm128_decrypt_finish(ctx, tag); - } - - return returnCode; -} - -#endif /* ITC_GCM128_C */ diff --git a/fsw/src/sadb_routine_inmemory.template.c b/fsw/src/sadb_routine_inmemory.template.c index 94b1d0c7..686f1ab9 100644 --- a/fsw/src/sadb_routine_inmemory.template.c +++ b/fsw/src/sadb_routine_inmemory.template.c @@ -171,7 +171,6 @@ static int32 sadb_config(void) sa[6].arcw_len = 1; sa[6].arcw = 5; sa[6].arc_len = (sa[6].arcw * 2) + 1; - //itc_gcm128_init(&(sa[6].gcm_ctx), (unsigned char *)&(ek_ring[sa[6].ekid])); // SA 7 - KEYED; ARCW:5; AES-GCM; IV:00...00; IV-len:12; MAC-len:16; Key-ID: 130 sa[7].spi = 7; diff --git a/unit_test/ciphers/Makefile b/unit_test/ciphers/Makefile deleted file mode 100644 index 3ec1b7c1..00000000 --- a/unit_test/ciphers/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -OBJECTS := itc_gcm128_test.o itc_cmac128_test.o itc_aes128_test.o itc_gcm128.o itc_cmac128.o itc_aes128.o - -CFLAGS = \ --I../../fsw/public_inc/ \ --I../../cfe/inc \ --I../../../../osal/src/os/inc/ - -VPATH = ../../fsw/src ../../fsw/public_inc - -.PHONY: clean - -all : clean itc_aes128_test itc_gcm128_test itc_cmac128_test libitc_crypto.a - -itc_aes128_test : itc_aes128.o itc_aes128_test.o - gcc itc_aes128.o itc_aes128_test.o -o itc_aes128_test - -itc_gcm128_test : itc_aes128.o itc_gcm128.o itc_gcm128_test.o - gcc itc_aes128.o itc_gcm128.o itc_gcm128_test.o -o itc_gcm128_test - -itc_cmac128_test : itc_aes128.o itc_cmac128.o itc_cmac128_test.o - gcc itc_aes128.o itc_cmac128.o itc_cmac128_test.o -o itc_cmac128_test - -libitc_crypto.a : itc_gcm128.o itc_cmac128.o itc_aes128.o - ar -crsv $@ itc_gcm128.o itc_cmac128.o itc_aes128.o - -%.o : %.c - cc -c $(CFLAGS) $< -o $@ - - - -clean : - -rm $(OBJECTS) itc_aes128_test itc_gcm128_test itc_cmac128_test libitc_crypto.a \ No newline at end of file diff --git a/unit_test/ciphers/cmactestvectors/CMACVerAES128.rsp b/unit_test/ciphers/cmactestvectors/CMACVerAES128.rsp deleted file mode 100644 index ffa05c0c..00000000 --- a/unit_test/ciphers/cmactestvectors/CMACVerAES128.rsp +++ /dev/null @@ -1,2165 +0,0 @@ -# CAVS 11.0 -# CMACVer information -# Algorithms tested:Alg = AES KeySize = 128 Mode = Verify -# Generated on Tue Mar 15 08:40:37 2011 - - -Count = 0 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = 27b5686c79b3d242f96d3892c6135b26 -Msg = 00 -Mac = c98d11822b9b4d7a -Result = F (3 - MAC changed) - -Count = 1 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = b4542a22baa348ee2d11ef62d44cebab -Msg = 00 -Mac = f7a2a3f519fc462f -Result = F (4 - Key or Key1 changed) - -Count = 2 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = 7256e344f68b3e7f9dd6e04c5c65135c -Msg = 00 -Mac = d4d7fcc5f979230f -Result = P - -Count = 3 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = 7a2116595c5cf6482199d3312498006d -Msg = 00 -Mac = c3c4fa28709060b0 -Result = F (2 - Key or Key2 changed) - -Count = 4 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = 0341551d6c7e7c57f678068f0b41d1fe -Msg = 00 -Mac = 821030d4b7889fcf -Result = F (1 - MAC changed - for 0-len msg) - -Count = 5 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = b67ba2aa4e9ea9871c3def87e2dd77f4 -Msg = 00 -Mac = ea896182698ac145 -Result = F (4 - Key or Key1 changed) - -Count = 6 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = 0091d39f3478d2c59bf874b96db9ce0f -Msg = 00 -Mac = fb12c5971b0f2f18 -Result = F (1 - MAC changed - for 0-len msg) - -Count = 7 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = 46a2e6bd3fd5336abf02eace3cd1e1f6 -Msg = 00 -Mac = 9c6b46ef046ae1d1 -Result = P - -Count = 8 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = 4b0fbd5e6f9298e5ced5ebdc60fc18a7 -Msg = 00 -Mac = 221857badcbcd2be -Result = F (2 - Key or Key2 changed) - -Count = 9 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = fb20547da671acd4c6df37f6568a6428 -Msg = 00 -Mac = ba0c9bfd3d9c0c95 -Result = F (3 - MAC changed) - -Count = 10 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = b787def50aaf446bf15c562434844562 -Msg = 00 -Mac = ba60bdae64068330 -Result = F (1 - MAC changed - for 0-len msg) - -Count = 11 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = 67d77f50727c7cd5b38e0b175a888c88 -Msg = 00 -Mac = 555923e6b5fbc504 -Result = P - -Count = 12 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = 6f552ef7d309bb98597b91cecc21e158 -Msg = 00 -Mac = c2aa402c0443dfbd -Result = F (3 - MAC changed) - -Count = 13 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = 411871267919a145532cc401e753ebff -Msg = 00 -Mac = 167a31913228f45f -Result = F (4 - Key or Key1 changed) - -Count = 14 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = abfe32efdf0464cb2eaafca8eac30d9b -Msg = 00 -Mac = 8edbc729b1923e10 -Result = F (2 - Key or Key2 changed) - -Count = 15 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = 85504d59a12f3e17edfb0b6337d4a081 -Msg = 00 -Mac = 9045fd77cb26dcb2 -Result = F (2 - Key or Key2 changed) - -Count = 16 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = 55f7565826b0e2ccc1368f4de32022de -Msg = 00 -Mac = f82395416a8dc209 -Result = F (1 - MAC changed - for 0-len msg) - -Count = 17 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = 43c8f984390debb0f26c6b9c2df8518c -Msg = 00 -Mac = b5d732086bf8feab -Result = F (4 - Key or Key1 changed) - -Count = 18 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = da288d2014616f16a2abf5923dea49ad -Msg = 00 -Mac = e03b67b53fc7863f -Result = P - -Count = 19 -Klen = 16 -Mlen = 0 -Tlen = 8 -Key = e2f962d076df051c2d291b47a902ea0c -Msg = 00 -Mac = df1456a7edeb4e42 -Result = F (3 - MAC changed) - -Count = 20 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 191b53e0c7d90161e5e2014e9b8aea31 -Msg = 00 -Mac = 1e210cff3c90bd2e2a27a78ef7662f61 -Result = F (1 - MAC changed - for 0-len msg) - -Count = 21 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 54666bdf6db300ee10982d14dac828bc -Msg = 00 -Mac = 9fef67209b8da28049b80efe98f85f13 -Result = F (3 - MAC changed) - -Count = 22 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 9a143c21cc6c9528b9ddd7e4405682e1 -Msg = 00 -Mac = 1c3c3b6d1d86ac5787234f8f6d707acc -Result = F (4 - Key or Key1 changed) - -Count = 23 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 802047ee1309e548ae81e93a17bff9e7 -Msg = 00 -Mac = 1472aecaa0a09e45893a14090ed9a17f -Result = P - -Count = 24 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = ab79ce74c0959aea0fd0b28ea5d0afe2 -Msg = 00 -Mac = fde8a95536cc334f7fc8881a187afc61 -Result = F (2 - Key or Key2 changed) - -Count = 25 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 644ac6fdc1e713ecb7ff1e0bd5729a57 -Msg = 00 -Mac = 95a93bb50703521e6c1a8be1aab6a646 -Result = F (3 - MAC changed) - -Count = 26 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = b4571e56f66a857daffbdc99370ceddd -Msg = 00 -Mac = d2742ea62f1d6513c4eb0e533922f251 -Result = F (2 - Key or Key2 changed) - -Count = 27 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = abff2b097d688293701ff2c49ba48eb3 -Msg = 00 -Mac = 17e724f66d4a9ef5dfc0cf903f8ff04a -Result = F (4 - Key or Key1 changed) - -Count = 28 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 9d45f6d97d1573de3cb3488befaf5b7f -Msg = 00 -Mac = 96ec3cf234d6704483a93885bd67e6dc -Result = P - -Count = 29 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 00d385629e5df815a5300e6635351934 -Msg = 00 -Mac = cb23bb449ac26e2186b02f7428fa022b -Result = F (1 - MAC changed - for 0-len msg) - -Count = 30 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 2f9109e7eea21b2615c81c03182ce603 -Msg = 00 -Mac = 4532211f48124a9eacd795ea4313adaf -Result = F (4 - Key or Key1 changed) - -Count = 31 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 9f3830f5cd40a2396b6093b358cef1e9 -Msg = 00 -Mac = f5ea59ec909a8ec2d8b11f5f276201fd -Result = F (3 - MAC changed) - -Count = 32 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 17378e17c41586b88523a6b6af738dc4 -Msg = 00 -Mac = 40cc8b388be6789aca584659acc7aa06 -Result = P - -Count = 33 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 064e8c88a0a0766186d75867b5ca3acd -Msg = 00 -Mac = b2f94222a68fcf803868b00404ad170f -Result = F (1 - MAC changed - for 0-len msg) - -Count = 34 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 1e39f1cba97dac4e4d4f3bce7fda72e5 -Msg = 00 -Mac = 60763815c1075c31078a9b44fe4b8427 -Result = F (2 - Key or Key2 changed) - -Count = 35 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 06f0e4618e0ea8fa5443b50ea005b672 -Msg = 00 -Mac = 295c6cd08b1d668d9fa85ef851b1e029 -Result = P - -Count = 36 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 648d77b57770b67ecda1ce7951eaaeea -Msg = 00 -Mac = 2f3fbc6edf5827fce440b9a7ff8535b4 -Result = F (1 - MAC changed - for 0-len msg) - -Count = 37 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 6f3938932b5c1280311e892280d8a822 -Msg = 00 -Mac = df02edfb316350c81dbee385d6e1d8e4 -Result = F (3 - MAC changed) - -Count = 38 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = f909903451d1f9f45ffcb93a407ffb50 -Msg = 00 -Mac = d176620722c5327270ef30956d7ac02f -Result = F (2 - Key or Key2 changed) - -Count = 39 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 181d92c7df1ebb0924719e066e08b95e -Msg = 00 -Mac = 144f688fa0d29faf787c48cd0765eecd -Result = F (4 - Key or Key1 changed) - -Count = 40 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = 0c5b763b1e97b4f4dfc7059e4896ba58 -Msg = a0b3c6944b35f7208dfb40b4c4ba134a14dac928b679950793b3b6751221f178 -Mac = d922ea85b3992a67 -Result = F (3 - MAC changed) - -Count = 41 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = 461d7d629778c8b05a688bee4fc01e9f -Msg = 07571a6c9bcb6f97d626796bc74e551d1c45cce38afed761706f6264b7e751d3 -Mac = 794b224a85396a27 -Result = P - -Count = 42 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = b91c6b09bf5a0487a9b5ea2fe0c1f3d2 -Msg = d31fd388e97727ba0a35d34ae05d9980e5974f6b3d86e2d4dd569b70f394a159 -Mac = 2665ff2785bcb606 -Result = F (1 - Message changed) - -Count = 43 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = 0737836cf771e842a70f3eeed7206799 -Msg = fce631a9eb130178018ca88cec966ae53ecc83a51d0a73173c8a9af10b4d04d6 -Mac = 1eee822e37dd1e84 -Result = F (2 - Key or Key2 changed) - -Count = 44 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = 120132c315bfc9c4fb93023f5d3500d7 -Msg = c2576ed3189eff3205f5e01dd8fe7c64f12dc73c807c22918f607f9e43fcc5ba -Mac = ddca15c8b5a80cb2 -Result = F (4 - Key or Key1 changed) - -Count = 45 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = 5363bd7d867a9f9f0592dd9940a791e8 -Msg = f34e86b8803d386573b81045df945df8319a93b613de4c41904c8e1879844cee -Mac = 109dd7c920ebbf41 -Result = F (3 - MAC changed) - -Count = 46 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = 3fa1c7cffaa167557b250634e8052fa0 -Msg = 4255f8af18df7237e0abe98421aec9634443561752d893aaffe76380e829ef32 -Mac = 0eceab8d28dd4a2a -Result = F (2 - Key or Key2 changed) - -Count = 47 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = 6583a4ff27b6e109046d11b977c8293d -Msg = b63be320f92e01260fba37312224494a2764dfc928287c75dc1cafee7b698d48 -Mac = fa0cced22e896b40 -Result = F (1 - Message changed) - -Count = 48 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = 5949378fd3135dd02ee1929014000411 -Msg = 65c16f4e66b10c7c153be7ba2dbe3a6d4eed3b04fec44188edc229747d52f8c8 -Mac = 9ef023345848680b -Result = F (4 - Key or Key1 changed) - -Count = 49 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = 0e80fa889b1d96a0d23d236d4d642a27 -Msg = f6f094e46cdb2e45fe49b18aff1427ebdac9710fa7f47f75fc9ec7140613ef3e -Mac = a09774009934c9d4 -Result = P - -Count = 50 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = 1f88dfd4f5c52c22b1db47f9f4fb6e2f -Msg = de433ebd1cdabeac46b94cc00d984f172923535ca8fdfeeb860546357dd8e266 -Mac = bb17b3983faee0db -Result = P - -Count = 51 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = ab0ab9e79ee53a6946a31ea807258dbb -Msg = 89ddbb042aa2aea5207b312c9831fb48138aca90626ef7c5ce474d5797ae1b2b -Mac = 72f316d5bfcfcf6f -Result = F (4 - Key or Key1 changed) - -Count = 52 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = 1eb19542a0064564e096e5d7d60acaa6 -Msg = ca25504f3f5559aa0e88199ce1551c9240b5c76f55b83bdbf2777cded54ad3af -Mac = d936b1fca0a96aec -Result = F (3 - MAC changed) - -Count = 53 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = 33f11aa36d8ab0fc53486839a576b31e -Msg = a58524e37c2504468f77a9c21b0e6d1a6b5e06fa051d5b8025ef97fa69417cf2 -Mac = fd64f7cb283adce1 -Result = F (1 - Message changed) - -Count = 54 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = a7b81d8245129aa451dcb7229de415e5 -Msg = 2b2ec02aba10aee056443cf90585caa2510b3b835454a99f1324567b0dcbe682 -Mac = f4cd48f32c9dc66b -Result = F (2 - Key or Key2 changed) - -Count = 55 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = 3c1baf0d915e5aec92bb62babad0ba2c -Msg = f8f2424c2dc0d0f3821af7244038da0832c547be4ff0850b98c04d4d44a716b1 -Mac = e17ea6862129d6b9 -Result = P - -Count = 56 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = 943a49073db6ae94a88844ed895f8fd9 -Msg = 8a15e5be479d3a39a459ca7b50457472cbf44f6a8324ee3d4096e2c3bf1d8190 -Mac = adcce0ea2c8b11d9 -Result = F (1 - Message changed) - -Count = 57 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = ebf8935f53dfb3bd40453c31f627c73e -Msg = 7edddb03d861dc9796f8e069bde434681620f604db436f34b7a6a3beeec925b3 -Mac = e8ea88729d49bea4 -Result = F (4 - Key or Key1 changed) - -Count = 58 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = f18e8feed77d1b80c31483fe69073d56 -Msg = 37c6206e23163c39a13f19de48cc25dc26e6f83cb376e8d2048ad7c141fa503d -Mac = 0d4f5cdb2a49b471 -Result = F (3 - MAC changed) - -Count = 59 -Klen = 16 -Mlen = 32 -Tlen = 8 -Key = b4e41c7bfb8fcaa5236f656185c1496b -Msg = 32758ae47884fcef766dd1fee1a7f55ca6f6691574e2ea097a68cd4072ef2e7d -Mac = bad08badb66c8e5f -Result = F (2 - Key or Key2 changed) - -Count = 60 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 708484fba04972b815256c5dab12d5d4 -Msg = 97751b4893a83cfe6b760e10da795682e9668749c09036f9bfadce9dcbdd85e6 -Mac = fa74b33267c5ffeca75e5e16978bd7b0 -Result = F (1 - Message changed) - -Count = 61 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = d0df1bdf1df6203241722fb9c9c1cf74 -Msg = 0e41361ebfbe4e6580fb5751e58e98de8ee5d9849fe875026fdab15a85804c1d -Mac = de4992c9d33659620cc203848e42a279 -Result = F (3 - MAC changed) - -Count = 62 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 7c0b7db9811f10d00e476c7a0d92f6e0 -Msg = 1ee0ec466d46fd849b40c066b4fbbd22a20a4d80a008ac9af17e4fdfd106785e -Mac = baecdc91e9a1fc3572adf1e4232ae285 -Result = P - -Count = 63 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 7b4c800f5071521119e4cc6deee8729f -Msg = 775946f3014523b6ea37804585cadd35e74e9382ebc1022579fbebe407281b6e -Mac = 2f6697f5d067aecdb3ff5a09d9169b3b -Result = F (2 - Key or Key2 changed) - -Count = 64 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 7618d222630138cc14246e8fddcf98cf -Msg = 432e3575a966958434da38dda3606f1f69adeaca536a7bf66c8b1e451edc3716 -Mac = d7d78aac615ffc1bb32dfea41f2b8771 -Result = F (4 - Key or Key1 changed) - -Count = 65 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = c8804fef18ef263c010c8a205e14516e -Msg = f2d23bc605181e3894f61fa63d61ed4a610123ab7d3531c0b7579a58b74161ba -Mac = bfe5e2c10a5cecccd3de2529f340cf6b -Result = F (1 - Message changed) - -Count = 66 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = f98ac86ecb742c188852980b5150d100 -Msg = 4e6fd4fa7669ce9552154bd796644961b51067dc02303430150aacf671280031 -Mac = 73df5f4d3ab9240d4fb2be775188adc0 -Result = F (3 - MAC changed) - -Count = 67 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 638d7d95ff5f57571261e23ffa081189 -Msg = 5f5bc4e32764bb00085667b7f1b15433f09c1f6fa48689f8f50dcaf5021f2864 -Mac = 96b270629b2bfbf721f1a70eccf9abe0 -Result = P - -Count = 68 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = a5a20d8139472a4cb38993c5711ac2ca -Msg = 73e1e75538f9a63e49a068189e3b0a1a1e65ca5d1295589bdafa3136deaa287c -Mac = 320647d53ccdf2335a9c9a3452c1cee5 -Result = F (2 - Key or Key2 changed) - -Count = 69 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 57656be54860414e8a62223381ca4405 -Msg = 3447e82ecec6c8b6fe1e44ed91f933e4a70c431911eb86eefe222d5ad78193df -Mac = 47c6b5a28d723129648aef418b74daa8 -Result = F (4 - Key or Key1 changed) - -Count = 70 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = e7b665600a2aa413e117c53816cbed34 -Msg = 5e4d49ab796025157add6d42258b9c506d9ce82bdd85c604360db0ff5aa4262c -Mac = e741166cfa2a58003dcae357d7a199b8 -Result = F (2 - Key or Key2 changed) - -Count = 71 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 693cbb46bc8366086ec7cd7776f2c563 -Msg = 5a908ae85ff721ffc5096aeeda5ee83bddcf639e7be68d109394e5253c22dc9b -Mac = 9d56b03ef83082f601a9cc8730b0de42 -Result = F (1 - Message changed) - -Count = 72 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = b4190e3462e07fca26496adcb877724f -Msg = 02097035a312cb02ea7f09fc1accc230a205e4a208e64a8f204291f581a12756 -Mac = eb9604ec71aac0cacb63e0b369ae7664 -Result = F (3 - MAC changed) - -Count = 73 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 4ae06c3b2940819e58eb24122a2988c9 -Msg = a2e7be3314238d7e4f604e134790bb15a87c09356c091b1aacb9f605b67475b5 -Mac = 14b4507ae4b50cfe4989b544bede756c -Result = F (4 - Key or Key1 changed) - -Count = 74 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 8d560de2e310ea69389221ce2e850625 -Msg = 04d9db45e4df19db757b9b95c25be43e822b8372ed148d49ce824a36da2b2f2e -Mac = 647f2874a083e82fa804b6c58c7b5c90 -Result = P - -Count = 75 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 0e1a79c5d734118c19eaba700f5da238 -Msg = 026470d57dad9893dc037b80978bf70c2e552fe46c8fe8c3ebf8338bda984d94 -Mac = b936ff3bb8afb9e42351a2a3ad49d70a -Result = F (1 - Message changed) - -Count = 76 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = c88b1bc0050e19780ab53efbea175634 -Msg = 7207aa8fa87283f1f57019bf1c89645ff8fc36ab1102704e6d577671a9f7e098 -Mac = c1dbd79e31c3b0bb824f16f735ccdfe6 -Result = F (2 - Key or Key2 changed) - -Count = 77 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = d87df10a53eb3ea24c003d2a65e44921 -Msg = fedd5813146a8c2af398d6066956829833b75e44b6e010e4f025ac0fad6f869b -Mac = 9dd7cbb34445bfb351d01e8cdb21d695 -Result = F (4 - Key or Key1 changed) - -Count = 78 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 4d436a4a5c02b22ad49548b97216f277 -Msg = 2d73204f0b2d35806a8227206922ac9c18eff6ebddc73809179d67a702cf3e21 -Mac = d2654d9bd6396075296cbe918d90670f -Result = F (3 - MAC changed) - -Count = 79 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 8af7b74e35eb38f4086343bc329ab465 -Msg = ada1fa439c653d0cc88c0d129ba252e86c7d20a3087be93e920bf13d8e6f0391 -Mac = 0fc9b177c874ea909b6beb1db1b802b4 -Result = P - -Count = 80 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = 91ce6c87860aa84053f42e1abc16f489 -Msg = 4c287bc16196698d762d5fb428e801975fdaa29026b7b78dba968bfee0f534f27cfec57c6009c55c6261e0dbb14bddf76944d0c0648b910254df6c240e8a1a50 -Mac = c1ce12f51aa823d0 -Result = F (3 - MAC changed) - -Count = 81 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = b7b774e5c9e2f6926660c48b8df52354 -Msg = 937273c7355e7b88a630d15be875234cacaa44e815f31997bf10b52c008cc3bb6d3724aaa0d7da0b391b252923d0eb6119575d346857d89af6af099883af5514 -Mac = ff845eb2d77aa5a7 -Result = F (4 - Key or Key1 changed) - -Count = 82 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = d7572ed0e37261efa02f8c83e695efdc -Msg = 85a327b0c7a31a4116e7fae0c0971e1578ab6fbdf90124b9ecacd0e70c909f51882cdca5a8b6b7e6b46d4660122bc9e1ae3932269f68e594075dbc293a2d4eb1 -Mac = b8b3b7526419e069 -Result = P - -Count = 83 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = 259129eb760f8a770410c160e4e13a6b -Msg = 77d9c306aa257379053cf1f2043c388a301dac2a9e2bb89eb8bab6eb3f150fe391b7a3f628be6b4b649c5c108a108f0e0c55a0800b9954251ab07e94450a23d0 -Mac = f9376f11cbec0ec0 -Result = F (2 - Key or Key2 changed) - -Count = 84 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = 6ccd61ed20f16ca7a78192f5b6ab5528 -Msg = 9211231ec382ecaaae57f34de1ac6bbb50741014a978160ce59c60491e64f30da0b8aa1442e42bc0f7e31973a0dd8c3c24eebeb7c329072ea7dd0b04bc163254 -Mac = 94c275e6a4675d8a -Result = F (1 - Message changed) - -Count = 85 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = 1cdc44c40efc3c0ed6fb84b0c2f78aec -Msg = 818c636772036761af037c23aa8cb63e424f0ba0375b645de2f8f5af23d3ca3b9a5ca3951a6d02075a2c828eee326a2676ed8247164226b0267798632a519bf1 -Mac = 74355397c7a29bb1 -Result = P - -Count = 86 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = 2e523e9d8a5532127ec63b220838f11b -Msg = e6d067907610109b8789e1ad00542539991677b9efc97a98d8bfcb50f3e334d0844323207fcb5a47e353e76d49dd573dbd17278dcc287b41dea8126cc7f07ab9 -Mac = 7bd6745c6f73d92e -Result = F (3 - MAC changed) - -Count = 87 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = 0eee5bc8994b723a580f67d45ccb194a -Msg = 1dc4fcbc73dab4e73ed9d7606acdcd42b74972460c640fe50f028abdf255d9368fa3bc65b849ac31c8000eb47e5fade40ca167726aa927f2f043133d24ad0613 -Mac = 486721355fff9cbc -Result = F (2 - Key or Key2 changed) - -Count = 88 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = 388468d10bf0b770cc125f8b7d359261 -Msg = b9aaadfb3f60e48f1b421a9450129d75af2ce811ab0b1661680e9d5b147c38167ac7252ed40d916ae1e4519c3857d2c9dc2c538a106951b26d16433131438839 -Mac = e13cef9392f4a80b -Result = F (1 - Message changed) - -Count = 89 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = edfe2e15edf0b0c28875651d4becfca5 -Msg = 70b1e2e4cf260b108f5a52d0d8234838ffd6ffe7b4acd78d7d6b95aa6342b598eaf402cb47396358ce61f8b4aa3a65bed0346e0036c3c5323f051f007aa58d0e -Mac = 7b70730219907d18 -Result = F (4 - Key or Key1 changed) - -Count = 90 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = 6876df1a77e11165331a5ce2e0e6bea6 -Msg = 34b73ba208bbe1df06da768b0321243815df4ece555974dee2bf5732295f5ea9631939425e13c47681ae2ecb0bb85aa69be38560f5752a9d034222d91ad71044 -Mac = 80e00df873439fe7 -Result = F (1 - Message changed) - -Count = 91 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = e65d5fd5f446b4eab63d56b0a5eb1d29 -Msg = 554395f9b113c0f2a1f155de171d6c0a805c838beb90c3756e8b864dc52517c03d8cb894d1dceae092f0e8784c7775ac664ad7320afd246086b3bc9ef237171c -Mac = c60f8ced2efd52fe -Result = F (3 - MAC changed) - -Count = 92 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = 5bdbd06f4df6e15d644f3a635d7bb14f -Msg = 4fcc7c2763a8dd5bfe74e34f512be8042af9ba1c73a944edfb616ad47a8d34cbcf192f3e8be3101bb3709b29c2dec39aee1913e3ac524ccb76ad50c2cc3a3e75 -Mac = af33d5a2746bfa5c -Result = F (4 - Key or Key1 changed) - -Count = 93 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = 13bf2f72211cc8e16ac1986a22e19f60 -Msg = 8ee212ed4bd110ca6a91b37bca59e19ba842e3a1b50619bc6b07ec02a09303ca5c66ba56e870d0b627d95fe829431244fe4f9218c862418f14a92bd76b5a3a82 -Mac = 18e8cd5bd42c75ea -Result = P - -Count = 94 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = e9b913c2f0630562eb1c16b3b1ed8409 -Msg = 031105ff01daa66ff95834e47b6f5c683994084d0fcb84c140d1dfa2039a95933efe6a4f91af993d966e2e45677eb1e36159047928a38eeaeb5c9a64ea59f97d -Mac = f00a17da0fb9e6b6 -Result = F (2 - Key or Key2 changed) - -Count = 95 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = 6fa5a5991315702cba3beb33867c7bca -Msg = bb0fabffbcc6935ca35755fd4bfbd192b6812cf75c4dc95bc3a175a1501be2065d7f57058cb7a5785a185dfff7e740a5551cf7c17e65051b2c6ef9509360e878 -Mac = dcfd143f86442183 -Result = F (4 - Key or Key1 changed) - -Count = 96 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = 3f8c6d21ec05bc439bf82774f1812bd2 -Msg = d726deb8537bcd671ddbaff8fcc6968f951b71aa82dfc802a53aadb2bcc2ef9a35fd90064320798b311d6d32f7dd3cd90bca39d57991eddc36260d23b108aac3 -Mac = 449e20567875d56f -Result = F (3 - MAC changed) - -Count = 97 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = 8ed1a4873bb37fafd4f8c2ee417443cf -Msg = 1652c9539bff4b6e9f303f3e6b5d4b9ff7e85aa2a401ee8c2dc7b722dbaf6424f92ab9188882e2483405070e8666204f5a600b46949cdb830fd57433d63a55a1 -Mac = 601eb06acc5a4e0a -Result = P - -Count = 98 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = 83a4669cb9961448cf418cb83a16098b -Msg = 26d97c3e28460d46216da39e043e024ed08e387b1e5fcfd3f962472cf1bac4676b03039b3b93927075ff41c87fe1d4a56bd9fa4784d283942787cdbdd5457f1f -Mac = 01a42494a10691ce -Result = F (1 - Message changed) - -Count = 99 -Klen = 16 -Mlen = 64 -Tlen = 8 -Key = c9e6d0b3dcd8ab50ba5ff31d9c1bd95d -Msg = 0d32c1cd73569ab2b10c67c167875fe22625358ed3469b424c5e052d4e49af2c97dfe1f947c972a08c938b327e01adbc48a7f57a89b49f49fa0fca5b50a57a2e -Mac = 476add8ee51b5e3e -Result = F (2 - Key or Key2 changed) - -Count = 100 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 17281acb525b13653000ab45d86e7010 -Msg = 225750ca982e5b34fc62e277eaaa0f248532abf374933e572b0278566cc7cf980df26abefb493ef57f8477cac0bd19408a22e71f4ded84906996d8e7a846b5c0 -Mac = 0f2aa7f2dffcf7df34c84d101aa9bab5 -Result = P - -Count = 101 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = d3624653ad0ed144667df0e0e355c29e -Msg = 39dd298acc45cb597f0733572677f7102536c0dd86fcfcc44895d29af92a5b6a87c20f1b53087d4c874f4083aad32e877142d20ad87b1d8b7295587bfd235d9f -Mac = 795da5a50f5b7df40317616b5a470c02 -Result = F (3 - MAC changed) - -Count = 102 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 813b3d579664cebe50a8e7050a0b4e65 -Msg = 78ad6517a09b99c1113d175f3129aade4d4a2516ebe054f15bc833d08ffe5e2a2d60c976e1b4b14cf8edd2c72baadb2db8001fd2b8798d39ac5ce27d592f1def -Mac = 20f40553bedb6496233e0b53143b6d10 -Result = F (1 - Message changed) - -Count = 103 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 21095cdbe94afa27d84bcd68276993f3 -Msg = 10525eb2794d03409faeab22a6d4cc4ebc0421daacb0e865b0f94eb387722897c827e31676debec9d49c36837b6bc234a95bc10ddcc7b1e5a0d9a1dca550e93e -Mac = c0b806ce5eaceb51b53b028e6efea9c7 -Result = F (4 - Key or Key1 changed) - -Count = 104 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 6c769a4822523525bb36c02518475549 -Msg = 4af38908fa44b46873535b39f432d9b3e677f6d06d8719af3d15b936afe515fc13d62566481fd0108bd95f6e8dbe32b3c830b1f1127d868273610aa834ccfc70 -Mac = c1934b9c74127cfd515521df330c0333 -Result = F (2 - Key or Key2 changed) - -Count = 105 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 6b454930925ca09d39e1e39a2e78fbfc -Msg = 2bc884394ab7050c14d66fb8901cac109c0126668d918a4419bfcc5d75fb6bc2ba07f6598d06cf8cffd62f3eb29f6a033eac7490d27aa4701f0fb9f9718d1b7f -Mac = db19b8ef218018e5a53abcc39b7c514a -Result = F (1 - Message changed) - -Count = 106 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 5df295be7c44d59c44fead3f1988356f -Msg = 3d7370cc2d61af35bf7b2ba50a143b23bfa0d1eff66c5ace2d8de5a28d17883d708fff7721a2977ee2164b6e34022c22523a0649ff0e40bc8134040fee02a065 -Mac = 81b3181acbc2d6d2960ec57441ff3c40 -Result = P - -Count = 107 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 387fc73be9f019913f2222d98053f95b -Msg = 944daaa76249bd9d3bd517d01b074920b7d4434d1a2618af902e0228c3fca658244d990f8ca42208239c42d4827cf114140cabebc2a72bb3cf9277ef008c1c81 -Mac = 5de79be9ff9c3c9d64f9cce35b188648 -Result = F (4 - Key or Key1 changed) - -Count = 108 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 7424990dee834ad05f4218861ab21eae -Msg = 49fd56dec210e903f6c703332637f9c267eab9333e2701a16c74ce5e0b5a16d9da68b9c5d67bb6770a3c9a90a7e93fdd5759b27bcf3a753fa39ee7545fb60026 -Mac = 38b66049ee8ed81f3f8ce2b45a4001ad -Result = F (2 - Key or Key2 changed) - -Count = 109 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 232407986ad4a8e438990fd04ffa35bf -Msg = 9d88a7970d4c58cecc20ed1811298a5b37297419ca49c74fe216679dafc938a656cb92bafb78efb31f24e71c2d5b5f994f6dfd82862adfd2faeb8c408fd22aab -Mac = 313d46dda3ccb75f497f9069c9478b3a -Result = F (3 - MAC changed) - -Count = 110 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = d9bd6ac153cb0bc4e19e59c45cfe0d6f -Msg = c68094c26c7f017b79f126dc26b3bbcb95f97535ca412da5f7853e15fcb52f042e6492c857c22b26ffca5520eabca20ee2cec2f0b71ea60383ece49232065e0f -Mac = 3b17778955990ae58e03feda7fc43998 -Result = P - -Count = 111 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 857fa35c6f70f637a9a5e6f215c694fd -Msg = a1fc1307757ed91665980e2d3cf9778d8bffc9a84cce6bd5c5a07e47af5c1b409869db8286c49d07dd5083f1826e3ec441ce8cd36c85fef8c55fff889e761286 -Mac = e1ddd63db51d3035adfd309ddc186238 -Result = F (2 - Key or Key2 changed) - -Count = 112 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 501f5c58355d1800f155f272dd09afee -Msg = fd3564848ceb5d8cddfd50732956d18b4af433efc2e2a914ff66aba1de7b9b816d81a936f534f47038dbf1def7c11144b7e99ecec5fee6a478899cbeb6677bfa -Mac = d995f9bae6150996cd9b798fcbc623c2 -Result = F (3 - MAC changed) - -Count = 113 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = c1d636989dfbcb0edc9f014cc82da6b5 -Msg = 20ef1bbf8a719497797f1f1bc4617179ea682a24a92f0831cd215a01473bb8207e13f26dea1a467bde1ed638a51359ccd11210c4d0a2fb70c0374e8984f81f17 -Mac = e4972a59db04f78da1728cab051faa98 -Result = F (4 - Key or Key1 changed) - -Count = 114 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = b4bc5a4d40716fb06a359ef9537726b7 -Msg = 36594fae7b487798d62c2c95ccbf51c984df5ca6343465b2dd147c8b36a34028e53fae61f51b36b28529143cbd3edd0c077158a07bc490a79a06270940f7ed27 -Mac = cfb3fce039ee2bb94b6961ff86688237 -Result = F (1 - Message changed) - -Count = 115 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = dc796e5d9b712c798922eef315cb4728 -Msg = d5755c40f52364343d2613420441afe9da9a5329d3c1e5a123ee49f5eb8ad47253f104f5d9776e08e9a9f74fadd5472326cc7b7c7ce61a1492474bc9de614543 -Mac = 315f0ce76352448bbd8a5012a9907a23 -Result = F (3 - MAC changed) - -Count = 116 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = b82fd283922e730a07f7ddb87484f66f -Msg = 94e47b82b728d639777d5d5843de2a5c364956cb4b21cabdced2529b10b3f4275f307fbc352866d7b094cfd7426ae801aac17ac72335c04adb8d791da69b3c4c -Mac = 86e6a8485b43f1b258eb59688af91fbb -Result = F (1 - Message changed) - -Count = 117 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = f6db7efdfe73dcb4a26b8448842b55e8 -Msg = a1fa1fcd5f095b2768e32cd733365a136a108e7493f212aaef27d86da253beb6154f103099344ee94db6304e41b4e856db0ca7fd7ab462f45a07d697b85cca1f -Mac = f998bba6c5d3efd78af9ef57e7a38f7b -Result = F (2 - Key or Key2 changed) - -Count = 118 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 3c1ba92d096fba134dfb4ef412b2568d -Msg = ba7725d74465f5d92454bff794e0be51c4d0af7d88f729834d57312c528d0a7d15694a7e0bdc334093173f1d2df1fd42e7891c6b192dc5ee527b2ffb92c66d22 -Mac = cfe6022ad29a54627ae7c4f907ef4da1 -Result = P - -Count = 119 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 4a92337f017a85b136ba6766444bbe84 -Msg = b0a3a8aa5d4bdfbb4c5c52acdcc60405c379f752b077eed42f2d7777cc0329047b322b9837d5f655ea445b578d9dc7e990a3c6f97cccc6cad7951ee948194e62 -Mac = 153eff3c035db2fdc752ebd22302adae -Result = F (4 - Key or Key1 changed) - -Count = 120 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = 305ec69b23e4490e0f8a5241cb9c8c85 -Msg = c641cf589020b94026ae -Mac = 3bc054afa9771970 -Result = F (4 - Key or Key1 changed) - -Count = 121 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = 28929286bd1391468ac75f5c03689f74 -Msg = 3813592f268a7a863c3b -Mac = bf1b514d2f899620 -Result = F (3 - MAC changed) - -Count = 122 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = 1b3163e2d3a471b9823525abc7543c4c -Msg = cada03e8c967f9732a81 -Mac = 53702fa98e6f9a19 -Result = P - -Count = 123 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = be1ed49e2cb0caf6b6a0940c58453b93 -Msg = 4a348c5ec996f7a97ef0 -Mac = 3358d143dff4adfa -Result = F (1 - Message changed) - -Count = 124 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = f18be18df045ba31b80f3283cee6a681 -Msg = 93006a06d7e6df775b19 -Mac = f3252f061dce32f6 -Result = F (2 - Key or Key2 changed) - -Count = 125 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = b9dafe18a904ba761762ec3fe0e4120b -Msg = 173887316279a47fc699 -Mac = 884f5b21d478d60b -Result = F (4 - Key or Key1 changed) - -Count = 126 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = 31fee08df80cc1009e661230e25939fd -Msg = aa54ff7466923b265fb5 -Mac = 03dd2a9616f653a7 -Result = P - -Count = 127 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = 65a28d970b2bc7afafb4069c26d264a4 -Msg = 1aa5a3a4e6c5e5394e50 -Mac = e0423589b192caab -Result = F (1 - Message changed) - -Count = 128 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = 6dc38e37d1379732df4dd535db88d17a -Msg = 0093c6d94aed50b398ad -Mac = 19b08e65d391c491 -Result = F (3 - MAC changed) - -Count = 129 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = c5329fd99848e1cdcfa406ec09745ae2 -Msg = 6d83d0ad7cc7efd0d2ca -Mac = 8ec2709e1466f8d3 -Result = F (2 - Key or Key2 changed) - -Count = 130 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = e608914a930b9c300b677afcb8689d63 -Msg = 146629e70b37d8b83ee8 -Mac = db78a639bb15c84c -Result = F (2 - Key or Key2 changed) - -Count = 131 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = 0a998d3d390f5a80ad398b2070489984 -Msg = a91c1a8d9d268ad153bb -Mac = 5643a8c99b99d944 -Result = P - -Count = 132 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = 2b6f78ceace47509a43ceb6b761e7866 -Msg = 3c0a41a78240c9d2fc22 -Mac = 811acef50d6c1913 -Result = F (3 - MAC changed) - -Count = 133 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = ca481f557306f9ce386edd0cfde375a5 -Msg = 9f3488736ef6e2c3a51b -Mac = 57e8a0e5965399c0 -Result = F (1 - Message changed) - -Count = 134 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = c0dd1cfb3add04cd67a8e59be7ac8dcf -Msg = a7c559c82776f429ac31 -Mac = 7e43a2b43d030ff4 -Result = F (4 - Key or Key1 changed) - -Count = 135 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = d3130d9e5ef516b6bf172953a37913a1 -Msg = cbe97e14c3100c9fc564 -Mac = db9f674a2d0e9ed9 -Result = F (1 - Message changed) - -Count = 136 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = 9ec8661a880ebfd15fd8b04f2ae09dbd -Msg = eff803e0fc809cc48587 -Mac = febec8d41b6bdc1f -Result = F (2 - Key or Key2 changed) - -Count = 137 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = 6c2b091433833a0ed915354dcb70d982 -Msg = 90f1416768fca7dd48d0 -Mac = f6ada24319e502ab -Result = F (3 - MAC changed) - -Count = 138 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = bc79d444dff9d9e722effab07b068cb7 -Msg = 07d5a925b724e2443936 -Mac = f964302c270af24c -Result = P - -Count = 139 -Klen = 16 -Mlen = 10 -Tlen = 8 -Key = 1a15b24ba5d9648358f2c39c9da8512b -Msg = 15b94910853a8f23dfb8 -Mac = 8cdfbc13239e6aa1 -Result = F (4 - Key or Key1 changed) - -Count = 140 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 618fb69c8fb670250c306b3225687d17 -Msg = 7f54845a57d916866eff -Mac = c0d4db73891bb1efa232593407856808 -Result = F (3 - MAC changed) - -Count = 141 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 8000aa080c127cbabfdfa5d9d9728c7b -Msg = e53101e6eabcda32c13d -Mac = 5671badc409d4b170d4c861a0b3e1fec -Result = F (2 - Key or Key2 changed) - -Count = 142 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = b05b5557ab145cec2f00706dbc6a3c23 -Msg = 5e2f601395ec406fcf96 -Mac = d00243508d25804548c4b4b512cb1906 -Result = F (4 - Key or Key1 changed) - -Count = 143 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = e8b13346b61daedc1f9e3b49df8d1cd6 -Msg = 0593365419e0f75b6323 -Mac = 871eb97850a776e7ad498467064484f9 -Result = P - -Count = 144 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = bc498326755503ff25d02805eb351722 -Msg = 9ece4c82fe9d38ef64ac -Mac = b5e88af50d1cff3d2b6d304edf042c43 -Result = F (1 - Message changed) - -Count = 145 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 4d248e73886a0e36b3ce7c6113477f4d -Msg = 8de6fe3b24fd6c202ef0 -Mac = c1a4f6d0ff7330171cfe570e900ce2c8 -Result = F (3 - MAC changed) - -Count = 146 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = b1b9fd78e3f8eaf4e8c91da62b2da534 -Msg = 482ea6f652067e8b791c -Mac = 63c6994c98bda91723f832020fa7d223 -Result = F (2 - Key or Key2 changed) - -Count = 147 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 85e4e63341658144a99fbd17d94e3177 -Msg = 21ff834bec4ec6384522 -Mac = 580c1e549a2ceca4743256a9cc972e84 -Result = P - -Count = 148 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 88b5448372548e6aab1b262630a28a47 -Msg = 36dbbff560ef04ea731b -Mac = 5fd17fd704baaf1ae6b3330ef2989dae -Result = F (1 - Message changed) - -Count = 149 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 8cc76730ca47620d0b437112a2c93fd0 -Msg = c73be9f019913f2222d9 -Mac = 2c73e2b5b84d8f4f3db1fc92831a03bf -Result = F (4 - Key or Key1 changed) - -Count = 150 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 7b657c640f155f1ff461c83cd656614d -Msg = be9c5e77bf1b9dcbd4f1 -Mac = b660ec36c0c0b4d987439505f1bf57e8 -Result = F (3 - MAC changed) - -Count = 151 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = d5044e9f10bd274aad4f7e605bb828f2 -Msg = d0be84df789c98dd125b -Mac = a26e513b09f184caf8d76d76961d1466 -Result = F (1 - Message changed) - -Count = 152 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 24d6d4bdc9fc4cd05b2867e9123acf18 -Msg = 0f9703a3454c25c0b105 -Mac = 41676ddadb7b960e0269c8a59a6d9b91 -Result = F (4 - Key or Key1 changed) - -Count = 153 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 6aa049d06bf66d2e2b65541eaa3730d8 -Msg = c562ab24ae5cdb7654df -Mac = 0d4d1196158fec46bfa754a526ba4a25 -Result = F (2 - Key or Key2 changed) - -Count = 154 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = cf3727509577f1932bd7a92589c11e67 -Msg = 831188efc5d1f6dc9bb8 -Mac = b5d162c885d7d4f6f65f4188d6582240 -Result = P - -Count = 155 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 0bc2fdd890c19882640f8d4188b88b9d -Msg = 296828cbee50f41d19b1 -Mac = e583d77645a603d841eaafa8860bfa91 -Result = F (1 - Message changed) - -Count = 156 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 5bab8051e2520b75673068b9cda93cba -Msg = f16cba03402f9924daa3 -Mac = 97f7eab25dc3ab017a9affc0e400dcc3 -Result = F (2 - Key or Key2 changed) - -Count = 157 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 7ac46e3249ca28e1ef0531d80fd37c12 -Msg = 3e9ddb8121760bffb7c6 -Mac = c6eb13d5087d05b4eba2e74b283b7fe3 -Result = F (4 - Key or Key1 changed) - -Count = 158 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 40f78f7ad3eede36e13bce222c6a4bc7 -Msg = 4fa8ad212ef73d37d48e -Mac = 3831419e62b51b7ced0d9117e48fabf6 -Result = F (3 - MAC changed) - -Count = 159 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = a1f82c9924411e98e6f93fa0d07559e2 -Msg = 7d4748147575bc0113ab -Mac = c23dbc58fe22b34f7b007590558a3080 -Result = P - -Count = 160 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 84760f98ec565d281496b1295b25150e -Msg = 9ce942ec81f8226506d48788e3acf49fcab6da22 -Mac = 606c2f459a9ce198 -Result = F (4 - Key or Key1 changed) - -Count = 161 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 3b6dd5169350b230774b02b9b44f06bc -Msg = adb1ad81dac0ebc650d48f7a9329755a83f293d0 -Mac = d7ceaa858508c476 -Result = F (1 - Message changed) - -Count = 162 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = f98d00755bcb45e6822121fe7cb03c8e -Msg = 7064a2491f716f4a2969815e4a281a54690ced9f -Mac = e14634c400b9f561 -Result = F (2 - Key or Key2 changed) - -Count = 163 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 5d27cb435e7724a246f158576fdbac68 -Msg = ee8ed4c12b0cf7c03bf91fba31a6a7b2d64c36c4 -Mac = c10b474c0077a39a -Result = F (3 - MAC changed) - -Count = 164 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 098c12058a0bc5951fc092aba322e1a0 -Msg = a2b76835229017bd0e8167a40ea1e2e18cc5db0a -Mac = 1d44128c3db0f7b9 -Result = P - -Count = 165 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 74f7f6516a17d5386c289756240241ed -Msg = 8eafce9ba466fd53eb87f499d7c76bd486db0e90 -Mac = acd978e0065375b6 -Result = F (3 - MAC changed) - -Count = 166 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 013bba67d26c7e52ae48dda3b67c9c96 -Msg = 48c0d53b85e6fa4928d3e9953afb9b451bc91a48 -Mac = ef41ce0d30baece9 -Result = F (1 - Message changed) - -Count = 167 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 14cea4c46d837c9439b088fba0e9d85d -Msg = 3477384c396a9e9efb3e169722cba779fef240c4 -Mac = 902158426696c229 -Result = P - -Count = 168 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 24f7b08fc2e6af6402243e22ca0626f9 -Msg = 914cf55a3fc739b5f87ac7518cc4171b4499d951 -Mac = b775a3c1dc11d074 -Result = F (4 - Key or Key1 changed) - -Count = 169 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 35b5428d440503773f30748ff843be68 -Msg = a5e5804cfdded4d610d1b05b7313ece84f369ccc -Mac = 6dac0947366be803 -Result = F (2 - Key or Key2 changed) - -Count = 170 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = c8afe4e5b1d019c2efdbeda65d874ba9 -Msg = f739e632436470b5a1db9fa9796ed384c0523f40 -Mac = 04c8aceaa8f8c3a1 -Result = F (4 - Key or Key1 changed) - -Count = 171 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 05a7910edcd7252b37e6d3d080a9ee90 -Msg = 702db7761abb9b5de41a86c8659270570be9d52d -Mac = 889a990539cbc30a -Result = F (1 - Message changed) - -Count = 172 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 4c8b0850eab7b212ad96dc7a032f8855 -Msg = 2de32ff6ca41b4c97424b121b8ad4edb133c00ea -Mac = f5ce7f46d457ec37 -Result = P - -Count = 173 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 687bcb63755f2b5c7daf4a154e8525a8 -Msg = 02778ca34db1cb5df76cb1a7619448f67d63b26d -Mac = 49d48bb0a684c6f2 -Result = F (2 - Key or Key2 changed) - -Count = 174 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = f8c4e562fde4379b08e512b0132766a4 -Msg = 627868b46ba546252f4eaa1c25205ccff72902d7 -Mac = 5459c0ac5bb6701a -Result = F (3 - MAC changed) - -Count = 175 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = dd235b05c15479dfe0326ba206ac784e -Msg = e044ec24ddc0605bca89925a4ebc0234811e2a0b -Mac = 5ed0a03da09555b3 -Result = P - -Count = 176 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 665c2d7d6e69c2ce8f0d06b41038b83c -Msg = 4fcd7541000cfc223fe9da6a030c681d0fb926cf -Mac = 1f022feb38ae6131 -Result = F (4 - Key or Key1 changed) - -Count = 177 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 2efb7cd914a59b6ad63b7d1812f254db -Msg = 67c9fe3e163787705a20f2fc8c468c4f771991fe -Mac = a866d6a31c0b42e6 -Result = F (2 - Key or Key2 changed) - -Count = 178 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = 74f6fd37ccb4b7702bb3a03b7322c0d5 -Msg = 011ecbe98c5cb7734476dedbb852e2474a5ad594 -Mac = 707ec713b9bce5d5 -Result = F (3 - MAC changed) - -Count = 179 -Klen = 16 -Mlen = 20 -Tlen = 8 -Key = e673b3a954a00082cb7516ca9a54d9a1 -Msg = a6fbd41a838bdf0fab3e7b56c27a8c18dc4bf970 -Mac = ad4dfde057b54a27 -Result = F (1 - Message changed) - -Count = 180 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = ce5bf070678cb07e963263b1562ff793 -Msg = 2bd10c4397a19fc79a307116a0847e0aaaefe813 -Mac = 299e5910f128a1f091dfb6b70f6a60ea -Result = F (3 - MAC changed) - -Count = 181 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = bf144c9bb974729aaa1188ceefdf85e1 -Msg = 5e1ef2ad86ceaf5439fe87d2ec9bc41b52e5ba01 -Mac = 58b4a32ae55966e42712721363ac9eda -Result = F (2 - Key or Key2 changed) - -Count = 182 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = a0cd07b684bb9e0e6692e320cec4510c -Msg = 6e1e490a30f0c9e3d3b79f1c36aab742bd67c585 -Mac = 24dd518ffffc1070f13d50d0bca42711 -Result = F (4 - Key or Key1 changed) - -Count = 183 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = e3ceb929b52a6eec02b99b13bf30721b -Msg = d2e8a3e86ae0b9edc7cc3116d929a16f13ee3643 -Mac = 10f3d29e89e4039b85e16438b2b2a470 -Result = P - -Count = 184 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 4073251950e3331d03d67a2399576d28 -Msg = d5dfd0321b26e578fe987456ff061dc1cdaa4161 -Mac = ed2823fb8fcae918064cef6211646e50 -Result = F (1 - Message changed) - -Count = 185 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = b08f47101365111133d974e8f0206507 -Msg = cefe484955fae117649ec158416a7439f29a596b -Mac = 3317717c6c0b138275090ea961c8d58f -Result = F (3 - MAC changed) - -Count = 186 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 166fb8d0e110124c09013e05688605ee -Msg = 24c65f715742da7d06046c783a35b2648180b4f2 -Mac = d27901a86dbf0ed8bde0d69203646b7a -Result = F (1 - Message changed) - -Count = 187 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 20f6f56117758ba47a08dadf93a59056 -Msg = 7514e0f402e73d9c0b0576782011b2e6b2080a6a -Mac = 11cda489b6dc0ab48d111ee6cb26a829 -Result = P - -Count = 188 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 7fa6ef35ad594a09cb74daf27e50a6b3 -Msg = ac0d616ed7dd3c3e86b3507d9f2bdc3a807d490e -Mac = fbad2fc6c9d0e5d21b25445f499eee10 -Result = F (4 - Key or Key1 changed) - -Count = 189 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 815871a8300471dc325f8289d0d37211 -Msg = a8ff31e90556236cb4df078943c1f2528b42a7ce -Mac = 5544c93de980bcf653354ce08aa9dc3b -Result = F (2 - Key or Key2 changed) - -Count = 190 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 06aa3f6fc20f867b42ec234a1bcb8665 -Msg = 25df5cc617e6e68be181694721a2a112a1bfb7c6 -Mac = 2eeb7ab470caea3317a6336f5eee24a6 -Result = F (1 - Message changed) - -Count = 191 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 860f8fdb021b1974d40e3d4bc41fa967 -Msg = 6c982a616510db422cc2f1beb955c3e7a88b6097 -Mac = d2280a55cd0bcd18846b4e30db6322bb -Result = F (4 - Key or Key1 changed) - -Count = 192 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 15105c6285a9015d0edd414d6a806bd7 -Msg = f1cc55636836e67909ed3a581de20630226dd5af -Mac = e9cc5799a630c6f26087c1bd3b6f1791 -Result = F (2 - Key or Key2 changed) - -Count = 193 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = b47aa890b03a8ac0dbc8f96c30fdf7db -Msg = 58b06c99e0d0256cb1c556ec3b48a3bce73450a0 -Mac = 3376cacc247686832736cea7e67e13af -Result = P - -Count = 194 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = dd057368033252d9bb2081a0b1a0229e -Msg = 81de8f50fbe35f7ed95430e74d28666c885b6100 -Mac = faa08c5a3a4ffdce81ca31873197d035 -Result = F (3 - MAC changed) - -Count = 195 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = baf5afafd7d0c8ad42a44e4e0a90fd2c -Msg = cc5a4209a6a60dcf12621e17150b4576b918732e -Mac = 5a43002d9144a1d5e48c2dc8dc167a52 -Result = P - -Count = 196 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = fa6405355bfb5065dc81e764d20277bb -Msg = 5dd1febed8e94d4715e772c3295b48eaf471daee -Mac = 29e96ce5ba930134670b3c68b5c512f3 -Result = F (1 - Message changed) - -Count = 197 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = ad2e3d3af6195e74b3e43296b1f618d3 -Msg = ca776f79b8581014ae58a4d533b60483fd1fbbd0 -Mac = b32ce1f493b126fccb9829d4dbe76382 -Result = F (4 - Key or Key1 changed) - -Count = 198 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 04ae7190f0cabd117d30a359f80b720c -Msg = b885e5e147f967032ab2552829a6e09210c44a45 -Mac = 9386d73a01960ab399bb7d290674b21f -Result = F (3 - MAC changed) - -Count = 199 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 51fdc65f6bb0d20a3c08ac1493ddddb2 -Msg = 1f0a56fb615b594d938bb8a27f4b2f5463ee9a61 -Mac = 8506fb1b74806381e2654c8764464d8d -Result = F (2 - Key or Key2 changed) - -Count = 200 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = cfb7e930b838dc3644f6c06f2ad0c8d1 -Msg = 611db4c194dbb54d80a4f4fa731cd9a6a330eaca734d3351f2cfebaba4bd541d86b3e35b4c1fa158edb0d15d610cd359a9c24878117f77f6b284f0363a576e0ef0 -Mac = e9589a711f5d4a5a -Result = F (4 - Key or Key1 changed) - -Count = 201 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = d179dfeead9d765d000462785459b1e2 -Msg = 795ee78ffdf302f3f1f2b31629ae918409cb42979afe3752dd14968d603678520e6b55884b5ebcce416248aa74b3cfe39dfedc2bb5246001503ca4d62cd7826f0a -Mac = f16ea84f554dfb54 -Result = F (2 - Key or Key2 changed) - -Count = 202 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = 22b7eb25e688672ab0e17206623094b0 -Msg = d830b16fa236a1dbe60f6db8d7e81a3ddb5f658c9f446e94639cae3699ec2ea6afb4fb152939d58df287271cf4b73c34e66eaf5265a623de47b135522c7aaf9f55 -Mac = 16229efcb7523025 -Result = F (1 - Message changed) - -Count = 203 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = a64fa98b4662d801159f61eefd1c8bc5 -Msg = d5982c462ad40458660cd7b120ce07fce9afe812caedcebdee536ac19b5d561d679dee8ea85d62552c86093a2ac1f8d179dbd4fc006ee4b16ebe6afd2be134498e -Mac = 2f9a2fbcb96461fd -Result = P - -Count = 204 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = e4fb10325d18666c382e6cc2442381e1 -Msg = dc28484ebfd293d62ac759d5754bdf502423e4d419fa79020805134b2ce3dff738c7556c91d810adbad8dd210f041296b73c2185d4646c97fc0a5b69ed49ac8c7c -Mac = 8f771ffe0c8d3445 -Result = F (3 - MAC changed) - -Count = 205 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = fdcd3459061c36c9a0daa0dcab2b967f -Msg = 1cfa3342540d03ec3fcc8378c021443ba3321fbc26dad7c5b859faba004a082a21d6d7a43d2836cc3820d1adbe4c55518714d48fd9346a254f702107da8212f605 -Mac = 6635f9e17949a14e -Result = F (4 - Key or Key1 changed) - -Count = 206 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = fc593384e6eebc508d181fc49ee10e56 -Msg = a6c891c9dd1fcc982c35bc74cfe71651bae424602519672b466d80e160af51eefccc5fcf76467a25bce1a10853a0209d9beffbeb53228fea5f1e77ddc956ade207 -Mac = 7a6fd94e3928d2a0 -Result = F (1 - Message changed) - -Count = 207 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = 4e4ff248f591ca27665960d9357a8de1 -Msg = 198d5c9c4aa35d12b62e8c4bf6f3f141e6ebefd8ab396c71f55e32bc82b094cde409547383bcc4c5e5cd2cfd2d616c8ae273e260f2c98e93f7267424b8c2421bf3 -Mac = 9140f91a0cf70762 -Result = F (3 - MAC changed) - -Count = 208 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = f20826990acdf225d9451a3d22f89747 -Msg = 03d340904ace1cd52d4b72a96d96afd77aee68ac3936415005ed0d56f46036915b1e5f2994ad49effe7bf3ee46170642e5a16f2eea804e68fa520fb79529d6c09a -Mac = f30b668f16bfe6c4 -Result = P - -Count = 209 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = c231ea8b75c65de68c49b76e7a3128de -Msg = 5b50879191a6debdb96c0bfaf9086b7dc6e25594416b08d2c75fe16cc347d2e3c7410fe3dc030a6c161ea22f6b80973bc43d42d8558f83b32a1bfa3c03757a4d62 -Mac = 65ba53ef4711e807 -Result = F (2 - Key or Key2 changed) - -Count = 210 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = 8ef18639bc8c831dc0b4aeeca25eff4f -Msg = 094c4d9baead7c5acd7dc58f3b4b4f57f1406b4e6af81a034d90cfa94c01760f4cacb4d2c63671d16d9594e1116b0dc2c39319523afac10175b1a485a240f7cf3f -Mac = d84f89e16c3b1633 -Result = P - -Count = 211 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = bab9d79aae4a1b282d8c5aa35d5c0876 -Msg = 02815f53c2be5f7246d4794895b4b15b6c3944819dfd3051b371f6d7d52d9f8ced84fd84095c33ea013c78aa5aa7176d6aa9bacabdafe9bab89cce4d7c183b9c0d -Mac = a01f976031bc8140 -Result = F (1 - Message changed) - -Count = 212 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = 42b97f583f64d88358885c66add5d03a -Msg = 187fe16a764c0987a28088f5cfcf55a6b9591b6395d2d41043e09932cbc4b8ae073d08d39da9799b316eef2ed89851a8cfc4dc1c6d3cbed95663e0ecf25403e61d -Mac = 0820b1ca0cd34e5f -Result = F (3 - MAC changed) - -Count = 213 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = 4fd555bd3a5253a90b68b5d4d46bd050 -Msg = 1ef253c61ac8ac66734ea80eefc1dc077edd660dc3518b5ecf709f10302925a72a3938e7449f2ae707506a67022dab63113242e9dff0d027aa3d22c8462a558165 -Mac = 3770a6cc988a28eb -Result = F (2 - Key or Key2 changed) - -Count = 214 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = d3a8eb3f9e5fb264ff098d85c28dd763 -Msg = e97a0986bf75e0e821f5adda80778863d9d479bd8ac3e7fe64a053f8016c465d581487278ef6923610a1463bdedcded62aeb22fb210dde9a0949947f8c6a6e7753 -Mac = 4947e6e28dbba216 -Result = F (4 - Key or Key1 changed) - -Count = 215 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = 3043857fc40be37fb0bda4f46894690b -Msg = 14874a8b59b0178c5ec89cd7316d909371969c1a1a1bc8a29f78341d39ce085e7e2aad7c350a3e7b691d3929bc4b7b47fef56be9fe7e7520a00abad5308505f8f6 -Mac = 1a8c82e9109a68a5 -Result = F (1 - Message changed) - -Count = 216 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = b325d425c810d22deb3209f29c5c1377 -Msg = e44c4202499440c12109296a35dfb1f669f97e7f415cd251a5e36943e134a548f0f2e841fa3541151b374c04665053382a24b99d731b99f3d411aa22644f66cd07 -Mac = 84faaeb5a9756a27 -Result = P - -Count = 217 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = 7cb6a84e99f5573c1eb27c0078f2127b -Msg = d7fa7be9c10252d6e41bc1a08195a344ef77b81785cea6b4ba453d398bf6ffb31d80e0d6a45a4af283676422b5ca94c76bfb4334f61ae0abe884278976a5a3bd21 -Mac = 64fa7f9284c24f14 -Result = F (2 - Key or Key2 changed) - -Count = 218 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = 00341fb81209c2abdfe3a9d607b98277 -Msg = 74f6fd37ccb4b7702bb3a03b7322c0d5fcc657cb2c3f1361488d853589d2d6207359b65d62d896ed66f217395000c2fa0d11f956332f2d4bdae55251adfe903b41 -Mac = 4cf05b6e583c70f9 -Result = F (3 - MAC changed) - -Count = 219 -Klen = 16 -Mlen = 65 -Tlen = 8 -Key = 647a5be8a66c83b4b238975388e15d00 -Msg = 0db33eda4188a9165147e24e40f79fee1985eb68d51627287e9c4ec995a77d89b27fb2fa6a6fd3fb7563f3e710b6d20ca145a25f9ac8116d9f628395eb769f75f0 -Mac = e8ef4f3cd7442246 -Result = F (4 - Key or Key1 changed) - -Count = 220 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = c98fc3416457d9eed0fa7ab1dc1b8a6a -Msg = 190ae57ab8bb70464e4a10c112a54c646438301b5662f3536c26d754a02451d1a9c76abd7dbf656115b2a2ac702ec2cadae30cf86e0f0f96da39897d6222889428 -Mac = 1bea94a457b2886e9098bf3ded932a3a -Result = P - -Count = 221 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 87428d5a53f750abdb335f70ee13b5d1 -Msg = 7bb0c2ecfd141e7e93a897b259732b6153af3542eb7289b1a18dc0aefeb4d129c9e0e27d7ef25d3afc9945277e75cb87cc7d1c9cb39e7e6ab2a49bbdf65e1c6d89 -Mac = a854d2da46afb77a787f0606a69cf467 -Result = F (4 - Key or Key1 changed) - -Count = 222 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = c725d9ef0dc6cfca84865cf5cc91d403 -Msg = d3208eb695e84c7a9250378e18be2f231ca3ebe72ba68e3ea4ff7bcf25206b43439bbd497e400dde738507cb542c7d6f961fb8bee99f0c8a6d9daf022368cc78a2 -Mac = 35d57445a5f10fd567595fc668293e95 -Result = F (2 - Key or Key2 changed) - -Count = 223 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 13e3fe7856cd680593a85cda3d6ff873 -Msg = b208e5a1a852caef0795150cf8313ee0cff06e3d28d438c2351484005661cbdcea6d8a3466aef0c6a460da4d7dc902ec99c073d086704112085a76dab0994fcab0 -Mac = efb2bef5aae555463ebbeebe69791459 -Result = F (3 - MAC changed) - -Count = 224 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 9b8112c1fb29fba2c8b0d8f16481b993 -Msg = f54105a04a4a02a1a07e020a6a4f4176e9c92bf40018ccac434988c650550c87625b84bd232d0e5ec20e6f6c46ba061b22a7fe36098bc7bf031ec6d6c1214bdb2d -Mac = 673281bc0effe92adfac4fef49477ee2 -Result = F (1 - Message changed) - -Count = 225 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 82e71e3ad1bc9a12a46e460a05ad9c05 -Msg = 41fb3dd6df78fe267175297e208ac753d50aaabd9edbf5e45385dfb47988b3d966f31be7a6329fd89e2869bc6f7e4bac1e3a0300f193bdc21c03d9629c9fefaa64 -Mac = 36f7df58abb54a053988cae066110ecb -Result = F (3 - MAC changed) - -Count = 226 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = b46e219217ab73c34904e24c6d995b72 -Msg = 887d6576572a3d8f6a1649394248c4d09d15026ffa930c0659508bac4243e7360802af084f363c2bcc4c91a04c6e86f4f8b22615d7915564949ab60b8267cb91dd -Mac = 10c1d8054ac549ad24ae4af2d8de97e2 -Result = F (1 - Message changed) - -Count = 227 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = b66edcc59dc9d8e34bea3baf4bfc0d5e -Msg = 57caadbb1a56cc5b8a5cf9584552e17e7af9542ba13e9c54695e0dc8f24eddb93d5a3678e10c8a80ff4f27b677d40bef5cb5f9b3a659cc4127970cd2c11ebf22d5 -Mac = 0c5864eefc04a6cac4f053ab2f65f851 -Result = P - -Count = 228 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = c607f631d792499ea43586b81fa3e2f2 -Msg = 21ed22abc7bbb62fb2d51d1fb8830ca95b16213f56291af976274934ab0d43805f71d9b906c44973f7d4b59b7a94d35c2220e7405dfcee98499c1c1dc92a89d7d9 -Mac = 4e65b3d58492a0eebb66928a8214498f -Result = F (4 - Key or Key1 changed) - -Count = 229 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = d9e9136339d361949242e4d8a0cd6917 -Msg = 419b9c9b093052577837862900e7de29273eb0678bf6238223b59176c78430b6f382f27bc8d9a95b53f26f1d12e545ccb434fa0a21b84fa7badb5872e208254fbd -Mac = 6c81094aded51ccd4da38d0412e7ca67 -Result = F (2 - Key or Key2 changed) - -Count = 230 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 6f349dd8b69dd41c6f246a1685115772 -Msg = a5a3c8afe5b84e0c3ba4f708a87b596d1b7c8694dbe691d7240e4e4815ad5aa4ca7e5b82c50989d092b96e80aa35e97f99ed79e75cf3b8750d0d263dc208289cb2 -Mac = cbf41299c35e65fa4e2626430f95051e -Result = F (4 - Key or Key1 changed) - -Count = 231 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = c15e4e552c9197184b3eb0a74f5fffe0 -Msg = 7c4699a7d9e2d9f31410f20029676f3c97f5793f6732f95f6d33fd7ecc205d27b8e89eda803316a3cb9951f12111b4a6aeac606b43835a469eede86eebf63e5e8b -Mac = 77e77de5c5600900e5b928d4be3d5f8c -Result = F (1 - Message changed) - -Count = 232 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 2eda9b2c6d7ad95b644a8739580ab4a4 -Msg = beadccddcf392ee56a8913f057da183ab06ec538e581b52c027ff7f63574b32d8bc4116efa1c56f4a4a851695a87f5fc5f7c47b46fe67b0400f2599fc80fe68d7f -Mac = 948e63657b8b6e2d130f6f25369d6160 -Result = F (2 - Key or Key2 changed) - -Count = 233 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 233088b67b741f07859d122a6a406d89 -Msg = 5717ed57ca0b6921f04dcacad34e0f6210c36673dc9f4d92493ff733c6e5f1c2e56805ef622a5f496049ee0ef51a0d41e9d363febb87070be558e8af61e86dc76c -Mac = c778152b00760fcd85bced0f58861d13 -Result = F (3 - MAC changed) - -Count = 234 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = b7471a8b2e50fb319f198a09cdaeb319 -Msg = 385f9fb139dbf88561b7a500b0c7b835fe57e2698c6d9f76de4fae6dcd45c47fd8a0811ebbfba35f43c17aa360f09c767c1cd9b70bb671fa638e852ace97cc73de -Mac = 1a8b81be875a4814e3f988c274784a63 -Result = P - -Count = 235 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = adf072ebb71e3400a2175c96fb0007a3 -Msg = a49840ab727bf6b03015eaca3f15a2bb64fd27b51b27fe7a2e0559c287ac8fdd4294ca990799ff66974624b8a4539dade66cf7f06b35d8dd2f8a36e6ec0bc83533 -Mac = ceac74b3af8750467e3b3c51624d96d1 -Result = F (2 - Key or Key2 changed) - -Count = 236 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 1b1d471add4e7f4fe197e3a4a44d06ab -Msg = da06bd1405028d93fefa3c037b5ad551879451a28314bae86a7591b359f56e4b4e26e6fb2fe7b1af0f930cc2ae785d113e8b16546d59dbae9f41e7827be1ac89aa -Mac = 16d0021b1f9c00b37fefb60af3358d87 -Result = F (4 - Key or Key1 changed) - -Count = 237 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = af5d4991c189dada2cb552c3c52d599d -Msg = 1bb1e0efa2d6811d2370a039a0c47c59683befbd46c04257f86a468ae25ba03304e865e62afae77a62b3cec7b3556aae0c60475a7bfb02c69f955c7f60cc8dacdd -Mac = d7056fe01f0ed1b20adbe05cbccc544b -Result = F (3 - MAC changed) - -Count = 238 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = d149441e667b245d4640e04c53ca6f51 -Msg = cbb34794bc8bfdf93d3c8d9f87ec1482b516b48b1e8a89b5e3b5df70c423a243384215b4bc69c76c6b18c497cf82088af74839a8c98895869a16294dfc094360d7 -Mac = 64f5e8dce5c3e0f9cc224e306de70b87 -Result = P - -Count = 239 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = c2f5d4837f9f75fb440c3bccad7c2e69 -Msg = 6a84594c4b3865f047c96038060b5b413db0d4e081c62e405b815ecd9e3be651f8b9075dc8b032eb2f87c1416a5fe4195f51defe75f671f9a92d966ddf18724075 -Mac = df8c8c61e8d604e24c7e3d0115dbe898 -Result = F (1 - Message changed) diff --git a/unit_test/ciphers/cmactestvectors/CMACVerAES128_stripped.rsp b/unit_test/ciphers/cmactestvectors/CMACVerAES128_stripped.rsp deleted file mode 100644 index be6ec6b0..00000000 --- a/unit_test/ciphers/cmactestvectors/CMACVerAES128_stripped.rsp +++ /dev/null @@ -1,1079 +0,0 @@ -Count = 20 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 191b53e0c7d90161e5e2014e9b8aea31 -Msg = 00 -Mac = 1e210cff3c90bd2e2a27a78ef7662f61 -Result = F (1 - MAC changed - for 0-len msg) - -Count = 21 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 54666bdf6db300ee10982d14dac828bc -Msg = 00 -Mac = 9fef67209b8da28049b80efe98f85f13 -Result = F (3 - MAC changed) - -Count = 22 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 9a143c21cc6c9528b9ddd7e4405682e1 -Msg = 00 -Mac = 1c3c3b6d1d86ac5787234f8f6d707acc -Result = F (4 - Key or Key1 changed) - -Count = 23 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 802047ee1309e548ae81e93a17bff9e7 -Msg = 00 -Mac = 1472aecaa0a09e45893a14090ed9a17f -Result = P - -Count = 24 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = ab79ce74c0959aea0fd0b28ea5d0afe2 -Msg = 00 -Mac = fde8a95536cc334f7fc8881a187afc61 -Result = F (2 - Key or Key2 changed) - -Count = 25 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 644ac6fdc1e713ecb7ff1e0bd5729a57 -Msg = 00 -Mac = 95a93bb50703521e6c1a8be1aab6a646 -Result = F (3 - MAC changed) - -Count = 26 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = b4571e56f66a857daffbdc99370ceddd -Msg = 00 -Mac = d2742ea62f1d6513c4eb0e533922f251 -Result = F (2 - Key or Key2 changed) - -Count = 27 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = abff2b097d688293701ff2c49ba48eb3 -Msg = 00 -Mac = 17e724f66d4a9ef5dfc0cf903f8ff04a -Result = F (4 - Key or Key1 changed) - -Count = 28 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 9d45f6d97d1573de3cb3488befaf5b7f -Msg = 00 -Mac = 96ec3cf234d6704483a93885bd67e6dc -Result = P - -Count = 29 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 00d385629e5df815a5300e6635351934 -Msg = 00 -Mac = cb23bb449ac26e2186b02f7428fa022b -Result = F (1 - MAC changed - for 0-len msg) - -Count = 30 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 2f9109e7eea21b2615c81c03182ce603 -Msg = 00 -Mac = 4532211f48124a9eacd795ea4313adaf -Result = F (4 - Key or Key1 changed) - -Count = 31 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 9f3830f5cd40a2396b6093b358cef1e9 -Msg = 00 -Mac = f5ea59ec909a8ec2d8b11f5f276201fd -Result = F (3 - MAC changed) - -Count = 32 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 17378e17c41586b88523a6b6af738dc4 -Msg = 00 -Mac = 40cc8b388be6789aca584659acc7aa06 -Result = P - -Count = 33 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 064e8c88a0a0766186d75867b5ca3acd -Msg = 00 -Mac = b2f94222a68fcf803868b00404ad170f -Result = F (1 - MAC changed - for 0-len msg) - -Count = 34 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 1e39f1cba97dac4e4d4f3bce7fda72e5 -Msg = 00 -Mac = 60763815c1075c31078a9b44fe4b8427 -Result = F (2 - Key or Key2 changed) - -Count = 35 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 06f0e4618e0ea8fa5443b50ea005b672 -Msg = 00 -Mac = 295c6cd08b1d668d9fa85ef851b1e029 -Result = P - -Count = 36 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 648d77b57770b67ecda1ce7951eaaeea -Msg = 00 -Mac = 2f3fbc6edf5827fce440b9a7ff8535b4 -Result = F (1 - MAC changed - for 0-len msg) - -Count = 37 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 6f3938932b5c1280311e892280d8a822 -Msg = 00 -Mac = df02edfb316350c81dbee385d6e1d8e4 -Result = F (3 - MAC changed) - -Count = 38 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = f909903451d1f9f45ffcb93a407ffb50 -Msg = 00 -Mac = d176620722c5327270ef30956d7ac02f -Result = F (2 - Key or Key2 changed) - -Count = 39 -Klen = 16 -Mlen = 0 -Tlen = 16 -Key = 181d92c7df1ebb0924719e066e08b95e -Msg = 00 -Mac = 144f688fa0d29faf787c48cd0765eecd -Result = F (4 - Key or Key1 changed) - -Count = 60 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 708484fba04972b815256c5dab12d5d4 -Msg = 97751b4893a83cfe6b760e10da795682e9668749c09036f9bfadce9dcbdd85e6 -Mac = fa74b33267c5ffeca75e5e16978bd7b0 -Result = F (1 - Message changed) - -Count = 61 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = d0df1bdf1df6203241722fb9c9c1cf74 -Msg = 0e41361ebfbe4e6580fb5751e58e98de8ee5d9849fe875026fdab15a85804c1d -Mac = de4992c9d33659620cc203848e42a279 -Result = F (3 - MAC changed) - -Count = 62 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 7c0b7db9811f10d00e476c7a0d92f6e0 -Msg = 1ee0ec466d46fd849b40c066b4fbbd22a20a4d80a008ac9af17e4fdfd106785e -Mac = baecdc91e9a1fc3572adf1e4232ae285 -Result = P - -Count = 63 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 7b4c800f5071521119e4cc6deee8729f -Msg = 775946f3014523b6ea37804585cadd35e74e9382ebc1022579fbebe407281b6e -Mac = 2f6697f5d067aecdb3ff5a09d9169b3b -Result = F (2 - Key or Key2 changed) - -Count = 64 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 7618d222630138cc14246e8fddcf98cf -Msg = 432e3575a966958434da38dda3606f1f69adeaca536a7bf66c8b1e451edc3716 -Mac = d7d78aac615ffc1bb32dfea41f2b8771 -Result = F (4 - Key or Key1 changed) - -Count = 65 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = c8804fef18ef263c010c8a205e14516e -Msg = f2d23bc605181e3894f61fa63d61ed4a610123ab7d3531c0b7579a58b74161ba -Mac = bfe5e2c10a5cecccd3de2529f340cf6b -Result = F (1 - Message changed) - -Count = 66 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = f98ac86ecb742c188852980b5150d100 -Msg = 4e6fd4fa7669ce9552154bd796644961b51067dc02303430150aacf671280031 -Mac = 73df5f4d3ab9240d4fb2be775188adc0 -Result = F (3 - MAC changed) - -Count = 67 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 638d7d95ff5f57571261e23ffa081189 -Msg = 5f5bc4e32764bb00085667b7f1b15433f09c1f6fa48689f8f50dcaf5021f2864 -Mac = 96b270629b2bfbf721f1a70eccf9abe0 -Result = P - -Count = 68 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = a5a20d8139472a4cb38993c5711ac2ca -Msg = 73e1e75538f9a63e49a068189e3b0a1a1e65ca5d1295589bdafa3136deaa287c -Mac = 320647d53ccdf2335a9c9a3452c1cee5 -Result = F (2 - Key or Key2 changed) - -Count = 69 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 57656be54860414e8a62223381ca4405 -Msg = 3447e82ecec6c8b6fe1e44ed91f933e4a70c431911eb86eefe222d5ad78193df -Mac = 47c6b5a28d723129648aef418b74daa8 -Result = F (4 - Key or Key1 changed) - -Count = 70 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = e7b665600a2aa413e117c53816cbed34 -Msg = 5e4d49ab796025157add6d42258b9c506d9ce82bdd85c604360db0ff5aa4262c -Mac = e741166cfa2a58003dcae357d7a199b8 -Result = F (2 - Key or Key2 changed) - -Count = 71 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 693cbb46bc8366086ec7cd7776f2c563 -Msg = 5a908ae85ff721ffc5096aeeda5ee83bddcf639e7be68d109394e5253c22dc9b -Mac = 9d56b03ef83082f601a9cc8730b0de42 -Result = F (1 - Message changed) - -Count = 72 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = b4190e3462e07fca26496adcb877724f -Msg = 02097035a312cb02ea7f09fc1accc230a205e4a208e64a8f204291f581a12756 -Mac = eb9604ec71aac0cacb63e0b369ae7664 -Result = F (3 - MAC changed) - -Count = 73 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 4ae06c3b2940819e58eb24122a2988c9 -Msg = a2e7be3314238d7e4f604e134790bb15a87c09356c091b1aacb9f605b67475b5 -Mac = 14b4507ae4b50cfe4989b544bede756c -Result = F (4 - Key or Key1 changed) - -Count = 74 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 8d560de2e310ea69389221ce2e850625 -Msg = 04d9db45e4df19db757b9b95c25be43e822b8372ed148d49ce824a36da2b2f2e -Mac = 647f2874a083e82fa804b6c58c7b5c90 -Result = P - -Count = 75 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 0e1a79c5d734118c19eaba700f5da238 -Msg = 026470d57dad9893dc037b80978bf70c2e552fe46c8fe8c3ebf8338bda984d94 -Mac = b936ff3bb8afb9e42351a2a3ad49d70a -Result = F (1 - Message changed) - -Count = 76 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = c88b1bc0050e19780ab53efbea175634 -Msg = 7207aa8fa87283f1f57019bf1c89645ff8fc36ab1102704e6d577671a9f7e098 -Mac = c1dbd79e31c3b0bb824f16f735ccdfe6 -Result = F (2 - Key or Key2 changed) - -Count = 77 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = d87df10a53eb3ea24c003d2a65e44921 -Msg = fedd5813146a8c2af398d6066956829833b75e44b6e010e4f025ac0fad6f869b -Mac = 9dd7cbb34445bfb351d01e8cdb21d695 -Result = F (4 - Key or Key1 changed) - -Count = 78 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 4d436a4a5c02b22ad49548b97216f277 -Msg = 2d73204f0b2d35806a8227206922ac9c18eff6ebddc73809179d67a702cf3e21 -Mac = d2654d9bd6396075296cbe918d90670f -Result = F (3 - MAC changed) - -Count = 79 -Klen = 16 -Mlen = 32 -Tlen = 16 -Key = 8af7b74e35eb38f4086343bc329ab465 -Msg = ada1fa439c653d0cc88c0d129ba252e86c7d20a3087be93e920bf13d8e6f0391 -Mac = 0fc9b177c874ea909b6beb1db1b802b4 -Result = P - -Count = 100 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 17281acb525b13653000ab45d86e7010 -Msg = 225750ca982e5b34fc62e277eaaa0f248532abf374933e572b0278566cc7cf980df26abefb493ef57f8477cac0bd19408a22e71f4ded84906996d8e7a846b5c0 -Mac = 0f2aa7f2dffcf7df34c84d101aa9bab5 -Result = P - -Count = 101 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = d3624653ad0ed144667df0e0e355c29e -Msg = 39dd298acc45cb597f0733572677f7102536c0dd86fcfcc44895d29af92a5b6a87c20f1b53087d4c874f4083aad32e877142d20ad87b1d8b7295587bfd235d9f -Mac = 795da5a50f5b7df40317616b5a470c02 -Result = F (3 - MAC changed) - -Count = 102 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 813b3d579664cebe50a8e7050a0b4e65 -Msg = 78ad6517a09b99c1113d175f3129aade4d4a2516ebe054f15bc833d08ffe5e2a2d60c976e1b4b14cf8edd2c72baadb2db8001fd2b8798d39ac5ce27d592f1def -Mac = 20f40553bedb6496233e0b53143b6d10 -Result = F (1 - Message changed) - -Count = 103 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 21095cdbe94afa27d84bcd68276993f3 -Msg = 10525eb2794d03409faeab22a6d4cc4ebc0421daacb0e865b0f94eb387722897c827e31676debec9d49c36837b6bc234a95bc10ddcc7b1e5a0d9a1dca550e93e -Mac = c0b806ce5eaceb51b53b028e6efea9c7 -Result = F (4 - Key or Key1 changed) - -Count = 104 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 6c769a4822523525bb36c02518475549 -Msg = 4af38908fa44b46873535b39f432d9b3e677f6d06d8719af3d15b936afe515fc13d62566481fd0108bd95f6e8dbe32b3c830b1f1127d868273610aa834ccfc70 -Mac = c1934b9c74127cfd515521df330c0333 -Result = F (2 - Key or Key2 changed) - -Count = 105 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 6b454930925ca09d39e1e39a2e78fbfc -Msg = 2bc884394ab7050c14d66fb8901cac109c0126668d918a4419bfcc5d75fb6bc2ba07f6598d06cf8cffd62f3eb29f6a033eac7490d27aa4701f0fb9f9718d1b7f -Mac = db19b8ef218018e5a53abcc39b7c514a -Result = F (1 - Message changed) - -Count = 106 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 5df295be7c44d59c44fead3f1988356f -Msg = 3d7370cc2d61af35bf7b2ba50a143b23bfa0d1eff66c5ace2d8de5a28d17883d708fff7721a2977ee2164b6e34022c22523a0649ff0e40bc8134040fee02a065 -Mac = 81b3181acbc2d6d2960ec57441ff3c40 -Result = P - -Count = 107 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 387fc73be9f019913f2222d98053f95b -Msg = 944daaa76249bd9d3bd517d01b074920b7d4434d1a2618af902e0228c3fca658244d990f8ca42208239c42d4827cf114140cabebc2a72bb3cf9277ef008c1c81 -Mac = 5de79be9ff9c3c9d64f9cce35b188648 -Result = F (4 - Key or Key1 changed) - -Count = 108 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 7424990dee834ad05f4218861ab21eae -Msg = 49fd56dec210e903f6c703332637f9c267eab9333e2701a16c74ce5e0b5a16d9da68b9c5d67bb6770a3c9a90a7e93fdd5759b27bcf3a753fa39ee7545fb60026 -Mac = 38b66049ee8ed81f3f8ce2b45a4001ad -Result = F (2 - Key or Key2 changed) - -Count = 109 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 232407986ad4a8e438990fd04ffa35bf -Msg = 9d88a7970d4c58cecc20ed1811298a5b37297419ca49c74fe216679dafc938a656cb92bafb78efb31f24e71c2d5b5f994f6dfd82862adfd2faeb8c408fd22aab -Mac = 313d46dda3ccb75f497f9069c9478b3a -Result = F (3 - MAC changed) - -Count = 110 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = d9bd6ac153cb0bc4e19e59c45cfe0d6f -Msg = c68094c26c7f017b79f126dc26b3bbcb95f97535ca412da5f7853e15fcb52f042e6492c857c22b26ffca5520eabca20ee2cec2f0b71ea60383ece49232065e0f -Mac = 3b17778955990ae58e03feda7fc43998 -Result = P - -Count = 111 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 857fa35c6f70f637a9a5e6f215c694fd -Msg = a1fc1307757ed91665980e2d3cf9778d8bffc9a84cce6bd5c5a07e47af5c1b409869db8286c49d07dd5083f1826e3ec441ce8cd36c85fef8c55fff889e761286 -Mac = e1ddd63db51d3035adfd309ddc186238 -Result = F (2 - Key or Key2 changed) - -Count = 112 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 501f5c58355d1800f155f272dd09afee -Msg = fd3564848ceb5d8cddfd50732956d18b4af433efc2e2a914ff66aba1de7b9b816d81a936f534f47038dbf1def7c11144b7e99ecec5fee6a478899cbeb6677bfa -Mac = d995f9bae6150996cd9b798fcbc623c2 -Result = F (3 - MAC changed) - -Count = 113 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = c1d636989dfbcb0edc9f014cc82da6b5 -Msg = 20ef1bbf8a719497797f1f1bc4617179ea682a24a92f0831cd215a01473bb8207e13f26dea1a467bde1ed638a51359ccd11210c4d0a2fb70c0374e8984f81f17 -Mac = e4972a59db04f78da1728cab051faa98 -Result = F (4 - Key or Key1 changed) - -Count = 114 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = b4bc5a4d40716fb06a359ef9537726b7 -Msg = 36594fae7b487798d62c2c95ccbf51c984df5ca6343465b2dd147c8b36a34028e53fae61f51b36b28529143cbd3edd0c077158a07bc490a79a06270940f7ed27 -Mac = cfb3fce039ee2bb94b6961ff86688237 -Result = F (1 - Message changed) - -Count = 115 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = dc796e5d9b712c798922eef315cb4728 -Msg = d5755c40f52364343d2613420441afe9da9a5329d3c1e5a123ee49f5eb8ad47253f104f5d9776e08e9a9f74fadd5472326cc7b7c7ce61a1492474bc9de614543 -Mac = 315f0ce76352448bbd8a5012a9907a23 -Result = F (3 - MAC changed) - -Count = 116 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = b82fd283922e730a07f7ddb87484f66f -Msg = 94e47b82b728d639777d5d5843de2a5c364956cb4b21cabdced2529b10b3f4275f307fbc352866d7b094cfd7426ae801aac17ac72335c04adb8d791da69b3c4c -Mac = 86e6a8485b43f1b258eb59688af91fbb -Result = F (1 - Message changed) - -Count = 117 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = f6db7efdfe73dcb4a26b8448842b55e8 -Msg = a1fa1fcd5f095b2768e32cd733365a136a108e7493f212aaef27d86da253beb6154f103099344ee94db6304e41b4e856db0ca7fd7ab462f45a07d697b85cca1f -Mac = f998bba6c5d3efd78af9ef57e7a38f7b -Result = F (2 - Key or Key2 changed) - -Count = 118 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 3c1ba92d096fba134dfb4ef412b2568d -Msg = ba7725d74465f5d92454bff794e0be51c4d0af7d88f729834d57312c528d0a7d15694a7e0bdc334093173f1d2df1fd42e7891c6b192dc5ee527b2ffb92c66d22 -Mac = cfe6022ad29a54627ae7c4f907ef4da1 -Result = P - -Count = 119 -Klen = 16 -Mlen = 64 -Tlen = 16 -Key = 4a92337f017a85b136ba6766444bbe84 -Msg = b0a3a8aa5d4bdfbb4c5c52acdcc60405c379f752b077eed42f2d7777cc0329047b322b9837d5f655ea445b578d9dc7e990a3c6f97cccc6cad7951ee948194e62 -Mac = 153eff3c035db2fdc752ebd22302adae -Result = F (4 - Key or Key1 changed) - -Count = 140 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 618fb69c8fb670250c306b3225687d17 -Msg = 7f54845a57d916866eff -Mac = c0d4db73891bb1efa232593407856808 -Result = F (3 - MAC changed) - -Count = 141 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 8000aa080c127cbabfdfa5d9d9728c7b -Msg = e53101e6eabcda32c13d -Mac = 5671badc409d4b170d4c861a0b3e1fec -Result = F (2 - Key or Key2 changed) - -Count = 142 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = b05b5557ab145cec2f00706dbc6a3c23 -Msg = 5e2f601395ec406fcf96 -Mac = d00243508d25804548c4b4b512cb1906 -Result = F (4 - Key or Key1 changed) - -Count = 143 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = e8b13346b61daedc1f9e3b49df8d1cd6 -Msg = 0593365419e0f75b6323 -Mac = 871eb97850a776e7ad498467064484f9 -Result = P - -Count = 144 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = bc498326755503ff25d02805eb351722 -Msg = 9ece4c82fe9d38ef64ac -Mac = b5e88af50d1cff3d2b6d304edf042c43 -Result = F (1 - Message changed) - -Count = 145 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 4d248e73886a0e36b3ce7c6113477f4d -Msg = 8de6fe3b24fd6c202ef0 -Mac = c1a4f6d0ff7330171cfe570e900ce2c8 -Result = F (3 - MAC changed) - -Count = 146 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = b1b9fd78e3f8eaf4e8c91da62b2da534 -Msg = 482ea6f652067e8b791c -Mac = 63c6994c98bda91723f832020fa7d223 -Result = F (2 - Key or Key2 changed) - -Count = 147 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 85e4e63341658144a99fbd17d94e3177 -Msg = 21ff834bec4ec6384522 -Mac = 580c1e549a2ceca4743256a9cc972e84 -Result = P - -Count = 148 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 88b5448372548e6aab1b262630a28a47 -Msg = 36dbbff560ef04ea731b -Mac = 5fd17fd704baaf1ae6b3330ef2989dae -Result = F (1 - Message changed) - -Count = 149 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 8cc76730ca47620d0b437112a2c93fd0 -Msg = c73be9f019913f2222d9 -Mac = 2c73e2b5b84d8f4f3db1fc92831a03bf -Result = F (4 - Key or Key1 changed) - -Count = 150 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 7b657c640f155f1ff461c83cd656614d -Msg = be9c5e77bf1b9dcbd4f1 -Mac = b660ec36c0c0b4d987439505f1bf57e8 -Result = F (3 - MAC changed) - -Count = 151 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = d5044e9f10bd274aad4f7e605bb828f2 -Msg = d0be84df789c98dd125b -Mac = a26e513b09f184caf8d76d76961d1466 -Result = F (1 - Message changed) - -Count = 152 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 24d6d4bdc9fc4cd05b2867e9123acf18 -Msg = 0f9703a3454c25c0b105 -Mac = 41676ddadb7b960e0269c8a59a6d9b91 -Result = F (4 - Key or Key1 changed) - -Count = 153 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 6aa049d06bf66d2e2b65541eaa3730d8 -Msg = c562ab24ae5cdb7654df -Mac = 0d4d1196158fec46bfa754a526ba4a25 -Result = F (2 - Key or Key2 changed) - -Count = 154 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = cf3727509577f1932bd7a92589c11e67 -Msg = 831188efc5d1f6dc9bb8 -Mac = b5d162c885d7d4f6f65f4188d6582240 -Result = P - -Count = 155 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 0bc2fdd890c19882640f8d4188b88b9d -Msg = 296828cbee50f41d19b1 -Mac = e583d77645a603d841eaafa8860bfa91 -Result = F (1 - Message changed) - -Count = 156 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 5bab8051e2520b75673068b9cda93cba -Msg = f16cba03402f9924daa3 -Mac = 97f7eab25dc3ab017a9affc0e400dcc3 -Result = F (2 - Key or Key2 changed) - -Count = 157 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 7ac46e3249ca28e1ef0531d80fd37c12 -Msg = 3e9ddb8121760bffb7c6 -Mac = c6eb13d5087d05b4eba2e74b283b7fe3 -Result = F (4 - Key or Key1 changed) - -Count = 158 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = 40f78f7ad3eede36e13bce222c6a4bc7 -Msg = 4fa8ad212ef73d37d48e -Mac = 3831419e62b51b7ced0d9117e48fabf6 -Result = F (3 - MAC changed) - -Count = 159 -Klen = 16 -Mlen = 10 -Tlen = 16 -Key = a1f82c9924411e98e6f93fa0d07559e2 -Msg = 7d4748147575bc0113ab -Mac = c23dbc58fe22b34f7b007590558a3080 -Result = P - -Count = 180 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = ce5bf070678cb07e963263b1562ff793 -Msg = 2bd10c4397a19fc79a307116a0847e0aaaefe813 -Mac = 299e5910f128a1f091dfb6b70f6a60ea -Result = F (3 - MAC changed) - -Count = 181 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = bf144c9bb974729aaa1188ceefdf85e1 -Msg = 5e1ef2ad86ceaf5439fe87d2ec9bc41b52e5ba01 -Mac = 58b4a32ae55966e42712721363ac9eda -Result = F (2 - Key or Key2 changed) - -Count = 182 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = a0cd07b684bb9e0e6692e320cec4510c -Msg = 6e1e490a30f0c9e3d3b79f1c36aab742bd67c585 -Mac = 24dd518ffffc1070f13d50d0bca42711 -Result = F (4 - Key or Key1 changed) - -Count = 183 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = e3ceb929b52a6eec02b99b13bf30721b -Msg = d2e8a3e86ae0b9edc7cc3116d929a16f13ee3643 -Mac = 10f3d29e89e4039b85e16438b2b2a470 -Result = P - -Count = 184 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 4073251950e3331d03d67a2399576d28 -Msg = d5dfd0321b26e578fe987456ff061dc1cdaa4161 -Mac = ed2823fb8fcae918064cef6211646e50 -Result = F (1 - Message changed) - -Count = 185 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = b08f47101365111133d974e8f0206507 -Msg = cefe484955fae117649ec158416a7439f29a596b -Mac = 3317717c6c0b138275090ea961c8d58f -Result = F (3 - MAC changed) - -Count = 186 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 166fb8d0e110124c09013e05688605ee -Msg = 24c65f715742da7d06046c783a35b2648180b4f2 -Mac = d27901a86dbf0ed8bde0d69203646b7a -Result = F (1 - Message changed) - -Count = 187 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 20f6f56117758ba47a08dadf93a59056 -Msg = 7514e0f402e73d9c0b0576782011b2e6b2080a6a -Mac = 11cda489b6dc0ab48d111ee6cb26a829 -Result = P - -Count = 188 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 7fa6ef35ad594a09cb74daf27e50a6b3 -Msg = ac0d616ed7dd3c3e86b3507d9f2bdc3a807d490e -Mac = fbad2fc6c9d0e5d21b25445f499eee10 -Result = F (4 - Key or Key1 changed) - -Count = 189 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 815871a8300471dc325f8289d0d37211 -Msg = a8ff31e90556236cb4df078943c1f2528b42a7ce -Mac = 5544c93de980bcf653354ce08aa9dc3b -Result = F (2 - Key or Key2 changed) - -Count = 190 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 06aa3f6fc20f867b42ec234a1bcb8665 -Msg = 25df5cc617e6e68be181694721a2a112a1bfb7c6 -Mac = 2eeb7ab470caea3317a6336f5eee24a6 -Result = F (1 - Message changed) - -Count = 191 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 860f8fdb021b1974d40e3d4bc41fa967 -Msg = 6c982a616510db422cc2f1beb955c3e7a88b6097 -Mac = d2280a55cd0bcd18846b4e30db6322bb -Result = F (4 - Key or Key1 changed) - -Count = 192 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 15105c6285a9015d0edd414d6a806bd7 -Msg = f1cc55636836e67909ed3a581de20630226dd5af -Mac = e9cc5799a630c6f26087c1bd3b6f1791 -Result = F (2 - Key or Key2 changed) - -Count = 193 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = b47aa890b03a8ac0dbc8f96c30fdf7db -Msg = 58b06c99e0d0256cb1c556ec3b48a3bce73450a0 -Mac = 3376cacc247686832736cea7e67e13af -Result = P - -Count = 194 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = dd057368033252d9bb2081a0b1a0229e -Msg = 81de8f50fbe35f7ed95430e74d28666c885b6100 -Mac = faa08c5a3a4ffdce81ca31873197d035 -Result = F (3 - MAC changed) - -Count = 195 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = baf5afafd7d0c8ad42a44e4e0a90fd2c -Msg = cc5a4209a6a60dcf12621e17150b4576b918732e -Mac = 5a43002d9144a1d5e48c2dc8dc167a52 -Result = P - -Count = 196 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = fa6405355bfb5065dc81e764d20277bb -Msg = 5dd1febed8e94d4715e772c3295b48eaf471daee -Mac = 29e96ce5ba930134670b3c68b5c512f3 -Result = F (1 - Message changed) - -Count = 197 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = ad2e3d3af6195e74b3e43296b1f618d3 -Msg = ca776f79b8581014ae58a4d533b60483fd1fbbd0 -Mac = b32ce1f493b126fccb9829d4dbe76382 -Result = F (4 - Key or Key1 changed) - -Count = 198 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 04ae7190f0cabd117d30a359f80b720c -Msg = b885e5e147f967032ab2552829a6e09210c44a45 -Mac = 9386d73a01960ab399bb7d290674b21f -Result = F (3 - MAC changed) - -Count = 199 -Klen = 16 -Mlen = 20 -Tlen = 16 -Key = 51fdc65f6bb0d20a3c08ac1493ddddb2 -Msg = 1f0a56fb615b594d938bb8a27f4b2f5463ee9a61 -Mac = 8506fb1b74806381e2654c8764464d8d -Result = F (2 - Key or Key2 changed) - -Count = 220 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = c98fc3416457d9eed0fa7ab1dc1b8a6a -Msg = 190ae57ab8bb70464e4a10c112a54c646438301b5662f3536c26d754a02451d1a9c76abd7dbf656115b2a2ac702ec2cadae30cf86e0f0f96da39897d6222889428 -Mac = 1bea94a457b2886e9098bf3ded932a3a -Result = P - -Count = 221 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 87428d5a53f750abdb335f70ee13b5d1 -Msg = 7bb0c2ecfd141e7e93a897b259732b6153af3542eb7289b1a18dc0aefeb4d129c9e0e27d7ef25d3afc9945277e75cb87cc7d1c9cb39e7e6ab2a49bbdf65e1c6d89 -Mac = a854d2da46afb77a787f0606a69cf467 -Result = F (4 - Key or Key1 changed) - -Count = 222 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = c725d9ef0dc6cfca84865cf5cc91d403 -Msg = d3208eb695e84c7a9250378e18be2f231ca3ebe72ba68e3ea4ff7bcf25206b43439bbd497e400dde738507cb542c7d6f961fb8bee99f0c8a6d9daf022368cc78a2 -Mac = 35d57445a5f10fd567595fc668293e95 -Result = F (2 - Key or Key2 changed) - -Count = 223 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 13e3fe7856cd680593a85cda3d6ff873 -Msg = b208e5a1a852caef0795150cf8313ee0cff06e3d28d438c2351484005661cbdcea6d8a3466aef0c6a460da4d7dc902ec99c073d086704112085a76dab0994fcab0 -Mac = efb2bef5aae555463ebbeebe69791459 -Result = F (3 - MAC changed) - -Count = 224 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 9b8112c1fb29fba2c8b0d8f16481b993 -Msg = f54105a04a4a02a1a07e020a6a4f4176e9c92bf40018ccac434988c650550c87625b84bd232d0e5ec20e6f6c46ba061b22a7fe36098bc7bf031ec6d6c1214bdb2d -Mac = 673281bc0effe92adfac4fef49477ee2 -Result = F (1 - Message changed) - -Count = 225 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 82e71e3ad1bc9a12a46e460a05ad9c05 -Msg = 41fb3dd6df78fe267175297e208ac753d50aaabd9edbf5e45385dfb47988b3d966f31be7a6329fd89e2869bc6f7e4bac1e3a0300f193bdc21c03d9629c9fefaa64 -Mac = 36f7df58abb54a053988cae066110ecb -Result = F (3 - MAC changed) - -Count = 226 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = b46e219217ab73c34904e24c6d995b72 -Msg = 887d6576572a3d8f6a1649394248c4d09d15026ffa930c0659508bac4243e7360802af084f363c2bcc4c91a04c6e86f4f8b22615d7915564949ab60b8267cb91dd -Mac = 10c1d8054ac549ad24ae4af2d8de97e2 -Result = F (1 - Message changed) - -Count = 227 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = b66edcc59dc9d8e34bea3baf4bfc0d5e -Msg = 57caadbb1a56cc5b8a5cf9584552e17e7af9542ba13e9c54695e0dc8f24eddb93d5a3678e10c8a80ff4f27b677d40bef5cb5f9b3a659cc4127970cd2c11ebf22d5 -Mac = 0c5864eefc04a6cac4f053ab2f65f851 -Result = P - -Count = 228 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = c607f631d792499ea43586b81fa3e2f2 -Msg = 21ed22abc7bbb62fb2d51d1fb8830ca95b16213f56291af976274934ab0d43805f71d9b906c44973f7d4b59b7a94d35c2220e7405dfcee98499c1c1dc92a89d7d9 -Mac = 4e65b3d58492a0eebb66928a8214498f -Result = F (4 - Key or Key1 changed) - -Count = 229 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = d9e9136339d361949242e4d8a0cd6917 -Msg = 419b9c9b093052577837862900e7de29273eb0678bf6238223b59176c78430b6f382f27bc8d9a95b53f26f1d12e545ccb434fa0a21b84fa7badb5872e208254fbd -Mac = 6c81094aded51ccd4da38d0412e7ca67 -Result = F (2 - Key or Key2 changed) - -Count = 230 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 6f349dd8b69dd41c6f246a1685115772 -Msg = a5a3c8afe5b84e0c3ba4f708a87b596d1b7c8694dbe691d7240e4e4815ad5aa4ca7e5b82c50989d092b96e80aa35e97f99ed79e75cf3b8750d0d263dc208289cb2 -Mac = cbf41299c35e65fa4e2626430f95051e -Result = F (4 - Key or Key1 changed) - -Count = 231 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = c15e4e552c9197184b3eb0a74f5fffe0 -Msg = 7c4699a7d9e2d9f31410f20029676f3c97f5793f6732f95f6d33fd7ecc205d27b8e89eda803316a3cb9951f12111b4a6aeac606b43835a469eede86eebf63e5e8b -Mac = 77e77de5c5600900e5b928d4be3d5f8c -Result = F (1 - Message changed) - -Count = 232 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 2eda9b2c6d7ad95b644a8739580ab4a4 -Msg = beadccddcf392ee56a8913f057da183ab06ec538e581b52c027ff7f63574b32d8bc4116efa1c56f4a4a851695a87f5fc5f7c47b46fe67b0400f2599fc80fe68d7f -Mac = 948e63657b8b6e2d130f6f25369d6160 -Result = F (2 - Key or Key2 changed) - -Count = 233 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 233088b67b741f07859d122a6a406d89 -Msg = 5717ed57ca0b6921f04dcacad34e0f6210c36673dc9f4d92493ff733c6e5f1c2e56805ef622a5f496049ee0ef51a0d41e9d363febb87070be558e8af61e86dc76c -Mac = c778152b00760fcd85bced0f58861d13 -Result = F (3 - MAC changed) - -Count = 234 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = b7471a8b2e50fb319f198a09cdaeb319 -Msg = 385f9fb139dbf88561b7a500b0c7b835fe57e2698c6d9f76de4fae6dcd45c47fd8a0811ebbfba35f43c17aa360f09c767c1cd9b70bb671fa638e852ace97cc73de -Mac = 1a8b81be875a4814e3f988c274784a63 -Result = P - -Count = 235 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = adf072ebb71e3400a2175c96fb0007a3 -Msg = a49840ab727bf6b03015eaca3f15a2bb64fd27b51b27fe7a2e0559c287ac8fdd4294ca990799ff66974624b8a4539dade66cf7f06b35d8dd2f8a36e6ec0bc83533 -Mac = ceac74b3af8750467e3b3c51624d96d1 -Result = F (2 - Key or Key2 changed) - -Count = 236 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = 1b1d471add4e7f4fe197e3a4a44d06ab -Msg = da06bd1405028d93fefa3c037b5ad551879451a28314bae86a7591b359f56e4b4e26e6fb2fe7b1af0f930cc2ae785d113e8b16546d59dbae9f41e7827be1ac89aa -Mac = 16d0021b1f9c00b37fefb60af3358d87 -Result = F (4 - Key or Key1 changed) - -Count = 237 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = af5d4991c189dada2cb552c3c52d599d -Msg = 1bb1e0efa2d6811d2370a039a0c47c59683befbd46c04257f86a468ae25ba03304e865e62afae77a62b3cec7b3556aae0c60475a7bfb02c69f955c7f60cc8dacdd -Mac = d7056fe01f0ed1b20adbe05cbccc544b -Result = F (3 - MAC changed) - -Count = 238 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = d149441e667b245d4640e04c53ca6f51 -Msg = cbb34794bc8bfdf93d3c8d9f87ec1482b516b48b1e8a89b5e3b5df70c423a243384215b4bc69c76c6b18c497cf82088af74839a8c98895869a16294dfc094360d7 -Mac = 64f5e8dce5c3e0f9cc224e306de70b87 -Result = P - -Count = 239 -Klen = 16 -Mlen = 65 -Tlen = 16 -Key = c2f5d4837f9f75fb440c3bccad7c2e69 -Msg = 6a84594c4b3865f047c96038060b5b413db0d4e081c62e405b815ecd9e3be651f8b9075dc8b032eb2f87c1416a5fe4195f51defe75f671f9a92d966ddf18724075 -Mac = df8c8c61e8d604e24c7e3d0115dbe898 -Result = F (1 - Message changed) diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/gcmDecrypt128_stripped.rsp b/unit_test/ciphers/gcmtestvectors/Decrypt128/gcmDecrypt128_stripped.rsp deleted file mode 100644 index 69ee2a88..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/gcmDecrypt128_stripped.rsp +++ /dev/null @@ -1,3150 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = cf063a34d4a9a76c2c86787d3f96db71 -IV = 113b9785971864c83b01c787 -CT = -AAD = -Tag = 72ac8493e3a5228b5d130a69d2510e42 -PT = - -Count = 1 -Key = a49a5e26a2f8cb63d05546c2a62f5343 -IV = 907763b19b9b4ab6bd4f0281 -CT = -AAD = -Tag = a2be08210d8c470a8df6e8fbd79ec5cf -FAIL - -Count = 2 -Key = 2ad0bf5aeb47a0c1a98da3dfdab4fded -IV = 25f1b6091ee7040fea4ba854 -CT = -AAD = -Tag = d7963d240317653e01cf5abe5d0966ae -PT = - -Count = 3 -Key = d8cd400a0a73d114cd3ecf36537cab3d -IV = 3c162c9f16a49b8fe6c92a81 -CT = -AAD = -Tag = 4203aec165f9d397cf9009770a088c16 -FAIL - -Count = 4 -Key = a982a7bae2b3eae1b7832f16faf693b4 -IV = 78d2d2fa43850483ce933576 -CT = -AAD = -Tag = ceabb89ee3179e25ed32d5a225006361 -PT = - -Count = 5 -Key = f9e3992196f7d7a21bd956f4b5a5ffce -IV = 0794a6bdf5f198c9f193b9ba -CT = -AAD = -Tag = f8247fd5dc7bd6d40e96af32aa9c1889 -PT = - -Count = 6 -Key = c91aab7ebe13653a71a4232fd1beb793 -IV = 7799464b6de6383da0daec52 -CT = -AAD = -Tag = 00c4f7033f3c05e9d531f3ca573dc98d -FAIL - -Count = 7 -Key = e7e4eefd0a3abd4ee1bef270d257eab7 -IV = f548f2a04a50a2f0342b2250 -CT = -AAD = -Tag = 044159b8a18668167fbd28ac500c20fe -PT = - -Count = 8 -Key = 1bd49e553457459aee1b5d83e7c216a2 -IV = 2b37cf40ed2685eb2a907cd0 -CT = -AAD = -Tag = fcb41d17fdb023d4d14f84a387d3ad77 -FAIL - -Count = 9 -Key = 4d6486fa68ce5a14b9db7334ab4838cb -IV = afad3f4190d56a1b8eb08e58 -CT = -AAD = -Tag = 4bda04755b7ce9da020ce7467a5ced8f -FAIL - -Count = 10 -Key = da5b59d5eb448fd6c08c350df9a82114 -IV = 15fb65d9fe2fa27f226312c0 -CT = -AAD = -Tag = e407fccbb9f00eeb9cef4a520cff957c -FAIL - -Count = 11 -Key = 07d5a7d405b21c64d74cc0988693b784 -IV = 2eefd7990ea025925e9ca6f9 -CT = -AAD = -Tag = 1439522d18c9eb129f1f776590027761 -FAIL - -Count = 12 -Key = 48760dec952010140ffc4b4078438b56 -IV = 930cc3ff276d7bbb74d187ef -CT = -AAD = -Tag = 8673dcb97934d54dc17de0037344737f -FAIL - -Count = 13 -Key = ed7c50762dc0dc4aa5c8be4cf0a56b88 -IV = 50dfb73b5034cffb6709af8f -CT = -AAD = -Tag = cb02203ee8eccec446ed1c2cf68fd1c0 -FAIL - -Count = 14 -Key = b5d4b3e80a56adbc780ff02c5da6a7ab -IV = abc5b96c5e872502971dcc55 -CT = -AAD = -Tag = 4e85677cc16e2b2fb50a2ca9c0ac1b9c -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = d1f6af919cde85661208bdce0c27cb22 -IV = 898c6929b435017bf031c3c5 -CT = -AAD = 7c5faa40e636bbc91107e68010c92b9f -Tag = ae45f11777540a2caeb128be8092468a -FAIL - -Count = 1 -Key = 2370e320d4344208e0ff5683f243b213 -IV = 04dbb82f044d30831c441228 -CT = -AAD = d43a8e5089eea0d026c03a85178b27da -Tag = 2a049c049d25aa95969b451d93c31c6e -PT = - -Count = 2 -Key = bc3ab28150fd4cb731d5f48ed2784173 -IV = 40408445c203c647312b8f01 -CT = -AAD = 53d2fc19963fc99a36a524e39cb68aa8 -Tag = 3f04dbd2f49909f73044175041fd9eff -PT = - -Count = 3 -Key = 34537f1a0ba093aefedefe8b4b6b34e7 -IV = 9c5fc88eb388ef6776aa2182 -CT = -AAD = 4dd377d089c617dda1ecd42341d1878b -Tag = c0fccde30ba354e23c05b5371c40d088 -PT = - -Count = 4 -Key = 54c3f935982de19de88d6384f9493389 -IV = 3d7eec1cdf3cd419511793ab -CT = -AAD = 2ded8cbc69fa57678aadc7477f2a2173 -Tag = 74107fc192c94a7d85d0f9205f8b02c9 -PT = - -Count = 5 -Key = 790f8945b127a1a418d6d58b4378e0dc -IV = f5694d77b816f2cef0ac80fc -CT = -AAD = e5c71b82a60c97f050511a3b9a09e450 -Tag = 4c75effb688dccd0affe92c0e0391d64 -PT = - -Count = 6 -Key = f6ed6f0afea7e99ab320b525107715c9 -IV = 351e7dc999b9de77ce61b2f7 -CT = -AAD = c9101b64e0b6abc0e46828aec14d29cc -Tag = 4f2ec2e1ab001443a60722671a9c9656 -FAIL - -Count = 7 -Key = 2eccf9cda0e4e70f273ee8251120c768 -IV = 1d869f4b8497bc19d948cea6 -CT = -AAD = 1d86a6a21f23ee56ad0fa6c1de525906 -Tag = 37ffc390298c3ea8cceb382f394c2fc2 -FAIL - -Count = 8 -Key = d61767f07b959e94f73c64cb5a5520b3 -IV = ecfa850395f8cf9348f1324f -CT = -AAD = c3571bf1700b114bbf0c6bb2278d4d88 -Tag = 1065f86bc9e22197880ea87ac326a17f -FAIL - -Count = 9 -Key = 9421cac15ce7d49ec7c088f7524a1ff5 -IV = b3d395bca123b265c05577cc -CT = -AAD = eb6e06071dae4360e8347bfb72d9c188 -Tag = 1f04c228c7efc71f1706d10fd819f35e -PT = - -Count = 10 -Key = 8580395a5d777c1690af79f6068e291b -IV = cad1a0f2b76f064ca56be3cf -CT = -AAD = 174388edf0b7f86fe634cb942c13754b -Tag = 0067b03f2e0efc72cb08792fbe3b0267 -PT = - -Count = 11 -Key = 0c21da9c8b84d371fde59e6d1752113e -IV = f8c13e58aaa329427438db8b -CT = -AAD = b8b197789cfd085b09a47760c28c7e8a -Tag = f8613cc5dcb4cc5c78f1f7c2d8084ec6 -PT = - -Count = 12 -Key = 162fc51e46e771222a04842f5546db8c -IV = 13557e09e738eb895eca2d8d -CT = -AAD = 691e71952c31a6b49b785f627c03e948 -Tag = 4f7ea723b1abd74e53fa356809275ca4 -PT = - -Count = 13 -Key = c46d9562d954801b8e99e4e57cbcc0ec -IV = 30414c934b14e0bb0110ae44 -CT = -AAD = 41ae6a63855c1944446491e80670bf68 -Tag = 3e2366a2cf5632c1ecfde33f1f5f6d18 -FAIL - -Count = 14 -Key = 2904df4dafcc6bbb8375baf6a7eede80 -IV = 6aae8ff4b1609f4026b47259 -CT = -AAD = c4afa7b21e5f41b892be52365a18584e -Tag = e1810fe340207fa83815182bbad62bde -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = b1089cecac8e1a56441353857246773c -IV = 1af1e6f40b1b21fcb38f65a5 -CT = -AAD = ed825cbf40e8f8f198ce1afd1141a3cf391cee73 -Tag = 0edb6756481560956d506a8cdb082db0 -FAIL - -Count = 1 -Key = e6a76441748e6903a8b7ef114f631dd8 -IV = 79706e2030f9938576d8d9ae -CT = -AAD = d2e6fc9e97ed37a0530f2744ca58ed81f0ddd99f -Tag = 102bb898d4ca9780a69aa159e8c92228 -FAIL - -Count = 2 -Key = 5211242698bed4774a090620a6ca56f3 -IV = b1e1349120b6e832ef976f5d -CT = -AAD = b6d729aab8e6416d7002b9faa794c410d8d2f193 -Tag = 0f247e7f9c2505de374006738018493b -PT = - -Count = 3 -Key = 0335807df98f4728dc982efef77686bb -IV = 5cceb5114b6701989957c926 -CT = -AAD = 5bc191e74d849733fea6b8212d01a19ac274bdac -Tag = 3f5e29ded16cb63f9ba8c103fe753595 -FAIL - -Count = 4 -Key = 11200dc2b58b3601f95f95cb80845493 -IV = bfc175513fb49d9be980d6b2 -CT = -AAD = 2740904aa8b7096a7bd7400b3023ecd042061a68 -Tag = 548deef09fb8d22252f956b28d8807a4 -FAIL - -Count = 5 -Key = f8869d9df1ac6da86e905442fc425c92 -IV = 22b0af177e3154cfef3dc2b0 -CT = -AAD = e07715b1d919f8bcb8b2c4ba998b87e6286d82fe -Tag = e08ea41cf27f344db855564cb94842b1 -PT = - -Count = 6 -Key = dc945bb910f648b228482ff6ea37c0dd -IV = 6fe11889b190056d77d3114b -CT = -AAD = 925c4a09fabba4d9df9320735f4753d0d75a2eb1 -Tag = 4f4a5106624a7eb722a4d0ed56b074ae -FAIL - -Count = 7 -Key = e97ef05d5272238514b40eb9dc37254d -IV = 77b02548a863130e64c4f23a -CT = -AAD = 16d11153706a45edcf5ab14775d6fb117c99efba -Tag = 49a4c763ed312224796fa0981b2f6067 -PT = - -Count = 8 -Key = 10486a4ec7a139c45392d11389312b65 -IV = e5fd821c83a47ca17baee945 -CT = -AAD = 9e794623863a6a8f7600e5d3dc906fb569e2d621 -Tag = 2255a12c2d4bd77a1e557f0f332f747e -FAIL - -Count = 9 -Key = 5b360040bb672a55a8a893afe9309169 -IV = d4795970cf41b54f673a5367 -CT = -AAD = 00fccf7ea5873e5bd437b4ef5e3b8543afdf0214 -Tag = a104513ebe3adaf87b7284d1f1c71c12 -FAIL - -Count = 10 -Key = 27bd1dacc704c5bbcbd7615ac5ebee14 -IV = 444d84e15fc7ccfb62aa46c5 -CT = -AAD = 0d964255b4862bc2c790d0112fd0b67c29fd7e88 -Tag = 3330fcc53223b49b5ef51d9352b32e97 -FAIL - -Count = 11 -Key = 7f0cb9efbcda58d5929632770b4ed3c3 -IV = 9d5f05f623dbd0d68c3940af -CT = -AAD = 74af77b5479ff8081486ebb2411d68632b964868 -Tag = d31b61e0c93b825efc7f04a9e219dc03 -FAIL - -Count = 12 -Key = 1bf60336203befd206d5e6cbe485dd1c -IV = 4e75611acd124375b7805908 -CT = -AAD = 32b4b023b13718da023d5f078b8d61c13640a33d -Tag = ee2fdafb44210218c95091dcaf6252b5 -PT = - -Count = 13 -Key = a6647da2721ee284eaec27ef95e6de0a -IV = 4c99b4c11b5403f164fb68c5 -CT = -AAD = c1e82a1c4324eb09add805623f9af291709ad9b0 -Tag = e892470ed058683bd5574c7295d84b2e -PT = - -Count = 14 -Key = 423506441e5237fbdead27eea94fd0a5 -IV = 5d390c71f28a2f09fdab125e -CT = -AAD = d78b51b89e01771483423024184eed27ca0ab8c3 -Tag = 8485ab4c8b8b0f9f2555aafa55680751 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 748146a0b1d5e9b6facdd95e8a3295be -IV = 99e8394910c21207541ca90c -CT = -AAD = 5ce0d8dbac8a82fa8dd7aec334b81301b31ab49f3b40a1857cc540a1d992f27f80945dfcb4730dc81ddfd32dee1825d6 -Tag = 847292904038c42168adf62011dc790e -FAIL - -Count = 1 -Key = 762da58bb000f5d499818bc859989a30 -IV = 584c291ff1aa388a5112521e -CT = -AAD = 91f92e8bbda7b5ec967ade766f4f26e9189eaafad416f37b4891d3e37d70cb9a267aa843dd202858ade020261223dfce -Tag = 9ac7eb2d762facae06086c957959880e -PT = - -Count = 2 -Key = 4ae615ef5f3e1ac590d4e5b8623173ba -IV = 3a998fbdf1131c8992e95bf1 -CT = -AAD = 81edcccd1ace673b96fa3b74a2f99fc63bca822f6b9c6b99477b479d5d13b8dca5f6ef726718346ba22c9f492b30d6ba -Tag = 93cfa8f4dc1da3429eb9dca26ed45024 -FAIL - -Count = 3 -Key = 2dd1a4bc80d9ae6773fe3284e7f7e734 -IV = 404c5b85d1429e48348ee225 -CT = -AAD = 861f17b5e33b17369021b8b2054131715bea7cebaaf732066da9a172341eae3b47a0d49923b25463caabcac6ffb7b5ea -Tag = e0fadad353d1d29ec6503dd2e049d6a9 -PT = - -Count = 4 -Key = d4eb3c0ac7156ebb5267f9ad2de162ac -IV = 74aed5826dc979d6b1c1011d -CT = -AAD = 34d2a785c9f47a83ed19e48ae1ee57745cbd9f30af5b9e6e633e9106d2f36a379e08d85b52acf9a14663a28d68808eab -Tag = 278acb3388978409d9fc2f6380ceffc3 -FAIL - -Count = 5 -Key = efbe4777ad529213599ea7bf82d4b0fa -IV = 8692f09a527d3e5d3cd152f7 -CT = -AAD = 95bff730bea903af3482913f712b4fe9da387f5104131ac03b2f94569957ab93af9bc6c3a405133d6874e6e466a3d011 -Tag = 7ddf730b688f268cdb7a32757f34817a -FAIL - -Count = 6 -Key = e024812778ce3c9659fa6b3ab917f38b -IV = 8a2ea9d140a8193572bc37c5 -CT = -AAD = 56b2c2f68ac50885a3a4bfc4fb8845a1c6e8704c0d89237566e551d59607bffe6e557c0dbff15a91a177905b526838db -Tag = 21706b2f8cd2f4d51aeefa3604d7f6d2 -PT = - -Count = 7 -Key = 293ae2e14a6a874c214ddd12ffd6a908 -IV = 542039d5e5b54222f8153747 -CT = -AAD = bc51a6a29a897a9fe4b955f270e21ef5768e55c11c9d9d16b4934cb3c8524c29e50d4b02b671c5a1b25a46991e62c65e -Tag = 612c4c96e6cd10c13a98ce5fb87bebd8 -PT = - -Count = 8 -Key = cb803f23f8c97ff4774ea37856c90f0f -IV = a3ec912bf0a0ad64e23e6c9d -CT = -AAD = 6c0f16c8e70852270b16a3eafdc5aaab1a3279d803d535b23292bd12bc2fa7da0a63f837c0093167029689c2bbe89bdb -Tag = 396a389e9e59b742dbe52fa277a05458 -FAIL - -Count = 9 -Key = 53101ae08ff3d972d437498253ad4911 -IV = 1748c2f3c6a7d2de3bbf91c2 -CT = -AAD = e166984563c1afb505b220490e3aabc8cfc07cd143960e3f0c068f395b5bcbb2e3f1f43c2e3ab33a4f14ad07d33273d9 -Tag = 250d1b4411d5c3fe0edff3fbc0814be3 -PT = - -Count = 10 -Key = c084b3bab6c3537c65621af9c0967acc -IV = 9a3b67c8288aeeb555e94907 -CT = -AAD = 8a194907eb9fbc4b12b8bb294d552d587cd267ce6dbc46191be1983243b6bc601db78b1ec8ff402e1087614991438bc0 -Tag = e2dede4cebfa914eb7821c912768a3e1 -FAIL - -Count = 11 -Key = 626125a33643839c534556d87b0a485f -IV = e7a2d435326d79f3ab43d3b5 -CT = -AAD = 086edfdb0afd60f10e5e8b628c31ac7094a41f22a33a85f3081aa53e733072825275aed31477246578bd97575e32961c -Tag = 66b38f7467273180d6672d34658fd6b7 -FAIL - -Count = 12 -Key = cc53a3209ed65930bbd535e4ad7be780 -IV = b7606cd869fcf69f5bac64a0 -CT = -AAD = 0ab24056d93d5be92c630fa615864deb7f85712188b576d11f12275b7188e3ac2afa6c4d3a4918df9344deae010902b1 -Tag = fef072eff57121c8c780eb5c6ad55538 -PT = - -Count = 13 -Key = ce84d222d62a6b28c636c1f0a36dfbe1 -IV = 3185d862c8a323ad7b433ea0 -CT = -AAD = 8c6c6de46b003a1265ea02caff3d8474ac99c84874c106d33ffc013c2c60ddc8bd46c7df402db609f854986fcbb44794 -Tag = a5a299bf09883e2fc323ee5eb88818e1 -FAIL - -Count = 14 -Key = 53580849635cce269e3bb897dcf9786a -IV = 76849053a7b046c1fdffd092 -CT = -AAD = 04bfad7c77e4db850c2bfca5a55a2a5c33019a4327bf850f7a70734bca688ce5551fd76d0593105515ad76c12dd69d58 -Tag = 9e7e1c5dccd58fea67a8648d50e5b6ef -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = c1e007d318d0e5c87d28fd890dfb04ba -IV = d7bc58d494491ff57639b60b -CT = -AAD = 10c68681c6d700ffc72ea9a790cdc9ddc1904c7e886e23ca166dbfa364a4c5f95205bdd1f22eeebefbbb9375f1a416ec7faed6cfdf706085f8fd2632c7a261a78875811f17fba19baf905f0aa623e67175f2158cda313a5047e3 -Tag = 2f1ede16f025bc8c5421854b5f0109d1 -FAIL - -Count = 1 -Key = 8dc7a59a71cd76499de67feac53c786a -IV = beb45b75ea5b7750e69a409d -CT = -AAD = 8bade18807ac5fe59cfd34d7eed8ae33dfeeb960d2a15693837f22dd98f68715079d358a49a04a7b231d486ae45f4cd6c0fe3cde6c0d967ce8d84bbf2e4be2db793afb72ea83c7b21a73f65742c214768f7e6133e3814059efb6 -Tag = 46e8457d8d409f2a0690e6502f8b7a87 -PT = - -Count = 2 -Key = 30b0bda9871e1732051ab0facb819848 -IV = a071b9e1f103bdedf419872d -CT = -AAD = f2295256508b41b6849a3a08b3a4586abfa5a2b35f9b30d0cc59755314b32d6a890973c568a14d4c313f79c47c83c1f0d2b76a006224926fec7ab9b208c34a6e8f8d6ef4b4a75c9952ca35cb81071314b70e65faaf9854f8c32d -Tag = 6f51e06b3aa3c7869e00e3fb07f512d8 -FAIL - -Count = 3 -Key = 2a032eb1893c4ad9e78c5ed4fcae3c74 -IV = 36839f2a8b1d6df1f9f0ec38 -CT = -AAD = 9228a9d72656b32e0342bc4ebdcfdafc2a4b11214ac8caa4c772a95809dea77e49ce4e052b748a662bc1ff7bf57ed9b784d75a349769e23018f406aebf6eae30a5e9364795b58620248ef6cd42db55ee7e49f472c602a3445140 -Tag = 610fdb18669a32e7fe24348ebc77ae15 -PT = - -Count = 4 -Key = 68dbff539c8ac07c0d66e3c8aa883655 -IV = daa344a429db89941f629bae -CT = -AAD = 8685accfe29a7e07d92aae2cebd25d3349bc917d81c3e999a009836e14611c083e6b3ca4257ffdfb7c2f53a867bf24c739f18c0d807222fb0bffa921da2835b33d0b79e666af0ac7be3fd288f38a086806045732b5a495d65774 -Tag = b5f74d514ad2eac63aba6367c5d7f843 -PT = - -Count = 5 -Key = d5e22e409e61c7e57687a143ee5dde17 -IV = 6a1b9b8b9fa5d3b14758a9a4 -CT = -AAD = eed5683b9e0c4080f6fd5b4fb896a2ee752df04a8f9cb34ac5fe1a0862b2431d4abe6e96e2983d850c85de17a31b612b02c344fc4c5a8e964ac1c60ea15eb1f6146429304338d3a928c84b0725d0956813f5dec79bc8b9a5acd4 -Tag = adb6051f2a18fdbe63ae4878ec3f3788 -FAIL - -Count = 6 -Key = 7bdc885dfbbda27482afeaa8aa30a94d -IV = 6a52105223c62f0e6761aee1 -CT = -AAD = 7aacf0bc8542d867a77411ddb0c9a70889fd395e01a5befdb26f0b45caf8cceb36696ed5b849251aff29eac75af7b12735daaf671412f6e1a62e21bda88c1618cd0a9fe09d5d340ee67711ae90822877bbce83adbe38b7f25d4d -Tag = 08bba50afb61ae82ed578a139804c3ad -PT = - -Count = 7 -Key = 549cb40fb29c51656d1788024a75b80f -IV = 8f9135503f55ff1a76a41553 -CT = -AAD = ac136573ae52f3a4e4a5f6161a2db70c24428fc2fe0d810b31419690a36c1d5bb6bf36d09f24b601cb558c5eeae8662d29c84e06e2e0927857945543b13db85b50ac28c4de1563d9f0ccfa85d032f3a59c1f3cb0acba07b61097 -Tag = 1fb97bae89bc87d6fea1f5fb571480b0 -FAIL - -Count = 8 -Key = fa52f5e8446617e8029800ab73c109d2 -IV = 92b4eb872cc5acc27b2c8f93 -CT = -AAD = e6f02753b83cdcd961a5455c34329f0358a1d9acc10f17a29dbfb7aaebae6f4b80481dc9aa3abf553aef570b01baa61a84820f20b0c051676fe2fd42cf9fce3c4bf221fec2519237cb9b7da6613a4be3eabb154c37b9c69c9c12 -Tag = 735b2a825bd1e288bd66e98e44fc0348 -PT = - -Count = 9 -Key = a3cc611d369a5c06d1c0d171be2cb25d -IV = 730b0cc99066bc7bd7b3ec9f -CT = -AAD = 84d86f689a1137920c1eef9dc0c27a3ca069f0f7943c4aca10bc47a67da7b8f4ce9558f53397f15dfed1df9f9bef61a7eef2b064b46bacf4f673b37e6d813fd408ccd9632628f0cd89db27c00e268c45c581ee8e189b14adb16b -Tag = a3d510d67716ce87471e807e188822bf -PT = - -Count = 10 -Key = 5fe29162dc4d5a511d373331573a4e26 -IV = d36edb05eaf746fbc48d1dc5 -CT = -AAD = dcd82c91702c2fc562ea7636d89aa7f4679afef80b85a4f3ce9c32a5a632a42d688416c65d47b314c8d272b77d8c447a4ea186230d03d30065b3339b0750f350b18ed7c82ebb16105fc98f2cd04c827f5fe2f3904d67d75a8961 -Tag = aafafcd6c396211704f3f708f167c781 -FAIL - -Count = 11 -Key = 2dcf7a69aea4aaabc9849c57f915bd68 -IV = d1d48a6e01c482f47d7b8871 -CT = -AAD = 345e8d49f3441bd55e3046cca636578084a2a7d7686c56c9bf8e4e29f2eb996b4ec537b7a10046b7ae514c76ddc8293eed583f1bbf0b45a90784e10fb83a5e837935547ab9555c4f8b93b44653944733e3691b9a14c0b9839e60 -Tag = 33b09fc073c3c3404a5661ef2d934e08 -FAIL - -Count = 12 -Key = 1579609bf33cdaa69ced53613557090c -IV = d64d1081db1d825fc692a28b -CT = -AAD = 9ed4a0960782e2fc4b88b6b3f3fa5fe976e5e160053c68def773a55dc8520d626fc0f3447b91a5217054c03ab72f19e53514bf38a3e2ab4b632dd5e338903b727e02327d9919c00657dd3457112714c9e9cda2df44f644b32bd1 -Tag = 198ca0c5e52ba7e8ed8b9310a05a1ebd -FAIL - -Count = 13 -Key = 60920e056ead9a73080f27038956884d -IV = 8cf4c1764ea1e6b9083952c4 -CT = -AAD = ee3fb4f08c9c6f7ecc7537035366d35793fbcb02605f1891acc539d9128ddcc6eff7d91936290490e4b28da8c2126d163565e0bd048a6f0a66a277daff4a03864c746f9dc3faea70d1fb4628d66a34a86fcdf91f2a176ce94863 -Tag = 41927cbc3ee0ed121f7884f0b32b024a -FAIL - -Count = 14 -Key = 2c084c95bb67293258e7e68492cb7d90 -IV = 60f0c5264a7743f548db8b2f -CT = -AAD = 7aac62d17794ce516c4a20e32ae8c7aa0be8e483f6e5643b77df5550498ccb1adcacc28366335d48007a094588e946ea98699e5323be8269151a7df2824e808b1388667170221a74197e3ca403fbe41be95b75afb98bcd2a5c14 -Tag = 84e9567a61b9a6bbf901c86b8f2606f1 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = e98b72a9881a84ca6b76e0f43e68647a -IV = 8b23299fde174053f3d652ba -CT = 5a3c1cf1985dbb8bed818036fdd5ab42 -AAD = -Tag = 23c7ab0f952b7091cd324835043b5eb5 -PT = 28286a321293253c3e0aa2704a278032 - -Count = 1 -Key = 33240636cd3236165f1a553b773e728e -IV = 17c4d61493ecdc8f31700b12 -CT = 47bb7e23f7bdfe05a8091ac90e4f8b2e -AAD = -Tag = b723c70e931d9785f40fd4ab1d612dc9 -PT = 95695a5b12f2870b9cc5fdc8f218a97d - -Count = 2 -Key = 5164df856f1e9cac04a79b808dc5be39 -IV = e76925d5355e0584ce871b2b -CT = 0216c899c88d6e32c958c7e553daa5bc -AAD = -Tag = a145319896329c96df291f64efbe0e3a -FAIL - -Count = 3 -Key = b1191a672cc55496b3c728d6a67de0ae -IV = d0b4fa7c7f107f98f66b0195 -CT = ab957acc04c1034d8acc617c0b20f78d -AAD = -Tag = a93cc22f6086e816016606b9ad0ba697 -FAIL - -Count = 4 -Key = ca7db9e97cfa056b80dcd04f46228640 -IV = 5e8dc246ee835dc5f229d698 -CT = 178ce3bd56ae27f9812e91b942c1309e -AAD = -Tag = c633075a8b608d5f96971d2bc1ea2a0e -PT = 964610fb6585cbbb070fd9ab10a7a600 - -Count = 5 -Key = 206209e6f2d16b268dbec05972431405 -IV = 95194cb4ba24ea0476ca5ae4 -CT = 493461aeda5a0c7d18edfb11ca8277c7 -AAD = -Tag = 865615a1484744a9c55e480871472e81 -FAIL - -Count = 6 -Key = bc722187a3729a4d0292fa73d4471605 -IV = a72d339ad829c9601d00a6ef -CT = b44481ab49863873ffa2a377aa7b759e -AAD = -Tag = 4d587a7d3b5eb1186d2eacce9bb51c04 -PT = 9dfac38da5811b3c4712439117f7520e - -Count = 7 -Key = 0631c9595b5cb7f9f94aea4940125f19 -IV = 673d7e9aaedab36cbb2afa0e -CT = d558f237bc04b41c8155ef643511c52c -AAD = -Tag = 482a54ff2d9270d70375e4d8db646744 -FAIL - -Count = 8 -Key = 722bb99f8321eebaa61dd0086fd63e5e -IV = 47e36c71c70c2bb662cddd6a -CT = 4d3168836b0be7e7cd7b54ac95281408 -AAD = -Tag = 18e18960789cf650bb48d163f881fe55 -FAIL - -Count = 9 -Key = 327f9f12217e54f14bc0b38166a507ec -IV = abf4b77903fd2894516d8fc2 -CT = 3c7512dc35bd8ec80954baf49105a67a -AAD = -Tag = 5e6299deac6594fd59cf073ef14ffdee -FAIL - -Count = 10 -Key = b7d2ebf187562bd4bef0cbfebdd7cdf4 -IV = 76ff7aaa095be4111f79c74a -CT = a998f173007ded002b3ebe264ea7f133 -AAD = -Tag = a71ba4f2385bd5b615a23bdfb9dcb17f -PT = d32e43eb1a90b626b189b6a8eb592bb8 - -Count = 11 -Key = 6956712b7392b3595132f606561c0bdf -IV = 63c54fcd8e648af4bb0f5e39 -CT = 9dc01d985cd4f6cfd1eb2207761ec04b -AAD = -Tag = 1d8dc617e8f49b7e92a3f5480d1d22ff -PT = 44830dd0bc8592f4a28ec79c1d0f2b53 - -Count = 12 -Key = b3ce2c46ddf39059f683ceef05c08d38 -IV = 188549f41ba61ed52e9b14ef -CT = c06aea0ea0ec6a8446ff8f3f722cfd1c -AAD = -Tag = 605ec2fe05d7067ee5371d484e5cd7dc -PT = afff5e9becb62c8b05c26effefa3d7b2 - -Count = 13 -Key = 23ecf56f3c9ddc76e7207873824321fa -IV = bc60bd5bca6802b526cc8361 -CT = f2f8851005b8bfb38cc3488133b004ae -AAD = -Tag = 7d79d1c8742446acb45d4d0cd33886fa -PT = 5926445daca77b55857b9bd4c897c1ec - -Count = 14 -Key = 3cf9882b08500c084ab38f26c0f3e730 -IV = 615f25d13c5c4ac9d6b01932 -CT = 375bca435832c7abccce9eb890807275 -AAD = -Tag = 57e37ba21f0aef8bc70b63f7968e9eda -PT = dc1adbb316be8abccd87ffadfdfc7ca0 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 816e39070410cf2184904da03ea5075a -IV = 32c367a3362613b27fc3e67e -CT = 552ebe012e7bcf90fcef712f8344e8f1 -AAD = f2a30728ed874ee02983c294435d3c16 -Tag = ecaae9fc68276a45ab0ca3cb9dd9539f -PT = ecafe96c67a1646744f1c891f5e69427 - -Count = 1 -Key = 867fc5d5476d5008f0703d81e3622255 -IV = 22945529dff947c3c9264df7 -CT = 1c785025e5a2678e4b29b29276e395bb -AAD = 261a9efd4f32bc3d07c115b4edcf8adf -Tag = 87fdf1261846164a950c37a3f2eea17d -FAIL - -Count = 2 -Key = 3d17f97bf1dae4268b6610dc90c70b28 -IV = ebcd88fc18d4c99d28524d41 -CT = 0128a239bb43c12885f9591386ecac0f -AAD = 681a4feac147ee2d25e9191aaa4c8830 -Tag = 144def0210af9348f07afe27e65bdc7e -PT = ec18a057c22d12373b5efe4d177eb068 - -Count = 3 -Key = 5c32091e288d4780fcaff52a69c1234e -IV = bedb360b22847fc2ff60ab78 -CT = 60c883306c91a0e6e98f8d7bf7ee9fd9 -AAD = dc7c3a89a00b688af2bd372530bfed0b -Tag = ffb93af9106e95e9a65ef147765970da -FAIL - -Count = 4 -Key = 75fb7f243336b78979988c08f39c44ab -IV = 69fed95864cad27f83503f8d -CT = 7bb1d878239966163a3db5712f57b096 -AAD = b4783565715e8cdb46f8a2bb72030ce2 -Tag = bfee0dda5e1afde5c7b0928774f80d21 -FAIL - -Count = 5 -Key = 7a3d71615ec0e6ee2257f33d06611b89 -IV = 1ccf177092a1518be9f6612f -CT = d0bb72968ff7fdbd3499d6e7a34ec043 -AAD = 0753ecc820e7ed3b6ce6b60dde776fdf -Tag = 3a7c708e0e6e74a654987a257ab96461 -PT = 9c0e1b4ea43af8b1d4d173b31424fa40 - -Count = 6 -Key = bf283c584efcc4778bc6091804b2b66d -IV = 1fad1f81b45de44392497629 -CT = 51f94491184b13f46defe609642adc16 -AAD = 791856131d5d4ed0e7b205b8b2ff4012 -Tag = f2e8b0bc4e1bdd9d2604c0607c4f7fc7 -PT = c40fee049bac9b688601506d63450869 - -Count = 7 -Key = 93477009c0bbbde3aead970dd96811a9 -IV = 6f096b1f3773a928301aea03 -CT = 8643e7d1686b916cdd2b74f1cf26ce72 -AAD = 7e61a6b6cb73c187d08509ad5b940a2d -Tag = f98afcefacdc71410eef471d5bb2a599 -FAIL - -Count = 8 -Key = ec3f4315316aca1bdc2806210bbd36ad -IV = fa0698f32e058389f11e519e -CT = 16a9fbf2fe33d6c8c0b22117bc0e6634 -AAD = 414ac255598157e3b506876d00843b31 -Tag = 88f4a30ea229c8c4641f60363436702c -FAIL - -Count = 9 -Key = b431bd21c8ae9845c469b8906618e715 -IV = 8579a353df1f7dd0bac1229c -CT = bca7919e99c8de9ccb7d2dc2e1fde95b -AAD = 79d9a0a2c7536fde809aeb9f084739a0 -Tag = 2b7d96b083a1fdafab7b64839a53b90d -PT = 8347a939a90f4e33dfc70c70e6447994 - -Count = 10 -Key = 71ccaf526ec51e5117c22869289d1b10 -IV = 9fc7b2fc3a762a9c28f64200 -CT = 6f65ed418dad09ffd883afcb3c3f2333 -AAD = 0b8ddf8514761fc60ca20c11b0a9e27b -Tag = 22e0056532a847859e2aa181b80fd97e -FAIL - -Count = 11 -Key = 42deade4fcd2728eef0c258f0f80c56e -IV = 033393d7167c23327271b58f -CT = 0cc5f4e993fcdbc81904f5b26071b360 -AAD = 34ae2559e79d88aa25ec8c0a97f4f8c1 -Tag = cff5af162a6bf4b7e9169632a40f3f41 -FAIL - -Count = 12 -Key = 1fe8b08b096103debbebe1ed1b5e0ecf -IV = 4f2442796ffc2cd7b7a6b6c7 -CT = 61ca6232340df229dea57b2bc45eed28 -AAD = 9c953a6b978ffd3457c0c1e2f9e29358 -Tag = b61b58eda5efa804d42b8038a9ca6472 -PT = 5b90f102d5cb5c4cf10db51f88d5bf03 - -Count = 13 -Key = 3f8a905c888fc42dcceac21ae09027c1 -IV = fb3db97addf0f67eb369c62c -CT = 743cdf63d80bd79d4664af2f5625d95d -AAD = b74eae31f9d55f9666899c8474cdc80e -Tag = a2bc61b1e16ac2ac9c23bf40bbfe18ad -FAIL - -Count = 14 -Key = fba087aa3a2b5b4109e36938d011a0b0 -IV = f92af1ed2065fac9eb4d7601 -CT = 700613d946dedd760da35483ab668685 -AAD = 90501a414620af8e76dcf165f5cbe603 -Tag = 63703fac96bb981f74bc52f557271b2c -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = 4cf56dd7eb109452d7445e79bcad4f86 -IV = 5f3724b27c345ed5d1757e9e -CT = 2d0581c040f4e2bb74423682113b818c -AAD = 20fe2aa2641db7318aa5e339b1e303f952b05dc8 -Tag = f090c0cba2151af2e78ef407720233db -FAIL - -Count = 1 -Key = d9529840200e1c17725ab52c9c927637 -IV = 6e9a639d4aecc25530a8ad75 -CT = 6c779895e78179783c51ade1926436b9 -AAD = 472a6f4e7771ca391e42065030db3ff418f3b636 -Tag = 4522bfdef4a635a38db5784b27d43661 -PT = 8ae823895ee4e7f08bc8bad04d63c220 - -Count = 2 -Key = 43ebcf37e131a9b954bf003136e72ce2 -IV = 643e6d21bda599d486f2bb1c -CT = 6d23fa3b74d3b61f7305fc87e051408b -AAD = 87c99e3b4292e047ae80947fc5d46c4600d9f5ed -Tag = 9c036852b5e3c0aff0bb8933796182ee -PT = d5add8d52c941aeb874cb17d52960210 - -Count = 3 -Key = 23b0b223c477ac83757300dc0c16684a -IV = 907c5c2d91d33ae435b51be4 -CT = 5943b9c9229301ce25b12e798d2f16a5 -AAD = dcaff8fa814e9302f872b89e8656ee1c7c87c0f3 -Tag = 31fe5884756cc3225c42a82489115fa1 -FAIL - -Count = 4 -Key = 1ea8d9a553d2bc1268f528fba611e80b -IV = 91495ca2fb726f317faa265c -CT = fffa077c1741cd9fa1923cfa7bcd8b04 -AAD = 55c0553c29dcf916d2cc4655a962ba18845f3d9d -Tag = e7c433cd59c3ff7e3480f664d13d02e1 -FAIL - -Count = 5 -Key = 73ca3a3548b85406e5512998339f01a8 -IV = fd1990f00d51bdced7a590e0 -CT = 0afcc434cb7b7e1ec0496342aa631f75 -AAD = 64775d9656d9186fedb1ebbe9e45114b3a0664ac -Tag = 77f14cc311d60bcf5ee95049d512eeb1 -FAIL - -Count = 6 -Key = e9a9eb3f226d3d47212bce6498bb489d -IV = 5830becfb7ac36c00f6ff8ae -CT = 08a6f369d29adc3bf94b269938a53b6b -AAD = c4c51491b05de3c2ff006012a2e23d4eb121d3fa -Tag = 1d53e69dca3ff4fae0029d013f7c349b -PT = b7fd70ad0723c5c8e74fff3eac282bf9 - -Count = 7 -Key = 961771c760fe92821f2febe0e3ca06b3 -IV = 8650d3dc83ec5cf702bb990b -CT = 20bc94651a0e4f134aa259298c9942d6 -AAD = 716b3419f61afc44aebdfb2ef21fccac1551de5d -Tag = 868887decab5c3979fc943139d7423ed -FAIL - -Count = 8 -Key = 903ca48ff529c6515c690a896f265999 -IV = 0b42148de0d438ccd434b20c -CT = 3918bf3882b04f0857e7e405a4ebe056 -AAD = a9680e1551a4b8678bf96cbc2c07ea95d0e58787 -Tag = 7b511865c62ac3a077348bc5671bbd50 -FAIL - -Count = 9 -Key = 9368fea0615ff679589ce50b39b097c0 -IV = 5e25fda2e612c707db2ac70c -CT = c3a2134534fbea7f5c2c53cc422e762d -AAD = 01a7c360ffd013282ba1accd509c9b341dc19abc -Tag = b88c003712a5be28ae8b46706091b097 -FAIL - -Count = 10 -Key = 6b01949fe5e343d1639690477bc3a252 -IV = 8d8e6f1b3685908103a9fbc6 -CT = 16f4981c944c6ac60d06def4fd587ac5 -AAD = 38f6601845bf8b194108942da1c4934b5d2025df -Tag = c8b627db732d629be6cfeb6762cbe611 -FAIL - -Count = 11 -Key = 86827950e1d412fe4077e231141c0482 -IV = 5752576285321b6483a2c192 -CT = 24a18516523a69be03a62b0572a8e068 -AAD = 24df844d581ef17959a433bbc44b4d6665f06630 -Tag = 031b8c5c2c7bfcec2fc72d56f605ace7 -PT = 5e0bfc67b327e725351dfdf56f3b3c18 - -Count = 12 -Key = 7ecf54b1d2d81b6ede2cd574d217d5c9 -IV = c335ee604c9055de42b2a672 -CT = fbf1dc7e4645a85ce2cb21b4b52697f6 -AAD = 0e65219827f0acf8b6b0e75f9397f711d0af4b21 -Tag = 1d6c7302bfa6451fe096289629a68049 -PT = c45dc86e1ffc3bc1013d4847b4dceb28 - -Count = 13 -Key = da8298a837229eb7c0eec75873261458 -IV = a500b91e890d278f974f2a77 -CT = 574fb01be46c7aa1e86e53dd3f31e3db -AAD = 2bbcaf47d8b255075da441294403a7b8d2dd5768 -Tag = 3b2ce73552d83efae185506e8ed8729f -FAIL - -Count = 14 -Key = 0ffc47ae5991e8b232d8abea0c323033 -IV = 5e5099b86e4c984072008bd4 -CT = ef3f1e9e81d1708edf657938d76ca394 -AAD = 92879fd84b5c627c67e2ac484f7bee6669272e9c -Tag = cde1f403eeeedf1f983545cc393feb21 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 527da7a4f81d6d4f6f395b623aedac3d -IV = 2acf3f0c64f5ab9282a6f4a9 -CT = ef47b52ebc6d4cc0dfaf09d22a587c73 -AAD = e5492270c1df154e594c689fc505575c6bf5d7dbde0d1ded5ed32ec65e3e8289072bb10c35e385f499c0600a58f721b2 -Tag = 0530cfe49d93d78bfa9d54ffa6d148ae -FAIL - -Count = 1 -Key = a10785641ff210336a96a42001824462 -IV = 906bcc9dcd0fb4caf3c5b691 -CT = 19f30bcdb9f3a4c110e5797c64561c88 -AAD = 96d9404d0a24052efec37c8998726fee2db69d755ac87dae6f9d6b505fdc09799de79757f90053bf503f23283fba3084 -Tag = beeec6ae10e9d7f11188c59c46789e45 -FAIL - -Count = 2 -Key = abbc49ee0bbe3d81afc2b6b84f70b748 -IV = f11db9f7b99a59ed59ade66f -CT = ce2d76f834942c022044eebc91b461c0 -AAD = d533cf7644a48da46fcdec47ae5c77b9b52db775d6c886896e4f4e00c51affd59499a0e572f324989df511c4ea5f93cd -Tag = 62df4b04f219554cd3e69d3c870032d2 -PT = 5135ba1354cbb80478ecaf3db38a443f - -Count = 3 -Key = bc34611aea26c47b028eda43936fbd1f -IV = 68628129aa2fb6ba7fa46b83 -CT = 738d5b0edbbdea4085174c168c11e955 -AAD = 6982a727ab5e75c089467b0c9d909d6da2dddaceb3b042aa9b12c1f8d7be7fab63af0e1f457fde6cfea04f4a6df6936f -Tag = bc0464a8f0f146546b16318dbad4a4ad -PT = b358a0151f05ba85d65ac3698e674d28 - -Count = 4 -Key = 86613911634393460d581276f2fe82c9 -IV = 6433b2a1e47552414cf60e84 -CT = 50c7ba11891c8b40ba74c663df54ec7b -AAD = df81e6b7ed9c4d8dec1accd93cd7f3d9538f3355202c5a545ab548950c5b4598430fc7d88e28241bc04cb00fc50418da -Tag = b7558e17cc7b5b1f6bfcce7f7ec6c16f -FAIL - -Count = 5 -Key = 7fc3f870c3f32a55c912c4b713269dd7 -IV = 828d1d61bdbefed2bcd65905 -CT = d1422903671ac453cf42322cd3341e9c -AAD = 378466552eac129bf147d64db0ecb3717c1add1ad76b416602cacb728c05af70769d00f32bdbbe7d54e950138d969a7a -Tag = cb53f3828dfba1f387254f50d9a69380 -PT = 80d99a194aaa8db085394591791f5481 - -Count = 6 -Key = fb83253786e83ddcdb8ebf89fb37fb32 -IV = 67454a1324f451e0c50eb805 -CT = bf9c0a175cc510b1e474f5cddd923f68 -AAD = 45a84eda3e45dd89d7a2f31ad9982dec9bb59fe7376382f6dfab8c9e8f5fd7a18663170af4557693e3108d51c14f6f9a -Tag = 92f65fae9301fa983a8149e9eed72b25 -FAIL - -Count = 7 -Key = b5291e834f899b3b22a8b77fd5a26642 -IV = 93fa2101e7b13b9e3ae3c248 -CT = 559c48cd0d213296381df40b961de268 -AAD = 8c09c1883ad1957fe7615ad0a465631a78e0a4059680a41c40a542ab94b0f246b3210122e7e6b1088a6067ab0ab39ce8 -Tag = 4b3a4d91ed785fd52836b023b11a8e0c -PT = 052ca393b0230b4b1ea06eedb3048546 - -Count = 8 -Key = c6d138d93b2106db7e62d67b25910586 -IV = 1290dca4047cd031f80afe5c -CT = 488f108ceac7dd6d9b653e5b700b96f0 -AAD = 0434f074ec1cf2b6cd958912ef1e58a7384ad47b4ed6852216954803d4b0eee42848ec28ed1fdef5b99f4a32f0081b15 -Tag = a83bf6bf0198799fde67d4725406d7be -FAIL - -Count = 9 -Key = 5f9c25ef23f1b8cc6d114665095ce500 -IV = a73c0171a14a5c4879dd8692 -CT = 213957e8aa7ec598e27a955b0b26d1b7 -AAD = 6ca8ecae42fd2fee8b285bc2836a1ec51bbbe03d83e20dbe0267983632e512846491e2e501419964c4e7eb9213ae5c44 -Tag = c781ca5e18b8ad91c30af636bfdd5a89 -FAIL - -Count = 10 -Key = a954403e7f5e6116b803fcf61b69fd78 -IV = 36438c3f50c7835800103d64 -CT = 09fb8dadf2aabf5a1eedfe1c7d585f4c -AAD = 2c01e76a3a8d86d199eac169560fde8680f4b14f45e76c0b26581bffef595fff1250051c972eed702eb3b58f5ea7cdb6 -Tag = a014ac75c80738e3b95fa6a4334d3126 -FAIL - -Count = 11 -Key = 229543caa39b8e2647703a09b082be4f -IV = b40f328dcdfb4f94214298cf -CT = eab31b64d8fe898481fcc743f56b6f9d -AAD = e84c355a609b9c190766dfc68e3dcd8377d85132c0e2f607ec06960a5e73972e25ff84a4f3e63ad4c946fb8c0d08da7e -Tag = 6dfe7f81209b1f059aafd8f36e929388 -PT = 6423fd59407650c305d92ecaa3dbc84e - -Count = 12 -Key = 1eb5022fa84cb4ff4354c4282ff205c0 -IV = 6334cc3d0b4ee7e575cd90c8 -CT = 436ba45e2bfd1119485d68f6d96b9c77 -AAD = d2caa4cbae3e26277c5ae361aa76a5c465845997acc37e6a3a1a09ab99342e698b6dd09bf5465adad1d54904bdcb4e77 -Tag = 16cb48152bc8778b4bbc9cf18e27908b -FAIL - -Count = 13 -Key = 5962ce9c4a12c457e5a2165639f93fbe -IV = c5cb3a2a1f4bbf7b64bfb211 -CT = 3a16961039ed49d930277c323d9d8be3 -AAD = ac9f9916f0b24b78de67f70446bdc85cb122f40e133fc5a30fee77539929009f2f97dcf5e5af0528f5378747d2c5cff6 -Tag = 9e6b8ecfb015309088b1375cde530608 -PT = 49f3ab3a9fc7b4283cea9abeb9edcc07 - -Count = 14 -Key = 745eb79bec8d94f90ed9e580067c9452 -IV = ea47877e5e6730dff90821a7 -CT = 90f1885812b17d7991c8053b003cfb47 -AAD = 68bcc1c94d821b864c2effd8ae24e2201dafeef48c15d82a5afb830e220e4740eaebf6f03c562a564c2521191ed84461 -Tag = dde6f55bbb9de66223027a61ba050e2d -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 99a9bddbb68be243759bc01c882c4ce7 -IV = 6d78e303d165a42082abf5a2 -CT = 1e3a3fdb540717afe12651d3a51b4340 -AAD = 80a8d9fdefb4b114f12208b0a79299ab5e2c8524d2991617f29b23b31cedef24226fadc72b3475c0f201ea0648aa4936ffff9c80f08a329e042cc23728e0b1569357bfd08e9af1b77369bce491b995f7393903c3eceb3fe0c0e4 -Tag = 66dbb3bd4b766df31d37a0282876276c -FAIL - -Count = 1 -Key = 300b8ffab4368cc90f6d4063e4279f2a -IV = 8e69fa64e871d0e98a183a49 -CT = 2d2292da61c280aff86767d25b75e814 -AAD = 5166309e153447b27c67051453abf441de3f4a7f6b633ec6122ff82dc132cfb422d36c5ec6e7cc90a9ad55caa1ccdcb82dc5022a20062a9c6e9238f34d085b1f554b5eac05eff25b5a5cb6e18e7827d70175dc0662d77033d118 -Tag = 633ee657a8981a7682f87505594c95ad -PT = 4953b54859870631e818da71fc69c981 - -Count = 2 -Key = 5061b1c9af824d400a4097353c8b324d -IV = f9c6575be814e22ec28bc6db -CT = b1d0976677a3e53777223dae0e65fc7e -AAD = 325408a19d85c17ab70b827a72259f13e45ca7173c392fbc985ed5d30a20fc19d231e1992e1db2c0608db234b7ae87922028226ae66e8fa467f2c2a8e9118139178855bbab89fd6b36c6a1d2e4ef87c65e2d5d80877ae2e31190 -Tag = ca672705ab5a9c257eb79129efa9b3cd -FAIL - -Count = 3 -Key = d27f5053e12dde30561119ad2b9b13be -IV = 5437231a59ac76b2948c48ff -CT = 055835c290211a17f56e019c00082a06 -AAD = da5aad950ec6c7ea6711202256c45590290d0ac427a5121d5cea6e0500dd88098d40b8616bb63a1afb9d3e8e327066b5dbd2ca59c349ba8ebb7bcfe658dcf87e2f74141a786785c41eb1a54118a422e9b9f43a65939f53f6fced -Tag = fe5e67e5433c57eb12773f473e1e2a0a -PT = 07a4b1a3c359dcbb38aa8b81cad572b8 - -Count = 4 -Key = 2ecdf75ea95d3ec8fc527bb831b1aff0 -IV = 17b48a715b5e244908950f1a -CT = 1df681b55e805d2060ab0dee8093153a -AAD = f503d5558f826641c23879c53e1f72cd08d069abe54cb145b592eac8e3014d39178d065f41fbe65047b8501d1b32ad4dea151a152e3166527a6ee81fe7806b52653a00a0296fecd52423bd9e06702aa313e698c7608b24b91dbf -Tag = 67efe1258c07e64d2ed355c0785c7f37 -PT = 549ea7cb568dec75bab8edbbe0cc94e9 - -Count = 5 -Key = d86f80508cf9d7c0d66de0ddf68a3816 -IV = d29ed7cbedb74089f264a6a8 -CT = a764d4398db219f81ce066a02f39c61d -AAD = dd9bce3863b224b22c1b764d24b68f6b8ee15a1a03e3d93cda018af8c548625c21388e11ba974125d85e8d52aeefd4cdd3d91a2fec552242f73d41fe03f8491fae9fdc30f0b042bdde65f2833b58264d493c5bbf8e2e15fa8b82 -Tag = 64671a12b392c68c5ab638e0bb7e29f4 -FAIL - -Count = 6 -Key = 7fa90797f1b6a3e6f121fd5c003270e9 -IV = c7ec4cf096ed56e88a0ee79d -CT = 18f728db6848bdbc6fd8043bcd13738a -AAD = 5764cabe5e95be9600fd1bf9c89e9a3901f621b901c90e34ee4b8c90701aa87065b2beb91ccad38766c31306192bce55ea6b90f1b8373688bf8770b5a6750ab49fa9d2beb3c8958ec2578dcbdd4a0a31b40f74a090c10654350f -Tag = e9328ffb6b84a0dd6576b1f2563a6387 -FAIL - -Count = 7 -Key = 43353c434b11cccd96fbd61dc26575e7 -IV = 407b85a0701da0c3754cf779 -CT = 32bd678f91351a83103bd65a1c4449c1 -AAD = 6e205d8c476b8e6d780819212f32203829da927734188702dff7b0673bb11c96300e2bb5f30951536332859ba7c72bf7669cb8ad27882b75832379aeebb701890aba3253c68a0e3fc99373a2ed2fa3276e829e87c86dc4f579e5 -Tag = a53265e07a9355584369fa4903144014 -PT = de9e002f12acc9e65356eb461a7a037d - -Count = 8 -Key = c2fe55b921f04d9da55341393033cfcb -IV = ec1dc287bb6f927b1e2c3cc4 -CT = 16efd99e3918f14116985d6afbea0f52 -AAD = 7d0e03aa029f663f9a9d38fe784f812310c70ad34af96fb65d54e5bd92ddc9259233cd86ffdfe14e1a6dd37457b4bc6fb3df8a7fa60e010bc3b8f7a80cdf050b94640cb85b83b9c40569bb1e37d47d1441326eff48679e12e1c7 -Tag = 84b2e87e046bc2c4e6dd32e256a19d62 -PT = 294be56c1aa5176df99b282bba8200cc - -Count = 9 -Key = 0268a73a952aa0f177d29fbc52d477c6 -IV = 4d0e4f4160f37b5c172311e2 -CT = 7c399a61f0baa70f0e9a2bae4e2e7610 -AAD = b6c4dc8df3529c453131b85dfc7bf4473fce580d070b7750bd3cbdb51f1b65117b6adb2a57ca925601144293b25b6e6c10c55e51674e197beeba05e65a7fb9bdfae760aa14ae69d07baa0d63e25f4d06e446887a5daa71ead3fd -Tag = 397911c6f3197a19ef663cfad139fc79 -PT = 987ae53894a4fb80ee995c3b9ae1097b - -Count = 10 -Key = f3ef2c78b5d5072d75b8bc638019fbd9 -IV = e744adc2c686c5072353a9e6 -CT = 2d650d6f221e31e8d981c3c3f8d74657 -AAD = 7a78c5b7444a1502383666c0ea0c596246e7e98148178a2ad0f20798ead8b66317a97b8576a6edfcf33ade393474d00f00516fe7fcfb5facd02cbb8161b224e994bde9fc17d60490fe1dfef97bda8aaf563cdcd0d4ec270c63a6 -Tag = 33469c4d2358f9afe5ce066670ed8037 -FAIL - -Count = 11 -Key = 5801f1d0c63b9414c73aefc971a59616 -IV = 391f171f76b85919200ecbb8 -CT = 6ddc6d402a0ba52f5f274ab90231336a -AAD = 9560b3d1f0b5de34b12fbe35bc1ac73ec7f666d58545b088740eb2720b3ac16cccc729307032ef3d465094024dc6c8e87b979b0c69102a857d1385a655ed47c768446b350020a7a11bca17d120295c89c566f712d96093f57852 -Tag = 26d6dbf8ba796693bad2b28e5c10f45a -FAIL - -Count = 12 -Key = 2eca32ca4445bbdff452b9f148475556 -IV = bafa872e73e398bd13684342 -CT = 8507c5f9db2b5ccc3511ff7c536e4fb1 -AAD = 699cdb33c82d8d479986f92c7e09fcadedd0bb16a6714a12ddbc23787a0a6bd9a26b4459dc910270d0bd5f2174c9428b8657eea47c866b5202170e09c644b0bd1a2571b95ff27eca9111d1e732a235aa9207906de127d339a353 -Tag = 45780dd1107458714eecabfb2fbaddb7 -FAIL - -Count = 13 -Key = 947b7af80ee22df81650b15ca3a9d30e -IV = b08d719c82d666afbb5319fc -CT = 3c0e648800b873a6d313df9819d69c88 -AAD = 14cd58d6304d89fc3aec5bb6736c4e9ef02db97969bc169a4f8c88c36adfd3a9b24da276533fb90c3930feb8b972b0e2eae2c80714536b6b68f3d2ea3328a359dbc1eae607eeb832ac7134d488712610ce4290bb03bdd12f48a2 -Tag = 52a69091a51a33e59b0bfd45a89f0a2c -PT = 97abeb8f5a115d2a978a31ffd3ab87bf - -Count = 14 -Key = 08d287011268b575c5e0117bb02eaa4a -IV = 1bdfc9f621afe6d47ca6a82e -CT = 952e3bec22baef1417bb32ff7217b509 -AAD = e33c9f5b0bc4f32f7f56b517c7aacc23451ba85bf10a70da5ed25765fc87add73cd29a7eb0cacb64e88142aafa5835cf161b9d3c6fd7cc9d91feb7d937e06acfc5d4c49e8ad617e5667a9b62aad09b492df9c66dad1136c341cf -Tag = 11e971c6f777ebcd738a541081d7559a -PT = 571b35d67615967d9d08858722fb1b8a - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 387218b246c1a8257748b56980e50c94 -IV = dd7e014198672be39f95b69d -CT = cdba9e73eaf3d38eceb2b04a8d -AAD = -Tag = ecf90f4a47c9c626d6fb2c765d201556 -PT = 48f5b426baca03064554cc2b30 - -Count = 1 -Key = 294de463721e359863887c820524b3d4 -IV = 3338b35c9d57a5d28190e8c9 -CT = 2f46634e74b8e4c89812ac83b9 -AAD = -Tag = dabd506764e68b82a7e720aa18da0abe -PT = 46a2e55c8e264df211bd112685 - -Count = 2 -Key = 28ead7fd2179e0d12aa6d5d88c58c2dc -IV = 5055347f18b4d5add0ae5c41 -CT = 142d8210c3fb84774cdbd0447a -AAD = -Tag = 5fd321d9cdb01952dc85f034736c2a7d -PT = 3b95b981086ee73cc4d0cc1422 - -Count = 3 -Key = 7d7b6c988137b8d470c57bf674a09c87 -IV = 9edf2aa970d016ac962e1fd8 -CT = a85b66c3cb5eab91d5bdc8bc0e -AAD = -Tag = dc054efc01f3afd21d9c2484819f569a -FAIL - -Count = 4 -Key = 1694029fc6c85dad8709fd4568ebf99c -IV = d2c27040b28a9c31af6dad0a -CT = e17df7ed1b0c36c6bab1c21dc1 -AAD = -Tag = 08644413f80753a66d27cc37d9903abf -PT = 51756d23ab2b2c4d4609e3133a - -Count = 5 -Key = e46eb11faa5c3f6e37ee510544514409 -IV = 31ece7b92df31eb13783b23e -CT = bf77690a555c368878f5929e39 -AAD = -Tag = 971a1f31d5838d444f329ff47bdae20d -FAIL - -Count = 6 -Key = 678840abd719f5588e103a9ce1895670 -IV = 2247ca0bfb937d7091c49940 -CT = f5f7190e3b85aea4faa57b52e8 -AAD = -Tag = b4d15142a68ab5258c3d20621f4706ea -PT = b4263d709f816288ece00bbfae - -Count = 7 -Key = 8dcd045f5685cf072f1a9571fd933cf1 -IV = 500ba0a66f3b919b0cc43d5d -CT = 38ec62147b601d1b84e628c60e -AAD = -Tag = d5a8456335aacb0db452f4c460edefa6 -FAIL - -Count = 8 -Key = ab42c0bb775a58e0c5aa81b2dc3e220d -IV = 4cd9049e3b3f48c848a21b3c -CT = 344df70485c8ac2fdcf69190f3 -AAD = -Tag = 4cdb58ad32123be431ef50613c9f886f -PT = 9fa3afe7d21dfe004b558ff940 - -Count = 9 -Key = 4e3e7322fe0baeaeca2afa6f10fc09a7 -IV = 8a9ea19485204cb1c671818b -CT = 66881a96b2c0e9c81d3270e285 -AAD = -Tag = 8b4b35abb0d8a498b75920adcf411ea8 -FAIL - -Count = 10 -Key = c63119ae857dbac28e1f9d254589c258 -IV = 4696e3963d8105483849c132 -CT = fb3b925ac70ee8fcc653344cfc -AAD = -Tag = 964a03393b541319996dfb9db8259d48 -FAIL - -Count = 11 -Key = 03c6071bd6363596161f34a039567fbb -IV = b6b6213e219034d5e1a86f65 -CT = 9234874c82e77eb464abebcfce -AAD = -Tag = 5e1513c241485b5d6dc0d4c852f9d39d -FAIL - -Count = 12 -Key = 1ff11c32fc837d9f2d0809ab65b530e0 -IV = f4cb53c43d206349b0333ea8 -CT = 4aa200287cd30147c3fc6f87e0 -AAD = -Tag = 2f12e3827848b21f141e5a9a0919e6b0 -FAIL - -Count = 13 -Key = 3de290481b59cdc48d328cb3ac39cd96 -IV = d1792633ed4d573a16b63feb -CT = 0bdc54d226fcd3c5a9b03fa960 -AAD = -Tag = 1a68657749ea7adb860f87b915e58659 -PT = 116d9d634bf9e746db89aab0c6 - -Count = 14 -Key = 61858ec104419274ee0e24871cdff474 -IV = 257de891935cc301aff3824a -CT = 918b9f4a5f59d5a9325d994c16 -AAD = -Tag = 0dd768a4f8d0252e943c9d6cc9e28664 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 660eb76f3d8b6ec54e01b8a36263124b -IV = 3d8cf16e262880ddfe0c86eb -CT = b1ee05f1415a61d7637e97c5f3 -AAD = 8560b10c011a1d4190eb46a3692daa17 -Tag = 761cb84a963e1db1a4ab2c5f904c09db -PT = 2efbaedfec3cfe4ac32f201fa5 - -Count = 1 -Key = 2aa3dfcef68c333d0f03cbbb60a2dac8 -IV = 667a61d732780f5694128daf -CT = 9fade7c433cb44d5ebec14095d -AAD = 227f0dddc71aa2cc20c901fcb8db0e15 -Tag = 85f30c02962900f8891a9b6987172256 -FAIL - -Count = 2 -Key = e8f077635e558cc41a435d5d364e61c7 -IV = 98c0d229fe5e8b2ddee347f9 -CT = 435a85887ef52372259cd7235d -AAD = 473a81d1517f963c9d207b92a37ceecd -Tag = 74c7f8c7075a334c01c6c2084289f6de -PT = 4dc63e19811baff628f24c1627 - -Count = 3 -Key = 295eecd883ba179e13336c75b0da31cc -IV = 0491d91c05bb855ae8218b31 -CT = 2c6e3497d217fcb9854e8db4a0 -AAD = fef3a54930a41bd68178515f447e6cbd -Tag = f58b48f4578dcd69caae8ecb60743d05 -PT = a506ed7636902fc2c74a5ea53a - -Count = 4 -Key = 53e2b200f322383f8c4f66e1f33582c4 -IV = 74651a12fb87d4159cad0176 -CT = fd3e45cc7c27808e81519ac1db -AAD = 62cf41c5adf2cfa83d955cc610448f86 -Tag = e0eab2047eaf4efa600a4082552a4a39 -PT = a7f37fb6f57464dbf469ff7840 - -Count = 5 -Key = 3abcdd36dd0b65bae484cb7654efbd1b -IV = a051edbee68546a493999904 -CT = 9ecf73e3140adf2b7d17eaaec6 -AAD = 0ce7963d31c11fbcbbcfc2f6bfa90b68 -Tag = 71b8ba81028215dc8f3de37b034bbaf8 -FAIL - -Count = 6 -Key = 82f67ccc7e7ff0734f61bbc1a3fb0b72 -IV = 7ed71d35a94a9a8f7d1c0deb -CT = 88fc46298c64dfcfdb5ea172ad -AAD = d11cfe752b544b5e86cd40739783a25d -Tag = 28a573b0acb4c6befd3eb761dcf41c8e -PT = 254dd9845aabf9c049cce9ee68 - -Count = 7 -Key = ad38e96dcb23e04de04b9c28fb4b8e33 -IV = c4646fa77cb05843dd33b549 -CT = eb1d781d8eba29f254d2d4b747 -AAD = 151bf8dee8e89f94dbcd210626c0c4ff -Tag = f080a110a2c28706bf8705788e647743 -FAIL - -Count = 8 -Key = e8d3bbd86c3825692761e507674ca8ab -IV = dae0eed624e1b4840206ecab -CT = 5f43e50829be1f6c1db21768dd -AAD = c5069684d531b4bf159f0d2800cb970c -Tag = bfa9cc78ad67d1bb8c58b8c27ed79439 -PT = 104bc5cd1f4c0bd0b1d7c60f0f - -Count = 9 -Key = 8dc2982890e5015b008508178e60805b -IV = 190f64a03e93a35be00f2c8b -CT = 624bbbdb5fc182ec68a7536c7a -AAD = d23828f4e380386dbe64117733496c27 -Tag = cf001db85c6318b346b27965f74b588e -PT = 690d473959e2bb9ee135098ad2 - -Count = 10 -Key = 6270f8d879f483c8da47c7a1ac841069 -IV = bf241ebbb53da9266feb80ec -CT = 4af8df0b28f8169d4ebdfd87af -AAD = 753738f9f9abe9e09d95e9094df917b7 -Tag = cfaf36396156d570a2d16d5d9309a20c -FAIL - -Count = 11 -Key = 41a7e25635ef6d9f41d5e47134224db9 -IV = 06196d4aca076d87307d25fa -CT = 8019af5fc9a6139dd70c3ce530 -AAD = fa9bc9d9f62c0b6ebaa9a78ae877f10d -Tag = 22c816aeaa81b29bbac65a7977fbeabb -FAIL - -Count = 12 -Key = ce4a52d8d9b7ea1a6b0582d515a76ef0 -IV = 9b917ed9844bf241e8e342ff -CT = 4c2787d382182ce0984ad73f75 -AAD = fd6de547fee72ad03c937dce02c1965f -Tag = 853a648db898f922295ec78e6d26193f -FAIL - -Count = 13 -Key = 6bdd0f5fac673ed0e5035704e0b81859 -IV = 89bc74857b39b5b3b6e119a3 -CT = 7285eb5e7380e62e8db412f141 -AAD = c76b9c59f5cc4d02c35c4e3250bf2a6c -Tag = 5d92968cb34561ef8bc81b6aafbd3ac3 -FAIL - -Count = 14 -Key = b69ee30195aff4034d692b619d000408 -IV = 8b509ffd89c70c5d74dc975d -CT = b011b1a89b8309c084660dc77d -AAD = 886aea7c2d67c0c64038bbbe93a3534f -Tag = 4b12ec1f7943ffff88f1e64ee090d781 -PT = 8d511f8e02961544754f36e937 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = c62dc36b9230e739179f3c58e7270ff9 -IV = 196a0572d8ff2fbd3522b6a5 -CT = 958062b331f05b3acaa1836fc2 -AAD = 4d10536cbdbd6f1d38b2bd10ab8c1c29ae68138e -Tag = dc65a20d9a9aec2e7699eaead47afb42 -PT = 6d8abcee45667e7a9443896cbf - -Count = 1 -Key = 0c966ae197bd94cdabcab5f9c4da02cb -IV = c5bcc7e7044169fa01519ab7 -CT = 49c9a9b0c3980e443cd5195a16 -AAD = 5feaf91a64887463a0b3299da6c87cf2874ebf0b -Tag = 9843f2181d3db30d1c7694c511a85440 -FAIL - -Count = 2 -Key = 913d0833618d0cac6cf1aa7879ff71df -IV = 64082c05f8f3661d0909c5b0 -CT = b4f1efce82f907c0fcc1ba0777 -AAD = 429e3b1b13f9772e9c77a1a4af3d42e8e0e4d86a -Tag = 452b7b777968c18128ade293fd7ca3cd -PT = 8c4c5d3af3ec87bdf8021bf01b - -Count = 3 -Key = 32c251cf7948c7da54a89c109cd10efc -IV = a12c50265a0f59f0d796185f -CT = 66f5786452f19af24a80ce87dc -AAD = 28d5ece6295b14a98f3d67fa3b7153791f4e34bf -Tag = cb176553e01e5991d5dcb6796c33336c -FAIL - -Count = 4 -Key = 977b05392cb87f18f8da6c6273846e84 -IV = 3d75233ecc9431a09605494f -CT = 67897c7de75d0a877545fac9ff -AAD = 803b6b7a7c15f5c9cc1de5166d68c53aef7697a9 -Tag = 3abd3c4653fccc758116beb653809a2e -FAIL - -Count = 5 -Key = 8bfca06dbb9be36fc52406628ce79afd -IV = faedb8fb599ecb05843c783c -CT = 755ceee1b887595011a848b3fe -AAD = 63bb624283314d67d9dfac0a01257f41dffdfebd -Tag = 8d22fcc810d50af86131d571aeab6c27 -FAIL - -Count = 6 -Key = ea55ab4c4a6e8dc4ecca42d4874cacc4 -IV = f5c77f9fb2c33639f35d8f0d -CT = a153dd682c7170a5757d3f0e5c -AAD = 37138bcc4cae4d9327ee8d7c533c2b3dcdd4232d -Tag = 0617b3f0b8f69365ac5c6eb8b3a0dbf6 -FAIL - -Count = 7 -Key = 9b0339dfc4843a419872a285254cdf86 -IV = 9173bb06344a171f7a045ca9 -CT = d1ee33e7dfa59bf1d684894a39 -AAD = b9626d0970d0a5902a3f7a5c7b43e875dcc50835 -Tag = fd7ccf008845d5ddf164e109ccb4e5be -FAIL - -Count = 8 -Key = b8ee3c155ccbb0f3887634fe96e2a1d5 -IV = d8b44efb1a3332501ee6afdd -CT = a5607fd03c0742fa7abae960ab -AAD = 151653716d50a72423ba17957b8ad24c7c4db5e6 -Tag = baeb1468e24c252684c14142b519be3f -PT = e390151ab9d399d534e0119767 - -Count = 9 -Key = 710218a79797b3cff3a20e9a60810475 -IV = f51da8e5a361aad6087af342 -CT = e55e14ff01fdd224fa809229ac -AAD = 455a908aec7d7ad9d644b5305d138b78258c2c8e -Tag = 7040bfcfa78be2bc0a624ba06cc562a2 -PT = de233903ba85973c9cdb15ad40 - -Count = 10 -Key = bf9a6f66977ab3a8d37b32e1f24111fe -IV = 5b9779c050a41b6f4053233d -CT = 27b30f458daccd4481408a3f5a -AAD = 9561c95310b0f882e0f7c2967d04ae9444e5794e -Tag = 9f5f1a41c4fa3e551330c5d91db4fa54 -FAIL - -Count = 11 -Key = abf42662668c5b8d5604a8fe6d73a2c3 -IV = d4d68ce645b95ea61addbd0e -CT = 29c718ab498e792ac1bb8c7c2f -AAD = 6362394c4e9acd3c9888d3c93f39a29dd02078db -Tag = 2b416d7723aee1935233c04ed2fea876 -FAIL - -Count = 12 -Key = b9eddaba6602cc32f33782b18e2aecd0 -IV = 86eef884baa60ed42b086eed -CT = e3a735e097fe667708996ff18f -AAD = b877b290962dd14bd1d622b975eed04113ed105b -Tag = 54395a31d93ea9625d644be8013d018b -FAIL - -Count = 13 -Key = 4598e0e4821db7dd6ed2ce09cdee6cdf -IV = 8e89130fbe0d9b66d5742aba -CT = 9edd822968b68f2173188ae6b7 -AAD = 04c1089bb4abb82ab55ea18eb2ad2fd5bca1a086 -Tag = 7c34c3941fbf51bd33e339b6390babc5 -FAIL - -Count = 14 -Key = 47e0fb871a560d92949d84f557ef2247 -IV = dc65e2cdbeb6601dfd684fee -CT = 6e2b2ed107490d306a2b5451f9 -AAD = 17a7966987c7ac3bb4e455e69f0e6035e7d0d3be -Tag = de38af58ff256e130d84edaaeb00d878 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = ef1da9dd794219ebf8f717d5a98ab0af -IV = 3f3983dc63986e33d1b6bffc -CT = 95ea05701481e915c72446c876 -AAD = 5abd0c1c52b687e9a1673b69137895e5025c2bd18cbeacdb9472e918fe1587da558c492cc708d270fd10572eea83d2de -Tag = 5c866992662005ca8886810e278c8ab4 -PT = 5511872905436c7de38e9501e7 - -Count = 1 -Key = 2e3968148b973cb79f275676367cd799 -IV = b055618bdaf94170080346ae -CT = 0117a142931082ff569aa58ea1 -AAD = 72c50abc8c10b7a83b755ac26b7a86afb37d2310e832a8982c70ea8950f8c1a0c0b01fee79644753f87a553868dcc719 -Tag = db9143f6cdb3aa57c2aab1bab89e6c26 -FAIL - -Count = 2 -Key = 7dabba053c8c682b65c8ac9059d20793 -IV = 109c8ff05626ed7329a7d68f -CT = 158b708fdbf206999c6d5dba50 -AAD = 041c26f5c77092c475ae6fd6f9c8c3c8c42d40f8bffa4c28c2f40146c1dfaed0313f109b0d918f7d72fb87fd20d7fe96 -Tag = 0b4680a9f3b9f745bb87c3620ecdd956 -FAIL - -Count = 3 -Key = e03c73bfd5dd3aadba727bb3f99e6237 -IV = 150fbaae76a2da0b84e42959 -CT = b6b4ab1cea7044abf6f6f7dbfc -AAD = 80d1ce195cf77fc3143a37b8546d2d415241d17ffc1d35fa0613f407f7c7cf4f9fe219fd32eb2a95442f5417bf0f7277 -Tag = 03ac1333e300e1845c12f150568ed37f -FAIL - -Count = 4 -Key = 01534e2afc3d9ccc30b826ba91bb8f4f -IV = 6caaaf9daa38e571537ad189 -CT = 1ad10d1f8aaf7c540755b26bf8 -AAD = 1dd85b293539f175f51d1eea58ec78b813b16933d3ebe883cae4340bdaa52a93504c43185bb12a82a93309f04b3fea2c -Tag = d92c12bcfd2dfb213537c796a37eb631 -FAIL - -Count = 5 -Key = 1cf382d72ce0cde089348ec997d7cb4e -IV = a6db73904471cb27d6ea87bc -CT = 69bcb6c8e85d70cfb6b9138a19 -AAD = 98fd3d310e72bbf08837b1f498de66a55f2cba0c6083f335751e59547151802e3e7dc41e1149362c2a938e10bab13a0f -Tag = 770c7c19ef48baa7f2c7a8528558465e -FAIL - -Count = 6 -Key = 2eb413374f602f6598ed463a102fb1f3 -IV = c115adfba0d9edc7d6ca92a8 -CT = f1d5ff51c84b884351038a6722 -AAD = db3206a7eaed7c7b1f17ba5c18fbec7e92ab259a237473f7a7242d1825fd49f167d7f838c1eb65e99b5eafa9c8c11d2a -Tag = d3a3f5e0659898b30e27720ed3e63e56 -FAIL - -Count = 7 -Key = 284b0739877c18921007c888b283f9f7 -IV = 6ae3a281a95760fee1c2a07c -CT = 5d76f5fa13c2f6d638145a029b -AAD = 771307fe6809cd1f5380e5e19299c5dd86d36a6f664e2226b1a42666374e154957035a538b311d73eaebcfe504cba2d8 -Tag = 6327aa1b885337285bc1f6367136b028 -PT = 8e460f57a808d4ef7d3e2cc4fe - -Count = 8 -Key = 698634972384bf4338da7a7a78b1dc45 -IV = e3776042ce8f196d87512ed0 -CT = 75379c28898c4a25c7f8b46b69 -AAD = 75ed47a6454f5a46cf06519dd5cab36f5c98845df604abe02eefa96f803bc9e43fb1d163453138f54b815de0ac77247c -Tag = d63164ca86592eb82c95df8bdac250bf -FAIL - -Count = 9 -Key = 0da45731532c21aa9be95c6b97fd88fa -IV = fcc4a45c9f30b75ce84b1963 -CT = 00846b8e389b4d51b8be03a9ab -AAD = cceb765bf43d0059c046334e001b2008083383e8a766def6e00a047d5ba34af9f459b626fe229e91ce44f2d4922053ae -Tag = e5de395dd1a944c82b1293e2f0a07610 -PT = 648a178a884cb9dcace3797bc7 - -Count = 10 -Key = 4b1e637ddd889ec3de9687e1d00efbf1 -IV = eeb95865db33cc0576e8c007 -CT = 12f4cff0564fbd78a30f6e5b94 -AAD = 36066a37b9fe24218dc09b7cb3fdbaa2d516106f4f87e1a207b4c9b70242f18dd755dc5e82d1684edf2f06d1fd167f3c -Tag = d53a1c8cb52a80367a6847e3733de17e -PT = c5694b0bce9ba2918cf689ff4b - -Count = 11 -Key = 15987b4622213f19f48e7f49a8c96cef -IV = 7d757f1143d4e158729ba484 -CT = a9c2336451553ead58c3324ccf -AAD = 1b65f7f64e6cfc6d3b6d133e33b8d1a8c4e1aa37e513c2d8a4f1d682fcd8acb512738e90186e6026c248bea612ea7589 -Tag = 507c941649fb802a230ef2e61e2f8c75 -PT = 24fd6844aca0ab5070ce41b4b5 - -Count = 12 -Key = e44bdfe6ebe04374145b7e5b20e080fd -IV = 87ab6a85d5bb3789fb70f8e0 -CT = 1ab5e65019f20c1e5548c4e6c3 -AAD = 619385644ec99fcb51fb5491ff6ab69538d7e4932bf07e20d8fc7bd4881c1391f45eff2372e175f1fd872c7149fc858c -Tag = f6565275180ca7ae363d82890f3aa59a -FAIL - -Count = 13 -Key = 863550a2fb509e6418e342a4bddeb219 -IV = dbfb5238ed3d1c1a2af4653e -CT = 2c91779a07504c069a790c7d35 -AAD = ddbb12ba633a780487e71216549f29ad7d52cb59aff1bcb8889abd894b3edfa4e75d661ce793286238e30d434d80ff18 -Tag = a88559f82c6eebada6dc45153ac944e5 -PT = 4ed8fb109e9dd47b4895ab8c85 - -Count = 14 -Key = 40100fbf5c359c60c7a01c95b4ad9d63 -IV = 0559e0d7372f935fc01b1d1a -CT = 8c1bbbe67d0fc9355d3d1d498f -AAD = e46fa70761a4480eda444c81263fd62ca12a720b2f40d17e572f2f387a07fc6473d82ab607d558cf08429557011a949b -Tag = 4a44b7d7eafaefe4407a9ae992de3d57 -PT = a0dabff03e4ad138e0e3eabc53 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 3eeaa3b5aa99f6902d1d58421b53ddb1 -IV = 71240c996af69d590ccc8e8d -CT = 9a50a33a9438f485e7c89caba7 -AAD = b1176b9e28794cb627c5cb3743846e6d11339ce6d0ce69789833b9f344e92e5360a0eb61b173687f74eae3184ef641f1c42c5b180014ca7e6b0edb00fbc35f2efa7aac7111dd8ec70e851a3ef2e2436ee07e4fba213425b1a8e4 -Tag = e2865b861f8d5e0af25757905dd0653d -FAIL - -Count = 1 -Key = 9dbb962de535a9e77108cd049dea0481 -IV = 72d607c6dbc4fbbfeacb042a -CT = 3c8ebab6a3c4ecdb1ed807c962 -AAD = 9127cb0deed0e5b43ea153b1c17b484225a49c13a5f5995f86ef28a65f9f82397dffb34d4191c3db60492473d5df839e234a537b5a1cce9dcba1b1d205c92c4b4daea01186737cef6d42829ef07f0b6b2920baf998f6ad0d384c -Tag = 9f8dc7e66cea95d7915281301913d3d5 -FAIL - -Count = 2 -Key = 77b55a5b37690c9b1b01a05820838e3e -IV = 7a8e0d881f023a9954941037 -CT = e0eb3359e443e1108ed4068969 -AAD = 0bb1ad1d294b927c24ee097d0a9afbaa6a62c8923627b50bd96e5ba852509a2e76f7a10ee3987e37a55b92d08531897e6cd76462403b39fb31508cc9fc7684ab5ec2ccc73e8a7f4104a277319bf207fcf263eceed13a76ca177f -Tag = ea6383077d15d7d0a97220848a7616a9 -PT = d164aeccec7dbcadee4f41b6a9 - -Count = 3 -Key = d5cc39db2b34cee01345dc52be7d5103 -IV = f662499e42f14bea6977174a -CT = 9a84bdd3ac1724216772349f59 -AAD = 32d9b18f80e4502ce6fe80fcb58cfa233dbc03d342277a5f381b075a386553895a722392c50ae74bcef5266bbbdecc838048924af36418fcb61d94094c86f702677e454c972affab146d629aabde3680bd7d2a669dd4d9e630fc -Tag = c15dd85c92bf94b4b901a771629f4600 -PT = ea48032834d9969e6c9f040957 - -Count = 4 -Key = 64eb561f7f132cf5a6eb6314360a6c10 -IV = c7604206c6e9800dcc4b29f4 -CT = df392736cbe2067acfbb675e37 -AAD = 79970cbf48f78920de1583f777d0d5a8d146ab16a86f2148a6134b5dd55c51c7ab1d0f9219dee77d618ce018f014ebe985c527d0641ac991eda2d48135dd8c552e496e33a65a5e5804546570b53dde4ba860d5f61505dcda77ab -Tag = c382e9854234cff3512ea17a8a8092b4 -PT = dc1fae5f1f0778d378c781dbea - -Count = 5 -Key = f27057cbcccc9cf163abd867fc891486 -IV = b224fea2ecb2b3a5c8fe5596 -CT = e9fc65eacd5be8b6865f853fbb -AAD = 50567ac439f395f3724b14882896f76832d2d464b95d5712b6f8664489d6751ec001140fe47acf75d893590ae22ce10fae18cf97d1c16cfbe52885cbdb7f1d1258adc49204aee73c7cf63a45e70196571cee496c3935f3a142f4 -Tag = 03e3dc31120402ba3a615ec0fa33173b -PT = 7c17f64a8e1c6072c83f8bc8db - -Count = 6 -Key = e9b652cbeeb2a556ac1826b19cc15958 -IV = d21da8693af1613c72bdf1c4 -CT = f7c92206909abf170063b7d6b6 -AAD = 9bbec67884adb146cfcc1456467ec75a37d3623d4a4a396276778151d591e839b4f8e8d96a3d1821c7590b3fd5c3afda9f70709d30903b978d2e6b166b72bf68dd48277929cc77ef45b67c8440e98c5cd89c02077f35e7a55a83 -Tag = 263367dceed0ae0ebdf33bcd43f3cc56 -PT = f12db98355e4a37eb8128c5ef1 - -Count = 7 -Key = d9aadddaf333bb0f78aaf5cdfe0029b1 -IV = c003a76eccd9bbc3ec85dc2c -CT = 091df0d0b2aae56a00eb252509 -AAD = 49c3351f3b103d29fbe6cb6c38a7afd2a06e42409372b04cf1a9741fdf86af62c57afc203d607b384c87fb9d174a1c9e1debca7a084775d2611de22f17e64b1ba9e286699f3276c08d05aaf0dcaec773f33c43d7de294a7915b0 -Tag = 8b041e3c4387fa45afb43ec83d2d11f4 -FAIL - -Count = 8 -Key = 2dcaea867bf72bcd91caff043cf08007 -IV = 07a1a531fa30bc77510d0453 -CT = b4fa6436b16942d3f539f47cb3 -AAD = a757ffcb0d6387b870dde672e863da43f8e71a8a5ecc2af9414dbc99f17a0ce3632472d2b75fa1cb3a6978af9813c1e779891837e6088b24c10622deb4f2461335dfedbe71576f721a070aea32be8229e2c9db109988f61eddd1 -Tag = 4e3868460ed3a64c2f9216f254949ea2 -FAIL - -Count = 9 -Key = eebb7f4031121fbbe400bd449a7ccc8b -IV = 412eeb64a9df2ea98e8b1dbb -CT = 3fe649156931273eb3ac9db896 -AAD = 054b1dee5ff5310db9451f8de5cc8a17bf5ea315a13a3d3ad921f64eefd634e0ad8cc0debd61bf5c089beed9cfdc3a62c4f867c1a385a38a95be4dfc226c91ae1e43e66c204f84e112687b194d202ee5aa2135132b9d5e4ee91d -Tag = e1867166f788de432f90b5c2a21b4cea -PT = 13ad6e1ea7fed171acaa9a5c7a - -Count = 10 -Key = 6ca30f76a5bd8db10f369d492076d5eb -IV = 32ba3341d212d8e5e021f2dc -CT = f9eb93d2dd2014736b64795166 -AAD = cd5c5ba9269fd8a4b355f7a72ddccadf2d7248e93e27af3d17ac7a25caa5c1931cdc0ab8f19ef94b3d9edfb249ba701a0cce9d0bb9fd3650040342b988d9f7305f8819ba84c679093e04a67c5554ca37d6d10234594a66bc261d -Tag = 94f18a542f3b55881365392a743fc4ea -PT = 2ce2935dc618a081100af7c61e - -Count = 11 -Key = 5173cbc7d19b39fceef0ae6efed41ad3 -IV = 7c0a8ebe0006db0d8d3325b1 -CT = 0d01b48b52b1e11d7457bc3f0b -AAD = 2272b3fb6735c466666d7590e989c47537182bcc85f3ff1c3e7b0618ab125f15d163d6d1868ee82c88df740fefac22538ddd65c532af37f5e90ec5c953b88da3806322e28c3505f9bcd57d3eaffece4170b5baa1a5b928bf3c07 -Tag = d568c0e4a644381dea718c2b7e1e1024 -PT = e7a3941472ee04ae90d34e6da6 - -Count = 12 -Key = ac45fccfc2f37966fb18eabc75ca7f13 -IV = f6437d540571986c8a9deffe -CT = d2fd74d90a2aaef2bfdd88638f -AAD = 999446c6391c45f6abc1094402da2d602fbeb973b15a33df30fd4493c0e217fa610fea050706808310663af2fbd66b3a5485f082aa75c824c684fbec62b7cc9ef16ec43c71442c891bc4b47daec6b927532fee5bfda611ea4d56 -Tag = 63d7efdb868b83704980b2dd7ab72a95 -PT = 9e0d96b80bfb65551dee91d828 - -Count = 13 -Key = b45d5a5c1238c6ff6452fbd605b9d60c -IV = 60dc1c9970bc7242385b15c9 -CT = 200be21ae091ef2d6915ff00e8 -AAD = d7b7e4cc20125b86815dafde75b07a0af4b16995728bf632500fb3a0edd5b281417f5125abdf4861963f3c93d870e58e6703ca760fa1b8e25d4134a4a7786267de107fa6560fe6a12477c29175eee02b7d9a010f2c0c83fe389e -Tag = f8f393c73dc613981e9d19cc9d273a76 -FAIL - -Count = 14 -Key = a4b4b85fda2776644ad63eb6e1be48b9 -IV = 635d0bb5e2240b195f21a28e -CT = 0cbe3cbb0725cd28d45745ef5f -AAD = 69d1c68e1521d821bc6976884f564f8a9715e76b99d91819eca63b1d3d12923c3fb868edc957d333a5621b6dd1fbbb9dc1b9a1b87faa155a84254cb23519b39796545d85dbf3302aef8225a2236bf64db82dc85683802a0a89c8 -Tag = 6cdd16fc0c83baf439da1e8279acae56 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = bfd414a6212958a607a0f5d3ab48471d -IV = 86d8ea0ab8e40dcc481cd0e2 -CT = 62171db33193292d930bf6647347652c1ef33316d7feca99d54f1db4fcf513f8 -AAD = -Tag = c28280aa5c6c7a8bd366f28c1cfd1f6e -PT = a6b76a066e63392c9443e60272ceaeb9d25c991b0f2e55e2804e168c05ea591a - -Count = 1 -Key = c3aa0400ea3f5107fbe8aa011e1391b3 -IV = 9c22008475e7a907f7abc966 -CT = 96a06e1fdb0082ebc6441312dd9cd6ed6f7fac745facc368b5ab2a3951bd75a6 -AAD = -Tag = 6e84d66448068f67889404263a047a88 -FAIL - -Count = 2 -Key = 0ab76460d1870b6c989383b615f3876a -IV = 32f38776d99843e9d79d6b28 -CT = fb4d7d8e0958ea76d9489f2c6b5308d75cf96c8e1bc6a08a978a65f0c0f510af -AAD = -Tag = b49a4c6af3403dfb57cf1f4bc25b17a8 -FAIL - -Count = 3 -Key = f02f0436322783d369d552f0d6385474 -IV = e029e6acddaf62ea81f7f39f -CT = 14b4e53213de80bd995468df293a6bbf2452846c375a3706738db45e7c5d5ba6 -AAD = -Tag = 8a8a3c4693256f8b50160554824856e6 -PT = 45ee8a0f38f91785bf8cac4bd05284249a8035eaec0e6e1946e0ea83a0ac3271 - -Count = 4 -Key = 693246ac318ccbab8cc852cd28415b75 -IV = 1dfe6aa73ffb680dffc10367 -CT = 73fc0c82a59165f557ac3c9a43a780ef2d7b55d3a269677ad9ad123706b85854 -AAD = -Tag = fbedbf6b9085e06958a50b329f813346 -FAIL - -Count = 5 -Key = 8767a7a8be83374dc75b0891c4fffec7 -IV = 498aecf672c73dd81aa966cf -CT = 032be9ca32e53e130f241d7a27b4959a6e2b71c98899cfdc66806a490c7fafc6 -AAD = -Tag = c3918262698ba9d30e329cad60fb3eb2 -FAIL - -Count = 6 -Key = 7d34065ca9982a64b0603a6c080bcf4f -IV = 888872c261b3596692ab96c3 -CT = 9bba3cc23f91eeae09269f9402967bb8b376552461faa10320741e861d3a2e71 -AAD = -Tag = 954e7fbb62b622216fb7d1d2f367eabe -FAIL - -Count = 7 -Key = 8f76fe87c4ce76ad7f5e5858030ee64e -IV = 0b5c3b98aeab6525f0cbff7b -CT = 37b795a6de594f97cbd51048f958caa56ea04d6ffd42683364857323759d0406 -AAD = -Tag = 1ce35f577b0661dcf1858b92061b4d77 -FAIL - -Count = 8 -Key = 9b8259870255aa4a7ebb0e5ffece4396 -IV = c9258baa6b7720f38d8f5a76 -CT = 46c291e1792486d98d5aef943e11c215ad38030861a14013014b34eadc771296 -AAD = -Tag = ef28e61958d92b8a2c26dfa69a3c3577 -PT = a3432fc525848dad2a4bba5971bb51ba0393ee8dd61989124c6c457b91c25b88 - -Count = 9 -Key = a00e8e77494da619e978a6d05bf86444 -IV = bdee5a78113546f33d1cb13d -CT = 68f25dea2677b57a19814eefb45c88f6f5028c6129a6d6e3f94da50373e9a1ea -AAD = -Tag = 0005f814865e5bd29c310e1b2761066d -PT = ca2c4ba89d911f74c6d89ee4f3a78f3c9a0e00017d262377aa334a782641397d - -Count = 10 -Key = 440d2393c60bbed9e804722d1ecac07f -IV = 578b96349a4c023ce12eab7b -CT = 68399bd1ea4dfbe7a91eadb3d6ee01e9f3267c97de2b6ab855d297918cb70065 -AAD = -Tag = 73650870d30e379d67858df44efa3b3c -PT = 3ac46dbb93f803235a6df55023aca55449764e91f65512bb9ff0b194788f92cf - -Count = 11 -Key = 8a1877e0bc1e79d88a13684abc216539 -IV = ae660679b01bbd1982960ee8 -CT = 3791e561d37ef21ddaf019a116f5609817bafe6c1875572f5dddc7f4e0728acc -AAD = -Tag = 0d31783e7586a137b81b5b41d1ee5896 -PT = 3f6f57db5b4c4ea4e5528bbf4b0a689c0c169a144f8250301ebdce33cb336547 - -Count = 12 -Key = bffdb949412bc1ffd379a8bd5d1c618e -IV = c8c352f9c47471c5ea3607e0 -CT = da123abf79c0f873d2c5eb65f7b9c4753d96788b1ca6ef8ce28a741558ba18b8 -AAD = -Tag = c4f7344b1fcbacb86b540e741d4171b7 -PT = 1d16adf20389315f655c22284a11b4c5f1d1a45bbffa6e47dc37751185df35c0 - -Count = 13 -Key = 28b5097f0f30860b587d5268365cd77d -IV = afe9269bd8e01bc5a8aa6ee5 -CT = b6da1df24fe4a75ed3745bf71fb1b3ba11a3810a083ba6ec1c39f979fba6ffc7 -AAD = -Tag = abea36a6da655e7aa7d7073bf936865d -PT = 276f7984d55a96f3250bb29bd80376ac54b737dffa6c99f06448cac814b6832e - -Count = 14 -Key = c8f7bc883121ccb5ac678a5675234d14 -IV = ff2929fad279c1f216e84ede -CT = 60ce0bd7045e77f84c6582343100fb7e1d299f07aee23189b38f5d4f93dc4519 -AAD = -Tag = b31a35203371f6ae6c1900301aff3932 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 3308bf978dca6bd7f5fe4ccd6d0e7c24 -IV = 85996c785a83493cc7165c11 -CT = 4c8f0c7ad73fc469b4b385f80741f3014ec236e29ca9068b8e55ed6fb2fc9b9b -AAD = b0ebb26b9e27c44c26543e257b7c7eb4 -Tag = 8b5528d6ef87eb0be9b6708fab7d654c -FAIL - -Count = 1 -Key = e60b37678b00cea55f72c593ac38067b -IV = 845de274d5ea7d6e0ce794ba -CT = dbc9fb93ffb1698e5a1c062d391f63884c8d8fd862e07ba51d664bffd22b9faf -AAD = 59c8ef4352877ee249cd11439b445733 -Tag = 08d213989f884aface743fb88f778395 -FAIL - -Count = 2 -Key = 95bcde70c094f04e3dd8259cafd88ce8 -IV = 12cf097ad22380432ff40a5c -CT = 8a023ba477f5b809bddcda8f55e09064d6d88aaec99c1e141212ea5b08503660 -AAD = c783a0cca10a8d9fb8d27d69659463f2 -Tag = 562f500dae635d60a769b466e15acd1e -PT = 32f51e837a9748838925066d69e87180f34a6437e6b396e5643b34cb2ee4f7b1 - -Count = 3 -Key = dd2f191758cdeb480feee0beee689fb7 -IV = 8a1c6f696968d1a77a44ba45 -CT = b43afe82184d077319a9366c1162c5ca4882da0df82207ccdc038125bb338c9b -AAD = ef910ed8c787999640c2bd172e5e686d -Tag = 88521a088f92a1d3ff7ce5364bdc7859 -FAIL - -Count = 4 -Key = b013ddc3c6125a9a8c3a309c6367a076 -IV = 5999d3d65eeec4ac7227146e -CT = f71242febd4826ea95ba8e6a3397f05c1b9dd82671680ecf7ab566f1e9ad787a -AAD = 617d5980203988d4ca779b2f33cb904d -Tag = fb74b36de5e6d43a38849f7f9d1f203c -FAIL - -Count = 5 -Key = afa272c03d0343f882008f6e163d6047 -IV = 271ba21f8fdcac34dc93be54 -CT = 36a4029c9e7d0307d31c29cea885bb6c8022452016a29754ba8a344c5bbfc3e1 -AAD = cdf5496a50214683304aec0a80337f9a -Tag = ed8d916c171f0688d7e7cca547ab3ab2 -PT = f3ee01423f192c36033542221c5545dd939de52ada18b9e8b72ba17d02c5dddd - -Count = 6 -Key = f869ffd231c95cc0822df5372842e755 -IV = 1490881cf72ac7f8e7afd0ab -CT = 816ddffa6114f40cfb5d61f04379111be8e1defd4d9e77c87d6ebb748dc79bff -AAD = 4b2b932803812720f6e044b5a5117612 -Tag = 88657cb7f8ef31e55d276d63648b9f0c -PT = a35a1dfdb624727ec51431a804add8673eaef0398b8a3d2896b2d659a0c5bc1d - -Count = 7 -Key = 98b984a6e61dbf66c9c6641d07e69c40 -IV = bbb54adca294947424c6b646 -CT = fd8f7aec05fec9fbd35b66e191556df6cfafcd3859927ec49b0f6f3031597e9a -AAD = 0edb4d86c33d0098de1a2430f0462a5b -Tag = 4651e0d440d42145d593c8db9291f1e5 -FAIL - -Count = 8 -Key = 88959a3edd76716399c33df453fb84b7 -IV = 324d315e3b18d94a86170500 -CT = 062cce52121a567cae3c78a99a28d87c679e418f32f79af1a8849e6d0e81d25f -AAD = fb760df45a75fbff72106e52d6da864a -Tag = 825cbc27be42143c2461fdc6b404e86e -FAIL - -Count = 9 -Key = 4555765171009f776032ec95f60ffebe -IV = 7595fbc3908df2b038c2298d -CT = 469239be20aec4a000384b8ba7ca8b9c1523acd03eab1ed9487a5a13c03bd62a -AAD = d2921132ebcd1f907e649c675d9dcad5 -Tag = d2e2701f334f28f69f6b2d6a8de20d0b -FAIL - -Count = 10 -Key = 69e8bfb2b7b84897153b431ec29fcb79 -IV = dd56a06a4662e2b692009a06 -CT = e740152f3bdc0a09c22146266bb3161ed1c37338f26fec26cd9d829dd6b96b44 -AAD = 3e465a94a95cc7f87b815afa196911ba -Tag = 2e6c438cc38fa5da375f88e237fed806 -FAIL - -Count = 11 -Key = d13e90072180031aba421d64d474448c -IV = 87cc23d00512a61933d435d9 -CT = cd1653f01d8e468e08131d263a10cd83a5e7ea68ed84225bceb4e0b57320cf83 -AAD = b9ac2c45232f7305fcc6f2424c30b606 -Tag = 7b02db1e0dc0c2010080992ad01a9a6b -PT = f1eedc99565378b3ded6190bbb1c6ca325e9e0dd57fae6a8190ce57ccaa302e3 - -Count = 12 -Key = 724d036af7649a85109ef3a597a9b133 -IV = 33c0c8f3a709fa03e684696c -CT = 49be803ad200608b026138ca62acdca2288e67faddec35254a52e8a531990436 -AAD = 8c1095b33f3c4806fe1872916fb6f5f3 -Tag = 81c0405a283ec84bb2a08867bb9a2433 -PT = b643616673a5eb1985900ccfe8ab47691401242c5ec57ffff23fea10a811fbcb - -Count = 13 -Key = 25aede64de2943c0a2ba83bb28075cf9 -IV = e91e66b0414c5ac32cafa3bf -CT = 54a85000a9a47cab4d20027661ee10940524dc06ac9db4e33bc0dc7e6cb6d20a -AAD = d7adeee427b52220d3305f4cb763ff8d -Tag = 2ebdac7cc27d777e26cf12c73a1623e4 -PT = 4b0dc9628a8deec3888c6e642d6f8d1859860c747439757e2d4006b9dce7d440 - -Count = 14 -Key = 5580619cb4b0820fad559b143ce0cf34 -IV = d1c93408a0ca93e94adff306 -CT = a461d08c458fd1b026839f8cf781f834b3214a31dde0477fa8c9b6e57bad8bd0 -AAD = 318dc3a4bafb2514346b520336bb5fed -Tag = 7fc2d6bdd8326d540c02dd0fdf55e9fb -PT = 9d81e6fb879c506e83e641dcf9015f6994a1417d03c1eacbf6d7cba0c349cbb4 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = f3e60720c7eff3af96a0e7b2a359c322 -IV = 8c9cb6af794f8c0fc4c8c06e -CT = 73e308d968ead96cefc9337dea6952ac3afbe39d7d14d063b9f59ab89c3f6acc -AAD = 5d15b60acc008f9308731ea0a3098644866fa862 -Tag = 658e311f9c9816dbf2567f811e905ab8 -PT = 7e299a25404311ee29eee9349f1e7f876dca42ba81f44295bb9b3a152a27a2af - -Count = 1 -Key = 4ea997187ee51b478f5e1ba48b57f0f8 -IV = bb6fed9776ed61ca321ecdad -CT = d4d67723dc367cb453c5b8ede795ad2b7affcf9f42650c0ea1df91e23175a7cd -AAD = abeeb5850efb796979bb55a1d255350d9faae4d8 -Tag = def8ab2eda15fe03abee6b2dc9f6e805 -PT = 87e9f743a7bdf04a2d97c4a6c5d243666bfb2bc80c9610bdb079792a3f724e04 - -Count = 2 -Key = aa6d3c010d93c6ce4d574b5f4017b8b3 -IV = 9480e879335e1c2f2f0b1201 -CT = 752ffdd7014ef7dbb269b9e43d241ca94b578c1ee2052b26225450ba2dcdd114 -AAD = 5c03cbcbb53d7b44a47e247c0c8b77e5603552c7 -Tag = 63d1a0a5faf1cfa9f72bcec227169fbc -FAIL - -Count = 3 -Key = b77cc41840f9fbff1eae0b9b2fe914c2 -IV = 81fd55366b7903e5c21e96c0 -CT = fe6cd8c592c40acd607fab35272044cf93bf1b64a34ab001564f474990ea851a -AAD = 8c8ec50ddcc4c6526336caa0fd43d4dc6f0b71aa -Tag = f6117a62541d37d32d84e7ea15a709eb -PT = 65453a0933555d1f85d6f7faf9216b4bb5428885b995a27f30dfb2620748fc41 - -Count = 4 -Key = 9133d24420ede755f92b0c1013d794af -IV = 59e1ef4e934d9b730994a58d -CT = b9e3365f552cb261082c9b412568d2beec164c4b9ce078e8fa6f2e43ce661bb4 -AAD = dc27f9206bf8a3969fa6ce3fd3567ed71de9d2c4 -Tag = 01fbf3c551340b041cbaca24abc7f6d0 -FAIL - -Count = 5 -Key = 712768594a8e29c9abe255a8493a086f -IV = c8614fb0a60e377a625b9c2f -CT = eadb515d3167d2809f88bfe5fc2accf74f46f899981f44940192a79c59457ace -AAD = c6435e5cc2a492671bfd4e346df9aa831603d1fb -Tag = 2440a1cee5ecae8681f7c65874bd75ed -PT = 1839ac4e4177fdaa0b7ce3aec45303c9ab44335a1c11569033a4202655c48c3f - -Count = 6 -Key = de0b9fc85fbb73020fc97ddb63241eba -IV = b606b94274c5553a1e9602ba -CT = 155fb5effc689aaafeeccd281b4f9ad8c5188db05e0087150ee273350cf101b7 -AAD = ecdb24c9b274f30a2f6e8f213e08c340b4a70a3d -Tag = 94d02127ade107e784e5ce7957fbaf51 -FAIL - -Count = 7 -Key = de5c1ce56bd1a8f5368c79150f878896 -IV = 6180f7c5ff343b0e472a146f -CT = 93eed51d4f2a18271c9addfc27a607cc0ab083a9019a9bc56e16016c0fb0cf93 -AAD = 8f277e505f58a141c36c149bd21297e57db39368 -Tag = da304087ac5bf7554844c42aa47df060 -PT = bc7e43d5434b4cee596f8466b91ea364274ded8427cb32a769b8c9ef5013b784 - -Count = 8 -Key = d30801f1219679ca8e5c3740fc9921ea -IV = 1d617eed1a5d1b00185e025e -CT = 0016592567d2f1d15de34bcacf362184be63d25de8c6f829bfbaffa817f4ea8e -AAD = ee78be3b42b9d34310c764fd34ce638d7f9eaf4a -Tag = 551f52cdb49eb910bfe8affee48010f3 -FAIL - -Count = 9 -Key = 8716c8d8b1db8c88074fd2b26f8c1147 -IV = 3a267fee424de653482bf9d9 -CT = afd442f001bc4ae06aa10952261b3e91c915da30767d059264c4d8c4a572b5f6 -AAD = 32bd64332598fe7402dc46a90512086259913bb0 -Tag = dae1ab57f4e9bc8e8c1302c5ff47d55e -PT = 557ecae25e16315e3af7e6aed7108a050517fca5025d1cc73922cb3fbe280af4 - -Count = 10 -Key = 689903458e666b9bae962af6216e1c95 -IV = 2a99b776f5ab1381bad64b71 -CT = 2e1124dbe2997d449a297c1393ad349013f043b095573b8e9d4d17ba4d65a9dc -AAD = 065886527d81b4031dae7c34ad4792ed364293d2 -Tag = a985f865faf6bccd511be3d04f5a0129 -PT = 8990e990c2671242d33c19e06841a36b49b83ea94de6d3aa1e29834fda83a602 - -Count = 11 -Key = a1207acba1aa57cfefd920693bd18c56 -IV = 78c3f9e40dbb4feae5ed7f59 -CT = 30387a274a099e22864c8e3e7a0c828406d283b0941f6507a45a459c59e178da -AAD = 10ffa4cc7da0c9c8884cf204e403691f32def692 -Tag = 2a80c2c4a6e843b6d3ef50aebbbde919 -FAIL - -Count = 12 -Key = b0aa82e267ea60febf7220167bf2a3df -IV = 50f86a412cc6c599cc678d24 -CT = 4fd730f52fb80fcf9f1b48239cf0fe1d5a290f682331b01d876204ace098078c -AAD = 552fb2751d6694433850e8fc48b47874db07267b -Tag = 14f41ad80c148007bc596db99214c321 -FAIL - -Count = 13 -Key = b0faaad121fff2d147a4f0b166c41976 -IV = bc081b1f49b62e94b44a4454 -CT = 429ba584c05b6aadf4fe07c468519bb96e0b30c417975b455e2d8c242bae63d4 -AAD = 8930fc9bb08376641c76535bd02ccc71af12dbcb -Tag = 71d8196259ddd346d38bc7ec00b328c0 -FAIL - -Count = 14 -Key = 7f571d7053533f29cec3c08779edc7b0 -IV = 65aba6342903457406b3519b -CT = 9186587933ddc6a83ab8df4bf6ba7c7a584bb5ce19de4fccd0903108f691156a -AAD = b6c4bc5c14ad1344ce2b1483f78b80efded57032 -Tag = 9bb738194012c804160936f013978977 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 8453cf505f22445634b18680c1f6b0f3 -IV = fab8e5ce90102286182ef690 -CT = 5475442af3ba2bd865ae082bc5e92ad7f42cd84b8c64daadcf18f0d4863b6172 -AAD = ff76d2210f2caec37490a19352c3945be1c5facb89cb3e9947754cade47ec932d95c88d7d2299a8b6db76b5144ab9516 -Tag = 972a7e85787ba26c626db1a1e7c13acb -PT = e4abb4773f5cc51c9df6322612d75f70696c17733ce41e22427250ae61fd90d3 - -Count = 1 -Key = 87a0af6da98b86e82098c9a7564554d7 -IV = 1991750a529395fe5b802332 -CT = 9a1e0fb7ec85f1c4d82111c7ad73085cb75f8478f362102cb4c1c27bc38cf4da -AAD = 6253a0d0d54234476bda68f2a4db8fac5c21206f1bb41de2e3c0a06b9d068c4d8cc99de08d0c6720d5f06ee4f981c23e -Tag = 9cd38b99c212342c816263c802656655 -PT = 1734cb85a5df60143786fdba7165f286d44ea0442eee802a36aa241c72725e4c - -Count = 2 -Key = ab124c19896f9a725cd84bc65c0b769d -IV = 8be6b8884adb0acb19776719 -CT = a77bc17b558e829efdf4508c62761520a44920840c4d8e8cad0564931ffb6f0f -AAD = f3f8c4d2edf80986c33940a9dfce5c64ac314d9969bad730bb719a4a39551eda6b771b6941ba301a4bcf2c7e69c8a000 -Tag = 890106f841f36315a7fed2ffb57f2dbb -FAIL - -Count = 3 -Key = 2c691107ac3eeac8507f7275d35daa6f -IV = b1c7fc99d810d00bef25163a -CT = dbb74c34d430d8bbc1a859418f0435c18deab7bca9d2c7ed3e9a1647de0e5f62 -AAD = 78e36ff5b2be643c948c1bec4153b2e9eaf0bb4a4a92079bab1fc42f3f66f25d075ec82998993c95fb8474b8091f4968 -Tag = b6bfa61751a82d581436ea837de8c483 -PT = 42f707406147678db6f51122e58bcbd4b9a8fd25bfad242aef6fa516663fd0d7 - -Count = 4 -Key = 078a2edbd9b6e86fa94a046cb688d6b7 -IV = 26bc3ee0106ee36e8b081fd8 -CT = b8f270f2b8bb2fa214eb35ad946212bd428390ab7ef652fc3e8c2226c3bc3416 -AAD = f93cdfdf0a98cee33f2f1b485c0e7115f7a56c80b0de75d4b7c87a28036f8e1fa916d6cc78f28cb3c19c19cf2173c5e2 -Tag = 0546d0182a212bc2f7ee185c4e33a510 -PT = 2fd09e96f27b31a8a22b778871bf71e9229b18e5ef42e28efbed8899122510ff - -Count = 5 -Key = 82d166bba1e5828f761e4231fbd2c76d -IV = f8b7d0adae5e4412b7287d89 -CT = 15f880e5c31c00240d2ca990495b597706939c9475c14a2a65582e93263d5479 -AAD = c675c578ee2754c12bd5a5c224c76d9aaadd2a1e7b70e51a1d6a13c9b2aea578444dd8b28b457ccf7cb28d4780fc1f86 -Tag = 4ee3f9cc35eb9d4ea65f162e8d6900db -FAIL - -Count = 6 -Key = 7dd5c39e6c6cb282a57930fa453c02d8 -IV = 73d4f1c8f69005370f509513 -CT = 80510c8914046fd36efdc24c3dbc74dc8d1903d7951603175d780cf95a4cd25b -AAD = ffdcf3d0a8ad8259c3f44f4abe72864e2876dd3c988658d78cff9a48fb6f0cff5e8da3fa7473e23e5efa5466fae7c01a -Tag = 456968965fd36c13415a701ebc77720d -PT = 56ef49a830c1b531843ba6a143b5eb7eea88f5f9edf9ef68e1c86ddd8b2ef9b7 - -Count = 7 -Key = 65541c7a7af95c50fcab82c9e8d24be3 -IV = 9e8491154a9fa91e35921039 -CT = 480c33465d805349beafeba53128f5ba234b8353e7f86ecd13992aa9aaa8b933 -AAD = e4f223988ee19c5065680ccad637240eb7bd659feefb0a8db0a5935ea2096cf5e9d89a1204248d00a70e102a9abf398b -Tag = 818f7229a392451112b5ae484c40ebb9 -FAIL - -Count = 8 -Key = a89926044fd23eaf3eaf8c6f05afaf60 -IV = 0506ee0c664394dc6c857d8e -CT = 329468ed34820830fa4657322b909cc6914bf51bea00a74b703394947dc29c2f -AAD = af6ec49868cc4ae5a12e677ecd60679da0844ef8316078ee5ff8faf04de53c9c6bcaddef8b0833155c9579636e82b6e1 -Tag = d5d610ea8810931e7ddf226d8569a54b -PT = a351f1709707501305e57ae767e89a7340f148112c1122734f68946267afff7d - -Count = 9 -Key = 8d36faf9f30ec69b5f8dad1e491f0f3d -IV = bf58466a6c70bbaa39ff7eb2 -CT = ace177fedf749b0312052ab77ef8074ec325ceeee3859177f6c952e7826a661a -AAD = 3535b93a652730ee47bef47650ee4f1f30a6c70491d0d56427caee2c4ee763ddd16575b6a3dee65ee7ab3e508ce6b8c4 -Tag = 324181117f39f500e7cfb6bb851909bb -FAIL - -Count = 10 -Key = ce54095bf5678115a76a89c4130450cb -IV = 788ec8fbd3cc197551739ceb -CT = 088efa30b927a8b21b86fa0bbe4e9ecdbcfcdb0a3379b8e758092fe21b23c99e -AAD = 634e3e6d72a31879f8030736957a9f89896475f915f627e73a32c9333ecaa2aece5e98b90a5668e6ec92913e3d91e570 -Tag = 9cb0e77f5b403ff85152a30a154457b4 -FAIL - -Count = 11 -Key = 99b3c4b8f2329a8eade022b7fb4f26bc -IV = b72d8545efe1ab84f0455e91 -CT = e5a56edcc5679aa2e7301119414656b406ddd7822c2de4772b8898ea0761825d -AAD = 9fb2c737e9c7de8052221ac0b76cd2a2289fc59b4cd646bb9622e30ea227f0cca33981ff51f27afde410f99ff6a810cd -Tag = 43dcad1123d27635015a5c42296199b1 -PT = 6b6403baa0ae0b354eb25641a5e958b5bd3f7108694f3ed019d1dc5ea2695625 - -Count = 12 -Key = 924b27bdcaf559e4a7a7d6c6332904b5 -IV = aeaed2c7b9a78acf83ecdde6 -CT = c190e4798254ce50ecf2fec69a46ee9a6ac9528dcb25ef72a5dc2b91cda0017c -AAD = e6ce29b8810499861fe179d3eee4bfdd2df25de10533e1334ce16d41dab3e8074f91943f2a3bcc7a04f657e84e9bb5b9 -Tag = 0aea374ec34347946cfbc4e251b7ee2c -FAIL - -Count = 13 -Key = b12ac950027bf3ac01df1cb743553a77 -IV = 5bbbb442bbc5114f949a274e -CT = 53738852ee4cf26c4e41675b31aa04d723b314a22924fc3a12d474ddc0771f8e -AAD = 81ca7d80c572abf9f9f3078258370b7763d603380bc536879e81185488bba8d029a18eebccd2eae9812c4af45e8758cd -Tag = 2310aac3905edc0ff5839ecc17fd43bb -FAIL - -Count = 14 -Key = 6598ebb72aeeb3def673f6fbbd9e5a2b -IV = ad29f048ec023dbf4e6b2f48 -CT = 0ce27f78a31a177741922fe99b1f44b7386e4ae5a1a666d6ba23ed76e61d3954 -AAD = 1457f349d36bfa595609ec4c174114264f1a5993264ea51fc2ff4055e132f3062cfa671a16367798f77c9c3146fc3cc0 -Tag = 5ea456be8c8cd7d1f18888ae74e16be5 -PT = 19832fc5a9d40d0cc9c7c2de8009be8323f79346b040b30551006eae72eea264 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 07a6be880a58f572dbc2ad74a56db8b6 -IV = 95fc6654e6dc3a8adf5e7a69 -CT = 095635c7e0eac0fc1059e67e1a936b6f72671121f96699fed520e5f8aff777f0 -AAD = de4269feea1a439d6e8990fd6f9f9d5bc67935294425255ea89b6f6772d680fd656b06581a5d8bc5c017ab532b4a9b83a55fde58cdfb3d2a8fef3aa426bc59d3e32f09d3cc20b1ceb9a9e349d1068a0aa3d39617fae0582ccef0 -Tag = b2235f6d4bdd7b9c0901711048859d47 -PT = 7680b48b5d28f38cdeab2d5851769394a3e141b990ec4bdf79a33e5315ac0338 - -Count = 1 -Key = 46bffe71ac52d4cc327b612469ccfb10 -IV = 78496f5e653ea0111b0ef4c9 -CT = 8c620a9245557459d7631f0df5935a9c4f05ac7f842e31c270264451090c21d3 -AAD = 954dc3942300fbd61bbb7e1c6a00836ec3875e6c12656df3affa4605200e4adf429731f6e7386bf43744cc252db523a322312702af68018853aa39a61ff88ce785ed727e0916057a97fa0c3e6daafba1aa79bf597ccddc4b5b97 -Tag = 20fe30dec5f3a5a8b8117afe65b81ca3 -PT = 59ba37f99a3be7b216f2a70dbc132f4b5839a5a57b51049daf9392afc02d9355 - -Count = 2 -Key = e306843ece9d0e98edf07aa3d1e3b6ed -IV = 9cc69f1c75cf0ee74f3a4ef5 -CT = ef59d545d7e921dcfefbaab0eea561e1c8cb12d27cfae589ddbf9c5271d41453 -AAD = 76f1e842634fc3a22be7b899d5616d125d393432c897f7994012f8c29934ff33ea4fd3495a52a1e3ea587a9116342c3ee304345d5e29102560df81a492799ec689e530dcd3e52711eebb43c66f645e5595abe5eaf8d462049d38 -Tag = c34930f3143b4746e574e653dfcc524d -PT = 0bfe265de63d70091b4f0537ff4153bb1e07502c55486f089873fdf38a9319db - -Count = 3 -Key = d0edd41ab297cb5d5df6b90a3cf1768d -IV = da4ef7e726e3a39d243c8444 -CT = d1c00496494bbcfefb04c5214657e9aa5270cd55e631ea914540312aa58ccd81 -AAD = 7a11df8fdef5aae36cfedd41565bad36fffbd6e6d9668135273e226dd83bd3ce84923a158747ddefefb12d156160d1abf3f35e1e689c40c2c0214ebb436c87528b3699e75817192894b54b47e3f508095230744b1b12f699cee1 -Tag = 7b9c7f4e5f471036ebc16c825f7e8e7f -PT = b9077e1f9787facc6fa5903b03d90af119454f8190f87391cb356e277cd3f06c - -Count = 4 -Key = 291567951e7d6e7442261b66372b3a6c -IV = 5a60ab4b00333bb34e292511 -CT = 0de6fe0eb4d94284388068226a84d6f86f181e320840d3f28a2bf6b92a17f7ea -AAD = 48055efab58264015eb49fe444de55edca701e09b679ec042abcdcff978e2b7eb74d0be0a84c858301cc415f5159f2a531138109fa5c559e770e6040f38ccf9302b790282458bbf99dbb494ae5c348ee4ab0f77d63b9dba6de56 -Tag = 38af26303a1ac4f8a5cb58420fd34803 -FAIL - -Count = 5 -Key = 44a0482a02ecac36d03d074949ca7815 -IV = c408ab22ba66b18947e3559e -CT = dc9d20998356985d299d81e965dd39abe03a1c04eb6829f531bc3d622cdd6e6d -AAD = fde37b7c9af3bbba7501d7b91dc456e32a6af77da2afae3b28c15640f5d99eeda5bde206d54c8def9c60eede741f4e4e50353119bb30e2523f073a7a367972b0c90e96a88a511646cfe24468548e50ff520bd5b8abb2a67d1304 -Tag = e013def1d2c5d1c8cfcf37ff1b99fd6b -PT = 3a995dd4779114839e2df602a4eca9c9e96f774aefdf3a78197e1a724de86cc5 - -Count = 6 -Key = 1edd5afd2b7a09e87528172eba3b4ece -IV = e8cc6fc5863f531860da48f0 -CT = b3d8fb923602f6570dedfd35392a78b3c6a824f6b0cae18f767bf17b51dbace5 -AAD = bb42f41f140f4b02f948e2e8022ecca7d74208171c52792989df161dad0d689d69e1ddcedc2dd910c6cc80f5759233ff9d39a571f48f42db1491b4d388f70925637bb6728cf2d47c2a9ed62240e2c948755750048230995fbae8 -Tag = 18e61e77a0da2f9212e49d9dbf1e4dfc -FAIL - -Count = 7 -Key = 801405876cbb2529d3fbe75ff683ace0 -IV = 70c46c7056213d4451f5e5dc -CT = a24f742c07d0ab8acab04f8fda4da7b5ac05728c0a7d5ad3bad0a0e845702a05 -AAD = 12942eaeca76806a5761cc76423240515f8f5d9b0d97557c5edb56db35dcda8a939b6375bb0b51ea7b9b67129304f82ce18f4a89edc75ce3db06a2e8607305de65349e4a6ba2d7ff8a13642caa59efb2b81cc050809bc52dceb5 -Tag = cc03cdbd5b6bd5b8614a456e2e14c6de -PT = daa772583ff5d445cdff53f0ddfd509ec8f93029ae0809b6ed54a91330ba16c1 - -Count = 8 -Key = 35f32d1f51d7d568ec80ab19555499cf -IV = 4af3095403b32091ca64c69e -CT = 4260444f1fd74ff30b0a8aefdf6b4bb39841678efe2ae7bfefc50d5b763fdf5b -AAD = a85fc884c10eb788e76e31cccf459b48d7e0bfc20f364316ced3ba81557ce3cc954357455e2998f3a9f3fe41694a8042bcc42a35fec042f1c24761b17a972e7d8255d0f1256dc8356e02baeff99e6b35203e71e4a95f61227ef6 -Tag = c659d690592881cce6eea2d6723a63ad -PT = 46eaf310e55f794e5b33429169450590272513b881df740e377c6b2f7744db78 - -Count = 9 -Key = b4aa6cd190092a887d0450302cff4464 -IV = f2dd629677deb47e9f6a87ac -CT = 84b74187e987fd293d743f0a42943ff52b6cff4710ce8adf387d84d9899df368 -AAD = dcd080bbdcbba07f1b9f9daef2cdbc2f9d579adf42b2467454cb2cf5233b753ca3ad04c61fb832e77ade745d600621ddfa4c14601865e013d3eddac8d2ce3733be0e84be1765200d778b9ae1bc087a97e89c9532971ea2177ecd -Tag = 6d89454ba2e6506d2a4a3fa1339af144 -PT = 75f80807a10beb8dace8bd1200bd8c2589abfa789b71257a9c7b15c0c14a89b8 - -Count = 10 -Key = 632072de94a0b3aafc8faad0337c3dd6 -IV = 0fd43cfaa52a7ede50c1fb48 -CT = 1a735b4723ed2eee23a5ec5706e41e7488b7ae34a01e741ba30c851b7a570e9b -AAD = 24e3af0dd3492e86598b8811e03d689b3802c972f081655320418045ceb7390f52592b85fc90acfa4717dad6e05c10957e33dd1cde30d127b759b2a03f3289f49cf3992d2a154f7230d50dafa57b7e78402946f17371661d1945 -Tag = c5e92a4b0ba5729de2c65c4ce33c0e8c -FAIL - -Count = 11 -Key = 7bcaaf0eec55d449c74b1af7311c5347 -IV = beb7a8feae23175e9920b9e2 -CT = e523e45e26e09f82af160d9965973e933ec5416a5af200872f0a3f5ff9121438 -AAD = cee02585c352bfe634591b2160ed76fadc3d35c76ab99687d4f7d1462d05ee25d94ff565ac77e7d12e911b07cda480e8032e48cb274ca96be27e85af6bfc4309b874f567d2c818fc0d0e91ae36c5123772648c73f7ce4c6490a3 -Tag = 3764be1d6efdedb7609fcdfd02c4b012 -PT = 39584163ee47e7bda29badece03463793c3cd6a0afeabd0c45aa6da2000ef275 - -Count = 12 -Key = b7b21207686125ded8a5763c217962dc -IV = ec7be05311b9fa04e4bde222 -CT = 345c41f07f6c6217fc134930ecb9377fa30992d63a0c07148a4fdcfa25484c4b -AAD = 885ed7046e3dba4be59d035a2516e382b07d3d7f3e68d9b654803b1dbd187a14f310209f5b3ffa51dedb59f0afdde54be81c6d8f431e547f8ed205d4c8b8d7d895e5bc49ae7cf304b5944bc01e096e0ab9079c2bbf10b40a6ff0 -Tag = 3b0e0bc5aca7d21285473f5e65c4afbb -FAIL - -Count = 13 -Key = 0dfa4098fb21873ced3cef3e9b5a5d92 -IV = 3a8a1cf096a5292324c3b890 -CT = b865ed2baaaa832320688c9da7854be242aba6f69258953b26730698ff08cd9e -AAD = e4fee49532d867ac44cca79d77c50297f0221d95bb2d668f47a0a49ae0b12bab67332b5380a9914c3952265365b558f94132e6b0586f40778e91cff0d47dad9649f56934934059a82f9fabedab8d27b0be782296d537c2b3a03d -Tag = 6163df5982acc866a8077c82a289fa3e -PT = 6cd946e61a36eb0b6b3ec580b0c463ac56fe8007906167d74685dc7bf69f0c88 - -Count = 14 -Key = 07fbf81cf98e000695b32bc7b0e2925c -IV = 67424e386d0bb45d1a7959f5 -CT = d8f277d9113154b4f54b0d0d717f339c27305254ea3eb87f7cc591a98d48cb31 -AAD = 7b34c644170bebb1e851f45ad7c6fc9a125b159f6bc6377d76daf3a4384447ac6c570919ad7ceac660b692d92624202110f85804399492feb2fc0e889e93eba61c4ee59d478aecfc53a88d163064d8e8fb5caf1d2d26aeb87a46 -Tag = 8e946decababd58afcec508278f6e95d -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = f3c4c058c7f0965a0328f0f011a128e0 -IV = e96098c39d9aa83522119355 -CT = b42c25155820564b41c525c6aa8ff4363c7c511917772b9bcd574b0be1f6b4ca2153869ddf0c4f76dfad3aef0a76ce056582f9 -AAD = -Tag = 44331e39b8a66a81591ed155d7d32372 -FAIL - -Count = 1 -Key = 93ae114052b7985d409a39a40df8c7ee -IV = 8ad733a4a9b8330690238c42 -CT = bbb5b672a479afca2b11adb0a4c762b698dd565908fee1d101f6a01d63332c91b85d7f03ac48a477897d512b4572f9042cb7ea -AAD = -Tag = 4d78bdcb1366fcba02fdccee57e1ff44 -PT = 3f3bb0644eac878b97d990d257f5b36e1793490dbc13fea4efe9822cebba7444cce4dee5a7f5dfdf285f96785792812200c279 - -Count = 2 -Key = 2e6705fc4862967af3aea0785f6da759 -IV = 7d9280f59dc2b98f0195098d -CT = 30980d2634138ead42c3347b9b3af32f78ffec0d7686b9247f8ef7258b72859276d9d33eb670eafb3ea900c32db9befccfc1d6 -AAD = -Tag = cbca49ce70d3ddb752dc3b438f2845ba -PT = fd1b20d58e51fe93d177db518416e632212dd1effb6b5fcf51bd94234ab96a455d8e3c84ca03b26d58c8867b6a1cc390828ffb - -Count = 3 -Key = c36bfc62ae2b4969dbe23b7332eccfe4 -IV = f9651d42ebf8468eb6e45829 -CT = f9296beed3d3b573f72cbde4ad832e34e8ef6cf7178e8d2783fff5ec8359daf67df8a70d8f86d2c339f9e1ec59d234e4f61938 -AAD = -Tag = 46ac46b455e9f483a8eedf6ef4b61be1 -PT = de42199c477b69de2857100395aefb2735c8328331109d647eae535c54200869e7a8bc82f461fc6c474748297c341bd22126fe - -Count = 4 -Key = a02b7907be2c2a5f8c40127c27b609cd -IV = b5ee4456bee99ab857120d1a -CT = 0a14bc62326c9af9960b896018d98c792d6e0456435005d65e60d553b4ea733ace7dcfdcef0c7d86a6f3065cab8012a4cb2cb9 -AAD = -Tag = 8fb36293be18a68ae7160fc848cc9cc9 -FAIL - -Count = 5 -Key = d3c4f95ee0ff93f67dfd7c6b65786a71 -IV = 18be95d32c908294ba908e76 -CT = a18dfc65d0d8e9485776623cd0a3bf77d05482eee64e97cbd0882197800611081198439a11e226c3fb819849230f1fca9a89e3 -AAD = -Tag = 0f528349ecbb4bed97e9fe8ce16161bb -PT = 51727be06b95ed04ec1f411aaf5b214c58f21782cbe9b624cb28229abb8f9d8d673b903c12eb9147c40cc58e81525d86edd6c6 - -Count = 6 -Key = a2526f5350c42e0772063ec155f1e1d5 -IV = b4f8c85c0d743a99a6cc87e3 -CT = 48584a611dfbe46c3a7cbdced160032945193cb8dc0d551080d162b47af7da53ef4cb1896fc01a5dcb8e38dd9784b86e804ee3 -AAD = -Tag = 65e48ba3b15b7478b885f8ccb52392f1 -FAIL - -Count = 7 -Key = d4c653fd951800ebe9c4a43806f294cd -IV = d3f54fcd5d7a85377fff76d5 -CT = a8464c51b538232eeaafb3c28f92773776bc040e9570cb1041ea69a28570f15bd284acdd2bf2e732d5e37fc4f71a9881e95f32 -AAD = -Tag = 88a2ae3bcd70d70c0652b41623287472 -PT = 38e1591924b8c3e3ae70955767bd33525223d3083245d0dab82bf55f2f9a0cf89eb67ac7fff56790c0a1cfd17dcfdab24fa821 - -Count = 8 -Key = d925a80f584eddce723da5e2c6dc2225 -IV = 90fa88a5d494154d71186705 -CT = 484049f8c5d49cee54d7a4f31801bf0b3f7b67c2c18e594117d413238f80e45e6322f389aafe7751abd15bec4ff0f6209add28 -AAD = -Tag = a382b14879dc59d855182f2a324569cf -FAIL - -Count = 9 -Key = dcbb9565d2f07f94a95f7982728f4624 -IV = a3e76752362e13ee7df5a207 -CT = 5e1789e0a24a72bba8c5f775284cc31243d62ef474db73bf73410be4abf80c860e1470aa98247119e558f13bdc4e9cd802aded -AAD = -Tag = 1a7bfc1af64c5e08741f1080064f89d1 -FAIL - -Count = 10 -Key = 838e8ec1da4be60680c2f7a03c050975 -IV = 33a4203c8a85bc83117dbb8a -CT = 19210a21ef00ba0e17ba8e1d23eca7f8f2e4cdb13c2e3f87a9ca0e361736796fd3720598e8283289aab0a4afafc13a7cff0437 -AAD = -Tag = 692270364f737ab2f31f421a48fb6b8a -FAIL - -Count = 11 -Key = c62f464a146cdfde1b23999bfc27715c -IV = 5bac8eb5030a81cf2782974c -CT = f8407943de543fabd5c6d2c217a2567b895847b3031e46fef6a20b9446b395d3a751633ea14dc49c36805a66eb466e028c0eda -AAD = -Tag = 150feaaed2ba2ae459f8f0f28fc2c27a -FAIL - -Count = 12 -Key = 3a2b2a1f2afd731648fc60c2d4775422 -IV = 9fd376abd09e6599986afb96 -CT = 813a8d7c46d0a3504445dbab48a546cbed968c574645fa696ffa9b5d62ce394ee35a204c62edf8d04c7ef621ed519c3b7a7318 -AAD = -Tag = f259e62193f1eefdbc6ec1ace305f78f -FAIL - -Count = 13 -Key = 1a77d432ea3555b56ce73509f90e4e47 -IV = c54136dc1525ed4f6dce4ba0 -CT = 33f094e27be6fdf62b901b980471b5e4d19ed7bd1b8ebf5b3f225f3e0e2669e02c74630f43472515806bd3d37b9b20f21870ae -AAD = -Tag = d480b1ab8a8f661d907c7d45bd8d2883 -FAIL - -Count = 14 -Key = 63193b6e66daedb9d566677ca4d3b129 -IV = 313ba09226bee694217f5cbc -CT = af18be0edfe1b74fc327d447909347c1e8b22f24eed0c545ac76f2d8d48f3c673b300b1c2cd894455c2232e052f078f0af71f4 -AAD = -Tag = 96183cc5e22937c15b78049d7cab2181 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = bc22f3f05cc40db9311e4192966fee92 -IV = 134988e662343c06d3ab83db -CT = 4c0168ab95d3a10ef25e5924108389365c67d97778995892d9fd46897384af61fc559212b3267e90fe4df7bfd1fbed46f4b9ee -AAD = 10087e6ed81049b509c31d12fee88c64 -Tag = 771357958a316f166bd0dacc98ea801a -PT = 337c1bc992386cf0f957617fe4d5ec1218ae1cc40369305518eb177e9b15c1646b142ff71237efaa58790080cd82e8848b295c - -Count = 1 -Key = 4384629e9b1686927e8508243be1d01a -IV = 84ff7f4feddde7d89d370e7d -CT = 8f385490e9622a6c1009900052385c23442890d2af667b210d012781e62d0de311f2149cc377a490afcc686cd92e7c35dc7e5c -AAD = a51cebf08d0f293e3a83bea5a9f1cc6d -Tag = 00097982ccc985671477cb1f1a250bd4 -FAIL - -Count = 2 -Key = aa1b3a94882b9b9dde8c8099a7af1830 -IV = d56abb827acd6388f48f7096 -CT = d145a79b9a97ecf2907ab0372c6eed310cf32e7a269374fba920c99eded54bc03c873fc0acdb895078bb8bb336fcd2662e071f -AAD = 503eb74ed7b0ed14f221d55638fa4fca -Tag = e0861f6a706b56da1b1fa8f04a14eebb -PT = 8b9700bbfec195f96f28093002217703970126e4b209e585719c066e5c7eb8c48e7e8e6b3329cf5980eeca49f80bf121de253f - -Count = 3 -Key = 5a85c2df1f3c0baeba09b8f532cfc8bc -IV = 9e8dfe8d34ef979508c00cda -CT = 9887db619566da9fbfa073a667168a85fcb94700ab267d30e3ddac0f8d1ac0f6f7d63ac02d2c28668f933ba080da521032ebd8 -AAD = 27eafefcad6eb8a410235ec3969ed11d -Tag = c84326d0247aa00ff3ba886da1f2c966 -PT = 63ef1aebf25de0e7e35a602e6d86c95dc9ff46ee0223b09b5332cb28a9b0d94486394cd442c93cd854ac54208fe1e1c64257b0 - -Count = 4 -Key = 9cb63a6932a7e7b210b82e854ed2389b -IV = 7d3498cd4af4387cf747dd50 -CT = d73bfce17382edd23be968d9da3bc772c59378d842183f4d11c028abfc9eca44a416a96a2058152e0ea83f42bd48ee79ed3acb -AAD = 188164c9a24f8965720392177138f354 -Tag = 5ee3c2452ccd78f780b8ffd0329f8df7 -FAIL - -Count = 5 -Key = 8b87af542edb66d468e9eb02f60685b0 -IV = fa7f13984e724612b22f4e5e -CT = 969cd236712e4a06be8c1f1a211f2c8a0a94d8b06bb05c72fbae4ac86ae2afbcb63580bf7261b4fdc829faf97652dbcdf54b3a -AAD = 7e734ddab198244376534bfe5024437f -Tag = 4305efed9cc20237daa32dfb47b1c276 -PT = 1b3898e927cc948ccb340e4ba46ea23095014e055256319ef4d114aa4ae67c520c9da07a0e2152b180505862d4c04eaa67887a - -Count = 6 -Key = 9f49f4aedf07cd2060cf4d12a7f40e34 -IV = a52983ca2faf10514d1369e1 -CT = 8df0217ef038eb6c03f3500833c3ac218dbbfe29100b9f48554333dee461b867dafc16089e6ef0c6c4c8684d307a54f0ccedc5 -AAD = 3ae716e481e36426214ad512fd607121 -Tag = 5bf48a795284ba53f0834940bc155e32 -PT = fecdaeac7f30ec39a6732a7829b7905141aa50f9ec65dd0efc5acea9349f585d61afaa4c0cb55a60e9b12a8a1fad98ea3e6bda - -Count = 7 -Key = c3a4add425cfc13062634ec4926059f0 -IV = 9e79f25c956adfeff8f71ba9 -CT = fc4a252f4179ddabf4c1cf5837526fec3cfeb3134e6d2cd70f1cf5eaf3beaf8ecb364e4256d529b930f524cd264adff3bb0211 -AAD = e36a19bea0f26f7a7117309d48a47cfa -Tag = dcb137bd2c88b60a7ca442ccd042061d -PT = 3c0d5f84159bf11e520b2d1405c5c26fe94a8482da1b420cf6d8df5a536dff7c39cf7bbeffdf60365bf9a1b0bdf35d299d9043 - -Count = 8 -Key = bf156813577aaed10f105662a2564005 -IV = 2dae894ae0848438f6e7f589 -CT = fedfec37d41795795c890472db7aa9cc9b59c5c86d6331466e5e5ac023a6f1e2855777f905794138f9b19a20dd4f9339b3c5c5 -AAD = 8c7ee403c77c861e6b75ad65f70d6cf5 -Tag = 0b50277dd6cb68a185b76d1dc3c0c3ae -PT = 9bee8e3b0daae03815fee8f548d06725261d1c213e7df2b87211655d60f7a122aa094967d54fc02cb2a51f156fba9294876c56 - -Count = 9 -Key = 1cee4f13145b8ee79c33755c4f60c299 -IV = 90115ee9a8c2fea38fd2b2c0 -CT = 7ccfde4eab711372bb28f5474797afc3066cb2befb84e66520526e8142316b986bba83fd928684c3131a866dc95c977f908dcc -AAD = b386ba008df273370459643b05e384f8 -Tag = c64979df36723089cb13bcfb2667c16b -FAIL - -Count = 10 -Key = 6b6b8a1fda71d168071213ed5f16e3a8 -IV = cd5cdb482d8d2a850ac528b7 -CT = cfb2c9aaabf3bcb373104255c6ba7c98bb88e7c446dc5b5caa4118c89c1bcacf1bfc7632d3a59ec954ad1582dc50970a57ea37 -AAD = 6ecfc978c3cf0dc721b868af6dd36588 -Tag = 87d16126f3b440d792cd4e69070e218a -FAIL - -Count = 11 -Key = aeb9f141348237ab152e0fee7765be89 -IV = 645cba3940f7d8e94d6ab775 -CT = 1db852ce89b10b3ee6dee42b492960be1838ae08e84dc00a70e217a9e83a436c849e7921e76af967e3574d65a915c854fb10ff -AAD = d3f8f031c70d75e26eb56c3fad82d49d -Tag = 69adcb30c4e12ff4eaf6e8e5ee8123c4 -FAIL - -Count = 12 -Key = 65dbce79d38150831274a718933b1207 -IV = f4f72eb6f3195327089dc7bd -CT = 70f31d645fc671cb4b79ab6ecf265f4ee9cba5febd2f73ceb44a7fe2f028efc8ee30b9eedac5bb7ccc11906e111029ddb3c545 -AAD = 6adcab836f1ef8ba1a9a089c5a6f5da3 -Tag = aec413c1e013af99cf8189da009adf63 -FAIL - -Count = 13 -Key = d6eccbc171f2b412acaed30238715f60 -IV = 90d0754b0ddf108afe8d199a -CT = 7c89057bf0c94527b3a63be13a963f76022896f0c98fa364934f71e997dddc09e778b71d009d12df611df0a9ef3cfb944fb86b -AAD = 217f2aedd907a8f86cbcce8d16a13744 -Tag = 9e045825b670b964a263c73c9a636427 -PT = 9da6e3f91d5f0ed62e1487bf9bf62ea8dbcfc56827731450a43f347882daa97cfb9ffdc79500bcf1601b397da076218b36cc9f - -Count = 14 -Key = 89b512544b5f39266fbbc0a770770d7a -IV = 97748e40699bf90abc46276e -CT = e0816c13ef928eb00f07444864fc7279b617543282a7e7c8873fdd352411afe457fbb4ec41e68685742948dda2cd8e09104110 -AAD = 1192973746283ab4657e19cd63284dcd -Tag = 136835fd131d43836ff2de3efabef747 -PT = 213f23341507ed5a2c93c1ef2007bee82786ab109f8d04e6cfeaade1bd895499f0661ae095132037200278a9bc3460a0716cff - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = af57f42c60c0fc5a09adb81ab86ca1c3 -IV = a2dc01871f37025dc0fc9a79 -CT = b9a535864f48ea7b6b1367914978f9bfa087d854bb0e269bed8d279d2eea1210e48947338b22f9bad09093276a331e9c79c7f4 -AAD = 41dc38988945fcb44faf2ef72d0061289ef8efd8 -Tag = 4f71e72bde0018f555c5adcce062e005 -PT = 3803a0727eeb0ade441e0ec107161ded2d425ec0d102f21f51bf2cf9947c7ec4aa72795b2f69b041596e8817d0a3c16f8fadeb - -Count = 1 -Key = ebc753e5422b377d3cb64b58ffa41b61 -IV = 2e1821efaced9acf1f241c9b -CT = 069567190554e9ab2b50a4e1fbf9c147340a5025fdbd201929834eaf6532325899ccb9f401823e04b05817243d2142a3589878 -AAD = b9673412fd4f88ba0e920f46dd6438ff791d8eef -Tag = 534d9234d2351cf30e565de47baece0b -PT = 39077edb35e9c5a4b1e4c2a6b9bb1fce77f00f5023af40333d6d699014c2bcf4209c18353a18017f5b36bfc00b1f6dcb7ed485 - -Count = 2 -Key = 52bdbbf9cf477f187ec010589cb39d58 -IV = d3be36d3393134951d324b31 -CT = 700188da144fa692cf46e4a8499510a53d90903c967f7f13e8a1bd8151a74adc4fe63e32b992760b3a5f99e9a47838867000a9 -AAD = 93c4fc6a4135f54d640b0c976bf755a06a292c33 -Tag = 8ca4e38aa3dfa6b1d0297021ccf3ea5f -FAIL - -Count = 3 -Key = 231025c304c626f119964a708328d25a -IV = 9f60d5a70a0a1452c50d756f -CT = 0dfe5a02709ec9fc6515501f16df29c512832f4f3da7491a8c1f1e149d131bd5ca05b803c8ad15bca743cb2c6308281857b8bf -AAD = 7e2b3efd33751fb7df561fee3f5f141433ed3b19 -Tag = 42ef3d08f38e9825b8800e56f1194ee9 -FAIL - -Count = 4 -Key = cb3354e8dd509bfeffcd8b7da33885d7 -IV = d794deec5973503dda19646d -CT = 20e1eb1572308afca40316934df2bd1d55131aa5f9abc06ebeddcf20ab66a6dfb562f54b7490fcb9d7d9bcd52f142edfa3f676 -AAD = 0d785ef9026b7e6a109adbaa7842a4bdc5461875 -Tag = ae92113005dddaf3e80ea809bd8fe899 -PT = c727894b7a507d5ab124a9fb14495c1d5842772e0d339ace3463a481967b0d7bfc16756ed18ac873d9119eedaa20bdea170dc8 - -Count = 5 -Key = 5a577dcb0d6929718fbdace24c03fb2e -IV = 54e4b51f37adb3d6696c58b3 -CT = 1712451494cc4dd30f779bc11f20c71683354235c69a1e3985e4492ec3c692781c5939f8bb73f14dbba37ce0ee640e24aa8a4a -AAD = c019aae892687a88946ed08115681ec79764369a -Tag = 9e201c975e3a938074a35c7e51a0d38a -PT = a457674bb83b3210e738c169b412f9a76ce77927265b1cb4f80fd336603a8363f3a287403969871c0d4085eb39a045e2b961c8 - -Count = 6 -Key = 04cbdcca86b9353d25c3d3c2b340453f -IV = fb594bde6c7da88bb4268c6b -CT = 22a7e51fc2b61ccd6367b3f4d519c725012db48834ba5e4ac89f7a27238eda54086cda0238de9abdab8231013e6692c17bd2d3 -AAD = 39b9ab5ac29002de6c6f48fb744a14b957e618d3 -Tag = f870268f770a3bbe7c3347b9f9b08f1e -PT = 0f8527090a793da125cc3a4aed04b5a1abeb0d09da7602982c686936734f874888b2f4b8c37c526b0b2005a2dc78dba7c8c47d - -Count = 7 -Key = 4d2fc6325a7beda38f12f9c4dae62e15 -IV = 774d52fd076c1d1707e024b0 -CT = 67a43f43fce9fb7303b0ec4544887d70c811c0b1dfc923ab567bccea494d0913ff40b7cb70d89e7b5096fa942d5747f8c245dc -AAD = 225e4c071fb10cf62d8529b5af30c29e29fafd30 -Tag = 97f586f1c395bbb05be58b891c48fc43 -PT = 13ab3fb2eb0d6d37637a0a1761911addde76f9b451d16c8e0dd562b5c4ffd8e59e5ac08d9321b9660605cbfb06f33ccaaeabc1 - -Count = 8 -Key = 53a2ed1d225b63d4bb45b5225d8fa21e -IV = daacea4f24319dee2afd9cec -CT = d58eaaf85adccb60a952dca9b72d8144eeac455ad9c3d558e64220669e6333d3e01d8d7f74cfca6d15480d564d2acf6110dbaf -AAD = ac25e4ada8fb3160b2bb5b445f35b885ab0b42de -Tag = dad2f9fae9071ae8fb21f3f2d7bf4ee1 -PT = 1f6666966c94ed3f2c4586ea8f6b9bfede55a396c6e4cdc014ba93b272d52c42081aa8272552d4a6862a1543439042e3656312 - -Count = 9 -Key = 441e2093780b7466a736cf9fd56f505e -IV = 29852c4f9e8e560bebda507f -CT = 3f86e4663af1108480e9ebfb1c4ff8cbbf2f340658b91953fa51bad044b3e900e38e66475115c203f9aab0553efbe7c8d3488d -AAD = cb79774fe3859d571750a721da0d0d4cde40a703 -Tag = 35d94561193fed46b6468672ed06f848 -FAIL - -Count = 10 -Key = 72e26b401f5edbab8d52d85b953c9740 -IV = 7bdee59ca460dcd9a9026c00 -CT = 326d6aa5c731fe350872edd4851cef3f52d8b23e8d21eadd6cde94266644393a033b8188f8d4991e6af8896cc90dfb14133ffa -AAD = c87e5464decf9e311e1a53fc7c2e58ce3c2cdfd5 -Tag = cc72145ec7d743669f82ffcff4477431 -FAIL - -Count = 11 -Key = 8b7e68eb7c5af5667e107b15b024c6dd -IV = 3032706bb97a57db2c12f516 -CT = 7e51f0246c2141d3056e029f010f137d962db5f2b75cea3025641b9f257b0cf368ac5af5386a652e4a344ce87a3ed7ea13f4b1 -AAD = 8e7443bd5391b0d794ca731faf0693b5c1bd322e -Tag = bd958335e45dfe08a14ad3493fcf684f -PT = 104d820cd5bb4ef3d6c8da38aaf87e918319bb9c6855141a5d347f34fc99f17d9099d75a55a9af4d91c3b606d5d681906fa645 - -Count = 12 -Key = 6be475335ebfac4a8153e2933df64728 -IV = 2ce9f60a87700b3cc2aa4bd6 -CT = 94450c6fcbc69723e5099e8f4d1687ef30d22b53e75dfb1d64a66b5a714c38841bc02e4d1a1d543a29d4421622605be9898c35 -AAD = 4a47b8de3f900d31b02c341fa6e93bf7d7fed8b6 -Tag = 0e2a619de3645b78f8d88b4d41bb7fee -FAIL - -Count = 13 -Key = 1e47d62f60c4f817e60b4daff62ff0bf -IV = ac749f9ae55bc1fbc8d18f8d -CT = 81aeac511f589d5f7b9a63c98188faa88e013fb2efea246627386f6124285fc9f5af0fc9a7dd66dcbfa72a08e0dd205a4f54e0 -AAD = 1dbe80d44a17dd3c9717436485e946edf10f5a94 -Tag = 3eb79932f3c5c81fe7a0b25f9a862820 -FAIL - -Count = 14 -Key = 94e5bfcb62bf58e4d22fa7e111f36ded -IV = a1440994c67b449ab1185996 -CT = a33bff622bd29e2d32b0860c6bef2fa7b0d9a108d06af8b41de8467ab063ab0363c576ec8b085b8ff04eafd997607d651e607b -AAD = d56056f606021bda6c9d3e47114650f08c4326a7 -Tag = 69ccda69723a8e596e0ed6db65f19257 -PT = e376d7e1466e559a8e535c06a8cd609a8075c373b7b2eda79396c9b7a7a2fd55b5d0d3c7fbca64f5e40c553865d697a52a242d - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = e7c650a8f64a900857eaf8d95c49a807 -IV = 961a0b83a36b79acc1494da5 -CT = 70954661360ee1dcc5ea22918fa89bbcf56aa6ded04b22fccff799d773833617c9aa7ddb0ab9c170d6a44769bce9f7fe287c68 -AAD = da9ff7c1529f9cb75c88cd890c9a1af493db5fe8148c4687984c070442c5d501434bbaab1dae06cec6de0606d59da3d0 -Tag = a0962c9259e7d4a9a21e9328e93c754c -FAIL - -Count = 1 -Key = f0305c7b513960533519473976f02beb -IV = 1a7f6ea0e6c9aa5cf8b78b09 -CT = 30043bcbe2177ab25e4b00a92ee1cd80e9daaea0bc0a827fc5fcb84e7b07be6395582a5a14e768dde80a20dae0a8b1d8d1d29b -AAD = 7e2071cc1c70719143981de543cd28dbceb92de0d6021bda4417e7b6417938b126632ecff6e00766e5d0aad3d6f06811 -Tag = 796c41624f6c3cab762380d21ab6130b -PT = e5fc990c0739e05bd4655871c7401128117737a11d520372239ab723f7fde78dc4212ac565ee5ee100a014dbb71ea13cdb08eb - -Count = 2 -Key = adbe83a792ac133ff5088b49dc8fc54c -IV = d9ff7ed76c6c34d956917a8e -CT = e12d324af2e723722fb5ace9da7c3dc0e673d2ee294e414b5abbbdd2dd4fc688e5dd6d2e961533e9083b6ae8e712b7b23339a4 -AAD = a81f2b8c138d3e629b6e06a9563e75ac5bf024fc53556dbb9e008d9fa551835566d72b15b39f1ea0d9d6a53ddbd488c8 -Tag = 6fe3139f1f75228545db7fee6965fb17 -PT = e76f356343be3e1fc9e2bd0f9dd770c876122ddf1d6270128a74ca8394ba47531e82e13b0c9f028fae18110f2ac673de832085 - -Count = 3 -Key = 32406fc5ecd36e327c45c9e783870b54 -IV = 22e95c98f482982ea0f189c8 -CT = e8396f91e757cc47385e2d45a0dd8a3fa34350a9d1e0cabadbe73ea2b17b866c7cce8df163a802a7e207e80fe6f11d15f2e483 -AAD = 635ba2c5301e218182da81805de97b2aab5f163397d319c4548dee5ca7fb4a6c601f667da3c542347890e267f94d613e -Tag = 630431ebd61f8f2e01639d2e6cf3acc8 -PT = 3d49646a76dafcb7ff78aca9415207b107afe751b2cebc1757cfc74402f15f89c36ebad397fa033d21c26ece33533c4d80897b - -Count = 4 -Key = 8e184c0f49d263a9cacdb83821a33c98 -IV = 06d8f6969a2e0569ee0f7872 -CT = 4b8497667cca8784a01300f2869aceeb6161f60f6073f11470a14b4b2f905cd9705ea3938fcaff3f2308d5e9f3aa7f88bdb808 -AAD = 655730e35b8f91ec3d6c083baab2751c7dabc0a4d29d0bed6453b2ce8a468cc0f0bac9000f8a86e468fdd1623901994d -Tag = 9d919fa4c13f38c9134d7893d832fd30 -FAIL - -Count = 5 -Key = 5d697b8c61784d02cda780887e57fca0 -IV = 6a7aa3548a1a23c91b8785c5 -CT = 654855265d5b61777a7c0a8b8239c74cc9af1aefbe80e76b415a17e148aae92ee3c9fdf391dc22fe1d77805cf18faf0be54823 -AAD = 57add18eadebfe0651f90699e1eebf168447a6d61db412f72acadf77f8dc5f27e0ca9bb5e5a8d02ad572782684647e23 -Tag = 813db300a2a25fc1791e98e7d8852ee6 -FAIL - -Count = 6 -Key = d7fbc15e1a47d60e64a15933eab1af36 -IV = b02845c45a33f58c5c33e729 -CT = 259f6299e382bfcbd8b217c2fed076799deb9abf3eb59b58f07f92121b7dfaf9d37130ae708898c281ffb1b22d8ea08c16c674 -AAD = ecbbe60c54a60414cc5f6da3634d03c0b78ad70dcb9902edb4285ccc148f7d30bcd14a1d8a8dd643b50cde910fde964a -Tag = c23e799000d36b0456c7ec1cf6b28285 -PT = 465a3617259fc4fce31df80aa4f7254065cb7c9e1b61692c42c3ec5bb8c13852c9b826ac886d86802d92bb63d5a0a3ad60c6a8 - -Count = 7 -Key = 3a90b1433b1c18f9e2d284ac1022add8 -IV = 99c814d63bb4835663fe8b0a -CT = 5fa507b9a068a16dd098223db38600ee3e2a4cfe7ed0d484fc24602062fe3118b112a0cb7d960616d4954f0f1b6bba6bdaf0d6 -AAD = 7e61eaa0442e1ac7fe336036ebab57140f5648f44a11968d63ee287de2cb01c5b1c808a20690ce0406104859a3ea462b -Tag = eb35c593e4641aa9f075e380645940d6 -FAIL - -Count = 8 -Key = 0e5d672e3e3abae3efccdd6302b63075 -IV = 41ce593eec39b3360741f5a7 -CT = f15d84949a7a6233ea7c6389c60c3be39e727c58fe86b63aa5101385bba8dd152ebeddcaccb8fda44e9923c4a27ab63700d60a -AAD = 12791dfc8a7fbfcef959cc1105e7017c837da1cca1dd8499ede10fad46323f752203c5e3213818ba751a5fb7a33d24ff -Tag = cef08ec966cee8be9904fb0f7014e455 -PT = 3bec21655c5b7727e82b9c14e495002fee0d0abcece86da9e5ed9361ab4e1b52db04630b3e2d2317f117712a213df4a2766b70 - -Count = 9 -Key = 5b4309a19a3ff4f5a2f3f50ff173553d -IV = 24732b76850d64df84b0b543 -CT = fcfd435b25812031ce0a2b1114083fd5d0e642ed9472f9794c65dc2e1ec2b69dfaede399041c895a150fa02794b307b1113f67 -AAD = e19620455af6630e2cdc16a184c6418dff96372fb31b5bad6c4c40e824a8a0f9ffcb9557269d3bd808582f99765997af -Tag = 1b1ff7b4ff45ab1c318371f860c21ee2 -FAIL - -Count = 10 -Key = 012e3a4a112fec5b012a8a740d528859 -IV = 7cb272d50f410acb61b0460b -CT = df42e49d5e42488b28ec32a1e2c13f49b018b94e268b8529d2db0cdddf7064674fcd347a6ad4ae6bc0b935d6820dafe1a1e037 -AAD = 27d30a53a8c009f01cc7eeacd5a2bd479280cf31a2c0e6c854b5bcbc0517cad3f135bb4799c9e2e1e99905bd649b251f -Tag = c62506c34f7ccfa41a50a389a7b57fe2 -FAIL - -Count = 11 -Key = d1a132ef84f48fea7f106e6d444ca25e -IV = 9c9725e2bab366dd9004338a -CT = 8ac638ccd1b4e074957e08fbc4f89a703b44c204ac15c0a8380c72536e62a7056e47f3e2096ccecd837c55e00e84e1ea31323d -AAD = d6a4c524d726502c3e726d6c8aaf373b390e4300a3e7ea74c21bedd9e5731575060e8a85922ae3c7b317a18f1a6331b7 -Tag = b03a4e723b8ecc24422ed39e0d7cbfc8 -PT = 9eb690978cf06c5df315e63633be02f8d9539bc4aaa98e7e9b6dde4cc4fecde3f53b82d7b614a2e03e1df21e887cabca843175 - -Count = 12 -Key = d85c71da4700d540319eb4f19bbe7654 -IV = 18aaf265066ade903c82dcee -CT = e97090cca858cdaae5d746dfbe947f16fb963beb1bd85aa1006a848e5020ef70de4f3af85c044423cade8f70cbe3d5131f607d -AAD = 15459e364082ffde14c08f91a7b42d39f1b075622f8ec0c7f0773b973990af721cd907bd7fd6c7f0f1aefc05a7aec27c -Tag = f5955ad7b20b9648218c71acf9a074cb -PT = 148b067d82552d721bd77765710d62749c5bc7c079360c051bc9be9ae49e26ff98fa9aa39e585843ce06208ff630d139972bfb - -Count = 13 -Key = ec3bf7626ac29db644ddc20ca1a40ebf -IV = daae780f721d7bcecf1f2cb4 -CT = 75ba0d138246649194d30e868f72680eeecf4b825b40e977f8cd9e38437f8e59900323a07a7f363470d3f77f0938481e856d6b -AAD = 50f2ab57728b146eb972d2fbe76d6d404a43aa990d10192820c4aa871e78ecd1cebc16700f2416c0512cbdda16642c32 -Tag = b4137053c3913db5e0ff7bbb00cb9fd5 -PT = 092d254107607fbd8bc2e23035d77ebc144bbd52758c1a691951420a10f07cb00566d2f6b72f022cf83b30645aff957aeca8b2 - -Count = 14 -Key = 36a23edc0f006933c99cc124e530dc7f -IV = f13bb10b0da13f7e9d32f585 -CT = 32f1b95f21c42dc13dad69ff061a6fc809809f91ac11d484f309553a6692107eb8982d0e48f2726c1c96ecdd2f1579e9bafa62 -AAD = 02c06615358ca90d1585333e35504b2fc5370d2bf4a5797a2c1f991fda06135cb13e71e647abb4def56036de838ebc96 -Tag = 8703b4a4fa637b16d1a36cc5028716fe -PT = 9da63166b633b5c9f31f5d0869594960de63570170e83530d796e78f81ed579a74d28d3cb9726f6c6037548f3924bc778c7f2f - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = da2bb7d581493d692380c77105590201 -IV = 44aa3e7856ca279d2eb020c6 -CT = 9290d430c9e89c37f0446dbd620c9a6b34b1274aeb6f911f75867efcf95b6feda69f1af4ee16c761b3c9aeac3da03aa9889c88 -AAD = 4cd171b23bddb3a53cdf959d5c1710b481eb3785a90eb20a2345ee00d0bb7868c367ab12e6f4dd1dee72af4eee1d197777d1d6499cc541f34edbf45cda6ef90b3c024f9272d72ec1909fb8fba7db88a4d6f7d3d925980f9f9f72 -Tag = 9e3ac938d3eb0cadd6f5c9e35d22ba38 -PT = 9bbf4c1a2742f6ac80cb4e8a052e4a8f4f07c43602361355b717381edf9fabd4cb7e3ad65dbd1378b196ac270588dd0621f642 - -Count = 1 -Key = d74e4958717a9d5c0e235b76a926cae8 -IV = 0b7471141e0c70b1995fd7b1 -CT = e701c57d2330bf066f9ff8cf3ca4343cafe4894651cd199bdaaa681ba486b4a65c5a22b0f1420be29ea547d42c713bc6af66aa -AAD = 4a42b7aae8c245c6f1598a395316e4b8484dbd6e64648d5e302021b1d3fa0a38f46e22bd9c8080b863dc0016482538a8562a4bd0ba84edbe2697c76fd039527ac179ec5506cf34a6039312774cedebf4961f3978b14a26509f96 -Tag = e192c23cb036f0b31592989119eed55d -PT = 840d9fb95e32559fb3602e48590280a172ca36d9b49ab69510f5bd552bfab7a306f85ff0a34bc305b88b804c60b90add594a17 - -Count = 2 -Key = 1986310c725ac94ecfe6422e75fc3ee7 -IV = 93ec4214fa8e6dc4e3afc775 -CT = b178ec72f85a311ac4168f42a4b2c23113fbea4b85f4b9dabb74e143eb1b8b0a361e0243edfd365b90d5b325950df0ada058f9 -AAD = e80b88e62c49c958b5e0b8b54f532d9ff6aa84c8a40132e93e55b59fc24e8decf28463139f155d1e8ce4ee76aaeefcd245baa0fc519f83a5fb9ad9aa40c4b21126013f576c4272c2cb136c8fd091cc4539877a5d1e72d607f960 -Tag = 8b347853f11d75e81e8a95010be81f17 -FAIL - -Count = 3 -Key = e765831739df79cad4271c8b97012b87 -IV = e02b84f657f30fcef55db39c -CT = c22a920729745e6033fb0a139fb84549125701d90ac568dfb1117461380959be61949a2ff8ab5044c448c5fe081253e639528e -AAD = 3b6a16b461a8aa599ea02a63ac7e57ef9acfed69dc75ec7886e902d4b8dc39913f5ef645e1c46251b144b5d6024c6a1a3c330aa7f57b8a1c55bcd918661583d970c33733ddde3ef1c5ea7ac8eeb67021ba47a904d11308824832 -Tag = aa49deb346952540a11b5af0d8ae2bd4 -FAIL - -Count = 4 -Key = 0f7cd5df675edaf66c8b7b0ac3d2798c -IV = 4085ea5c6359da0cda2e6028 -CT = 19bf82169fee58fd9054b4729835f5d6141a39819e9ab6f050335dc6af662842b2a990b12a2f75546b56bf578832b0236a2313 -AAD = bf65373999ed6576780dabef2361be4713486358ffc9ae08ef91b517b02cfc9fd71a57eb49a02fb209726a21e5a2ec02c976a96e60f795559225b1515876400650d504dc6013aef6a92b41f952c88fc8aa0746cb0e3852f5a00e -Tag = 0ff48571e381418cfcaa0cc13cc178bc -FAIL - -Count = 5 -Key = 7046ce2cfad031f8564d7060f7b9fcbe -IV = be584d2d74c2734ee05dde5d -CT = 7652219e8315b2914c3cddabf28810169ab64d552da2553edad00d016e03d5ea1a540605c1b5d15f0f533fdf8a67a8233c65b7 -AAD = b9856b2c5b261037bf8629688f06a415a162ba27c44976256d87d61a965bfd94b4a29b2b553abb5fca0a93739f84a60149cf1cf3db63fe043e1e292b1834cc48c47e816fd8fb059f909d17769f316388528b1f8246e3708c1c1f -Tag = 3f72b336ae622971c66ec23999dee1bb -PT = cbf47b4cf3602ee4718806d92d79d550cc58108fc6e7384fd607eb2839f1510856314bef516101c1ba0bf9013c3223a40c7566 - -Count = 6 -Key = 11338a7a431e3c16f0e5d265ca619735 -IV = 3b355d853a4fee0690be45e9 -CT = ff4d5100b25581129f8d50bbdb8e84ab08b52c87d71019d552ba6cda7c80da584f2d5a7e17ca0667dd578e099852389241d5c8 -AAD = e417b81988f7e2f3d2efffeca7e061fb865526a8067e8253851ae8828f9f027fb380a711d1db671bda7266fe779394ba0eb1d02d1f99bd0eacdddab57d9d29c4db5e863fd53b000a11b3fc7c1497fe9cc63a94d5e3c3a3856721 -Tag = 42939c00e6b469db15b9fd47e9153005 -PT = 8a6a9fbf3e72b1390d665424d1d2e706384ff1db8c5e309b69a27448bd1750a038c2c25acda988ec1dbed5f24fa8c44199146f - -Count = 7 -Key = 172dfc179211c31e055c149c8c23ec9e -IV = 6f32ba04972c3570b11d1a1b -CT = eda182e3eb20281807e041f14cb7e26e933b9691db457a3239213b3fcd885d421a737207a20ae3c30bd9fbfd9bf85f2bf93cfb -AAD = 6b9656e6c07bca3540eb334703a3b110447e55a9f47b3513e00e029aec6245a7a55e51b28d9afa27b1ac2c5639f02c64810a5212a71582438f691653356c3caedc9efe29db375af29d15eb473786b2afca37b3400734d9d103fa -Tag = 8e404527995c65f9936efad88fee1b4e -FAIL - -Count = 8 -Key = c74c96c514b09cf729cd0bb21c4eb0c6 -IV = 45b1d4a0e56d7e24e91b84e0 -CT = ad3a0d8bccb0f2fd773a67b4cbd7b4f8ca523191d5a93aabb8f62be100701febc66cd2adf162d4d8cd9abf5ee2f03cbcbeef30 -AAD = 58ea828b2ab805b1d262772161c26c452b545ae75335fb0dcd904ec1f1f7125984d9c59c03b1ae30dd7910b0ea4e1a5383fea414111154d916f4766d0cd8542d3ee0fbf55398fcaf0a8858a542b12feeb277651d019ceeae6eaf -Tag = da9dc47d559516d2ba43cb78eb218d29 -FAIL - -Count = 9 -Key = e45d100fe08f2df7106fb7f5a69ab9fd -IV = 89cb5592e015c15268fa6c74 -CT = a3e6d97d398b6f8d1acb9d45c0fb66b89cc8f8c034fb77b4cf50da3fd8b7521a6eb5f7bf4a6df703a125a43a95f7d6679cc2b5 -AAD = 1c9293292c44aa0535d7e3cf55345272c994d1c7e4af05b666ab80dae87d831685ebf706900efa1662bed1deca81ae2ab1aeb58f40030eca375ef1765d7fa196a2ba72d1d7dfb751f48e00d8b607ba1ea900f7fd4d1dd6169235 -Tag = 1d61d7db1d37bceb7de98bd76a736d45 -PT = ea9b8523fd5ba55c93ff32347d491220b3984cff39d145ca6625f4cc7b01b417776a2e7c4216b1385f8191667a333efaf00343 - -Count = 10 -Key = 2d0b0ccf8f6e955a49a8a6e525c6841d -IV = 086d5a3f6590e8f7696e6ca3 -CT = f4c9c513a49a7a98fcde6c2f380bac70158a5c772cb334c0defb10399c2741b3be0fb06242808b1c4d3941dd0f0c6337fe5183 -AAD = 2f697a4535c68faccddc970f403103d69590661bdc196e064542fb1d6663d47a55f8b25c71dd16ea36c53a8caa8d2ed30b49efdf1794c2f13e6e5cc3ab81832c6b63c1862bcb589a7af0bca5f6647521556fa104713c7b0f4237 -Tag = 9deb38ad834d4e0788a113f01163a2c1 -FAIL - -Count = 11 -Key = 842f74526892dbea464884041fd1176f -IV = 8b2c836bb2306aeaff793bfe -CT = 79c1ab6299d187b7513b996807b6484817d39899eb9c87845b2c7b13edca01a8f5ab96f6546b6f921a89ab5624cab507b10f35 -AAD = 78aa908eef930e05c8491dbc093ad689ccbdf6cdb0321ee0beb7e73dd199f6db81b5ceb26bad8bf0015c05543ca3dba582fbb8a816430397159491c20c17dbf303c3981275eea91be0f8d0cffe7be53418802ce35bc6ebdf190a -Tag = 1b1b94ad78dbe7c286f87f80394a519b -FAIL - -Count = 12 -Key = f2dc68a0aaef843b142d1ea02a83ddb9 -IV = 6e8045bb7cddcde4945723ed -CT = 47b824727193d179b279e7ff90c1848f721d5ddee2e7b9c680e24a9f8b284ddc702bc4b3d7951a6574b000bb725ba34c444259 -AAD = a50e9bed28509b594943c6dda18abf26e21e1b43b7b3377d00dcdc27fe5d9af001d63df3dc177b86c41601b982cf5bb064e5b1383d4bb3a1891b418fc665ab7c165d3033af0c971fc368f3f40b3b3de35377b1945fa582b85c70 -Tag = a6ec986694fed00ff3fa689487158ce2 -PT = eddb4801aa6fbdaae5dd436a958e5771f850f81f1435cb6d41a22bf0b0a2a3b453874145861d3d1e65bb2d1d3b2b7a458b8c6e - -Count = 13 -Key = be23a5fcec16a1ab734e914d52a38918 -IV = 0ca9634183e4f07b46b6cfb4 -CT = 9256f9cac94ed76011454a96f91deb5c75516b3778e66a948618cdacab369303ddbc5e159b7eaa669ed436aa9931bc1462d754 -AAD = e2cabc6ccf6b078b370aaae412ba9ac810246938a4ed0e8d4aa9f05347095650abbf773efa42a2447886620e31982ec9aa0ec24152f3d551c6b66759742f7abc5c01325bfeecc8473bde40969fb0c82949393fa232a9c82ebb72 -Tag = 91d35d8f10a9b02a710d142ea695363d -PT = b04e7595841a8fc99d19a7bdb7e08d687fa9b3475132a79d3441a228d129ccf2d3068c47173775b696f61d9040acbbd72927d3 - -Count = 14 -Key = 0658fca0a449d0b2bd1a56a0bb582f81 -IV = 12731761ca8bb0f266d66354 -CT = a26a3749820ab45b0e254a9de5e7863b6bf45139c4b981b57c14db59d1affd838e2ac4ce397145fae610a10ab1a0fa62d2fba7 -AAD = 67128c67b6ef6f8245fcd3e191ee9e37072252fec8e4dcc385fdca7bf19835f5c1f43058830ace68af6bead5090b647b727a3fb6806266df6070133ecf96b1cafed543d3c9e9aea6f82ffa3539e5105abe3a8fe8bf184ae6398d -Tag = 64ecdd3e2b77a5eef9444bdfb5a8e7df -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test1.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test1.txt deleted file mode 100644 index 34142fc0..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test1.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = cf063a34d4a9a76c2c86787d3f96db71 -IV = 113b9785971864c83b01c787 -CT = -AAD = -Tag = 72ac8493e3a5228b5d130a69d2510e42 -PT = - -Count = 1 -Key = a49a5e26a2f8cb63d05546c2a62f5343 -IV = 907763b19b9b4ab6bd4f0281 -CT = -AAD = -Tag = a2be08210d8c470a8df6e8fbd79ec5cf -FAIL - -Count = 2 -Key = 2ad0bf5aeb47a0c1a98da3dfdab4fded -IV = 25f1b6091ee7040fea4ba854 -CT = -AAD = -Tag = d7963d240317653e01cf5abe5d0966ae -PT = - -Count = 3 -Key = d8cd400a0a73d114cd3ecf36537cab3d -IV = 3c162c9f16a49b8fe6c92a81 -CT = -AAD = -Tag = 4203aec165f9d397cf9009770a088c16 -FAIL - -Count = 4 -Key = a982a7bae2b3eae1b7832f16faf693b4 -IV = 78d2d2fa43850483ce933576 -CT = -AAD = -Tag = ceabb89ee3179e25ed32d5a225006361 -PT = - -Count = 5 -Key = f9e3992196f7d7a21bd956f4b5a5ffce -IV = 0794a6bdf5f198c9f193b9ba -CT = -AAD = -Tag = f8247fd5dc7bd6d40e96af32aa9c1889 -PT = - -Count = 6 -Key = c91aab7ebe13653a71a4232fd1beb793 -IV = 7799464b6de6383da0daec52 -CT = -AAD = -Tag = 00c4f7033f3c05e9d531f3ca573dc98d -FAIL - -Count = 7 -Key = e7e4eefd0a3abd4ee1bef270d257eab7 -IV = f548f2a04a50a2f0342b2250 -CT = -AAD = -Tag = 044159b8a18668167fbd28ac500c20fe -PT = - -Count = 8 -Key = 1bd49e553457459aee1b5d83e7c216a2 -IV = 2b37cf40ed2685eb2a907cd0 -CT = -AAD = -Tag = fcb41d17fdb023d4d14f84a387d3ad77 -FAIL - -Count = 9 -Key = 4d6486fa68ce5a14b9db7334ab4838cb -IV = afad3f4190d56a1b8eb08e58 -CT = -AAD = -Tag = 4bda04755b7ce9da020ce7467a5ced8f -FAIL - -Count = 10 -Key = da5b59d5eb448fd6c08c350df9a82114 -IV = 15fb65d9fe2fa27f226312c0 -CT = -AAD = -Tag = e407fccbb9f00eeb9cef4a520cff957c -FAIL - -Count = 11 -Key = 07d5a7d405b21c64d74cc0988693b784 -IV = 2eefd7990ea025925e9ca6f9 -CT = -AAD = -Tag = 1439522d18c9eb129f1f776590027761 -FAIL - -Count = 12 -Key = 48760dec952010140ffc4b4078438b56 -IV = 930cc3ff276d7bbb74d187ef -CT = -AAD = -Tag = 8673dcb97934d54dc17de0037344737f -FAIL - -Count = 13 -Key = ed7c50762dc0dc4aa5c8be4cf0a56b88 -IV = 50dfb73b5034cffb6709af8f -CT = -AAD = -Tag = cb02203ee8eccec446ed1c2cf68fd1c0 -FAIL - -Count = 14 -Key = b5d4b3e80a56adbc780ff02c5da6a7ab -IV = abc5b96c5e872502971dcc55 -CT = -AAD = -Tag = 4e85677cc16e2b2fb50a2ca9c0ac1b9c -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test10.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test10.txt deleted file mode 100644 index fa24d812..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test10.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 99a9bddbb68be243759bc01c882c4ce7 -IV = 6d78e303d165a42082abf5a2 -CT = 1e3a3fdb540717afe12651d3a51b4340 -AAD = 80a8d9fdefb4b114f12208b0a79299ab5e2c8524d2991617f29b23b31cedef24226fadc72b3475c0f201ea0648aa4936ffff9c80f08a329e042cc23728e0b1569357bfd08e9af1b77369bce491b995f7393903c3eceb3fe0c0e4 -Tag = 66dbb3bd4b766df31d37a0282876276c -FAIL - -Count = 1 -Key = 300b8ffab4368cc90f6d4063e4279f2a -IV = 8e69fa64e871d0e98a183a49 -CT = 2d2292da61c280aff86767d25b75e814 -AAD = 5166309e153447b27c67051453abf441de3f4a7f6b633ec6122ff82dc132cfb422d36c5ec6e7cc90a9ad55caa1ccdcb82dc5022a20062a9c6e9238f34d085b1f554b5eac05eff25b5a5cb6e18e7827d70175dc0662d77033d118 -Tag = 633ee657a8981a7682f87505594c95ad -PT = 4953b54859870631e818da71fc69c981 - -Count = 2 -Key = 5061b1c9af824d400a4097353c8b324d -IV = f9c6575be814e22ec28bc6db -CT = b1d0976677a3e53777223dae0e65fc7e -AAD = 325408a19d85c17ab70b827a72259f13e45ca7173c392fbc985ed5d30a20fc19d231e1992e1db2c0608db234b7ae87922028226ae66e8fa467f2c2a8e9118139178855bbab89fd6b36c6a1d2e4ef87c65e2d5d80877ae2e31190 -Tag = ca672705ab5a9c257eb79129efa9b3cd -FAIL - -Count = 3 -Key = d27f5053e12dde30561119ad2b9b13be -IV = 5437231a59ac76b2948c48ff -CT = 055835c290211a17f56e019c00082a06 -AAD = da5aad950ec6c7ea6711202256c45590290d0ac427a5121d5cea6e0500dd88098d40b8616bb63a1afb9d3e8e327066b5dbd2ca59c349ba8ebb7bcfe658dcf87e2f74141a786785c41eb1a54118a422e9b9f43a65939f53f6fced -Tag = fe5e67e5433c57eb12773f473e1e2a0a -PT = 07a4b1a3c359dcbb38aa8b81cad572b8 - -Count = 4 -Key = 2ecdf75ea95d3ec8fc527bb831b1aff0 -IV = 17b48a715b5e244908950f1a -CT = 1df681b55e805d2060ab0dee8093153a -AAD = f503d5558f826641c23879c53e1f72cd08d069abe54cb145b592eac8e3014d39178d065f41fbe65047b8501d1b32ad4dea151a152e3166527a6ee81fe7806b52653a00a0296fecd52423bd9e06702aa313e698c7608b24b91dbf -Tag = 67efe1258c07e64d2ed355c0785c7f37 -PT = 549ea7cb568dec75bab8edbbe0cc94e9 - -Count = 5 -Key = d86f80508cf9d7c0d66de0ddf68a3816 -IV = d29ed7cbedb74089f264a6a8 -CT = a764d4398db219f81ce066a02f39c61d -AAD = dd9bce3863b224b22c1b764d24b68f6b8ee15a1a03e3d93cda018af8c548625c21388e11ba974125d85e8d52aeefd4cdd3d91a2fec552242f73d41fe03f8491fae9fdc30f0b042bdde65f2833b58264d493c5bbf8e2e15fa8b82 -Tag = 64671a12b392c68c5ab638e0bb7e29f4 -FAIL - -Count = 6 -Key = 7fa90797f1b6a3e6f121fd5c003270e9 -IV = c7ec4cf096ed56e88a0ee79d -CT = 18f728db6848bdbc6fd8043bcd13738a -AAD = 5764cabe5e95be9600fd1bf9c89e9a3901f621b901c90e34ee4b8c90701aa87065b2beb91ccad38766c31306192bce55ea6b90f1b8373688bf8770b5a6750ab49fa9d2beb3c8958ec2578dcbdd4a0a31b40f74a090c10654350f -Tag = e9328ffb6b84a0dd6576b1f2563a6387 -FAIL - -Count = 7 -Key = 43353c434b11cccd96fbd61dc26575e7 -IV = 407b85a0701da0c3754cf779 -CT = 32bd678f91351a83103bd65a1c4449c1 -AAD = 6e205d8c476b8e6d780819212f32203829da927734188702dff7b0673bb11c96300e2bb5f30951536332859ba7c72bf7669cb8ad27882b75832379aeebb701890aba3253c68a0e3fc99373a2ed2fa3276e829e87c86dc4f579e5 -Tag = a53265e07a9355584369fa4903144014 -PT = de9e002f12acc9e65356eb461a7a037d - -Count = 8 -Key = c2fe55b921f04d9da55341393033cfcb -IV = ec1dc287bb6f927b1e2c3cc4 -CT = 16efd99e3918f14116985d6afbea0f52 -AAD = 7d0e03aa029f663f9a9d38fe784f812310c70ad34af96fb65d54e5bd92ddc9259233cd86ffdfe14e1a6dd37457b4bc6fb3df8a7fa60e010bc3b8f7a80cdf050b94640cb85b83b9c40569bb1e37d47d1441326eff48679e12e1c7 -Tag = 84b2e87e046bc2c4e6dd32e256a19d62 -PT = 294be56c1aa5176df99b282bba8200cc - -Count = 9 -Key = 0268a73a952aa0f177d29fbc52d477c6 -IV = 4d0e4f4160f37b5c172311e2 -CT = 7c399a61f0baa70f0e9a2bae4e2e7610 -AAD = b6c4dc8df3529c453131b85dfc7bf4473fce580d070b7750bd3cbdb51f1b65117b6adb2a57ca925601144293b25b6e6c10c55e51674e197beeba05e65a7fb9bdfae760aa14ae69d07baa0d63e25f4d06e446887a5daa71ead3fd -Tag = 397911c6f3197a19ef663cfad139fc79 -PT = 987ae53894a4fb80ee995c3b9ae1097b - -Count = 10 -Key = f3ef2c78b5d5072d75b8bc638019fbd9 -IV = e744adc2c686c5072353a9e6 -CT = 2d650d6f221e31e8d981c3c3f8d74657 -AAD = 7a78c5b7444a1502383666c0ea0c596246e7e98148178a2ad0f20798ead8b66317a97b8576a6edfcf33ade393474d00f00516fe7fcfb5facd02cbb8161b224e994bde9fc17d60490fe1dfef97bda8aaf563cdcd0d4ec270c63a6 -Tag = 33469c4d2358f9afe5ce066670ed8037 -FAIL - -Count = 11 -Key = 5801f1d0c63b9414c73aefc971a59616 -IV = 391f171f76b85919200ecbb8 -CT = 6ddc6d402a0ba52f5f274ab90231336a -AAD = 9560b3d1f0b5de34b12fbe35bc1ac73ec7f666d58545b088740eb2720b3ac16cccc729307032ef3d465094024dc6c8e87b979b0c69102a857d1385a655ed47c768446b350020a7a11bca17d120295c89c566f712d96093f57852 -Tag = 26d6dbf8ba796693bad2b28e5c10f45a -FAIL - -Count = 12 -Key = 2eca32ca4445bbdff452b9f148475556 -IV = bafa872e73e398bd13684342 -CT = 8507c5f9db2b5ccc3511ff7c536e4fb1 -AAD = 699cdb33c82d8d479986f92c7e09fcadedd0bb16a6714a12ddbc23787a0a6bd9a26b4459dc910270d0bd5f2174c9428b8657eea47c866b5202170e09c644b0bd1a2571b95ff27eca9111d1e732a235aa9207906de127d339a353 -Tag = 45780dd1107458714eecabfb2fbaddb7 -FAIL - -Count = 13 -Key = 947b7af80ee22df81650b15ca3a9d30e -IV = b08d719c82d666afbb5319fc -CT = 3c0e648800b873a6d313df9819d69c88 -AAD = 14cd58d6304d89fc3aec5bb6736c4e9ef02db97969bc169a4f8c88c36adfd3a9b24da276533fb90c3930feb8b972b0e2eae2c80714536b6b68f3d2ea3328a359dbc1eae607eeb832ac7134d488712610ce4290bb03bdd12f48a2 -Tag = 52a69091a51a33e59b0bfd45a89f0a2c -PT = 97abeb8f5a115d2a978a31ffd3ab87bf - -Count = 14 -Key = 08d287011268b575c5e0117bb02eaa4a -IV = 1bdfc9f621afe6d47ca6a82e -CT = 952e3bec22baef1417bb32ff7217b509 -AAD = e33c9f5b0bc4f32f7f56b517c7aacc23451ba85bf10a70da5ed25765fc87add73cd29a7eb0cacb64e88142aafa5835cf161b9d3c6fd7cc9d91feb7d937e06acfc5d4c49e8ad617e5667a9b62aad09b492df9c66dad1136c341cf -Tag = 11e971c6f777ebcd738a541081d7559a -PT = 571b35d67615967d9d08858722fb1b8a - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test11.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test11.txt deleted file mode 100644 index 21e63791..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test11.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 387218b246c1a8257748b56980e50c94 -IV = dd7e014198672be39f95b69d -CT = cdba9e73eaf3d38eceb2b04a8d -AAD = -Tag = ecf90f4a47c9c626d6fb2c765d201556 -PT = 48f5b426baca03064554cc2b30 - -Count = 1 -Key = 294de463721e359863887c820524b3d4 -IV = 3338b35c9d57a5d28190e8c9 -CT = 2f46634e74b8e4c89812ac83b9 -AAD = -Tag = dabd506764e68b82a7e720aa18da0abe -PT = 46a2e55c8e264df211bd112685 - -Count = 2 -Key = 28ead7fd2179e0d12aa6d5d88c58c2dc -IV = 5055347f18b4d5add0ae5c41 -CT = 142d8210c3fb84774cdbd0447a -AAD = -Tag = 5fd321d9cdb01952dc85f034736c2a7d -PT = 3b95b981086ee73cc4d0cc1422 - -Count = 3 -Key = 7d7b6c988137b8d470c57bf674a09c87 -IV = 9edf2aa970d016ac962e1fd8 -CT = a85b66c3cb5eab91d5bdc8bc0e -AAD = -Tag = dc054efc01f3afd21d9c2484819f569a -FAIL - -Count = 4 -Key = 1694029fc6c85dad8709fd4568ebf99c -IV = d2c27040b28a9c31af6dad0a -CT = e17df7ed1b0c36c6bab1c21dc1 -AAD = -Tag = 08644413f80753a66d27cc37d9903abf -PT = 51756d23ab2b2c4d4609e3133a - -Count = 5 -Key = e46eb11faa5c3f6e37ee510544514409 -IV = 31ece7b92df31eb13783b23e -CT = bf77690a555c368878f5929e39 -AAD = -Tag = 971a1f31d5838d444f329ff47bdae20d -FAIL - -Count = 6 -Key = 678840abd719f5588e103a9ce1895670 -IV = 2247ca0bfb937d7091c49940 -CT = f5f7190e3b85aea4faa57b52e8 -AAD = -Tag = b4d15142a68ab5258c3d20621f4706ea -PT = b4263d709f816288ece00bbfae - -Count = 7 -Key = 8dcd045f5685cf072f1a9571fd933cf1 -IV = 500ba0a66f3b919b0cc43d5d -CT = 38ec62147b601d1b84e628c60e -AAD = -Tag = d5a8456335aacb0db452f4c460edefa6 -FAIL - -Count = 8 -Key = ab42c0bb775a58e0c5aa81b2dc3e220d -IV = 4cd9049e3b3f48c848a21b3c -CT = 344df70485c8ac2fdcf69190f3 -AAD = -Tag = 4cdb58ad32123be431ef50613c9f886f -PT = 9fa3afe7d21dfe004b558ff940 - -Count = 9 -Key = 4e3e7322fe0baeaeca2afa6f10fc09a7 -IV = 8a9ea19485204cb1c671818b -CT = 66881a96b2c0e9c81d3270e285 -AAD = -Tag = 8b4b35abb0d8a498b75920adcf411ea8 -FAIL - -Count = 10 -Key = c63119ae857dbac28e1f9d254589c258 -IV = 4696e3963d8105483849c132 -CT = fb3b925ac70ee8fcc653344cfc -AAD = -Tag = 964a03393b541319996dfb9db8259d48 -FAIL - -Count = 11 -Key = 03c6071bd6363596161f34a039567fbb -IV = b6b6213e219034d5e1a86f65 -CT = 9234874c82e77eb464abebcfce -AAD = -Tag = 5e1513c241485b5d6dc0d4c852f9d39d -FAIL - -Count = 12 -Key = 1ff11c32fc837d9f2d0809ab65b530e0 -IV = f4cb53c43d206349b0333ea8 -CT = 4aa200287cd30147c3fc6f87e0 -AAD = -Tag = 2f12e3827848b21f141e5a9a0919e6b0 -FAIL - -Count = 13 -Key = 3de290481b59cdc48d328cb3ac39cd96 -IV = d1792633ed4d573a16b63feb -CT = 0bdc54d226fcd3c5a9b03fa960 -AAD = -Tag = 1a68657749ea7adb860f87b915e58659 -PT = 116d9d634bf9e746db89aab0c6 - -Count = 14 -Key = 61858ec104419274ee0e24871cdff474 -IV = 257de891935cc301aff3824a -CT = 918b9f4a5f59d5a9325d994c16 -AAD = -Tag = 0dd768a4f8d0252e943c9d6cc9e28664 -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test12.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test12.txt deleted file mode 100644 index c10fc4d1..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test12.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 660eb76f3d8b6ec54e01b8a36263124b -IV = 3d8cf16e262880ddfe0c86eb -CT = b1ee05f1415a61d7637e97c5f3 -AAD = 8560b10c011a1d4190eb46a3692daa17 -Tag = 761cb84a963e1db1a4ab2c5f904c09db -PT = 2efbaedfec3cfe4ac32f201fa5 - -Count = 1 -Key = 2aa3dfcef68c333d0f03cbbb60a2dac8 -IV = 667a61d732780f5694128daf -CT = 9fade7c433cb44d5ebec14095d -AAD = 227f0dddc71aa2cc20c901fcb8db0e15 -Tag = 85f30c02962900f8891a9b6987172256 -FAIL - -Count = 2 -Key = e8f077635e558cc41a435d5d364e61c7 -IV = 98c0d229fe5e8b2ddee347f9 -CT = 435a85887ef52372259cd7235d -AAD = 473a81d1517f963c9d207b92a37ceecd -Tag = 74c7f8c7075a334c01c6c2084289f6de -PT = 4dc63e19811baff628f24c1627 - -Count = 3 -Key = 295eecd883ba179e13336c75b0da31cc -IV = 0491d91c05bb855ae8218b31 -CT = 2c6e3497d217fcb9854e8db4a0 -AAD = fef3a54930a41bd68178515f447e6cbd -Tag = f58b48f4578dcd69caae8ecb60743d05 -PT = a506ed7636902fc2c74a5ea53a - -Count = 4 -Key = 53e2b200f322383f8c4f66e1f33582c4 -IV = 74651a12fb87d4159cad0176 -CT = fd3e45cc7c27808e81519ac1db -AAD = 62cf41c5adf2cfa83d955cc610448f86 -Tag = e0eab2047eaf4efa600a4082552a4a39 -PT = a7f37fb6f57464dbf469ff7840 - -Count = 5 -Key = 3abcdd36dd0b65bae484cb7654efbd1b -IV = a051edbee68546a493999904 -CT = 9ecf73e3140adf2b7d17eaaec6 -AAD = 0ce7963d31c11fbcbbcfc2f6bfa90b68 -Tag = 71b8ba81028215dc8f3de37b034bbaf8 -FAIL - -Count = 6 -Key = 82f67ccc7e7ff0734f61bbc1a3fb0b72 -IV = 7ed71d35a94a9a8f7d1c0deb -CT = 88fc46298c64dfcfdb5ea172ad -AAD = d11cfe752b544b5e86cd40739783a25d -Tag = 28a573b0acb4c6befd3eb761dcf41c8e -PT = 254dd9845aabf9c049cce9ee68 - -Count = 7 -Key = ad38e96dcb23e04de04b9c28fb4b8e33 -IV = c4646fa77cb05843dd33b549 -CT = eb1d781d8eba29f254d2d4b747 -AAD = 151bf8dee8e89f94dbcd210626c0c4ff -Tag = f080a110a2c28706bf8705788e647743 -FAIL - -Count = 8 -Key = e8d3bbd86c3825692761e507674ca8ab -IV = dae0eed624e1b4840206ecab -CT = 5f43e50829be1f6c1db21768dd -AAD = c5069684d531b4bf159f0d2800cb970c -Tag = bfa9cc78ad67d1bb8c58b8c27ed79439 -PT = 104bc5cd1f4c0bd0b1d7c60f0f - -Count = 9 -Key = 8dc2982890e5015b008508178e60805b -IV = 190f64a03e93a35be00f2c8b -CT = 624bbbdb5fc182ec68a7536c7a -AAD = d23828f4e380386dbe64117733496c27 -Tag = cf001db85c6318b346b27965f74b588e -PT = 690d473959e2bb9ee135098ad2 - -Count = 10 -Key = 6270f8d879f483c8da47c7a1ac841069 -IV = bf241ebbb53da9266feb80ec -CT = 4af8df0b28f8169d4ebdfd87af -AAD = 753738f9f9abe9e09d95e9094df917b7 -Tag = cfaf36396156d570a2d16d5d9309a20c -FAIL - -Count = 11 -Key = 41a7e25635ef6d9f41d5e47134224db9 -IV = 06196d4aca076d87307d25fa -CT = 8019af5fc9a6139dd70c3ce530 -AAD = fa9bc9d9f62c0b6ebaa9a78ae877f10d -Tag = 22c816aeaa81b29bbac65a7977fbeabb -FAIL - -Count = 12 -Key = ce4a52d8d9b7ea1a6b0582d515a76ef0 -IV = 9b917ed9844bf241e8e342ff -CT = 4c2787d382182ce0984ad73f75 -AAD = fd6de547fee72ad03c937dce02c1965f -Tag = 853a648db898f922295ec78e6d26193f -FAIL - -Count = 13 -Key = 6bdd0f5fac673ed0e5035704e0b81859 -IV = 89bc74857b39b5b3b6e119a3 -CT = 7285eb5e7380e62e8db412f141 -AAD = c76b9c59f5cc4d02c35c4e3250bf2a6c -Tag = 5d92968cb34561ef8bc81b6aafbd3ac3 -FAIL - -Count = 14 -Key = b69ee30195aff4034d692b619d000408 -IV = 8b509ffd89c70c5d74dc975d -CT = b011b1a89b8309c084660dc77d -AAD = 886aea7c2d67c0c64038bbbe93a3534f -Tag = 4b12ec1f7943ffff88f1e64ee090d781 -PT = 8d511f8e02961544754f36e937 - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test13.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test13.txt deleted file mode 100644 index 486c62f1..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test13.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = c62dc36b9230e739179f3c58e7270ff9 -IV = 196a0572d8ff2fbd3522b6a5 -CT = 958062b331f05b3acaa1836fc2 -AAD = 4d10536cbdbd6f1d38b2bd10ab8c1c29ae68138e -Tag = dc65a20d9a9aec2e7699eaead47afb42 -PT = 6d8abcee45667e7a9443896cbf - -Count = 1 -Key = 0c966ae197bd94cdabcab5f9c4da02cb -IV = c5bcc7e7044169fa01519ab7 -CT = 49c9a9b0c3980e443cd5195a16 -AAD = 5feaf91a64887463a0b3299da6c87cf2874ebf0b -Tag = 9843f2181d3db30d1c7694c511a85440 -FAIL - -Count = 2 -Key = 913d0833618d0cac6cf1aa7879ff71df -IV = 64082c05f8f3661d0909c5b0 -CT = b4f1efce82f907c0fcc1ba0777 -AAD = 429e3b1b13f9772e9c77a1a4af3d42e8e0e4d86a -Tag = 452b7b777968c18128ade293fd7ca3cd -PT = 8c4c5d3af3ec87bdf8021bf01b - -Count = 3 -Key = 32c251cf7948c7da54a89c109cd10efc -IV = a12c50265a0f59f0d796185f -CT = 66f5786452f19af24a80ce87dc -AAD = 28d5ece6295b14a98f3d67fa3b7153791f4e34bf -Tag = cb176553e01e5991d5dcb6796c33336c -FAIL - -Count = 4 -Key = 977b05392cb87f18f8da6c6273846e84 -IV = 3d75233ecc9431a09605494f -CT = 67897c7de75d0a877545fac9ff -AAD = 803b6b7a7c15f5c9cc1de5166d68c53aef7697a9 -Tag = 3abd3c4653fccc758116beb653809a2e -FAIL - -Count = 5 -Key = 8bfca06dbb9be36fc52406628ce79afd -IV = faedb8fb599ecb05843c783c -CT = 755ceee1b887595011a848b3fe -AAD = 63bb624283314d67d9dfac0a01257f41dffdfebd -Tag = 8d22fcc810d50af86131d571aeab6c27 -FAIL - -Count = 6 -Key = ea55ab4c4a6e8dc4ecca42d4874cacc4 -IV = f5c77f9fb2c33639f35d8f0d -CT = a153dd682c7170a5757d3f0e5c -AAD = 37138bcc4cae4d9327ee8d7c533c2b3dcdd4232d -Tag = 0617b3f0b8f69365ac5c6eb8b3a0dbf6 -FAIL - -Count = 7 -Key = 9b0339dfc4843a419872a285254cdf86 -IV = 9173bb06344a171f7a045ca9 -CT = d1ee33e7dfa59bf1d684894a39 -AAD = b9626d0970d0a5902a3f7a5c7b43e875dcc50835 -Tag = fd7ccf008845d5ddf164e109ccb4e5be -FAIL - -Count = 8 -Key = b8ee3c155ccbb0f3887634fe96e2a1d5 -IV = d8b44efb1a3332501ee6afdd -CT = a5607fd03c0742fa7abae960ab -AAD = 151653716d50a72423ba17957b8ad24c7c4db5e6 -Tag = baeb1468e24c252684c14142b519be3f -PT = e390151ab9d399d534e0119767 - -Count = 9 -Key = 710218a79797b3cff3a20e9a60810475 -IV = f51da8e5a361aad6087af342 -CT = e55e14ff01fdd224fa809229ac -AAD = 455a908aec7d7ad9d644b5305d138b78258c2c8e -Tag = 7040bfcfa78be2bc0a624ba06cc562a2 -PT = de233903ba85973c9cdb15ad40 - -Count = 10 -Key = bf9a6f66977ab3a8d37b32e1f24111fe -IV = 5b9779c050a41b6f4053233d -CT = 27b30f458daccd4481408a3f5a -AAD = 9561c95310b0f882e0f7c2967d04ae9444e5794e -Tag = 9f5f1a41c4fa3e551330c5d91db4fa54 -FAIL - -Count = 11 -Key = abf42662668c5b8d5604a8fe6d73a2c3 -IV = d4d68ce645b95ea61addbd0e -CT = 29c718ab498e792ac1bb8c7c2f -AAD = 6362394c4e9acd3c9888d3c93f39a29dd02078db -Tag = 2b416d7723aee1935233c04ed2fea876 -FAIL - -Count = 12 -Key = b9eddaba6602cc32f33782b18e2aecd0 -IV = 86eef884baa60ed42b086eed -CT = e3a735e097fe667708996ff18f -AAD = b877b290962dd14bd1d622b975eed04113ed105b -Tag = 54395a31d93ea9625d644be8013d018b -FAIL - -Count = 13 -Key = 4598e0e4821db7dd6ed2ce09cdee6cdf -IV = 8e89130fbe0d9b66d5742aba -CT = 9edd822968b68f2173188ae6b7 -AAD = 04c1089bb4abb82ab55ea18eb2ad2fd5bca1a086 -Tag = 7c34c3941fbf51bd33e339b6390babc5 -FAIL - -Count = 14 -Key = 47e0fb871a560d92949d84f557ef2247 -IV = dc65e2cdbeb6601dfd684fee -CT = 6e2b2ed107490d306a2b5451f9 -AAD = 17a7966987c7ac3bb4e455e69f0e6035e7d0d3be -Tag = de38af58ff256e130d84edaaeb00d878 -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test14.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test14.txt deleted file mode 100644 index 84cd6dfe..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test14.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = ef1da9dd794219ebf8f717d5a98ab0af -IV = 3f3983dc63986e33d1b6bffc -CT = 95ea05701481e915c72446c876 -AAD = 5abd0c1c52b687e9a1673b69137895e5025c2bd18cbeacdb9472e918fe1587da558c492cc708d270fd10572eea83d2de -Tag = 5c866992662005ca8886810e278c8ab4 -PT = 5511872905436c7de38e9501e7 - -Count = 1 -Key = 2e3968148b973cb79f275676367cd799 -IV = b055618bdaf94170080346ae -CT = 0117a142931082ff569aa58ea1 -AAD = 72c50abc8c10b7a83b755ac26b7a86afb37d2310e832a8982c70ea8950f8c1a0c0b01fee79644753f87a553868dcc719 -Tag = db9143f6cdb3aa57c2aab1bab89e6c26 -FAIL - -Count = 2 -Key = 7dabba053c8c682b65c8ac9059d20793 -IV = 109c8ff05626ed7329a7d68f -CT = 158b708fdbf206999c6d5dba50 -AAD = 041c26f5c77092c475ae6fd6f9c8c3c8c42d40f8bffa4c28c2f40146c1dfaed0313f109b0d918f7d72fb87fd20d7fe96 -Tag = 0b4680a9f3b9f745bb87c3620ecdd956 -FAIL - -Count = 3 -Key = e03c73bfd5dd3aadba727bb3f99e6237 -IV = 150fbaae76a2da0b84e42959 -CT = b6b4ab1cea7044abf6f6f7dbfc -AAD = 80d1ce195cf77fc3143a37b8546d2d415241d17ffc1d35fa0613f407f7c7cf4f9fe219fd32eb2a95442f5417bf0f7277 -Tag = 03ac1333e300e1845c12f150568ed37f -FAIL - -Count = 4 -Key = 01534e2afc3d9ccc30b826ba91bb8f4f -IV = 6caaaf9daa38e571537ad189 -CT = 1ad10d1f8aaf7c540755b26bf8 -AAD = 1dd85b293539f175f51d1eea58ec78b813b16933d3ebe883cae4340bdaa52a93504c43185bb12a82a93309f04b3fea2c -Tag = d92c12bcfd2dfb213537c796a37eb631 -FAIL - -Count = 5 -Key = 1cf382d72ce0cde089348ec997d7cb4e -IV = a6db73904471cb27d6ea87bc -CT = 69bcb6c8e85d70cfb6b9138a19 -AAD = 98fd3d310e72bbf08837b1f498de66a55f2cba0c6083f335751e59547151802e3e7dc41e1149362c2a938e10bab13a0f -Tag = 770c7c19ef48baa7f2c7a8528558465e -FAIL - -Count = 6 -Key = 2eb413374f602f6598ed463a102fb1f3 -IV = c115adfba0d9edc7d6ca92a8 -CT = f1d5ff51c84b884351038a6722 -AAD = db3206a7eaed7c7b1f17ba5c18fbec7e92ab259a237473f7a7242d1825fd49f167d7f838c1eb65e99b5eafa9c8c11d2a -Tag = d3a3f5e0659898b30e27720ed3e63e56 -FAIL - -Count = 7 -Key = 284b0739877c18921007c888b283f9f7 -IV = 6ae3a281a95760fee1c2a07c -CT = 5d76f5fa13c2f6d638145a029b -AAD = 771307fe6809cd1f5380e5e19299c5dd86d36a6f664e2226b1a42666374e154957035a538b311d73eaebcfe504cba2d8 -Tag = 6327aa1b885337285bc1f6367136b028 -PT = 8e460f57a808d4ef7d3e2cc4fe - -Count = 8 -Key = 698634972384bf4338da7a7a78b1dc45 -IV = e3776042ce8f196d87512ed0 -CT = 75379c28898c4a25c7f8b46b69 -AAD = 75ed47a6454f5a46cf06519dd5cab36f5c98845df604abe02eefa96f803bc9e43fb1d163453138f54b815de0ac77247c -Tag = d63164ca86592eb82c95df8bdac250bf -FAIL - -Count = 9 -Key = 0da45731532c21aa9be95c6b97fd88fa -IV = fcc4a45c9f30b75ce84b1963 -CT = 00846b8e389b4d51b8be03a9ab -AAD = cceb765bf43d0059c046334e001b2008083383e8a766def6e00a047d5ba34af9f459b626fe229e91ce44f2d4922053ae -Tag = e5de395dd1a944c82b1293e2f0a07610 -PT = 648a178a884cb9dcace3797bc7 - -Count = 10 -Key = 4b1e637ddd889ec3de9687e1d00efbf1 -IV = eeb95865db33cc0576e8c007 -CT = 12f4cff0564fbd78a30f6e5b94 -AAD = 36066a37b9fe24218dc09b7cb3fdbaa2d516106f4f87e1a207b4c9b70242f18dd755dc5e82d1684edf2f06d1fd167f3c -Tag = d53a1c8cb52a80367a6847e3733de17e -PT = c5694b0bce9ba2918cf689ff4b - -Count = 11 -Key = 15987b4622213f19f48e7f49a8c96cef -IV = 7d757f1143d4e158729ba484 -CT = a9c2336451553ead58c3324ccf -AAD = 1b65f7f64e6cfc6d3b6d133e33b8d1a8c4e1aa37e513c2d8a4f1d682fcd8acb512738e90186e6026c248bea612ea7589 -Tag = 507c941649fb802a230ef2e61e2f8c75 -PT = 24fd6844aca0ab5070ce41b4b5 - -Count = 12 -Key = e44bdfe6ebe04374145b7e5b20e080fd -IV = 87ab6a85d5bb3789fb70f8e0 -CT = 1ab5e65019f20c1e5548c4e6c3 -AAD = 619385644ec99fcb51fb5491ff6ab69538d7e4932bf07e20d8fc7bd4881c1391f45eff2372e175f1fd872c7149fc858c -Tag = f6565275180ca7ae363d82890f3aa59a -FAIL - -Count = 13 -Key = 863550a2fb509e6418e342a4bddeb219 -IV = dbfb5238ed3d1c1a2af4653e -CT = 2c91779a07504c069a790c7d35 -AAD = ddbb12ba633a780487e71216549f29ad7d52cb59aff1bcb8889abd894b3edfa4e75d661ce793286238e30d434d80ff18 -Tag = a88559f82c6eebada6dc45153ac944e5 -PT = 4ed8fb109e9dd47b4895ab8c85 - -Count = 14 -Key = 40100fbf5c359c60c7a01c95b4ad9d63 -IV = 0559e0d7372f935fc01b1d1a -CT = 8c1bbbe67d0fc9355d3d1d498f -AAD = e46fa70761a4480eda444c81263fd62ca12a720b2f40d17e572f2f387a07fc6473d82ab607d558cf08429557011a949b -Tag = 4a44b7d7eafaefe4407a9ae992de3d57 -PT = a0dabff03e4ad138e0e3eabc53 - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test15.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test15.txt deleted file mode 100644 index afef665a..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test15.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 3eeaa3b5aa99f6902d1d58421b53ddb1 -IV = 71240c996af69d590ccc8e8d -CT = 9a50a33a9438f485e7c89caba7 -AAD = b1176b9e28794cb627c5cb3743846e6d11339ce6d0ce69789833b9f344e92e5360a0eb61b173687f74eae3184ef641f1c42c5b180014ca7e6b0edb00fbc35f2efa7aac7111dd8ec70e851a3ef2e2436ee07e4fba213425b1a8e4 -Tag = e2865b861f8d5e0af25757905dd0653d -FAIL - -Count = 1 -Key = 9dbb962de535a9e77108cd049dea0481 -IV = 72d607c6dbc4fbbfeacb042a -CT = 3c8ebab6a3c4ecdb1ed807c962 -AAD = 9127cb0deed0e5b43ea153b1c17b484225a49c13a5f5995f86ef28a65f9f82397dffb34d4191c3db60492473d5df839e234a537b5a1cce9dcba1b1d205c92c4b4daea01186737cef6d42829ef07f0b6b2920baf998f6ad0d384c -Tag = 9f8dc7e66cea95d7915281301913d3d5 -FAIL - -Count = 2 -Key = 77b55a5b37690c9b1b01a05820838e3e -IV = 7a8e0d881f023a9954941037 -CT = e0eb3359e443e1108ed4068969 -AAD = 0bb1ad1d294b927c24ee097d0a9afbaa6a62c8923627b50bd96e5ba852509a2e76f7a10ee3987e37a55b92d08531897e6cd76462403b39fb31508cc9fc7684ab5ec2ccc73e8a7f4104a277319bf207fcf263eceed13a76ca177f -Tag = ea6383077d15d7d0a97220848a7616a9 -PT = d164aeccec7dbcadee4f41b6a9 - -Count = 3 -Key = d5cc39db2b34cee01345dc52be7d5103 -IV = f662499e42f14bea6977174a -CT = 9a84bdd3ac1724216772349f59 -AAD = 32d9b18f80e4502ce6fe80fcb58cfa233dbc03d342277a5f381b075a386553895a722392c50ae74bcef5266bbbdecc838048924af36418fcb61d94094c86f702677e454c972affab146d629aabde3680bd7d2a669dd4d9e630fc -Tag = c15dd85c92bf94b4b901a771629f4600 -PT = ea48032834d9969e6c9f040957 - -Count = 4 -Key = 64eb561f7f132cf5a6eb6314360a6c10 -IV = c7604206c6e9800dcc4b29f4 -CT = df392736cbe2067acfbb675e37 -AAD = 79970cbf48f78920de1583f777d0d5a8d146ab16a86f2148a6134b5dd55c51c7ab1d0f9219dee77d618ce018f014ebe985c527d0641ac991eda2d48135dd8c552e496e33a65a5e5804546570b53dde4ba860d5f61505dcda77ab -Tag = c382e9854234cff3512ea17a8a8092b4 -PT = dc1fae5f1f0778d378c781dbea - -Count = 5 -Key = f27057cbcccc9cf163abd867fc891486 -IV = b224fea2ecb2b3a5c8fe5596 -CT = e9fc65eacd5be8b6865f853fbb -AAD = 50567ac439f395f3724b14882896f76832d2d464b95d5712b6f8664489d6751ec001140fe47acf75d893590ae22ce10fae18cf97d1c16cfbe52885cbdb7f1d1258adc49204aee73c7cf63a45e70196571cee496c3935f3a142f4 -Tag = 03e3dc31120402ba3a615ec0fa33173b -PT = 7c17f64a8e1c6072c83f8bc8db - -Count = 6 -Key = e9b652cbeeb2a556ac1826b19cc15958 -IV = d21da8693af1613c72bdf1c4 -CT = f7c92206909abf170063b7d6b6 -AAD = 9bbec67884adb146cfcc1456467ec75a37d3623d4a4a396276778151d591e839b4f8e8d96a3d1821c7590b3fd5c3afda9f70709d30903b978d2e6b166b72bf68dd48277929cc77ef45b67c8440e98c5cd89c02077f35e7a55a83 -Tag = 263367dceed0ae0ebdf33bcd43f3cc56 -PT = f12db98355e4a37eb8128c5ef1 - -Count = 7 -Key = d9aadddaf333bb0f78aaf5cdfe0029b1 -IV = c003a76eccd9bbc3ec85dc2c -CT = 091df0d0b2aae56a00eb252509 -AAD = 49c3351f3b103d29fbe6cb6c38a7afd2a06e42409372b04cf1a9741fdf86af62c57afc203d607b384c87fb9d174a1c9e1debca7a084775d2611de22f17e64b1ba9e286699f3276c08d05aaf0dcaec773f33c43d7de294a7915b0 -Tag = 8b041e3c4387fa45afb43ec83d2d11f4 -FAIL - -Count = 8 -Key = 2dcaea867bf72bcd91caff043cf08007 -IV = 07a1a531fa30bc77510d0453 -CT = b4fa6436b16942d3f539f47cb3 -AAD = a757ffcb0d6387b870dde672e863da43f8e71a8a5ecc2af9414dbc99f17a0ce3632472d2b75fa1cb3a6978af9813c1e779891837e6088b24c10622deb4f2461335dfedbe71576f721a070aea32be8229e2c9db109988f61eddd1 -Tag = 4e3868460ed3a64c2f9216f254949ea2 -FAIL - -Count = 9 -Key = eebb7f4031121fbbe400bd449a7ccc8b -IV = 412eeb64a9df2ea98e8b1dbb -CT = 3fe649156931273eb3ac9db896 -AAD = 054b1dee5ff5310db9451f8de5cc8a17bf5ea315a13a3d3ad921f64eefd634e0ad8cc0debd61bf5c089beed9cfdc3a62c4f867c1a385a38a95be4dfc226c91ae1e43e66c204f84e112687b194d202ee5aa2135132b9d5e4ee91d -Tag = e1867166f788de432f90b5c2a21b4cea -PT = 13ad6e1ea7fed171acaa9a5c7a - -Count = 10 -Key = 6ca30f76a5bd8db10f369d492076d5eb -IV = 32ba3341d212d8e5e021f2dc -CT = f9eb93d2dd2014736b64795166 -AAD = cd5c5ba9269fd8a4b355f7a72ddccadf2d7248e93e27af3d17ac7a25caa5c1931cdc0ab8f19ef94b3d9edfb249ba701a0cce9d0bb9fd3650040342b988d9f7305f8819ba84c679093e04a67c5554ca37d6d10234594a66bc261d -Tag = 94f18a542f3b55881365392a743fc4ea -PT = 2ce2935dc618a081100af7c61e - -Count = 11 -Key = 5173cbc7d19b39fceef0ae6efed41ad3 -IV = 7c0a8ebe0006db0d8d3325b1 -CT = 0d01b48b52b1e11d7457bc3f0b -AAD = 2272b3fb6735c466666d7590e989c47537182bcc85f3ff1c3e7b0618ab125f15d163d6d1868ee82c88df740fefac22538ddd65c532af37f5e90ec5c953b88da3806322e28c3505f9bcd57d3eaffece4170b5baa1a5b928bf3c07 -Tag = d568c0e4a644381dea718c2b7e1e1024 -PT = e7a3941472ee04ae90d34e6da6 - -Count = 12 -Key = ac45fccfc2f37966fb18eabc75ca7f13 -IV = f6437d540571986c8a9deffe -CT = d2fd74d90a2aaef2bfdd88638f -AAD = 999446c6391c45f6abc1094402da2d602fbeb973b15a33df30fd4493c0e217fa610fea050706808310663af2fbd66b3a5485f082aa75c824c684fbec62b7cc9ef16ec43c71442c891bc4b47daec6b927532fee5bfda611ea4d56 -Tag = 63d7efdb868b83704980b2dd7ab72a95 -PT = 9e0d96b80bfb65551dee91d828 - -Count = 13 -Key = b45d5a5c1238c6ff6452fbd605b9d60c -IV = 60dc1c9970bc7242385b15c9 -CT = 200be21ae091ef2d6915ff00e8 -AAD = d7b7e4cc20125b86815dafde75b07a0af4b16995728bf632500fb3a0edd5b281417f5125abdf4861963f3c93d870e58e6703ca760fa1b8e25d4134a4a7786267de107fa6560fe6a12477c29175eee02b7d9a010f2c0c83fe389e -Tag = f8f393c73dc613981e9d19cc9d273a76 -FAIL - -Count = 14 -Key = a4b4b85fda2776644ad63eb6e1be48b9 -IV = 635d0bb5e2240b195f21a28e -CT = 0cbe3cbb0725cd28d45745ef5f -AAD = 69d1c68e1521d821bc6976884f564f8a9715e76b99d91819eca63b1d3d12923c3fb868edc957d333a5621b6dd1fbbb9dc1b9a1b87faa155a84254cb23519b39796545d85dbf3302aef8225a2236bf64db82dc85683802a0a89c8 -Tag = 6cdd16fc0c83baf439da1e8279acae56 -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test16.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test16.txt deleted file mode 100644 index d986d2c3..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test16.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = bfd414a6212958a607a0f5d3ab48471d -IV = 86d8ea0ab8e40dcc481cd0e2 -CT = 62171db33193292d930bf6647347652c1ef33316d7feca99d54f1db4fcf513f8 -AAD = -Tag = c28280aa5c6c7a8bd366f28c1cfd1f6e -PT = a6b76a066e63392c9443e60272ceaeb9d25c991b0f2e55e2804e168c05ea591a - -Count = 1 -Key = c3aa0400ea3f5107fbe8aa011e1391b3 -IV = 9c22008475e7a907f7abc966 -CT = 96a06e1fdb0082ebc6441312dd9cd6ed6f7fac745facc368b5ab2a3951bd75a6 -AAD = -Tag = 6e84d66448068f67889404263a047a88 -FAIL - -Count = 2 -Key = 0ab76460d1870b6c989383b615f3876a -IV = 32f38776d99843e9d79d6b28 -CT = fb4d7d8e0958ea76d9489f2c6b5308d75cf96c8e1bc6a08a978a65f0c0f510af -AAD = -Tag = b49a4c6af3403dfb57cf1f4bc25b17a8 -FAIL - -Count = 3 -Key = f02f0436322783d369d552f0d6385474 -IV = e029e6acddaf62ea81f7f39f -CT = 14b4e53213de80bd995468df293a6bbf2452846c375a3706738db45e7c5d5ba6 -AAD = -Tag = 8a8a3c4693256f8b50160554824856e6 -PT = 45ee8a0f38f91785bf8cac4bd05284249a8035eaec0e6e1946e0ea83a0ac3271 - -Count = 4 -Key = 693246ac318ccbab8cc852cd28415b75 -IV = 1dfe6aa73ffb680dffc10367 -CT = 73fc0c82a59165f557ac3c9a43a780ef2d7b55d3a269677ad9ad123706b85854 -AAD = -Tag = fbedbf6b9085e06958a50b329f813346 -FAIL - -Count = 5 -Key = 8767a7a8be83374dc75b0891c4fffec7 -IV = 498aecf672c73dd81aa966cf -CT = 032be9ca32e53e130f241d7a27b4959a6e2b71c98899cfdc66806a490c7fafc6 -AAD = -Tag = c3918262698ba9d30e329cad60fb3eb2 -FAIL - -Count = 6 -Key = 7d34065ca9982a64b0603a6c080bcf4f -IV = 888872c261b3596692ab96c3 -CT = 9bba3cc23f91eeae09269f9402967bb8b376552461faa10320741e861d3a2e71 -AAD = -Tag = 954e7fbb62b622216fb7d1d2f367eabe -FAIL - -Count = 7 -Key = 8f76fe87c4ce76ad7f5e5858030ee64e -IV = 0b5c3b98aeab6525f0cbff7b -CT = 37b795a6de594f97cbd51048f958caa56ea04d6ffd42683364857323759d0406 -AAD = -Tag = 1ce35f577b0661dcf1858b92061b4d77 -FAIL - -Count = 8 -Key = 9b8259870255aa4a7ebb0e5ffece4396 -IV = c9258baa6b7720f38d8f5a76 -CT = 46c291e1792486d98d5aef943e11c215ad38030861a14013014b34eadc771296 -AAD = -Tag = ef28e61958d92b8a2c26dfa69a3c3577 -PT = a3432fc525848dad2a4bba5971bb51ba0393ee8dd61989124c6c457b91c25b88 - -Count = 9 -Key = a00e8e77494da619e978a6d05bf86444 -IV = bdee5a78113546f33d1cb13d -CT = 68f25dea2677b57a19814eefb45c88f6f5028c6129a6d6e3f94da50373e9a1ea -AAD = -Tag = 0005f814865e5bd29c310e1b2761066d -PT = ca2c4ba89d911f74c6d89ee4f3a78f3c9a0e00017d262377aa334a782641397d - -Count = 10 -Key = 440d2393c60bbed9e804722d1ecac07f -IV = 578b96349a4c023ce12eab7b -CT = 68399bd1ea4dfbe7a91eadb3d6ee01e9f3267c97de2b6ab855d297918cb70065 -AAD = -Tag = 73650870d30e379d67858df44efa3b3c -PT = 3ac46dbb93f803235a6df55023aca55449764e91f65512bb9ff0b194788f92cf - -Count = 11 -Key = 8a1877e0bc1e79d88a13684abc216539 -IV = ae660679b01bbd1982960ee8 -CT = 3791e561d37ef21ddaf019a116f5609817bafe6c1875572f5dddc7f4e0728acc -AAD = -Tag = 0d31783e7586a137b81b5b41d1ee5896 -PT = 3f6f57db5b4c4ea4e5528bbf4b0a689c0c169a144f8250301ebdce33cb336547 - -Count = 12 -Key = bffdb949412bc1ffd379a8bd5d1c618e -IV = c8c352f9c47471c5ea3607e0 -CT = da123abf79c0f873d2c5eb65f7b9c4753d96788b1ca6ef8ce28a741558ba18b8 -AAD = -Tag = c4f7344b1fcbacb86b540e741d4171b7 -PT = 1d16adf20389315f655c22284a11b4c5f1d1a45bbffa6e47dc37751185df35c0 - -Count = 13 -Key = 28b5097f0f30860b587d5268365cd77d -IV = afe9269bd8e01bc5a8aa6ee5 -CT = b6da1df24fe4a75ed3745bf71fb1b3ba11a3810a083ba6ec1c39f979fba6ffc7 -AAD = -Tag = abea36a6da655e7aa7d7073bf936865d -PT = 276f7984d55a96f3250bb29bd80376ac54b737dffa6c99f06448cac814b6832e - -Count = 14 -Key = c8f7bc883121ccb5ac678a5675234d14 -IV = ff2929fad279c1f216e84ede -CT = 60ce0bd7045e77f84c6582343100fb7e1d299f07aee23189b38f5d4f93dc4519 -AAD = -Tag = b31a35203371f6ae6c1900301aff3932 -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test17.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test17.txt deleted file mode 100644 index 8b953ae3..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test17.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 3308bf978dca6bd7f5fe4ccd6d0e7c24 -IV = 85996c785a83493cc7165c11 -CT = 4c8f0c7ad73fc469b4b385f80741f3014ec236e29ca9068b8e55ed6fb2fc9b9b -AAD = b0ebb26b9e27c44c26543e257b7c7eb4 -Tag = 8b5528d6ef87eb0be9b6708fab7d654c -FAIL - -Count = 1 -Key = e60b37678b00cea55f72c593ac38067b -IV = 845de274d5ea7d6e0ce794ba -CT = dbc9fb93ffb1698e5a1c062d391f63884c8d8fd862e07ba51d664bffd22b9faf -AAD = 59c8ef4352877ee249cd11439b445733 -Tag = 08d213989f884aface743fb88f778395 -FAIL - -Count = 2 -Key = 95bcde70c094f04e3dd8259cafd88ce8 -IV = 12cf097ad22380432ff40a5c -CT = 8a023ba477f5b809bddcda8f55e09064d6d88aaec99c1e141212ea5b08503660 -AAD = c783a0cca10a8d9fb8d27d69659463f2 -Tag = 562f500dae635d60a769b466e15acd1e -PT = 32f51e837a9748838925066d69e87180f34a6437e6b396e5643b34cb2ee4f7b1 - -Count = 3 -Key = dd2f191758cdeb480feee0beee689fb7 -IV = 8a1c6f696968d1a77a44ba45 -CT = b43afe82184d077319a9366c1162c5ca4882da0df82207ccdc038125bb338c9b -AAD = ef910ed8c787999640c2bd172e5e686d -Tag = 88521a088f92a1d3ff7ce5364bdc7859 -FAIL - -Count = 4 -Key = b013ddc3c6125a9a8c3a309c6367a076 -IV = 5999d3d65eeec4ac7227146e -CT = f71242febd4826ea95ba8e6a3397f05c1b9dd82671680ecf7ab566f1e9ad787a -AAD = 617d5980203988d4ca779b2f33cb904d -Tag = fb74b36de5e6d43a38849f7f9d1f203c -FAIL - -Count = 5 -Key = afa272c03d0343f882008f6e163d6047 -IV = 271ba21f8fdcac34dc93be54 -CT = 36a4029c9e7d0307d31c29cea885bb6c8022452016a29754ba8a344c5bbfc3e1 -AAD = cdf5496a50214683304aec0a80337f9a -Tag = ed8d916c171f0688d7e7cca547ab3ab2 -PT = f3ee01423f192c36033542221c5545dd939de52ada18b9e8b72ba17d02c5dddd - -Count = 6 -Key = f869ffd231c95cc0822df5372842e755 -IV = 1490881cf72ac7f8e7afd0ab -CT = 816ddffa6114f40cfb5d61f04379111be8e1defd4d9e77c87d6ebb748dc79bff -AAD = 4b2b932803812720f6e044b5a5117612 -Tag = 88657cb7f8ef31e55d276d63648b9f0c -PT = a35a1dfdb624727ec51431a804add8673eaef0398b8a3d2896b2d659a0c5bc1d - -Count = 7 -Key = 98b984a6e61dbf66c9c6641d07e69c40 -IV = bbb54adca294947424c6b646 -CT = fd8f7aec05fec9fbd35b66e191556df6cfafcd3859927ec49b0f6f3031597e9a -AAD = 0edb4d86c33d0098de1a2430f0462a5b -Tag = 4651e0d440d42145d593c8db9291f1e5 -FAIL - -Count = 8 -Key = 88959a3edd76716399c33df453fb84b7 -IV = 324d315e3b18d94a86170500 -CT = 062cce52121a567cae3c78a99a28d87c679e418f32f79af1a8849e6d0e81d25f -AAD = fb760df45a75fbff72106e52d6da864a -Tag = 825cbc27be42143c2461fdc6b404e86e -FAIL - -Count = 9 -Key = 4555765171009f776032ec95f60ffebe -IV = 7595fbc3908df2b038c2298d -CT = 469239be20aec4a000384b8ba7ca8b9c1523acd03eab1ed9487a5a13c03bd62a -AAD = d2921132ebcd1f907e649c675d9dcad5 -Tag = d2e2701f334f28f69f6b2d6a8de20d0b -FAIL - -Count = 10 -Key = 69e8bfb2b7b84897153b431ec29fcb79 -IV = dd56a06a4662e2b692009a06 -CT = e740152f3bdc0a09c22146266bb3161ed1c37338f26fec26cd9d829dd6b96b44 -AAD = 3e465a94a95cc7f87b815afa196911ba -Tag = 2e6c438cc38fa5da375f88e237fed806 -FAIL - -Count = 11 -Key = d13e90072180031aba421d64d474448c -IV = 87cc23d00512a61933d435d9 -CT = cd1653f01d8e468e08131d263a10cd83a5e7ea68ed84225bceb4e0b57320cf83 -AAD = b9ac2c45232f7305fcc6f2424c30b606 -Tag = 7b02db1e0dc0c2010080992ad01a9a6b -PT = f1eedc99565378b3ded6190bbb1c6ca325e9e0dd57fae6a8190ce57ccaa302e3 - -Count = 12 -Key = 724d036af7649a85109ef3a597a9b133 -IV = 33c0c8f3a709fa03e684696c -CT = 49be803ad200608b026138ca62acdca2288e67faddec35254a52e8a531990436 -AAD = 8c1095b33f3c4806fe1872916fb6f5f3 -Tag = 81c0405a283ec84bb2a08867bb9a2433 -PT = b643616673a5eb1985900ccfe8ab47691401242c5ec57ffff23fea10a811fbcb - -Count = 13 -Key = 25aede64de2943c0a2ba83bb28075cf9 -IV = e91e66b0414c5ac32cafa3bf -CT = 54a85000a9a47cab4d20027661ee10940524dc06ac9db4e33bc0dc7e6cb6d20a -AAD = d7adeee427b52220d3305f4cb763ff8d -Tag = 2ebdac7cc27d777e26cf12c73a1623e4 -PT = 4b0dc9628a8deec3888c6e642d6f8d1859860c747439757e2d4006b9dce7d440 - -Count = 14 -Key = 5580619cb4b0820fad559b143ce0cf34 -IV = d1c93408a0ca93e94adff306 -CT = a461d08c458fd1b026839f8cf781f834b3214a31dde0477fa8c9b6e57bad8bd0 -AAD = 318dc3a4bafb2514346b520336bb5fed -Tag = 7fc2d6bdd8326d540c02dd0fdf55e9fb -PT = 9d81e6fb879c506e83e641dcf9015f6994a1417d03c1eacbf6d7cba0c349cbb4 - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test18.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test18.txt deleted file mode 100644 index b1e91bf2..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test18.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = f3e60720c7eff3af96a0e7b2a359c322 -IV = 8c9cb6af794f8c0fc4c8c06e -CT = 73e308d968ead96cefc9337dea6952ac3afbe39d7d14d063b9f59ab89c3f6acc -AAD = 5d15b60acc008f9308731ea0a3098644866fa862 -Tag = 658e311f9c9816dbf2567f811e905ab8 -PT = 7e299a25404311ee29eee9349f1e7f876dca42ba81f44295bb9b3a152a27a2af - -Count = 1 -Key = 4ea997187ee51b478f5e1ba48b57f0f8 -IV = bb6fed9776ed61ca321ecdad -CT = d4d67723dc367cb453c5b8ede795ad2b7affcf9f42650c0ea1df91e23175a7cd -AAD = abeeb5850efb796979bb55a1d255350d9faae4d8 -Tag = def8ab2eda15fe03abee6b2dc9f6e805 -PT = 87e9f743a7bdf04a2d97c4a6c5d243666bfb2bc80c9610bdb079792a3f724e04 - -Count = 2 -Key = aa6d3c010d93c6ce4d574b5f4017b8b3 -IV = 9480e879335e1c2f2f0b1201 -CT = 752ffdd7014ef7dbb269b9e43d241ca94b578c1ee2052b26225450ba2dcdd114 -AAD = 5c03cbcbb53d7b44a47e247c0c8b77e5603552c7 -Tag = 63d1a0a5faf1cfa9f72bcec227169fbc -FAIL - -Count = 3 -Key = b77cc41840f9fbff1eae0b9b2fe914c2 -IV = 81fd55366b7903e5c21e96c0 -CT = fe6cd8c592c40acd607fab35272044cf93bf1b64a34ab001564f474990ea851a -AAD = 8c8ec50ddcc4c6526336caa0fd43d4dc6f0b71aa -Tag = f6117a62541d37d32d84e7ea15a709eb -PT = 65453a0933555d1f85d6f7faf9216b4bb5428885b995a27f30dfb2620748fc41 - -Count = 4 -Key = 9133d24420ede755f92b0c1013d794af -IV = 59e1ef4e934d9b730994a58d -CT = b9e3365f552cb261082c9b412568d2beec164c4b9ce078e8fa6f2e43ce661bb4 -AAD = dc27f9206bf8a3969fa6ce3fd3567ed71de9d2c4 -Tag = 01fbf3c551340b041cbaca24abc7f6d0 -FAIL - -Count = 5 -Key = 712768594a8e29c9abe255a8493a086f -IV = c8614fb0a60e377a625b9c2f -CT = eadb515d3167d2809f88bfe5fc2accf74f46f899981f44940192a79c59457ace -AAD = c6435e5cc2a492671bfd4e346df9aa831603d1fb -Tag = 2440a1cee5ecae8681f7c65874bd75ed -PT = 1839ac4e4177fdaa0b7ce3aec45303c9ab44335a1c11569033a4202655c48c3f - -Count = 6 -Key = de0b9fc85fbb73020fc97ddb63241eba -IV = b606b94274c5553a1e9602ba -CT = 155fb5effc689aaafeeccd281b4f9ad8c5188db05e0087150ee273350cf101b7 -AAD = ecdb24c9b274f30a2f6e8f213e08c340b4a70a3d -Tag = 94d02127ade107e784e5ce7957fbaf51 -FAIL - -Count = 7 -Key = de5c1ce56bd1a8f5368c79150f878896 -IV = 6180f7c5ff343b0e472a146f -CT = 93eed51d4f2a18271c9addfc27a607cc0ab083a9019a9bc56e16016c0fb0cf93 -AAD = 8f277e505f58a141c36c149bd21297e57db39368 -Tag = da304087ac5bf7554844c42aa47df060 -PT = bc7e43d5434b4cee596f8466b91ea364274ded8427cb32a769b8c9ef5013b784 - -Count = 8 -Key = d30801f1219679ca8e5c3740fc9921ea -IV = 1d617eed1a5d1b00185e025e -CT = 0016592567d2f1d15de34bcacf362184be63d25de8c6f829bfbaffa817f4ea8e -AAD = ee78be3b42b9d34310c764fd34ce638d7f9eaf4a -Tag = 551f52cdb49eb910bfe8affee48010f3 -FAIL - -Count = 9 -Key = 8716c8d8b1db8c88074fd2b26f8c1147 -IV = 3a267fee424de653482bf9d9 -CT = afd442f001bc4ae06aa10952261b3e91c915da30767d059264c4d8c4a572b5f6 -AAD = 32bd64332598fe7402dc46a90512086259913bb0 -Tag = dae1ab57f4e9bc8e8c1302c5ff47d55e -PT = 557ecae25e16315e3af7e6aed7108a050517fca5025d1cc73922cb3fbe280af4 - -Count = 10 -Key = 689903458e666b9bae962af6216e1c95 -IV = 2a99b776f5ab1381bad64b71 -CT = 2e1124dbe2997d449a297c1393ad349013f043b095573b8e9d4d17ba4d65a9dc -AAD = 065886527d81b4031dae7c34ad4792ed364293d2 -Tag = a985f865faf6bccd511be3d04f5a0129 -PT = 8990e990c2671242d33c19e06841a36b49b83ea94de6d3aa1e29834fda83a602 - -Count = 11 -Key = a1207acba1aa57cfefd920693bd18c56 -IV = 78c3f9e40dbb4feae5ed7f59 -CT = 30387a274a099e22864c8e3e7a0c828406d283b0941f6507a45a459c59e178da -AAD = 10ffa4cc7da0c9c8884cf204e403691f32def692 -Tag = 2a80c2c4a6e843b6d3ef50aebbbde919 -FAIL - -Count = 12 -Key = b0aa82e267ea60febf7220167bf2a3df -IV = 50f86a412cc6c599cc678d24 -CT = 4fd730f52fb80fcf9f1b48239cf0fe1d5a290f682331b01d876204ace098078c -AAD = 552fb2751d6694433850e8fc48b47874db07267b -Tag = 14f41ad80c148007bc596db99214c321 -FAIL - -Count = 13 -Key = b0faaad121fff2d147a4f0b166c41976 -IV = bc081b1f49b62e94b44a4454 -CT = 429ba584c05b6aadf4fe07c468519bb96e0b30c417975b455e2d8c242bae63d4 -AAD = 8930fc9bb08376641c76535bd02ccc71af12dbcb -Tag = 71d8196259ddd346d38bc7ec00b328c0 -FAIL - -Count = 14 -Key = 7f571d7053533f29cec3c08779edc7b0 -IV = 65aba6342903457406b3519b -CT = 9186587933ddc6a83ab8df4bf6ba7c7a584bb5ce19de4fccd0903108f691156a -AAD = b6c4bc5c14ad1344ce2b1483f78b80efded57032 -Tag = 9bb738194012c804160936f013978977 -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test19.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test19.txt deleted file mode 100644 index 02c16e5c..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test19.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 8453cf505f22445634b18680c1f6b0f3 -IV = fab8e5ce90102286182ef690 -CT = 5475442af3ba2bd865ae082bc5e92ad7f42cd84b8c64daadcf18f0d4863b6172 -AAD = ff76d2210f2caec37490a19352c3945be1c5facb89cb3e9947754cade47ec932d95c88d7d2299a8b6db76b5144ab9516 -Tag = 972a7e85787ba26c626db1a1e7c13acb -PT = e4abb4773f5cc51c9df6322612d75f70696c17733ce41e22427250ae61fd90d3 - -Count = 1 -Key = 87a0af6da98b86e82098c9a7564554d7 -IV = 1991750a529395fe5b802332 -CT = 9a1e0fb7ec85f1c4d82111c7ad73085cb75f8478f362102cb4c1c27bc38cf4da -AAD = 6253a0d0d54234476bda68f2a4db8fac5c21206f1bb41de2e3c0a06b9d068c4d8cc99de08d0c6720d5f06ee4f981c23e -Tag = 9cd38b99c212342c816263c802656655 -PT = 1734cb85a5df60143786fdba7165f286d44ea0442eee802a36aa241c72725e4c - -Count = 2 -Key = ab124c19896f9a725cd84bc65c0b769d -IV = 8be6b8884adb0acb19776719 -CT = a77bc17b558e829efdf4508c62761520a44920840c4d8e8cad0564931ffb6f0f -AAD = f3f8c4d2edf80986c33940a9dfce5c64ac314d9969bad730bb719a4a39551eda6b771b6941ba301a4bcf2c7e69c8a000 -Tag = 890106f841f36315a7fed2ffb57f2dbb -FAIL - -Count = 3 -Key = 2c691107ac3eeac8507f7275d35daa6f -IV = b1c7fc99d810d00bef25163a -CT = dbb74c34d430d8bbc1a859418f0435c18deab7bca9d2c7ed3e9a1647de0e5f62 -AAD = 78e36ff5b2be643c948c1bec4153b2e9eaf0bb4a4a92079bab1fc42f3f66f25d075ec82998993c95fb8474b8091f4968 -Tag = b6bfa61751a82d581436ea837de8c483 -PT = 42f707406147678db6f51122e58bcbd4b9a8fd25bfad242aef6fa516663fd0d7 - -Count = 4 -Key = 078a2edbd9b6e86fa94a046cb688d6b7 -IV = 26bc3ee0106ee36e8b081fd8 -CT = b8f270f2b8bb2fa214eb35ad946212bd428390ab7ef652fc3e8c2226c3bc3416 -AAD = f93cdfdf0a98cee33f2f1b485c0e7115f7a56c80b0de75d4b7c87a28036f8e1fa916d6cc78f28cb3c19c19cf2173c5e2 -Tag = 0546d0182a212bc2f7ee185c4e33a510 -PT = 2fd09e96f27b31a8a22b778871bf71e9229b18e5ef42e28efbed8899122510ff - -Count = 5 -Key = 82d166bba1e5828f761e4231fbd2c76d -IV = f8b7d0adae5e4412b7287d89 -CT = 15f880e5c31c00240d2ca990495b597706939c9475c14a2a65582e93263d5479 -AAD = c675c578ee2754c12bd5a5c224c76d9aaadd2a1e7b70e51a1d6a13c9b2aea578444dd8b28b457ccf7cb28d4780fc1f86 -Tag = 4ee3f9cc35eb9d4ea65f162e8d6900db -FAIL - -Count = 6 -Key = 7dd5c39e6c6cb282a57930fa453c02d8 -IV = 73d4f1c8f69005370f509513 -CT = 80510c8914046fd36efdc24c3dbc74dc8d1903d7951603175d780cf95a4cd25b -AAD = ffdcf3d0a8ad8259c3f44f4abe72864e2876dd3c988658d78cff9a48fb6f0cff5e8da3fa7473e23e5efa5466fae7c01a -Tag = 456968965fd36c13415a701ebc77720d -PT = 56ef49a830c1b531843ba6a143b5eb7eea88f5f9edf9ef68e1c86ddd8b2ef9b7 - -Count = 7 -Key = 65541c7a7af95c50fcab82c9e8d24be3 -IV = 9e8491154a9fa91e35921039 -CT = 480c33465d805349beafeba53128f5ba234b8353e7f86ecd13992aa9aaa8b933 -AAD = e4f223988ee19c5065680ccad637240eb7bd659feefb0a8db0a5935ea2096cf5e9d89a1204248d00a70e102a9abf398b -Tag = 818f7229a392451112b5ae484c40ebb9 -FAIL - -Count = 8 -Key = a89926044fd23eaf3eaf8c6f05afaf60 -IV = 0506ee0c664394dc6c857d8e -CT = 329468ed34820830fa4657322b909cc6914bf51bea00a74b703394947dc29c2f -AAD = af6ec49868cc4ae5a12e677ecd60679da0844ef8316078ee5ff8faf04de53c9c6bcaddef8b0833155c9579636e82b6e1 -Tag = d5d610ea8810931e7ddf226d8569a54b -PT = a351f1709707501305e57ae767e89a7340f148112c1122734f68946267afff7d - -Count = 9 -Key = 8d36faf9f30ec69b5f8dad1e491f0f3d -IV = bf58466a6c70bbaa39ff7eb2 -CT = ace177fedf749b0312052ab77ef8074ec325ceeee3859177f6c952e7826a661a -AAD = 3535b93a652730ee47bef47650ee4f1f30a6c70491d0d56427caee2c4ee763ddd16575b6a3dee65ee7ab3e508ce6b8c4 -Tag = 324181117f39f500e7cfb6bb851909bb -FAIL - -Count = 10 -Key = ce54095bf5678115a76a89c4130450cb -IV = 788ec8fbd3cc197551739ceb -CT = 088efa30b927a8b21b86fa0bbe4e9ecdbcfcdb0a3379b8e758092fe21b23c99e -AAD = 634e3e6d72a31879f8030736957a9f89896475f915f627e73a32c9333ecaa2aece5e98b90a5668e6ec92913e3d91e570 -Tag = 9cb0e77f5b403ff85152a30a154457b4 -FAIL - -Count = 11 -Key = 99b3c4b8f2329a8eade022b7fb4f26bc -IV = b72d8545efe1ab84f0455e91 -CT = e5a56edcc5679aa2e7301119414656b406ddd7822c2de4772b8898ea0761825d -AAD = 9fb2c737e9c7de8052221ac0b76cd2a2289fc59b4cd646bb9622e30ea227f0cca33981ff51f27afde410f99ff6a810cd -Tag = 43dcad1123d27635015a5c42296199b1 -PT = 6b6403baa0ae0b354eb25641a5e958b5bd3f7108694f3ed019d1dc5ea2695625 - -Count = 12 -Key = 924b27bdcaf559e4a7a7d6c6332904b5 -IV = aeaed2c7b9a78acf83ecdde6 -CT = c190e4798254ce50ecf2fec69a46ee9a6ac9528dcb25ef72a5dc2b91cda0017c -AAD = e6ce29b8810499861fe179d3eee4bfdd2df25de10533e1334ce16d41dab3e8074f91943f2a3bcc7a04f657e84e9bb5b9 -Tag = 0aea374ec34347946cfbc4e251b7ee2c -FAIL - -Count = 13 -Key = b12ac950027bf3ac01df1cb743553a77 -IV = 5bbbb442bbc5114f949a274e -CT = 53738852ee4cf26c4e41675b31aa04d723b314a22924fc3a12d474ddc0771f8e -AAD = 81ca7d80c572abf9f9f3078258370b7763d603380bc536879e81185488bba8d029a18eebccd2eae9812c4af45e8758cd -Tag = 2310aac3905edc0ff5839ecc17fd43bb -FAIL - -Count = 14 -Key = 6598ebb72aeeb3def673f6fbbd9e5a2b -IV = ad29f048ec023dbf4e6b2f48 -CT = 0ce27f78a31a177741922fe99b1f44b7386e4ae5a1a666d6ba23ed76e61d3954 -AAD = 1457f349d36bfa595609ec4c174114264f1a5993264ea51fc2ff4055e132f3062cfa671a16367798f77c9c3146fc3cc0 -Tag = 5ea456be8c8cd7d1f18888ae74e16be5 -PT = 19832fc5a9d40d0cc9c7c2de8009be8323f79346b040b30551006eae72eea264 - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test2.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test2.txt deleted file mode 100644 index d68042a2..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test2.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = d1f6af919cde85661208bdce0c27cb22 -IV = 898c6929b435017bf031c3c5 -CT = -AAD = 7c5faa40e636bbc91107e68010c92b9f -Tag = ae45f11777540a2caeb128be8092468a -FAIL - -Count = 1 -Key = 2370e320d4344208e0ff5683f243b213 -IV = 04dbb82f044d30831c441228 -CT = -AAD = d43a8e5089eea0d026c03a85178b27da -Tag = 2a049c049d25aa95969b451d93c31c6e -PT = - -Count = 2 -Key = bc3ab28150fd4cb731d5f48ed2784173 -IV = 40408445c203c647312b8f01 -CT = -AAD = 53d2fc19963fc99a36a524e39cb68aa8 -Tag = 3f04dbd2f49909f73044175041fd9eff -PT = - -Count = 3 -Key = 34537f1a0ba093aefedefe8b4b6b34e7 -IV = 9c5fc88eb388ef6776aa2182 -CT = -AAD = 4dd377d089c617dda1ecd42341d1878b -Tag = c0fccde30ba354e23c05b5371c40d088 -PT = - -Count = 4 -Key = 54c3f935982de19de88d6384f9493389 -IV = 3d7eec1cdf3cd419511793ab -CT = -AAD = 2ded8cbc69fa57678aadc7477f2a2173 -Tag = 74107fc192c94a7d85d0f9205f8b02c9 -PT = - -Count = 5 -Key = 790f8945b127a1a418d6d58b4378e0dc -IV = f5694d77b816f2cef0ac80fc -CT = -AAD = e5c71b82a60c97f050511a3b9a09e450 -Tag = 4c75effb688dccd0affe92c0e0391d64 -PT = - -Count = 6 -Key = f6ed6f0afea7e99ab320b525107715c9 -IV = 351e7dc999b9de77ce61b2f7 -CT = -AAD = c9101b64e0b6abc0e46828aec14d29cc -Tag = 4f2ec2e1ab001443a60722671a9c9656 -FAIL - -Count = 7 -Key = 2eccf9cda0e4e70f273ee8251120c768 -IV = 1d869f4b8497bc19d948cea6 -CT = -AAD = 1d86a6a21f23ee56ad0fa6c1de525906 -Tag = 37ffc390298c3ea8cceb382f394c2fc2 -FAIL - -Count = 8 -Key = d61767f07b959e94f73c64cb5a5520b3 -IV = ecfa850395f8cf9348f1324f -CT = -AAD = c3571bf1700b114bbf0c6bb2278d4d88 -Tag = 1065f86bc9e22197880ea87ac326a17f -FAIL - -Count = 9 -Key = 9421cac15ce7d49ec7c088f7524a1ff5 -IV = b3d395bca123b265c05577cc -CT = -AAD = eb6e06071dae4360e8347bfb72d9c188 -Tag = 1f04c228c7efc71f1706d10fd819f35e -PT = - -Count = 10 -Key = 8580395a5d777c1690af79f6068e291b -IV = cad1a0f2b76f064ca56be3cf -CT = -AAD = 174388edf0b7f86fe634cb942c13754b -Tag = 0067b03f2e0efc72cb08792fbe3b0267 -PT = - -Count = 11 -Key = 0c21da9c8b84d371fde59e6d1752113e -IV = f8c13e58aaa329427438db8b -CT = -AAD = b8b197789cfd085b09a47760c28c7e8a -Tag = f8613cc5dcb4cc5c78f1f7c2d8084ec6 -PT = - -Count = 12 -Key = 162fc51e46e771222a04842f5546db8c -IV = 13557e09e738eb895eca2d8d -CT = -AAD = 691e71952c31a6b49b785f627c03e948 -Tag = 4f7ea723b1abd74e53fa356809275ca4 -PT = - -Count = 13 -Key = c46d9562d954801b8e99e4e57cbcc0ec -IV = 30414c934b14e0bb0110ae44 -CT = -AAD = 41ae6a63855c1944446491e80670bf68 -Tag = 3e2366a2cf5632c1ecfde33f1f5f6d18 -FAIL - -Count = 14 -Key = 2904df4dafcc6bbb8375baf6a7eede80 -IV = 6aae8ff4b1609f4026b47259 -CT = -AAD = c4afa7b21e5f41b892be52365a18584e -Tag = e1810fe340207fa83815182bbad62bde -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test20.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test20.txt deleted file mode 100644 index 7d417dd7..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test20.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 07a6be880a58f572dbc2ad74a56db8b6 -IV = 95fc6654e6dc3a8adf5e7a69 -CT = 095635c7e0eac0fc1059e67e1a936b6f72671121f96699fed520e5f8aff777f0 -AAD = de4269feea1a439d6e8990fd6f9f9d5bc67935294425255ea89b6f6772d680fd656b06581a5d8bc5c017ab532b4a9b83a55fde58cdfb3d2a8fef3aa426bc59d3e32f09d3cc20b1ceb9a9e349d1068a0aa3d39617fae0582ccef0 -Tag = b2235f6d4bdd7b9c0901711048859d47 -PT = 7680b48b5d28f38cdeab2d5851769394a3e141b990ec4bdf79a33e5315ac0338 - -Count = 1 -Key = 46bffe71ac52d4cc327b612469ccfb10 -IV = 78496f5e653ea0111b0ef4c9 -CT = 8c620a9245557459d7631f0df5935a9c4f05ac7f842e31c270264451090c21d3 -AAD = 954dc3942300fbd61bbb7e1c6a00836ec3875e6c12656df3affa4605200e4adf429731f6e7386bf43744cc252db523a322312702af68018853aa39a61ff88ce785ed727e0916057a97fa0c3e6daafba1aa79bf597ccddc4b5b97 -Tag = 20fe30dec5f3a5a8b8117afe65b81ca3 -PT = 59ba37f99a3be7b216f2a70dbc132f4b5839a5a57b51049daf9392afc02d9355 - -Count = 2 -Key = e306843ece9d0e98edf07aa3d1e3b6ed -IV = 9cc69f1c75cf0ee74f3a4ef5 -CT = ef59d545d7e921dcfefbaab0eea561e1c8cb12d27cfae589ddbf9c5271d41453 -AAD = 76f1e842634fc3a22be7b899d5616d125d393432c897f7994012f8c29934ff33ea4fd3495a52a1e3ea587a9116342c3ee304345d5e29102560df81a492799ec689e530dcd3e52711eebb43c66f645e5595abe5eaf8d462049d38 -Tag = c34930f3143b4746e574e653dfcc524d -PT = 0bfe265de63d70091b4f0537ff4153bb1e07502c55486f089873fdf38a9319db - -Count = 3 -Key = d0edd41ab297cb5d5df6b90a3cf1768d -IV = da4ef7e726e3a39d243c8444 -CT = d1c00496494bbcfefb04c5214657e9aa5270cd55e631ea914540312aa58ccd81 -AAD = 7a11df8fdef5aae36cfedd41565bad36fffbd6e6d9668135273e226dd83bd3ce84923a158747ddefefb12d156160d1abf3f35e1e689c40c2c0214ebb436c87528b3699e75817192894b54b47e3f508095230744b1b12f699cee1 -Tag = 7b9c7f4e5f471036ebc16c825f7e8e7f -PT = b9077e1f9787facc6fa5903b03d90af119454f8190f87391cb356e277cd3f06c - -Count = 4 -Key = 291567951e7d6e7442261b66372b3a6c -IV = 5a60ab4b00333bb34e292511 -CT = 0de6fe0eb4d94284388068226a84d6f86f181e320840d3f28a2bf6b92a17f7ea -AAD = 48055efab58264015eb49fe444de55edca701e09b679ec042abcdcff978e2b7eb74d0be0a84c858301cc415f5159f2a531138109fa5c559e770e6040f38ccf9302b790282458bbf99dbb494ae5c348ee4ab0f77d63b9dba6de56 -Tag = 38af26303a1ac4f8a5cb58420fd34803 -FAIL - -Count = 5 -Key = 44a0482a02ecac36d03d074949ca7815 -IV = c408ab22ba66b18947e3559e -CT = dc9d20998356985d299d81e965dd39abe03a1c04eb6829f531bc3d622cdd6e6d -AAD = fde37b7c9af3bbba7501d7b91dc456e32a6af77da2afae3b28c15640f5d99eeda5bde206d54c8def9c60eede741f4e4e50353119bb30e2523f073a7a367972b0c90e96a88a511646cfe24468548e50ff520bd5b8abb2a67d1304 -Tag = e013def1d2c5d1c8cfcf37ff1b99fd6b -PT = 3a995dd4779114839e2df602a4eca9c9e96f774aefdf3a78197e1a724de86cc5 - -Count = 6 -Key = 1edd5afd2b7a09e87528172eba3b4ece -IV = e8cc6fc5863f531860da48f0 -CT = b3d8fb923602f6570dedfd35392a78b3c6a824f6b0cae18f767bf17b51dbace5 -AAD = bb42f41f140f4b02f948e2e8022ecca7d74208171c52792989df161dad0d689d69e1ddcedc2dd910c6cc80f5759233ff9d39a571f48f42db1491b4d388f70925637bb6728cf2d47c2a9ed62240e2c948755750048230995fbae8 -Tag = 18e61e77a0da2f9212e49d9dbf1e4dfc -FAIL - -Count = 7 -Key = 801405876cbb2529d3fbe75ff683ace0 -IV = 70c46c7056213d4451f5e5dc -CT = a24f742c07d0ab8acab04f8fda4da7b5ac05728c0a7d5ad3bad0a0e845702a05 -AAD = 12942eaeca76806a5761cc76423240515f8f5d9b0d97557c5edb56db35dcda8a939b6375bb0b51ea7b9b67129304f82ce18f4a89edc75ce3db06a2e8607305de65349e4a6ba2d7ff8a13642caa59efb2b81cc050809bc52dceb5 -Tag = cc03cdbd5b6bd5b8614a456e2e14c6de -PT = daa772583ff5d445cdff53f0ddfd509ec8f93029ae0809b6ed54a91330ba16c1 - -Count = 8 -Key = 35f32d1f51d7d568ec80ab19555499cf -IV = 4af3095403b32091ca64c69e -CT = 4260444f1fd74ff30b0a8aefdf6b4bb39841678efe2ae7bfefc50d5b763fdf5b -AAD = a85fc884c10eb788e76e31cccf459b48d7e0bfc20f364316ced3ba81557ce3cc954357455e2998f3a9f3fe41694a8042bcc42a35fec042f1c24761b17a972e7d8255d0f1256dc8356e02baeff99e6b35203e71e4a95f61227ef6 -Tag = c659d690592881cce6eea2d6723a63ad -PT = 46eaf310e55f794e5b33429169450590272513b881df740e377c6b2f7744db78 - -Count = 9 -Key = b4aa6cd190092a887d0450302cff4464 -IV = f2dd629677deb47e9f6a87ac -CT = 84b74187e987fd293d743f0a42943ff52b6cff4710ce8adf387d84d9899df368 -AAD = dcd080bbdcbba07f1b9f9daef2cdbc2f9d579adf42b2467454cb2cf5233b753ca3ad04c61fb832e77ade745d600621ddfa4c14601865e013d3eddac8d2ce3733be0e84be1765200d778b9ae1bc087a97e89c9532971ea2177ecd -Tag = 6d89454ba2e6506d2a4a3fa1339af144 -PT = 75f80807a10beb8dace8bd1200bd8c2589abfa789b71257a9c7b15c0c14a89b8 - -Count = 10 -Key = 632072de94a0b3aafc8faad0337c3dd6 -IV = 0fd43cfaa52a7ede50c1fb48 -CT = 1a735b4723ed2eee23a5ec5706e41e7488b7ae34a01e741ba30c851b7a570e9b -AAD = 24e3af0dd3492e86598b8811e03d689b3802c972f081655320418045ceb7390f52592b85fc90acfa4717dad6e05c10957e33dd1cde30d127b759b2a03f3289f49cf3992d2a154f7230d50dafa57b7e78402946f17371661d1945 -Tag = c5e92a4b0ba5729de2c65c4ce33c0e8c -FAIL - -Count = 11 -Key = 7bcaaf0eec55d449c74b1af7311c5347 -IV = beb7a8feae23175e9920b9e2 -CT = e523e45e26e09f82af160d9965973e933ec5416a5af200872f0a3f5ff9121438 -AAD = cee02585c352bfe634591b2160ed76fadc3d35c76ab99687d4f7d1462d05ee25d94ff565ac77e7d12e911b07cda480e8032e48cb274ca96be27e85af6bfc4309b874f567d2c818fc0d0e91ae36c5123772648c73f7ce4c6490a3 -Tag = 3764be1d6efdedb7609fcdfd02c4b012 -PT = 39584163ee47e7bda29badece03463793c3cd6a0afeabd0c45aa6da2000ef275 - -Count = 12 -Key = b7b21207686125ded8a5763c217962dc -IV = ec7be05311b9fa04e4bde222 -CT = 345c41f07f6c6217fc134930ecb9377fa30992d63a0c07148a4fdcfa25484c4b -AAD = 885ed7046e3dba4be59d035a2516e382b07d3d7f3e68d9b654803b1dbd187a14f310209f5b3ffa51dedb59f0afdde54be81c6d8f431e547f8ed205d4c8b8d7d895e5bc49ae7cf304b5944bc01e096e0ab9079c2bbf10b40a6ff0 -Tag = 3b0e0bc5aca7d21285473f5e65c4afbb -FAIL - -Count = 13 -Key = 0dfa4098fb21873ced3cef3e9b5a5d92 -IV = 3a8a1cf096a5292324c3b890 -CT = b865ed2baaaa832320688c9da7854be242aba6f69258953b26730698ff08cd9e -AAD = e4fee49532d867ac44cca79d77c50297f0221d95bb2d668f47a0a49ae0b12bab67332b5380a9914c3952265365b558f94132e6b0586f40778e91cff0d47dad9649f56934934059a82f9fabedab8d27b0be782296d537c2b3a03d -Tag = 6163df5982acc866a8077c82a289fa3e -PT = 6cd946e61a36eb0b6b3ec580b0c463ac56fe8007906167d74685dc7bf69f0c88 - -Count = 14 -Key = 07fbf81cf98e000695b32bc7b0e2925c -IV = 67424e386d0bb45d1a7959f5 -CT = d8f277d9113154b4f54b0d0d717f339c27305254ea3eb87f7cc591a98d48cb31 -AAD = 7b34c644170bebb1e851f45ad7c6fc9a125b159f6bc6377d76daf3a4384447ac6c570919ad7ceac660b692d92624202110f85804399492feb2fc0e889e93eba61c4ee59d478aecfc53a88d163064d8e8fb5caf1d2d26aeb87a46 -Tag = 8e946decababd58afcec508278f6e95d -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test21.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test21.txt deleted file mode 100644 index 021f13e4..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test21.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = f3c4c058c7f0965a0328f0f011a128e0 -IV = e96098c39d9aa83522119355 -CT = b42c25155820564b41c525c6aa8ff4363c7c511917772b9bcd574b0be1f6b4ca2153869ddf0c4f76dfad3aef0a76ce056582f9 -AAD = -Tag = 44331e39b8a66a81591ed155d7d32372 -FAIL - -Count = 1 -Key = 93ae114052b7985d409a39a40df8c7ee -IV = 8ad733a4a9b8330690238c42 -CT = bbb5b672a479afca2b11adb0a4c762b698dd565908fee1d101f6a01d63332c91b85d7f03ac48a477897d512b4572f9042cb7ea -AAD = -Tag = 4d78bdcb1366fcba02fdccee57e1ff44 -PT = 3f3bb0644eac878b97d990d257f5b36e1793490dbc13fea4efe9822cebba7444cce4dee5a7f5dfdf285f96785792812200c279 - -Count = 2 -Key = 2e6705fc4862967af3aea0785f6da759 -IV = 7d9280f59dc2b98f0195098d -CT = 30980d2634138ead42c3347b9b3af32f78ffec0d7686b9247f8ef7258b72859276d9d33eb670eafb3ea900c32db9befccfc1d6 -AAD = -Tag = cbca49ce70d3ddb752dc3b438f2845ba -PT = fd1b20d58e51fe93d177db518416e632212dd1effb6b5fcf51bd94234ab96a455d8e3c84ca03b26d58c8867b6a1cc390828ffb - -Count = 3 -Key = c36bfc62ae2b4969dbe23b7332eccfe4 -IV = f9651d42ebf8468eb6e45829 -CT = f9296beed3d3b573f72cbde4ad832e34e8ef6cf7178e8d2783fff5ec8359daf67df8a70d8f86d2c339f9e1ec59d234e4f61938 -AAD = -Tag = 46ac46b455e9f483a8eedf6ef4b61be1 -PT = de42199c477b69de2857100395aefb2735c8328331109d647eae535c54200869e7a8bc82f461fc6c474748297c341bd22126fe - -Count = 4 -Key = a02b7907be2c2a5f8c40127c27b609cd -IV = b5ee4456bee99ab857120d1a -CT = 0a14bc62326c9af9960b896018d98c792d6e0456435005d65e60d553b4ea733ace7dcfdcef0c7d86a6f3065cab8012a4cb2cb9 -AAD = -Tag = 8fb36293be18a68ae7160fc848cc9cc9 -FAIL - -Count = 5 -Key = d3c4f95ee0ff93f67dfd7c6b65786a71 -IV = 18be95d32c908294ba908e76 -CT = a18dfc65d0d8e9485776623cd0a3bf77d05482eee64e97cbd0882197800611081198439a11e226c3fb819849230f1fca9a89e3 -AAD = -Tag = 0f528349ecbb4bed97e9fe8ce16161bb -PT = 51727be06b95ed04ec1f411aaf5b214c58f21782cbe9b624cb28229abb8f9d8d673b903c12eb9147c40cc58e81525d86edd6c6 - -Count = 6 -Key = a2526f5350c42e0772063ec155f1e1d5 -IV = b4f8c85c0d743a99a6cc87e3 -CT = 48584a611dfbe46c3a7cbdced160032945193cb8dc0d551080d162b47af7da53ef4cb1896fc01a5dcb8e38dd9784b86e804ee3 -AAD = -Tag = 65e48ba3b15b7478b885f8ccb52392f1 -FAIL - -Count = 7 -Key = d4c653fd951800ebe9c4a43806f294cd -IV = d3f54fcd5d7a85377fff76d5 -CT = a8464c51b538232eeaafb3c28f92773776bc040e9570cb1041ea69a28570f15bd284acdd2bf2e732d5e37fc4f71a9881e95f32 -AAD = -Tag = 88a2ae3bcd70d70c0652b41623287472 -PT = 38e1591924b8c3e3ae70955767bd33525223d3083245d0dab82bf55f2f9a0cf89eb67ac7fff56790c0a1cfd17dcfdab24fa821 - -Count = 8 -Key = d925a80f584eddce723da5e2c6dc2225 -IV = 90fa88a5d494154d71186705 -CT = 484049f8c5d49cee54d7a4f31801bf0b3f7b67c2c18e594117d413238f80e45e6322f389aafe7751abd15bec4ff0f6209add28 -AAD = -Tag = a382b14879dc59d855182f2a324569cf -FAIL - -Count = 9 -Key = dcbb9565d2f07f94a95f7982728f4624 -IV = a3e76752362e13ee7df5a207 -CT = 5e1789e0a24a72bba8c5f775284cc31243d62ef474db73bf73410be4abf80c860e1470aa98247119e558f13bdc4e9cd802aded -AAD = -Tag = 1a7bfc1af64c5e08741f1080064f89d1 -FAIL - -Count = 10 -Key = 838e8ec1da4be60680c2f7a03c050975 -IV = 33a4203c8a85bc83117dbb8a -CT = 19210a21ef00ba0e17ba8e1d23eca7f8f2e4cdb13c2e3f87a9ca0e361736796fd3720598e8283289aab0a4afafc13a7cff0437 -AAD = -Tag = 692270364f737ab2f31f421a48fb6b8a -FAIL - -Count = 11 -Key = c62f464a146cdfde1b23999bfc27715c -IV = 5bac8eb5030a81cf2782974c -CT = f8407943de543fabd5c6d2c217a2567b895847b3031e46fef6a20b9446b395d3a751633ea14dc49c36805a66eb466e028c0eda -AAD = -Tag = 150feaaed2ba2ae459f8f0f28fc2c27a -FAIL - -Count = 12 -Key = 3a2b2a1f2afd731648fc60c2d4775422 -IV = 9fd376abd09e6599986afb96 -CT = 813a8d7c46d0a3504445dbab48a546cbed968c574645fa696ffa9b5d62ce394ee35a204c62edf8d04c7ef621ed519c3b7a7318 -AAD = -Tag = f259e62193f1eefdbc6ec1ace305f78f -FAIL - -Count = 13 -Key = 1a77d432ea3555b56ce73509f90e4e47 -IV = c54136dc1525ed4f6dce4ba0 -CT = 33f094e27be6fdf62b901b980471b5e4d19ed7bd1b8ebf5b3f225f3e0e2669e02c74630f43472515806bd3d37b9b20f21870ae -AAD = -Tag = d480b1ab8a8f661d907c7d45bd8d2883 -FAIL - -Count = 14 -Key = 63193b6e66daedb9d566677ca4d3b129 -IV = 313ba09226bee694217f5cbc -CT = af18be0edfe1b74fc327d447909347c1e8b22f24eed0c545ac76f2d8d48f3c673b300b1c2cd894455c2232e052f078f0af71f4 -AAD = -Tag = 96183cc5e22937c15b78049d7cab2181 -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test22.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test22.txt deleted file mode 100644 index ad876fb6..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test22.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = bc22f3f05cc40db9311e4192966fee92 -IV = 134988e662343c06d3ab83db -CT = 4c0168ab95d3a10ef25e5924108389365c67d97778995892d9fd46897384af61fc559212b3267e90fe4df7bfd1fbed46f4b9ee -AAD = 10087e6ed81049b509c31d12fee88c64 -Tag = 771357958a316f166bd0dacc98ea801a -PT = 337c1bc992386cf0f957617fe4d5ec1218ae1cc40369305518eb177e9b15c1646b142ff71237efaa58790080cd82e8848b295c - -Count = 1 -Key = 4384629e9b1686927e8508243be1d01a -IV = 84ff7f4feddde7d89d370e7d -CT = 8f385490e9622a6c1009900052385c23442890d2af667b210d012781e62d0de311f2149cc377a490afcc686cd92e7c35dc7e5c -AAD = a51cebf08d0f293e3a83bea5a9f1cc6d -Tag = 00097982ccc985671477cb1f1a250bd4 -FAIL - -Count = 2 -Key = aa1b3a94882b9b9dde8c8099a7af1830 -IV = d56abb827acd6388f48f7096 -CT = d145a79b9a97ecf2907ab0372c6eed310cf32e7a269374fba920c99eded54bc03c873fc0acdb895078bb8bb336fcd2662e071f -AAD = 503eb74ed7b0ed14f221d55638fa4fca -Tag = e0861f6a706b56da1b1fa8f04a14eebb -PT = 8b9700bbfec195f96f28093002217703970126e4b209e585719c066e5c7eb8c48e7e8e6b3329cf5980eeca49f80bf121de253f - -Count = 3 -Key = 5a85c2df1f3c0baeba09b8f532cfc8bc -IV = 9e8dfe8d34ef979508c00cda -CT = 9887db619566da9fbfa073a667168a85fcb94700ab267d30e3ddac0f8d1ac0f6f7d63ac02d2c28668f933ba080da521032ebd8 -AAD = 27eafefcad6eb8a410235ec3969ed11d -Tag = c84326d0247aa00ff3ba886da1f2c966 -PT = 63ef1aebf25de0e7e35a602e6d86c95dc9ff46ee0223b09b5332cb28a9b0d94486394cd442c93cd854ac54208fe1e1c64257b0 - -Count = 4 -Key = 9cb63a6932a7e7b210b82e854ed2389b -IV = 7d3498cd4af4387cf747dd50 -CT = d73bfce17382edd23be968d9da3bc772c59378d842183f4d11c028abfc9eca44a416a96a2058152e0ea83f42bd48ee79ed3acb -AAD = 188164c9a24f8965720392177138f354 -Tag = 5ee3c2452ccd78f780b8ffd0329f8df7 -FAIL - -Count = 5 -Key = 8b87af542edb66d468e9eb02f60685b0 -IV = fa7f13984e724612b22f4e5e -CT = 969cd236712e4a06be8c1f1a211f2c8a0a94d8b06bb05c72fbae4ac86ae2afbcb63580bf7261b4fdc829faf97652dbcdf54b3a -AAD = 7e734ddab198244376534bfe5024437f -Tag = 4305efed9cc20237daa32dfb47b1c276 -PT = 1b3898e927cc948ccb340e4ba46ea23095014e055256319ef4d114aa4ae67c520c9da07a0e2152b180505862d4c04eaa67887a - -Count = 6 -Key = 9f49f4aedf07cd2060cf4d12a7f40e34 -IV = a52983ca2faf10514d1369e1 -CT = 8df0217ef038eb6c03f3500833c3ac218dbbfe29100b9f48554333dee461b867dafc16089e6ef0c6c4c8684d307a54f0ccedc5 -AAD = 3ae716e481e36426214ad512fd607121 -Tag = 5bf48a795284ba53f0834940bc155e32 -PT = fecdaeac7f30ec39a6732a7829b7905141aa50f9ec65dd0efc5acea9349f585d61afaa4c0cb55a60e9b12a8a1fad98ea3e6bda - -Count = 7 -Key = c3a4add425cfc13062634ec4926059f0 -IV = 9e79f25c956adfeff8f71ba9 -CT = fc4a252f4179ddabf4c1cf5837526fec3cfeb3134e6d2cd70f1cf5eaf3beaf8ecb364e4256d529b930f524cd264adff3bb0211 -AAD = e36a19bea0f26f7a7117309d48a47cfa -Tag = dcb137bd2c88b60a7ca442ccd042061d -PT = 3c0d5f84159bf11e520b2d1405c5c26fe94a8482da1b420cf6d8df5a536dff7c39cf7bbeffdf60365bf9a1b0bdf35d299d9043 - -Count = 8 -Key = bf156813577aaed10f105662a2564005 -IV = 2dae894ae0848438f6e7f589 -CT = fedfec37d41795795c890472db7aa9cc9b59c5c86d6331466e5e5ac023a6f1e2855777f905794138f9b19a20dd4f9339b3c5c5 -AAD = 8c7ee403c77c861e6b75ad65f70d6cf5 -Tag = 0b50277dd6cb68a185b76d1dc3c0c3ae -PT = 9bee8e3b0daae03815fee8f548d06725261d1c213e7df2b87211655d60f7a122aa094967d54fc02cb2a51f156fba9294876c56 - -Count = 9 -Key = 1cee4f13145b8ee79c33755c4f60c299 -IV = 90115ee9a8c2fea38fd2b2c0 -CT = 7ccfde4eab711372bb28f5474797afc3066cb2befb84e66520526e8142316b986bba83fd928684c3131a866dc95c977f908dcc -AAD = b386ba008df273370459643b05e384f8 -Tag = c64979df36723089cb13bcfb2667c16b -FAIL - -Count = 10 -Key = 6b6b8a1fda71d168071213ed5f16e3a8 -IV = cd5cdb482d8d2a850ac528b7 -CT = cfb2c9aaabf3bcb373104255c6ba7c98bb88e7c446dc5b5caa4118c89c1bcacf1bfc7632d3a59ec954ad1582dc50970a57ea37 -AAD = 6ecfc978c3cf0dc721b868af6dd36588 -Tag = 87d16126f3b440d792cd4e69070e218a -FAIL - -Count = 11 -Key = aeb9f141348237ab152e0fee7765be89 -IV = 645cba3940f7d8e94d6ab775 -CT = 1db852ce89b10b3ee6dee42b492960be1838ae08e84dc00a70e217a9e83a436c849e7921e76af967e3574d65a915c854fb10ff -AAD = d3f8f031c70d75e26eb56c3fad82d49d -Tag = 69adcb30c4e12ff4eaf6e8e5ee8123c4 -FAIL - -Count = 12 -Key = 65dbce79d38150831274a718933b1207 -IV = f4f72eb6f3195327089dc7bd -CT = 70f31d645fc671cb4b79ab6ecf265f4ee9cba5febd2f73ceb44a7fe2f028efc8ee30b9eedac5bb7ccc11906e111029ddb3c545 -AAD = 6adcab836f1ef8ba1a9a089c5a6f5da3 -Tag = aec413c1e013af99cf8189da009adf63 -FAIL - -Count = 13 -Key = d6eccbc171f2b412acaed30238715f60 -IV = 90d0754b0ddf108afe8d199a -CT = 7c89057bf0c94527b3a63be13a963f76022896f0c98fa364934f71e997dddc09e778b71d009d12df611df0a9ef3cfb944fb86b -AAD = 217f2aedd907a8f86cbcce8d16a13744 -Tag = 9e045825b670b964a263c73c9a636427 -PT = 9da6e3f91d5f0ed62e1487bf9bf62ea8dbcfc56827731450a43f347882daa97cfb9ffdc79500bcf1601b397da076218b36cc9f - -Count = 14 -Key = 89b512544b5f39266fbbc0a770770d7a -IV = 97748e40699bf90abc46276e -CT = e0816c13ef928eb00f07444864fc7279b617543282a7e7c8873fdd352411afe457fbb4ec41e68685742948dda2cd8e09104110 -AAD = 1192973746283ab4657e19cd63284dcd -Tag = 136835fd131d43836ff2de3efabef747 -PT = 213f23341507ed5a2c93c1ef2007bee82786ab109f8d04e6cfeaade1bd895499f0661ae095132037200278a9bc3460a0716cff - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test23.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test23.txt deleted file mode 100644 index c6f10998..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test23.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = af57f42c60c0fc5a09adb81ab86ca1c3 -IV = a2dc01871f37025dc0fc9a79 -CT = b9a535864f48ea7b6b1367914978f9bfa087d854bb0e269bed8d279d2eea1210e48947338b22f9bad09093276a331e9c79c7f4 -AAD = 41dc38988945fcb44faf2ef72d0061289ef8efd8 -Tag = 4f71e72bde0018f555c5adcce062e005 -PT = 3803a0727eeb0ade441e0ec107161ded2d425ec0d102f21f51bf2cf9947c7ec4aa72795b2f69b041596e8817d0a3c16f8fadeb - -Count = 1 -Key = ebc753e5422b377d3cb64b58ffa41b61 -IV = 2e1821efaced9acf1f241c9b -CT = 069567190554e9ab2b50a4e1fbf9c147340a5025fdbd201929834eaf6532325899ccb9f401823e04b05817243d2142a3589878 -AAD = b9673412fd4f88ba0e920f46dd6438ff791d8eef -Tag = 534d9234d2351cf30e565de47baece0b -PT = 39077edb35e9c5a4b1e4c2a6b9bb1fce77f00f5023af40333d6d699014c2bcf4209c18353a18017f5b36bfc00b1f6dcb7ed485 - -Count = 2 -Key = 52bdbbf9cf477f187ec010589cb39d58 -IV = d3be36d3393134951d324b31 -CT = 700188da144fa692cf46e4a8499510a53d90903c967f7f13e8a1bd8151a74adc4fe63e32b992760b3a5f99e9a47838867000a9 -AAD = 93c4fc6a4135f54d640b0c976bf755a06a292c33 -Tag = 8ca4e38aa3dfa6b1d0297021ccf3ea5f -FAIL - -Count = 3 -Key = 231025c304c626f119964a708328d25a -IV = 9f60d5a70a0a1452c50d756f -CT = 0dfe5a02709ec9fc6515501f16df29c512832f4f3da7491a8c1f1e149d131bd5ca05b803c8ad15bca743cb2c6308281857b8bf -AAD = 7e2b3efd33751fb7df561fee3f5f141433ed3b19 -Tag = 42ef3d08f38e9825b8800e56f1194ee9 -FAIL - -Count = 4 -Key = cb3354e8dd509bfeffcd8b7da33885d7 -IV = d794deec5973503dda19646d -CT = 20e1eb1572308afca40316934df2bd1d55131aa5f9abc06ebeddcf20ab66a6dfb562f54b7490fcb9d7d9bcd52f142edfa3f676 -AAD = 0d785ef9026b7e6a109adbaa7842a4bdc5461875 -Tag = ae92113005dddaf3e80ea809bd8fe899 -PT = c727894b7a507d5ab124a9fb14495c1d5842772e0d339ace3463a481967b0d7bfc16756ed18ac873d9119eedaa20bdea170dc8 - -Count = 5 -Key = 5a577dcb0d6929718fbdace24c03fb2e -IV = 54e4b51f37adb3d6696c58b3 -CT = 1712451494cc4dd30f779bc11f20c71683354235c69a1e3985e4492ec3c692781c5939f8bb73f14dbba37ce0ee640e24aa8a4a -AAD = c019aae892687a88946ed08115681ec79764369a -Tag = 9e201c975e3a938074a35c7e51a0d38a -PT = a457674bb83b3210e738c169b412f9a76ce77927265b1cb4f80fd336603a8363f3a287403969871c0d4085eb39a045e2b961c8 - -Count = 6 -Key = 04cbdcca86b9353d25c3d3c2b340453f -IV = fb594bde6c7da88bb4268c6b -CT = 22a7e51fc2b61ccd6367b3f4d519c725012db48834ba5e4ac89f7a27238eda54086cda0238de9abdab8231013e6692c17bd2d3 -AAD = 39b9ab5ac29002de6c6f48fb744a14b957e618d3 -Tag = f870268f770a3bbe7c3347b9f9b08f1e -PT = 0f8527090a793da125cc3a4aed04b5a1abeb0d09da7602982c686936734f874888b2f4b8c37c526b0b2005a2dc78dba7c8c47d - -Count = 7 -Key = 4d2fc6325a7beda38f12f9c4dae62e15 -IV = 774d52fd076c1d1707e024b0 -CT = 67a43f43fce9fb7303b0ec4544887d70c811c0b1dfc923ab567bccea494d0913ff40b7cb70d89e7b5096fa942d5747f8c245dc -AAD = 225e4c071fb10cf62d8529b5af30c29e29fafd30 -Tag = 97f586f1c395bbb05be58b891c48fc43 -PT = 13ab3fb2eb0d6d37637a0a1761911addde76f9b451d16c8e0dd562b5c4ffd8e59e5ac08d9321b9660605cbfb06f33ccaaeabc1 - -Count = 8 -Key = 53a2ed1d225b63d4bb45b5225d8fa21e -IV = daacea4f24319dee2afd9cec -CT = d58eaaf85adccb60a952dca9b72d8144eeac455ad9c3d558e64220669e6333d3e01d8d7f74cfca6d15480d564d2acf6110dbaf -AAD = ac25e4ada8fb3160b2bb5b445f35b885ab0b42de -Tag = dad2f9fae9071ae8fb21f3f2d7bf4ee1 -PT = 1f6666966c94ed3f2c4586ea8f6b9bfede55a396c6e4cdc014ba93b272d52c42081aa8272552d4a6862a1543439042e3656312 - -Count = 9 -Key = 441e2093780b7466a736cf9fd56f505e -IV = 29852c4f9e8e560bebda507f -CT = 3f86e4663af1108480e9ebfb1c4ff8cbbf2f340658b91953fa51bad044b3e900e38e66475115c203f9aab0553efbe7c8d3488d -AAD = cb79774fe3859d571750a721da0d0d4cde40a703 -Tag = 35d94561193fed46b6468672ed06f848 -FAIL - -Count = 10 -Key = 72e26b401f5edbab8d52d85b953c9740 -IV = 7bdee59ca460dcd9a9026c00 -CT = 326d6aa5c731fe350872edd4851cef3f52d8b23e8d21eadd6cde94266644393a033b8188f8d4991e6af8896cc90dfb14133ffa -AAD = c87e5464decf9e311e1a53fc7c2e58ce3c2cdfd5 -Tag = cc72145ec7d743669f82ffcff4477431 -FAIL - -Count = 11 -Key = 8b7e68eb7c5af5667e107b15b024c6dd -IV = 3032706bb97a57db2c12f516 -CT = 7e51f0246c2141d3056e029f010f137d962db5f2b75cea3025641b9f257b0cf368ac5af5386a652e4a344ce87a3ed7ea13f4b1 -AAD = 8e7443bd5391b0d794ca731faf0693b5c1bd322e -Tag = bd958335e45dfe08a14ad3493fcf684f -PT = 104d820cd5bb4ef3d6c8da38aaf87e918319bb9c6855141a5d347f34fc99f17d9099d75a55a9af4d91c3b606d5d681906fa645 - -Count = 12 -Key = 6be475335ebfac4a8153e2933df64728 -IV = 2ce9f60a87700b3cc2aa4bd6 -CT = 94450c6fcbc69723e5099e8f4d1687ef30d22b53e75dfb1d64a66b5a714c38841bc02e4d1a1d543a29d4421622605be9898c35 -AAD = 4a47b8de3f900d31b02c341fa6e93bf7d7fed8b6 -Tag = 0e2a619de3645b78f8d88b4d41bb7fee -FAIL - -Count = 13 -Key = 1e47d62f60c4f817e60b4daff62ff0bf -IV = ac749f9ae55bc1fbc8d18f8d -CT = 81aeac511f589d5f7b9a63c98188faa88e013fb2efea246627386f6124285fc9f5af0fc9a7dd66dcbfa72a08e0dd205a4f54e0 -AAD = 1dbe80d44a17dd3c9717436485e946edf10f5a94 -Tag = 3eb79932f3c5c81fe7a0b25f9a862820 -FAIL - -Count = 14 -Key = 94e5bfcb62bf58e4d22fa7e111f36ded -IV = a1440994c67b449ab1185996 -CT = a33bff622bd29e2d32b0860c6bef2fa7b0d9a108d06af8b41de8467ab063ab0363c576ec8b085b8ff04eafd997607d651e607b -AAD = d56056f606021bda6c9d3e47114650f08c4326a7 -Tag = 69ccda69723a8e596e0ed6db65f19257 -PT = e376d7e1466e559a8e535c06a8cd609a8075c373b7b2eda79396c9b7a7a2fd55b5d0d3c7fbca64f5e40c553865d697a52a242d - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test24.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test24.txt deleted file mode 100644 index 574aaf25..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test24.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = e7c650a8f64a900857eaf8d95c49a807 -IV = 961a0b83a36b79acc1494da5 -CT = 70954661360ee1dcc5ea22918fa89bbcf56aa6ded04b22fccff799d773833617c9aa7ddb0ab9c170d6a44769bce9f7fe287c68 -AAD = da9ff7c1529f9cb75c88cd890c9a1af493db5fe8148c4687984c070442c5d501434bbaab1dae06cec6de0606d59da3d0 -Tag = a0962c9259e7d4a9a21e9328e93c754c -FAIL - -Count = 1 -Key = f0305c7b513960533519473976f02beb -IV = 1a7f6ea0e6c9aa5cf8b78b09 -CT = 30043bcbe2177ab25e4b00a92ee1cd80e9daaea0bc0a827fc5fcb84e7b07be6395582a5a14e768dde80a20dae0a8b1d8d1d29b -AAD = 7e2071cc1c70719143981de543cd28dbceb92de0d6021bda4417e7b6417938b126632ecff6e00766e5d0aad3d6f06811 -Tag = 796c41624f6c3cab762380d21ab6130b -PT = e5fc990c0739e05bd4655871c7401128117737a11d520372239ab723f7fde78dc4212ac565ee5ee100a014dbb71ea13cdb08eb - -Count = 2 -Key = adbe83a792ac133ff5088b49dc8fc54c -IV = d9ff7ed76c6c34d956917a8e -CT = e12d324af2e723722fb5ace9da7c3dc0e673d2ee294e414b5abbbdd2dd4fc688e5dd6d2e961533e9083b6ae8e712b7b23339a4 -AAD = a81f2b8c138d3e629b6e06a9563e75ac5bf024fc53556dbb9e008d9fa551835566d72b15b39f1ea0d9d6a53ddbd488c8 -Tag = 6fe3139f1f75228545db7fee6965fb17 -PT = e76f356343be3e1fc9e2bd0f9dd770c876122ddf1d6270128a74ca8394ba47531e82e13b0c9f028fae18110f2ac673de832085 - -Count = 3 -Key = 32406fc5ecd36e327c45c9e783870b54 -IV = 22e95c98f482982ea0f189c8 -CT = e8396f91e757cc47385e2d45a0dd8a3fa34350a9d1e0cabadbe73ea2b17b866c7cce8df163a802a7e207e80fe6f11d15f2e483 -AAD = 635ba2c5301e218182da81805de97b2aab5f163397d319c4548dee5ca7fb4a6c601f667da3c542347890e267f94d613e -Tag = 630431ebd61f8f2e01639d2e6cf3acc8 -PT = 3d49646a76dafcb7ff78aca9415207b107afe751b2cebc1757cfc74402f15f89c36ebad397fa033d21c26ece33533c4d80897b - -Count = 4 -Key = 8e184c0f49d263a9cacdb83821a33c98 -IV = 06d8f6969a2e0569ee0f7872 -CT = 4b8497667cca8784a01300f2869aceeb6161f60f6073f11470a14b4b2f905cd9705ea3938fcaff3f2308d5e9f3aa7f88bdb808 -AAD = 655730e35b8f91ec3d6c083baab2751c7dabc0a4d29d0bed6453b2ce8a468cc0f0bac9000f8a86e468fdd1623901994d -Tag = 9d919fa4c13f38c9134d7893d832fd30 -FAIL - -Count = 5 -Key = 5d697b8c61784d02cda780887e57fca0 -IV = 6a7aa3548a1a23c91b8785c5 -CT = 654855265d5b61777a7c0a8b8239c74cc9af1aefbe80e76b415a17e148aae92ee3c9fdf391dc22fe1d77805cf18faf0be54823 -AAD = 57add18eadebfe0651f90699e1eebf168447a6d61db412f72acadf77f8dc5f27e0ca9bb5e5a8d02ad572782684647e23 -Tag = 813db300a2a25fc1791e98e7d8852ee6 -FAIL - -Count = 6 -Key = d7fbc15e1a47d60e64a15933eab1af36 -IV = b02845c45a33f58c5c33e729 -CT = 259f6299e382bfcbd8b217c2fed076799deb9abf3eb59b58f07f92121b7dfaf9d37130ae708898c281ffb1b22d8ea08c16c674 -AAD = ecbbe60c54a60414cc5f6da3634d03c0b78ad70dcb9902edb4285ccc148f7d30bcd14a1d8a8dd643b50cde910fde964a -Tag = c23e799000d36b0456c7ec1cf6b28285 -PT = 465a3617259fc4fce31df80aa4f7254065cb7c9e1b61692c42c3ec5bb8c13852c9b826ac886d86802d92bb63d5a0a3ad60c6a8 - -Count = 7 -Key = 3a90b1433b1c18f9e2d284ac1022add8 -IV = 99c814d63bb4835663fe8b0a -CT = 5fa507b9a068a16dd098223db38600ee3e2a4cfe7ed0d484fc24602062fe3118b112a0cb7d960616d4954f0f1b6bba6bdaf0d6 -AAD = 7e61eaa0442e1ac7fe336036ebab57140f5648f44a11968d63ee287de2cb01c5b1c808a20690ce0406104859a3ea462b -Tag = eb35c593e4641aa9f075e380645940d6 -FAIL - -Count = 8 -Key = 0e5d672e3e3abae3efccdd6302b63075 -IV = 41ce593eec39b3360741f5a7 -CT = f15d84949a7a6233ea7c6389c60c3be39e727c58fe86b63aa5101385bba8dd152ebeddcaccb8fda44e9923c4a27ab63700d60a -AAD = 12791dfc8a7fbfcef959cc1105e7017c837da1cca1dd8499ede10fad46323f752203c5e3213818ba751a5fb7a33d24ff -Tag = cef08ec966cee8be9904fb0f7014e455 -PT = 3bec21655c5b7727e82b9c14e495002fee0d0abcece86da9e5ed9361ab4e1b52db04630b3e2d2317f117712a213df4a2766b70 - -Count = 9 -Key = 5b4309a19a3ff4f5a2f3f50ff173553d -IV = 24732b76850d64df84b0b543 -CT = fcfd435b25812031ce0a2b1114083fd5d0e642ed9472f9794c65dc2e1ec2b69dfaede399041c895a150fa02794b307b1113f67 -AAD = e19620455af6630e2cdc16a184c6418dff96372fb31b5bad6c4c40e824a8a0f9ffcb9557269d3bd808582f99765997af -Tag = 1b1ff7b4ff45ab1c318371f860c21ee2 -FAIL - -Count = 10 -Key = 012e3a4a112fec5b012a8a740d528859 -IV = 7cb272d50f410acb61b0460b -CT = df42e49d5e42488b28ec32a1e2c13f49b018b94e268b8529d2db0cdddf7064674fcd347a6ad4ae6bc0b935d6820dafe1a1e037 -AAD = 27d30a53a8c009f01cc7eeacd5a2bd479280cf31a2c0e6c854b5bcbc0517cad3f135bb4799c9e2e1e99905bd649b251f -Tag = c62506c34f7ccfa41a50a389a7b57fe2 -FAIL - -Count = 11 -Key = d1a132ef84f48fea7f106e6d444ca25e -IV = 9c9725e2bab366dd9004338a -CT = 8ac638ccd1b4e074957e08fbc4f89a703b44c204ac15c0a8380c72536e62a7056e47f3e2096ccecd837c55e00e84e1ea31323d -AAD = d6a4c524d726502c3e726d6c8aaf373b390e4300a3e7ea74c21bedd9e5731575060e8a85922ae3c7b317a18f1a6331b7 -Tag = b03a4e723b8ecc24422ed39e0d7cbfc8 -PT = 9eb690978cf06c5df315e63633be02f8d9539bc4aaa98e7e9b6dde4cc4fecde3f53b82d7b614a2e03e1df21e887cabca843175 - -Count = 12 -Key = d85c71da4700d540319eb4f19bbe7654 -IV = 18aaf265066ade903c82dcee -CT = e97090cca858cdaae5d746dfbe947f16fb963beb1bd85aa1006a848e5020ef70de4f3af85c044423cade8f70cbe3d5131f607d -AAD = 15459e364082ffde14c08f91a7b42d39f1b075622f8ec0c7f0773b973990af721cd907bd7fd6c7f0f1aefc05a7aec27c -Tag = f5955ad7b20b9648218c71acf9a074cb -PT = 148b067d82552d721bd77765710d62749c5bc7c079360c051bc9be9ae49e26ff98fa9aa39e585843ce06208ff630d139972bfb - -Count = 13 -Key = ec3bf7626ac29db644ddc20ca1a40ebf -IV = daae780f721d7bcecf1f2cb4 -CT = 75ba0d138246649194d30e868f72680eeecf4b825b40e977f8cd9e38437f8e59900323a07a7f363470d3f77f0938481e856d6b -AAD = 50f2ab57728b146eb972d2fbe76d6d404a43aa990d10192820c4aa871e78ecd1cebc16700f2416c0512cbdda16642c32 -Tag = b4137053c3913db5e0ff7bbb00cb9fd5 -PT = 092d254107607fbd8bc2e23035d77ebc144bbd52758c1a691951420a10f07cb00566d2f6b72f022cf83b30645aff957aeca8b2 - -Count = 14 -Key = 36a23edc0f006933c99cc124e530dc7f -IV = f13bb10b0da13f7e9d32f585 -CT = 32f1b95f21c42dc13dad69ff061a6fc809809f91ac11d484f309553a6692107eb8982d0e48f2726c1c96ecdd2f1579e9bafa62 -AAD = 02c06615358ca90d1585333e35504b2fc5370d2bf4a5797a2c1f991fda06135cb13e71e647abb4def56036de838ebc96 -Tag = 8703b4a4fa637b16d1a36cc5028716fe -PT = 9da63166b633b5c9f31f5d0869594960de63570170e83530d796e78f81ed579a74d28d3cb9726f6c6037548f3924bc778c7f2f - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test25.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test25.txt deleted file mode 100644 index 3f29abc1..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test25.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = da2bb7d581493d692380c77105590201 -IV = 44aa3e7856ca279d2eb020c6 -CT = 9290d430c9e89c37f0446dbd620c9a6b34b1274aeb6f911f75867efcf95b6feda69f1af4ee16c761b3c9aeac3da03aa9889c88 -AAD = 4cd171b23bddb3a53cdf959d5c1710b481eb3785a90eb20a2345ee00d0bb7868c367ab12e6f4dd1dee72af4eee1d197777d1d6499cc541f34edbf45cda6ef90b3c024f9272d72ec1909fb8fba7db88a4d6f7d3d925980f9f9f72 -Tag = 9e3ac938d3eb0cadd6f5c9e35d22ba38 -PT = 9bbf4c1a2742f6ac80cb4e8a052e4a8f4f07c43602361355b717381edf9fabd4cb7e3ad65dbd1378b196ac270588dd0621f642 - -Count = 1 -Key = d74e4958717a9d5c0e235b76a926cae8 -IV = 0b7471141e0c70b1995fd7b1 -CT = e701c57d2330bf066f9ff8cf3ca4343cafe4894651cd199bdaaa681ba486b4a65c5a22b0f1420be29ea547d42c713bc6af66aa -AAD = 4a42b7aae8c245c6f1598a395316e4b8484dbd6e64648d5e302021b1d3fa0a38f46e22bd9c8080b863dc0016482538a8562a4bd0ba84edbe2697c76fd039527ac179ec5506cf34a6039312774cedebf4961f3978b14a26509f96 -Tag = e192c23cb036f0b31592989119eed55d -PT = 840d9fb95e32559fb3602e48590280a172ca36d9b49ab69510f5bd552bfab7a306f85ff0a34bc305b88b804c60b90add594a17 - -Count = 2 -Key = 1986310c725ac94ecfe6422e75fc3ee7 -IV = 93ec4214fa8e6dc4e3afc775 -CT = b178ec72f85a311ac4168f42a4b2c23113fbea4b85f4b9dabb74e143eb1b8b0a361e0243edfd365b90d5b325950df0ada058f9 -AAD = e80b88e62c49c958b5e0b8b54f532d9ff6aa84c8a40132e93e55b59fc24e8decf28463139f155d1e8ce4ee76aaeefcd245baa0fc519f83a5fb9ad9aa40c4b21126013f576c4272c2cb136c8fd091cc4539877a5d1e72d607f960 -Tag = 8b347853f11d75e81e8a95010be81f17 -FAIL - -Count = 3 -Key = e765831739df79cad4271c8b97012b87 -IV = e02b84f657f30fcef55db39c -CT = c22a920729745e6033fb0a139fb84549125701d90ac568dfb1117461380959be61949a2ff8ab5044c448c5fe081253e639528e -AAD = 3b6a16b461a8aa599ea02a63ac7e57ef9acfed69dc75ec7886e902d4b8dc39913f5ef645e1c46251b144b5d6024c6a1a3c330aa7f57b8a1c55bcd918661583d970c33733ddde3ef1c5ea7ac8eeb67021ba47a904d11308824832 -Tag = aa49deb346952540a11b5af0d8ae2bd4 -FAIL - -Count = 4 -Key = 0f7cd5df675edaf66c8b7b0ac3d2798c -IV = 4085ea5c6359da0cda2e6028 -CT = 19bf82169fee58fd9054b4729835f5d6141a39819e9ab6f050335dc6af662842b2a990b12a2f75546b56bf578832b0236a2313 -AAD = bf65373999ed6576780dabef2361be4713486358ffc9ae08ef91b517b02cfc9fd71a57eb49a02fb209726a21e5a2ec02c976a96e60f795559225b1515876400650d504dc6013aef6a92b41f952c88fc8aa0746cb0e3852f5a00e -Tag = 0ff48571e381418cfcaa0cc13cc178bc -FAIL - -Count = 5 -Key = 7046ce2cfad031f8564d7060f7b9fcbe -IV = be584d2d74c2734ee05dde5d -CT = 7652219e8315b2914c3cddabf28810169ab64d552da2553edad00d016e03d5ea1a540605c1b5d15f0f533fdf8a67a8233c65b7 -AAD = b9856b2c5b261037bf8629688f06a415a162ba27c44976256d87d61a965bfd94b4a29b2b553abb5fca0a93739f84a60149cf1cf3db63fe043e1e292b1834cc48c47e816fd8fb059f909d17769f316388528b1f8246e3708c1c1f -Tag = 3f72b336ae622971c66ec23999dee1bb -PT = cbf47b4cf3602ee4718806d92d79d550cc58108fc6e7384fd607eb2839f1510856314bef516101c1ba0bf9013c3223a40c7566 - -Count = 6 -Key = 11338a7a431e3c16f0e5d265ca619735 -IV = 3b355d853a4fee0690be45e9 -CT = ff4d5100b25581129f8d50bbdb8e84ab08b52c87d71019d552ba6cda7c80da584f2d5a7e17ca0667dd578e099852389241d5c8 -AAD = e417b81988f7e2f3d2efffeca7e061fb865526a8067e8253851ae8828f9f027fb380a711d1db671bda7266fe779394ba0eb1d02d1f99bd0eacdddab57d9d29c4db5e863fd53b000a11b3fc7c1497fe9cc63a94d5e3c3a3856721 -Tag = 42939c00e6b469db15b9fd47e9153005 -PT = 8a6a9fbf3e72b1390d665424d1d2e706384ff1db8c5e309b69a27448bd1750a038c2c25acda988ec1dbed5f24fa8c44199146f - -Count = 7 -Key = 172dfc179211c31e055c149c8c23ec9e -IV = 6f32ba04972c3570b11d1a1b -CT = eda182e3eb20281807e041f14cb7e26e933b9691db457a3239213b3fcd885d421a737207a20ae3c30bd9fbfd9bf85f2bf93cfb -AAD = 6b9656e6c07bca3540eb334703a3b110447e55a9f47b3513e00e029aec6245a7a55e51b28d9afa27b1ac2c5639f02c64810a5212a71582438f691653356c3caedc9efe29db375af29d15eb473786b2afca37b3400734d9d103fa -Tag = 8e404527995c65f9936efad88fee1b4e -FAIL - -Count = 8 -Key = c74c96c514b09cf729cd0bb21c4eb0c6 -IV = 45b1d4a0e56d7e24e91b84e0 -CT = ad3a0d8bccb0f2fd773a67b4cbd7b4f8ca523191d5a93aabb8f62be100701febc66cd2adf162d4d8cd9abf5ee2f03cbcbeef30 -AAD = 58ea828b2ab805b1d262772161c26c452b545ae75335fb0dcd904ec1f1f7125984d9c59c03b1ae30dd7910b0ea4e1a5383fea414111154d916f4766d0cd8542d3ee0fbf55398fcaf0a8858a542b12feeb277651d019ceeae6eaf -Tag = da9dc47d559516d2ba43cb78eb218d29 -FAIL - -Count = 9 -Key = e45d100fe08f2df7106fb7f5a69ab9fd -IV = 89cb5592e015c15268fa6c74 -CT = a3e6d97d398b6f8d1acb9d45c0fb66b89cc8f8c034fb77b4cf50da3fd8b7521a6eb5f7bf4a6df703a125a43a95f7d6679cc2b5 -AAD = 1c9293292c44aa0535d7e3cf55345272c994d1c7e4af05b666ab80dae87d831685ebf706900efa1662bed1deca81ae2ab1aeb58f40030eca375ef1765d7fa196a2ba72d1d7dfb751f48e00d8b607ba1ea900f7fd4d1dd6169235 -Tag = 1d61d7db1d37bceb7de98bd76a736d45 -PT = ea9b8523fd5ba55c93ff32347d491220b3984cff39d145ca6625f4cc7b01b417776a2e7c4216b1385f8191667a333efaf00343 - -Count = 10 -Key = 2d0b0ccf8f6e955a49a8a6e525c6841d -IV = 086d5a3f6590e8f7696e6ca3 -CT = f4c9c513a49a7a98fcde6c2f380bac70158a5c772cb334c0defb10399c2741b3be0fb06242808b1c4d3941dd0f0c6337fe5183 -AAD = 2f697a4535c68faccddc970f403103d69590661bdc196e064542fb1d6663d47a55f8b25c71dd16ea36c53a8caa8d2ed30b49efdf1794c2f13e6e5cc3ab81832c6b63c1862bcb589a7af0bca5f6647521556fa104713c7b0f4237 -Tag = 9deb38ad834d4e0788a113f01163a2c1 -FAIL - -Count = 11 -Key = 842f74526892dbea464884041fd1176f -IV = 8b2c836bb2306aeaff793bfe -CT = 79c1ab6299d187b7513b996807b6484817d39899eb9c87845b2c7b13edca01a8f5ab96f6546b6f921a89ab5624cab507b10f35 -AAD = 78aa908eef930e05c8491dbc093ad689ccbdf6cdb0321ee0beb7e73dd199f6db81b5ceb26bad8bf0015c05543ca3dba582fbb8a816430397159491c20c17dbf303c3981275eea91be0f8d0cffe7be53418802ce35bc6ebdf190a -Tag = 1b1b94ad78dbe7c286f87f80394a519b -FAIL - -Count = 12 -Key = f2dc68a0aaef843b142d1ea02a83ddb9 -IV = 6e8045bb7cddcde4945723ed -CT = 47b824727193d179b279e7ff90c1848f721d5ddee2e7b9c680e24a9f8b284ddc702bc4b3d7951a6574b000bb725ba34c444259 -AAD = a50e9bed28509b594943c6dda18abf26e21e1b43b7b3377d00dcdc27fe5d9af001d63df3dc177b86c41601b982cf5bb064e5b1383d4bb3a1891b418fc665ab7c165d3033af0c971fc368f3f40b3b3de35377b1945fa582b85c70 -Tag = a6ec986694fed00ff3fa689487158ce2 -PT = eddb4801aa6fbdaae5dd436a958e5771f850f81f1435cb6d41a22bf0b0a2a3b453874145861d3d1e65bb2d1d3b2b7a458b8c6e - -Count = 13 -Key = be23a5fcec16a1ab734e914d52a38918 -IV = 0ca9634183e4f07b46b6cfb4 -CT = 9256f9cac94ed76011454a96f91deb5c75516b3778e66a948618cdacab369303ddbc5e159b7eaa669ed436aa9931bc1462d754 -AAD = e2cabc6ccf6b078b370aaae412ba9ac810246938a4ed0e8d4aa9f05347095650abbf773efa42a2447886620e31982ec9aa0ec24152f3d551c6b66759742f7abc5c01325bfeecc8473bde40969fb0c82949393fa232a9c82ebb72 -Tag = 91d35d8f10a9b02a710d142ea695363d -PT = b04e7595841a8fc99d19a7bdb7e08d687fa9b3475132a79d3441a228d129ccf2d3068c47173775b696f61d9040acbbd72927d3 - -Count = 14 -Key = 0658fca0a449d0b2bd1a56a0bb582f81 -IV = 12731761ca8bb0f266d66354 -CT = a26a3749820ab45b0e254a9de5e7863b6bf45139c4b981b57c14db59d1affd838e2ac4ce397145fae610a10ab1a0fa62d2fba7 -AAD = 67128c67b6ef6f8245fcd3e191ee9e37072252fec8e4dcc385fdca7bf19835f5c1f43058830ace68af6bead5090b647b727a3fb6806266df6070133ecf96b1cafed543d3c9e9aea6f82ffa3539e5105abe3a8fe8bf184ae6398d -Tag = 64ecdd3e2b77a5eef9444bdfb5a8e7df -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test3.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test3.txt deleted file mode 100644 index 7066fefa..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test3.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = b1089cecac8e1a56441353857246773c -IV = 1af1e6f40b1b21fcb38f65a5 -CT = -AAD = ed825cbf40e8f8f198ce1afd1141a3cf391cee73 -Tag = 0edb6756481560956d506a8cdb082db0 -FAIL - -Count = 1 -Key = e6a76441748e6903a8b7ef114f631dd8 -IV = 79706e2030f9938576d8d9ae -CT = -AAD = d2e6fc9e97ed37a0530f2744ca58ed81f0ddd99f -Tag = 102bb898d4ca9780a69aa159e8c92228 -FAIL - -Count = 2 -Key = 5211242698bed4774a090620a6ca56f3 -IV = b1e1349120b6e832ef976f5d -CT = -AAD = b6d729aab8e6416d7002b9faa794c410d8d2f193 -Tag = 0f247e7f9c2505de374006738018493b -PT = - -Count = 3 -Key = 0335807df98f4728dc982efef77686bb -IV = 5cceb5114b6701989957c926 -CT = -AAD = 5bc191e74d849733fea6b8212d01a19ac274bdac -Tag = 3f5e29ded16cb63f9ba8c103fe753595 -FAIL - -Count = 4 -Key = 11200dc2b58b3601f95f95cb80845493 -IV = bfc175513fb49d9be980d6b2 -CT = -AAD = 2740904aa8b7096a7bd7400b3023ecd042061a68 -Tag = 548deef09fb8d22252f956b28d8807a4 -FAIL - -Count = 5 -Key = f8869d9df1ac6da86e905442fc425c92 -IV = 22b0af177e3154cfef3dc2b0 -CT = -AAD = e07715b1d919f8bcb8b2c4ba998b87e6286d82fe -Tag = e08ea41cf27f344db855564cb94842b1 -PT = - -Count = 6 -Key = dc945bb910f648b228482ff6ea37c0dd -IV = 6fe11889b190056d77d3114b -CT = -AAD = 925c4a09fabba4d9df9320735f4753d0d75a2eb1 -Tag = 4f4a5106624a7eb722a4d0ed56b074ae -FAIL - -Count = 7 -Key = e97ef05d5272238514b40eb9dc37254d -IV = 77b02548a863130e64c4f23a -CT = -AAD = 16d11153706a45edcf5ab14775d6fb117c99efba -Tag = 49a4c763ed312224796fa0981b2f6067 -PT = - -Count = 8 -Key = 10486a4ec7a139c45392d11389312b65 -IV = e5fd821c83a47ca17baee945 -CT = -AAD = 9e794623863a6a8f7600e5d3dc906fb569e2d621 -Tag = 2255a12c2d4bd77a1e557f0f332f747e -FAIL - -Count = 9 -Key = 5b360040bb672a55a8a893afe9309169 -IV = d4795970cf41b54f673a5367 -CT = -AAD = 00fccf7ea5873e5bd437b4ef5e3b8543afdf0214 -Tag = a104513ebe3adaf87b7284d1f1c71c12 -FAIL - -Count = 10 -Key = 27bd1dacc704c5bbcbd7615ac5ebee14 -IV = 444d84e15fc7ccfb62aa46c5 -CT = -AAD = 0d964255b4862bc2c790d0112fd0b67c29fd7e88 -Tag = 3330fcc53223b49b5ef51d9352b32e97 -FAIL - -Count = 11 -Key = 7f0cb9efbcda58d5929632770b4ed3c3 -IV = 9d5f05f623dbd0d68c3940af -CT = -AAD = 74af77b5479ff8081486ebb2411d68632b964868 -Tag = d31b61e0c93b825efc7f04a9e219dc03 -FAIL - -Count = 12 -Key = 1bf60336203befd206d5e6cbe485dd1c -IV = 4e75611acd124375b7805908 -CT = -AAD = 32b4b023b13718da023d5f078b8d61c13640a33d -Tag = ee2fdafb44210218c95091dcaf6252b5 -PT = - -Count = 13 -Key = a6647da2721ee284eaec27ef95e6de0a -IV = 4c99b4c11b5403f164fb68c5 -CT = -AAD = c1e82a1c4324eb09add805623f9af291709ad9b0 -Tag = e892470ed058683bd5574c7295d84b2e -PT = - -Count = 14 -Key = 423506441e5237fbdead27eea94fd0a5 -IV = 5d390c71f28a2f09fdab125e -CT = -AAD = d78b51b89e01771483423024184eed27ca0ab8c3 -Tag = 8485ab4c8b8b0f9f2555aafa55680751 -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test4.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test4.txt deleted file mode 100644 index a8afd5db..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test4.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 748146a0b1d5e9b6facdd95e8a3295be -IV = 99e8394910c21207541ca90c -CT = -AAD = 5ce0d8dbac8a82fa8dd7aec334b81301b31ab49f3b40a1857cc540a1d992f27f80945dfcb4730dc81ddfd32dee1825d6 -Tag = 847292904038c42168adf62011dc790e -FAIL - -Count = 1 -Key = 762da58bb000f5d499818bc859989a30 -IV = 584c291ff1aa388a5112521e -CT = -AAD = 91f92e8bbda7b5ec967ade766f4f26e9189eaafad416f37b4891d3e37d70cb9a267aa843dd202858ade020261223dfce -Tag = 9ac7eb2d762facae06086c957959880e -PT = - -Count = 2 -Key = 4ae615ef5f3e1ac590d4e5b8623173ba -IV = 3a998fbdf1131c8992e95bf1 -CT = -AAD = 81edcccd1ace673b96fa3b74a2f99fc63bca822f6b9c6b99477b479d5d13b8dca5f6ef726718346ba22c9f492b30d6ba -Tag = 93cfa8f4dc1da3429eb9dca26ed45024 -FAIL - -Count = 3 -Key = 2dd1a4bc80d9ae6773fe3284e7f7e734 -IV = 404c5b85d1429e48348ee225 -CT = -AAD = 861f17b5e33b17369021b8b2054131715bea7cebaaf732066da9a172341eae3b47a0d49923b25463caabcac6ffb7b5ea -Tag = e0fadad353d1d29ec6503dd2e049d6a9 -PT = - -Count = 4 -Key = d4eb3c0ac7156ebb5267f9ad2de162ac -IV = 74aed5826dc979d6b1c1011d -CT = -AAD = 34d2a785c9f47a83ed19e48ae1ee57745cbd9f30af5b9e6e633e9106d2f36a379e08d85b52acf9a14663a28d68808eab -Tag = 278acb3388978409d9fc2f6380ceffc3 -FAIL - -Count = 5 -Key = efbe4777ad529213599ea7bf82d4b0fa -IV = 8692f09a527d3e5d3cd152f7 -CT = -AAD = 95bff730bea903af3482913f712b4fe9da387f5104131ac03b2f94569957ab93af9bc6c3a405133d6874e6e466a3d011 -Tag = 7ddf730b688f268cdb7a32757f34817a -FAIL - -Count = 6 -Key = e024812778ce3c9659fa6b3ab917f38b -IV = 8a2ea9d140a8193572bc37c5 -CT = -AAD = 56b2c2f68ac50885a3a4bfc4fb8845a1c6e8704c0d89237566e551d59607bffe6e557c0dbff15a91a177905b526838db -Tag = 21706b2f8cd2f4d51aeefa3604d7f6d2 -PT = - -Count = 7 -Key = 293ae2e14a6a874c214ddd12ffd6a908 -IV = 542039d5e5b54222f8153747 -CT = -AAD = bc51a6a29a897a9fe4b955f270e21ef5768e55c11c9d9d16b4934cb3c8524c29e50d4b02b671c5a1b25a46991e62c65e -Tag = 612c4c96e6cd10c13a98ce5fb87bebd8 -PT = - -Count = 8 -Key = cb803f23f8c97ff4774ea37856c90f0f -IV = a3ec912bf0a0ad64e23e6c9d -CT = -AAD = 6c0f16c8e70852270b16a3eafdc5aaab1a3279d803d535b23292bd12bc2fa7da0a63f837c0093167029689c2bbe89bdb -Tag = 396a389e9e59b742dbe52fa277a05458 -FAIL - -Count = 9 -Key = 53101ae08ff3d972d437498253ad4911 -IV = 1748c2f3c6a7d2de3bbf91c2 -CT = -AAD = e166984563c1afb505b220490e3aabc8cfc07cd143960e3f0c068f395b5bcbb2e3f1f43c2e3ab33a4f14ad07d33273d9 -Tag = 250d1b4411d5c3fe0edff3fbc0814be3 -PT = - -Count = 10 -Key = c084b3bab6c3537c65621af9c0967acc -IV = 9a3b67c8288aeeb555e94907 -CT = -AAD = 8a194907eb9fbc4b12b8bb294d552d587cd267ce6dbc46191be1983243b6bc601db78b1ec8ff402e1087614991438bc0 -Tag = e2dede4cebfa914eb7821c912768a3e1 -FAIL - -Count = 11 -Key = 626125a33643839c534556d87b0a485f -IV = e7a2d435326d79f3ab43d3b5 -CT = -AAD = 086edfdb0afd60f10e5e8b628c31ac7094a41f22a33a85f3081aa53e733072825275aed31477246578bd97575e32961c -Tag = 66b38f7467273180d6672d34658fd6b7 -FAIL - -Count = 12 -Key = cc53a3209ed65930bbd535e4ad7be780 -IV = b7606cd869fcf69f5bac64a0 -CT = -AAD = 0ab24056d93d5be92c630fa615864deb7f85712188b576d11f12275b7188e3ac2afa6c4d3a4918df9344deae010902b1 -Tag = fef072eff57121c8c780eb5c6ad55538 -PT = - -Count = 13 -Key = ce84d222d62a6b28c636c1f0a36dfbe1 -IV = 3185d862c8a323ad7b433ea0 -CT = -AAD = 8c6c6de46b003a1265ea02caff3d8474ac99c84874c106d33ffc013c2c60ddc8bd46c7df402db609f854986fcbb44794 -Tag = a5a299bf09883e2fc323ee5eb88818e1 -FAIL - -Count = 14 -Key = 53580849635cce269e3bb897dcf9786a -IV = 76849053a7b046c1fdffd092 -CT = -AAD = 04bfad7c77e4db850c2bfca5a55a2a5c33019a4327bf850f7a70734bca688ce5551fd76d0593105515ad76c12dd69d58 -Tag = 9e7e1c5dccd58fea67a8648d50e5b6ef -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test5.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test5.txt deleted file mode 100644 index e50f51fd..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test5.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = c1e007d318d0e5c87d28fd890dfb04ba -IV = d7bc58d494491ff57639b60b -CT = -AAD = 10c68681c6d700ffc72ea9a790cdc9ddc1904c7e886e23ca166dbfa364a4c5f95205bdd1f22eeebefbbb9375f1a416ec7faed6cfdf706085f8fd2632c7a261a78875811f17fba19baf905f0aa623e67175f2158cda313a5047e3 -Tag = 2f1ede16f025bc8c5421854b5f0109d1 -FAIL - -Count = 1 -Key = 8dc7a59a71cd76499de67feac53c786a -IV = beb45b75ea5b7750e69a409d -CT = -AAD = 8bade18807ac5fe59cfd34d7eed8ae33dfeeb960d2a15693837f22dd98f68715079d358a49a04a7b231d486ae45f4cd6c0fe3cde6c0d967ce8d84bbf2e4be2db793afb72ea83c7b21a73f65742c214768f7e6133e3814059efb6 -Tag = 46e8457d8d409f2a0690e6502f8b7a87 -PT = - -Count = 2 -Key = 30b0bda9871e1732051ab0facb819848 -IV = a071b9e1f103bdedf419872d -CT = -AAD = f2295256508b41b6849a3a08b3a4586abfa5a2b35f9b30d0cc59755314b32d6a890973c568a14d4c313f79c47c83c1f0d2b76a006224926fec7ab9b208c34a6e8f8d6ef4b4a75c9952ca35cb81071314b70e65faaf9854f8c32d -Tag = 6f51e06b3aa3c7869e00e3fb07f512d8 -FAIL - -Count = 3 -Key = 2a032eb1893c4ad9e78c5ed4fcae3c74 -IV = 36839f2a8b1d6df1f9f0ec38 -CT = -AAD = 9228a9d72656b32e0342bc4ebdcfdafc2a4b11214ac8caa4c772a95809dea77e49ce4e052b748a662bc1ff7bf57ed9b784d75a349769e23018f406aebf6eae30a5e9364795b58620248ef6cd42db55ee7e49f472c602a3445140 -Tag = 610fdb18669a32e7fe24348ebc77ae15 -PT = - -Count = 4 -Key = 68dbff539c8ac07c0d66e3c8aa883655 -IV = daa344a429db89941f629bae -CT = -AAD = 8685accfe29a7e07d92aae2cebd25d3349bc917d81c3e999a009836e14611c083e6b3ca4257ffdfb7c2f53a867bf24c739f18c0d807222fb0bffa921da2835b33d0b79e666af0ac7be3fd288f38a086806045732b5a495d65774 -Tag = b5f74d514ad2eac63aba6367c5d7f843 -PT = - -Count = 5 -Key = d5e22e409e61c7e57687a143ee5dde17 -IV = 6a1b9b8b9fa5d3b14758a9a4 -CT = -AAD = eed5683b9e0c4080f6fd5b4fb896a2ee752df04a8f9cb34ac5fe1a0862b2431d4abe6e96e2983d850c85de17a31b612b02c344fc4c5a8e964ac1c60ea15eb1f6146429304338d3a928c84b0725d0956813f5dec79bc8b9a5acd4 -Tag = adb6051f2a18fdbe63ae4878ec3f3788 -FAIL - -Count = 6 -Key = 7bdc885dfbbda27482afeaa8aa30a94d -IV = 6a52105223c62f0e6761aee1 -CT = -AAD = 7aacf0bc8542d867a77411ddb0c9a70889fd395e01a5befdb26f0b45caf8cceb36696ed5b849251aff29eac75af7b12735daaf671412f6e1a62e21bda88c1618cd0a9fe09d5d340ee67711ae90822877bbce83adbe38b7f25d4d -Tag = 08bba50afb61ae82ed578a139804c3ad -PT = - -Count = 7 -Key = 549cb40fb29c51656d1788024a75b80f -IV = 8f9135503f55ff1a76a41553 -CT = -AAD = ac136573ae52f3a4e4a5f6161a2db70c24428fc2fe0d810b31419690a36c1d5bb6bf36d09f24b601cb558c5eeae8662d29c84e06e2e0927857945543b13db85b50ac28c4de1563d9f0ccfa85d032f3a59c1f3cb0acba07b61097 -Tag = 1fb97bae89bc87d6fea1f5fb571480b0 -FAIL - -Count = 8 -Key = fa52f5e8446617e8029800ab73c109d2 -IV = 92b4eb872cc5acc27b2c8f93 -CT = -AAD = e6f02753b83cdcd961a5455c34329f0358a1d9acc10f17a29dbfb7aaebae6f4b80481dc9aa3abf553aef570b01baa61a84820f20b0c051676fe2fd42cf9fce3c4bf221fec2519237cb9b7da6613a4be3eabb154c37b9c69c9c12 -Tag = 735b2a825bd1e288bd66e98e44fc0348 -PT = - -Count = 9 -Key = a3cc611d369a5c06d1c0d171be2cb25d -IV = 730b0cc99066bc7bd7b3ec9f -CT = -AAD = 84d86f689a1137920c1eef9dc0c27a3ca069f0f7943c4aca10bc47a67da7b8f4ce9558f53397f15dfed1df9f9bef61a7eef2b064b46bacf4f673b37e6d813fd408ccd9632628f0cd89db27c00e268c45c581ee8e189b14adb16b -Tag = a3d510d67716ce87471e807e188822bf -PT = - -Count = 10 -Key = 5fe29162dc4d5a511d373331573a4e26 -IV = d36edb05eaf746fbc48d1dc5 -CT = -AAD = dcd82c91702c2fc562ea7636d89aa7f4679afef80b85a4f3ce9c32a5a632a42d688416c65d47b314c8d272b77d8c447a4ea186230d03d30065b3339b0750f350b18ed7c82ebb16105fc98f2cd04c827f5fe2f3904d67d75a8961 -Tag = aafafcd6c396211704f3f708f167c781 -FAIL - -Count = 11 -Key = 2dcf7a69aea4aaabc9849c57f915bd68 -IV = d1d48a6e01c482f47d7b8871 -CT = -AAD = 345e8d49f3441bd55e3046cca636578084a2a7d7686c56c9bf8e4e29f2eb996b4ec537b7a10046b7ae514c76ddc8293eed583f1bbf0b45a90784e10fb83a5e837935547ab9555c4f8b93b44653944733e3691b9a14c0b9839e60 -Tag = 33b09fc073c3c3404a5661ef2d934e08 -FAIL - -Count = 12 -Key = 1579609bf33cdaa69ced53613557090c -IV = d64d1081db1d825fc692a28b -CT = -AAD = 9ed4a0960782e2fc4b88b6b3f3fa5fe976e5e160053c68def773a55dc8520d626fc0f3447b91a5217054c03ab72f19e53514bf38a3e2ab4b632dd5e338903b727e02327d9919c00657dd3457112714c9e9cda2df44f644b32bd1 -Tag = 198ca0c5e52ba7e8ed8b9310a05a1ebd -FAIL - -Count = 13 -Key = 60920e056ead9a73080f27038956884d -IV = 8cf4c1764ea1e6b9083952c4 -CT = -AAD = ee3fb4f08c9c6f7ecc7537035366d35793fbcb02605f1891acc539d9128ddcc6eff7d91936290490e4b28da8c2126d163565e0bd048a6f0a66a277daff4a03864c746f9dc3faea70d1fb4628d66a34a86fcdf91f2a176ce94863 -Tag = 41927cbc3ee0ed121f7884f0b32b024a -FAIL - -Count = 14 -Key = 2c084c95bb67293258e7e68492cb7d90 -IV = 60f0c5264a7743f548db8b2f -CT = -AAD = 7aac62d17794ce516c4a20e32ae8c7aa0be8e483f6e5643b77df5550498ccb1adcacc28366335d48007a094588e946ea98699e5323be8269151a7df2824e808b1388667170221a74197e3ca403fbe41be95b75afb98bcd2a5c14 -Tag = 84e9567a61b9a6bbf901c86b8f2606f1 -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test6.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test6.txt deleted file mode 100644 index 74f464ab..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test6.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = e98b72a9881a84ca6b76e0f43e68647a -IV = 8b23299fde174053f3d652ba -CT = 5a3c1cf1985dbb8bed818036fdd5ab42 -AAD = -Tag = 23c7ab0f952b7091cd324835043b5eb5 -PT = 28286a321293253c3e0aa2704a278032 - -Count = 1 -Key = 33240636cd3236165f1a553b773e728e -IV = 17c4d61493ecdc8f31700b12 -CT = 47bb7e23f7bdfe05a8091ac90e4f8b2e -AAD = -Tag = b723c70e931d9785f40fd4ab1d612dc9 -PT = 95695a5b12f2870b9cc5fdc8f218a97d - -Count = 2 -Key = 5164df856f1e9cac04a79b808dc5be39 -IV = e76925d5355e0584ce871b2b -CT = 0216c899c88d6e32c958c7e553daa5bc -AAD = -Tag = a145319896329c96df291f64efbe0e3a -FAIL - -Count = 3 -Key = b1191a672cc55496b3c728d6a67de0ae -IV = d0b4fa7c7f107f98f66b0195 -CT = ab957acc04c1034d8acc617c0b20f78d -AAD = -Tag = a93cc22f6086e816016606b9ad0ba697 -FAIL - -Count = 4 -Key = ca7db9e97cfa056b80dcd04f46228640 -IV = 5e8dc246ee835dc5f229d698 -CT = 178ce3bd56ae27f9812e91b942c1309e -AAD = -Tag = c633075a8b608d5f96971d2bc1ea2a0e -PT = 964610fb6585cbbb070fd9ab10a7a600 - -Count = 5 -Key = 206209e6f2d16b268dbec05972431405 -IV = 95194cb4ba24ea0476ca5ae4 -CT = 493461aeda5a0c7d18edfb11ca8277c7 -AAD = -Tag = 865615a1484744a9c55e480871472e81 -FAIL - -Count = 6 -Key = bc722187a3729a4d0292fa73d4471605 -IV = a72d339ad829c9601d00a6ef -CT = b44481ab49863873ffa2a377aa7b759e -AAD = -Tag = 4d587a7d3b5eb1186d2eacce9bb51c04 -PT = 9dfac38da5811b3c4712439117f7520e - -Count = 7 -Key = 0631c9595b5cb7f9f94aea4940125f19 -IV = 673d7e9aaedab36cbb2afa0e -CT = d558f237bc04b41c8155ef643511c52c -AAD = -Tag = 482a54ff2d9270d70375e4d8db646744 -FAIL - -Count = 8 -Key = 722bb99f8321eebaa61dd0086fd63e5e -IV = 47e36c71c70c2bb662cddd6a -CT = 4d3168836b0be7e7cd7b54ac95281408 -AAD = -Tag = 18e18960789cf650bb48d163f881fe55 -FAIL - -Count = 9 -Key = 327f9f12217e54f14bc0b38166a507ec -IV = abf4b77903fd2894516d8fc2 -CT = 3c7512dc35bd8ec80954baf49105a67a -AAD = -Tag = 5e6299deac6594fd59cf073ef14ffdee -FAIL - -Count = 10 -Key = b7d2ebf187562bd4bef0cbfebdd7cdf4 -IV = 76ff7aaa095be4111f79c74a -CT = a998f173007ded002b3ebe264ea7f133 -AAD = -Tag = a71ba4f2385bd5b615a23bdfb9dcb17f -PT = d32e43eb1a90b626b189b6a8eb592bb8 - -Count = 11 -Key = 6956712b7392b3595132f606561c0bdf -IV = 63c54fcd8e648af4bb0f5e39 -CT = 9dc01d985cd4f6cfd1eb2207761ec04b -AAD = -Tag = 1d8dc617e8f49b7e92a3f5480d1d22ff -PT = 44830dd0bc8592f4a28ec79c1d0f2b53 - -Count = 12 -Key = b3ce2c46ddf39059f683ceef05c08d38 -IV = 188549f41ba61ed52e9b14ef -CT = c06aea0ea0ec6a8446ff8f3f722cfd1c -AAD = -Tag = 605ec2fe05d7067ee5371d484e5cd7dc -PT = afff5e9becb62c8b05c26effefa3d7b2 - -Count = 13 -Key = 23ecf56f3c9ddc76e7207873824321fa -IV = bc60bd5bca6802b526cc8361 -CT = f2f8851005b8bfb38cc3488133b004ae -AAD = -Tag = 7d79d1c8742446acb45d4d0cd33886fa -PT = 5926445daca77b55857b9bd4c897c1ec - -Count = 14 -Key = 3cf9882b08500c084ab38f26c0f3e730 -IV = 615f25d13c5c4ac9d6b01932 -CT = 375bca435832c7abccce9eb890807275 -AAD = -Tag = 57e37ba21f0aef8bc70b63f7968e9eda -PT = dc1adbb316be8abccd87ffadfdfc7ca0 - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test7.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test7.txt deleted file mode 100644 index 4c2d89e3..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test7.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 816e39070410cf2184904da03ea5075a -IV = 32c367a3362613b27fc3e67e -CT = 552ebe012e7bcf90fcef712f8344e8f1 -AAD = f2a30728ed874ee02983c294435d3c16 -Tag = ecaae9fc68276a45ab0ca3cb9dd9539f -PT = ecafe96c67a1646744f1c891f5e69427 - -Count = 1 -Key = 867fc5d5476d5008f0703d81e3622255 -IV = 22945529dff947c3c9264df7 -CT = 1c785025e5a2678e4b29b29276e395bb -AAD = 261a9efd4f32bc3d07c115b4edcf8adf -Tag = 87fdf1261846164a950c37a3f2eea17d -FAIL - -Count = 2 -Key = 3d17f97bf1dae4268b6610dc90c70b28 -IV = ebcd88fc18d4c99d28524d41 -CT = 0128a239bb43c12885f9591386ecac0f -AAD = 681a4feac147ee2d25e9191aaa4c8830 -Tag = 144def0210af9348f07afe27e65bdc7e -PT = ec18a057c22d12373b5efe4d177eb068 - -Count = 3 -Key = 5c32091e288d4780fcaff52a69c1234e -IV = bedb360b22847fc2ff60ab78 -CT = 60c883306c91a0e6e98f8d7bf7ee9fd9 -AAD = dc7c3a89a00b688af2bd372530bfed0b -Tag = ffb93af9106e95e9a65ef147765970da -FAIL - -Count = 4 -Key = 75fb7f243336b78979988c08f39c44ab -IV = 69fed95864cad27f83503f8d -CT = 7bb1d878239966163a3db5712f57b096 -AAD = b4783565715e8cdb46f8a2bb72030ce2 -Tag = bfee0dda5e1afde5c7b0928774f80d21 -FAIL - -Count = 5 -Key = 7a3d71615ec0e6ee2257f33d06611b89 -IV = 1ccf177092a1518be9f6612f -CT = d0bb72968ff7fdbd3499d6e7a34ec043 -AAD = 0753ecc820e7ed3b6ce6b60dde776fdf -Tag = 3a7c708e0e6e74a654987a257ab96461 -PT = 9c0e1b4ea43af8b1d4d173b31424fa40 - -Count = 6 -Key = bf283c584efcc4778bc6091804b2b66d -IV = 1fad1f81b45de44392497629 -CT = 51f94491184b13f46defe609642adc16 -AAD = 791856131d5d4ed0e7b205b8b2ff4012 -Tag = f2e8b0bc4e1bdd9d2604c0607c4f7fc7 -PT = c40fee049bac9b688601506d63450869 - -Count = 7 -Key = 93477009c0bbbde3aead970dd96811a9 -IV = 6f096b1f3773a928301aea03 -CT = 8643e7d1686b916cdd2b74f1cf26ce72 -AAD = 7e61a6b6cb73c187d08509ad5b940a2d -Tag = f98afcefacdc71410eef471d5bb2a599 -FAIL - -Count = 8 -Key = ec3f4315316aca1bdc2806210bbd36ad -IV = fa0698f32e058389f11e519e -CT = 16a9fbf2fe33d6c8c0b22117bc0e6634 -AAD = 414ac255598157e3b506876d00843b31 -Tag = 88f4a30ea229c8c4641f60363436702c -FAIL - -Count = 9 -Key = b431bd21c8ae9845c469b8906618e715 -IV = 8579a353df1f7dd0bac1229c -CT = bca7919e99c8de9ccb7d2dc2e1fde95b -AAD = 79d9a0a2c7536fde809aeb9f084739a0 -Tag = 2b7d96b083a1fdafab7b64839a53b90d -PT = 8347a939a90f4e33dfc70c70e6447994 - -Count = 10 -Key = 71ccaf526ec51e5117c22869289d1b10 -IV = 9fc7b2fc3a762a9c28f64200 -CT = 6f65ed418dad09ffd883afcb3c3f2333 -AAD = 0b8ddf8514761fc60ca20c11b0a9e27b -Tag = 22e0056532a847859e2aa181b80fd97e -FAIL - -Count = 11 -Key = 42deade4fcd2728eef0c258f0f80c56e -IV = 033393d7167c23327271b58f -CT = 0cc5f4e993fcdbc81904f5b26071b360 -AAD = 34ae2559e79d88aa25ec8c0a97f4f8c1 -Tag = cff5af162a6bf4b7e9169632a40f3f41 -FAIL - -Count = 12 -Key = 1fe8b08b096103debbebe1ed1b5e0ecf -IV = 4f2442796ffc2cd7b7a6b6c7 -CT = 61ca6232340df229dea57b2bc45eed28 -AAD = 9c953a6b978ffd3457c0c1e2f9e29358 -Tag = b61b58eda5efa804d42b8038a9ca6472 -PT = 5b90f102d5cb5c4cf10db51f88d5bf03 - -Count = 13 -Key = 3f8a905c888fc42dcceac21ae09027c1 -IV = fb3db97addf0f67eb369c62c -CT = 743cdf63d80bd79d4664af2f5625d95d -AAD = b74eae31f9d55f9666899c8474cdc80e -Tag = a2bc61b1e16ac2ac9c23bf40bbfe18ad -FAIL - -Count = 14 -Key = fba087aa3a2b5b4109e36938d011a0b0 -IV = f92af1ed2065fac9eb4d7601 -CT = 700613d946dedd760da35483ab668685 -AAD = 90501a414620af8e76dcf165f5cbe603 -Tag = 63703fac96bb981f74bc52f557271b2c -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test8.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test8.txt deleted file mode 100644 index c4bb71ed..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test8.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = 4cf56dd7eb109452d7445e79bcad4f86 -IV = 5f3724b27c345ed5d1757e9e -CT = 2d0581c040f4e2bb74423682113b818c -AAD = 20fe2aa2641db7318aa5e339b1e303f952b05dc8 -Tag = f090c0cba2151af2e78ef407720233db -FAIL - -Count = 1 -Key = d9529840200e1c17725ab52c9c927637 -IV = 6e9a639d4aecc25530a8ad75 -CT = 6c779895e78179783c51ade1926436b9 -AAD = 472a6f4e7771ca391e42065030db3ff418f3b636 -Tag = 4522bfdef4a635a38db5784b27d43661 -PT = 8ae823895ee4e7f08bc8bad04d63c220 - -Count = 2 -Key = 43ebcf37e131a9b954bf003136e72ce2 -IV = 643e6d21bda599d486f2bb1c -CT = 6d23fa3b74d3b61f7305fc87e051408b -AAD = 87c99e3b4292e047ae80947fc5d46c4600d9f5ed -Tag = 9c036852b5e3c0aff0bb8933796182ee -PT = d5add8d52c941aeb874cb17d52960210 - -Count = 3 -Key = 23b0b223c477ac83757300dc0c16684a -IV = 907c5c2d91d33ae435b51be4 -CT = 5943b9c9229301ce25b12e798d2f16a5 -AAD = dcaff8fa814e9302f872b89e8656ee1c7c87c0f3 -Tag = 31fe5884756cc3225c42a82489115fa1 -FAIL - -Count = 4 -Key = 1ea8d9a553d2bc1268f528fba611e80b -IV = 91495ca2fb726f317faa265c -CT = fffa077c1741cd9fa1923cfa7bcd8b04 -AAD = 55c0553c29dcf916d2cc4655a962ba18845f3d9d -Tag = e7c433cd59c3ff7e3480f664d13d02e1 -FAIL - -Count = 5 -Key = 73ca3a3548b85406e5512998339f01a8 -IV = fd1990f00d51bdced7a590e0 -CT = 0afcc434cb7b7e1ec0496342aa631f75 -AAD = 64775d9656d9186fedb1ebbe9e45114b3a0664ac -Tag = 77f14cc311d60bcf5ee95049d512eeb1 -FAIL - -Count = 6 -Key = e9a9eb3f226d3d47212bce6498bb489d -IV = 5830becfb7ac36c00f6ff8ae -CT = 08a6f369d29adc3bf94b269938a53b6b -AAD = c4c51491b05de3c2ff006012a2e23d4eb121d3fa -Tag = 1d53e69dca3ff4fae0029d013f7c349b -PT = b7fd70ad0723c5c8e74fff3eac282bf9 - -Count = 7 -Key = 961771c760fe92821f2febe0e3ca06b3 -IV = 8650d3dc83ec5cf702bb990b -CT = 20bc94651a0e4f134aa259298c9942d6 -AAD = 716b3419f61afc44aebdfb2ef21fccac1551de5d -Tag = 868887decab5c3979fc943139d7423ed -FAIL - -Count = 8 -Key = 903ca48ff529c6515c690a896f265999 -IV = 0b42148de0d438ccd434b20c -CT = 3918bf3882b04f0857e7e405a4ebe056 -AAD = a9680e1551a4b8678bf96cbc2c07ea95d0e58787 -Tag = 7b511865c62ac3a077348bc5671bbd50 -FAIL - -Count = 9 -Key = 9368fea0615ff679589ce50b39b097c0 -IV = 5e25fda2e612c707db2ac70c -CT = c3a2134534fbea7f5c2c53cc422e762d -AAD = 01a7c360ffd013282ba1accd509c9b341dc19abc -Tag = b88c003712a5be28ae8b46706091b097 -FAIL - -Count = 10 -Key = 6b01949fe5e343d1639690477bc3a252 -IV = 8d8e6f1b3685908103a9fbc6 -CT = 16f4981c944c6ac60d06def4fd587ac5 -AAD = 38f6601845bf8b194108942da1c4934b5d2025df -Tag = c8b627db732d629be6cfeb6762cbe611 -FAIL - -Count = 11 -Key = 86827950e1d412fe4077e231141c0482 -IV = 5752576285321b6483a2c192 -CT = 24a18516523a69be03a62b0572a8e068 -AAD = 24df844d581ef17959a433bbc44b4d6665f06630 -Tag = 031b8c5c2c7bfcec2fc72d56f605ace7 -PT = 5e0bfc67b327e725351dfdf56f3b3c18 - -Count = 12 -Key = 7ecf54b1d2d81b6ede2cd574d217d5c9 -IV = c335ee604c9055de42b2a672 -CT = fbf1dc7e4645a85ce2cb21b4b52697f6 -AAD = 0e65219827f0acf8b6b0e75f9397f711d0af4b21 -Tag = 1d6c7302bfa6451fe096289629a68049 -PT = c45dc86e1ffc3bc1013d4847b4dceb28 - -Count = 13 -Key = da8298a837229eb7c0eec75873261458 -IV = a500b91e890d278f974f2a77 -CT = 574fb01be46c7aa1e86e53dd3f31e3db -AAD = 2bbcaf47d8b255075da441294403a7b8d2dd5768 -Tag = 3b2ce73552d83efae185506e8ed8729f -FAIL - -Count = 14 -Key = 0ffc47ae5991e8b232d8abea0c323033 -IV = 5e5099b86e4c984072008bd4 -CT = ef3f1e9e81d1708edf657938d76ca394 -AAD = 92879fd84b5c627c67e2ac484f7bee6669272e9c -Tag = cde1f403eeeedf1f983545cc393feb21 -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Decrypt128/test9.txt b/unit_test/ciphers/gcmtestvectors/Decrypt128/test9.txt deleted file mode 100644 index 6f2d954c..00000000 --- a/unit_test/ciphers/gcmtestvectors/Decrypt128/test9.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 527da7a4f81d6d4f6f395b623aedac3d -IV = 2acf3f0c64f5ab9282a6f4a9 -CT = ef47b52ebc6d4cc0dfaf09d22a587c73 -AAD = e5492270c1df154e594c689fc505575c6bf5d7dbde0d1ded5ed32ec65e3e8289072bb10c35e385f499c0600a58f721b2 -Tag = 0530cfe49d93d78bfa9d54ffa6d148ae -FAIL - -Count = 1 -Key = a10785641ff210336a96a42001824462 -IV = 906bcc9dcd0fb4caf3c5b691 -CT = 19f30bcdb9f3a4c110e5797c64561c88 -AAD = 96d9404d0a24052efec37c8998726fee2db69d755ac87dae6f9d6b505fdc09799de79757f90053bf503f23283fba3084 -Tag = beeec6ae10e9d7f11188c59c46789e45 -FAIL - -Count = 2 -Key = abbc49ee0bbe3d81afc2b6b84f70b748 -IV = f11db9f7b99a59ed59ade66f -CT = ce2d76f834942c022044eebc91b461c0 -AAD = d533cf7644a48da46fcdec47ae5c77b9b52db775d6c886896e4f4e00c51affd59499a0e572f324989df511c4ea5f93cd -Tag = 62df4b04f219554cd3e69d3c870032d2 -PT = 5135ba1354cbb80478ecaf3db38a443f - -Count = 3 -Key = bc34611aea26c47b028eda43936fbd1f -IV = 68628129aa2fb6ba7fa46b83 -CT = 738d5b0edbbdea4085174c168c11e955 -AAD = 6982a727ab5e75c089467b0c9d909d6da2dddaceb3b042aa9b12c1f8d7be7fab63af0e1f457fde6cfea04f4a6df6936f -Tag = bc0464a8f0f146546b16318dbad4a4ad -PT = b358a0151f05ba85d65ac3698e674d28 - -Count = 4 -Key = 86613911634393460d581276f2fe82c9 -IV = 6433b2a1e47552414cf60e84 -CT = 50c7ba11891c8b40ba74c663df54ec7b -AAD = df81e6b7ed9c4d8dec1accd93cd7f3d9538f3355202c5a545ab548950c5b4598430fc7d88e28241bc04cb00fc50418da -Tag = b7558e17cc7b5b1f6bfcce7f7ec6c16f -FAIL - -Count = 5 -Key = 7fc3f870c3f32a55c912c4b713269dd7 -IV = 828d1d61bdbefed2bcd65905 -CT = d1422903671ac453cf42322cd3341e9c -AAD = 378466552eac129bf147d64db0ecb3717c1add1ad76b416602cacb728c05af70769d00f32bdbbe7d54e950138d969a7a -Tag = cb53f3828dfba1f387254f50d9a69380 -PT = 80d99a194aaa8db085394591791f5481 - -Count = 6 -Key = fb83253786e83ddcdb8ebf89fb37fb32 -IV = 67454a1324f451e0c50eb805 -CT = bf9c0a175cc510b1e474f5cddd923f68 -AAD = 45a84eda3e45dd89d7a2f31ad9982dec9bb59fe7376382f6dfab8c9e8f5fd7a18663170af4557693e3108d51c14f6f9a -Tag = 92f65fae9301fa983a8149e9eed72b25 -FAIL - -Count = 7 -Key = b5291e834f899b3b22a8b77fd5a26642 -IV = 93fa2101e7b13b9e3ae3c248 -CT = 559c48cd0d213296381df40b961de268 -AAD = 8c09c1883ad1957fe7615ad0a465631a78e0a4059680a41c40a542ab94b0f246b3210122e7e6b1088a6067ab0ab39ce8 -Tag = 4b3a4d91ed785fd52836b023b11a8e0c -PT = 052ca393b0230b4b1ea06eedb3048546 - -Count = 8 -Key = c6d138d93b2106db7e62d67b25910586 -IV = 1290dca4047cd031f80afe5c -CT = 488f108ceac7dd6d9b653e5b700b96f0 -AAD = 0434f074ec1cf2b6cd958912ef1e58a7384ad47b4ed6852216954803d4b0eee42848ec28ed1fdef5b99f4a32f0081b15 -Tag = a83bf6bf0198799fde67d4725406d7be -FAIL - -Count = 9 -Key = 5f9c25ef23f1b8cc6d114665095ce500 -IV = a73c0171a14a5c4879dd8692 -CT = 213957e8aa7ec598e27a955b0b26d1b7 -AAD = 6ca8ecae42fd2fee8b285bc2836a1ec51bbbe03d83e20dbe0267983632e512846491e2e501419964c4e7eb9213ae5c44 -Tag = c781ca5e18b8ad91c30af636bfdd5a89 -FAIL - -Count = 10 -Key = a954403e7f5e6116b803fcf61b69fd78 -IV = 36438c3f50c7835800103d64 -CT = 09fb8dadf2aabf5a1eedfe1c7d585f4c -AAD = 2c01e76a3a8d86d199eac169560fde8680f4b14f45e76c0b26581bffef595fff1250051c972eed702eb3b58f5ea7cdb6 -Tag = a014ac75c80738e3b95fa6a4334d3126 -FAIL - -Count = 11 -Key = 229543caa39b8e2647703a09b082be4f -IV = b40f328dcdfb4f94214298cf -CT = eab31b64d8fe898481fcc743f56b6f9d -AAD = e84c355a609b9c190766dfc68e3dcd8377d85132c0e2f607ec06960a5e73972e25ff84a4f3e63ad4c946fb8c0d08da7e -Tag = 6dfe7f81209b1f059aafd8f36e929388 -PT = 6423fd59407650c305d92ecaa3dbc84e - -Count = 12 -Key = 1eb5022fa84cb4ff4354c4282ff205c0 -IV = 6334cc3d0b4ee7e575cd90c8 -CT = 436ba45e2bfd1119485d68f6d96b9c77 -AAD = d2caa4cbae3e26277c5ae361aa76a5c465845997acc37e6a3a1a09ab99342e698b6dd09bf5465adad1d54904bdcb4e77 -Tag = 16cb48152bc8778b4bbc9cf18e27908b -FAIL - -Count = 13 -Key = 5962ce9c4a12c457e5a2165639f93fbe -IV = c5cb3a2a1f4bbf7b64bfb211 -CT = 3a16961039ed49d930277c323d9d8be3 -AAD = ac9f9916f0b24b78de67f70446bdc85cb122f40e133fc5a30fee77539929009f2f97dcf5e5af0528f5378747d2c5cff6 -Tag = 9e6b8ecfb015309088b1375cde530608 -PT = 49f3ab3a9fc7b4283cea9abeb9edcc07 - -Count = 14 -Key = 745eb79bec8d94f90ed9e580067c9452 -IV = ea47877e5e6730dff90821a7 -CT = 90f1885812b17d7991c8053b003cfb47 -AAD = 68bcc1c94d821b864c2effd8ae24e2201dafeef48c15d82a5afb830e220e4740eaebf6f03c562a564c2521191ed84461 -Tag = dde6f55bbb9de66223027a61ba050e2d -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/gcmEncryptExtIV128_stripped.rsp b/unit_test/ciphers/gcmtestvectors/Encrypt128/gcmEncryptExtIV128_stripped.rsp deleted file mode 100644 index 4ff64c39..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/gcmEncryptExtIV128_stripped.rsp +++ /dev/null @@ -1,3150 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 11754cd72aec309bf52f7687212e8957 -IV = 3c819d9a9bed087615030b65 -PT = -AAD = -CT = -Tag = 250327c674aaf477aef2675748cf6971 - -Count = 1 -Key = ca47248ac0b6f8372a97ac43508308ed -IV = ffd2b598feabc9019262d2be -PT = -AAD = -CT = -Tag = 60d20404af527d248d893ae495707d1a - -Count = 2 -Key = db1ad0bd1cf6db0b5d86efdd8914b218 -IV = 36fad6acb3c98e0138aeb9b1 -PT = -AAD = -CT = -Tag = 5ee2ba737d3f2a944b335a81f6653cce - -Count = 3 -Key = 1c7135af627c04c32957f33f9ac08590 -IV = 355c094fa09c8e9281178d34 -PT = -AAD = -CT = -Tag = b6ab2c7d906c9d9ec4c1498d2cbb5029 - -Count = 4 -Key = 6ca2c11205a6e55ab504dbf3491f8bdc -IV = b1008b650a2fee642175c60d -PT = -AAD = -CT = -Tag = 7a9a225d5f9a0ebfe0e69f371871a672 - -Count = 5 -Key = 69f2ca78bb5690acc6587302628828d5 -IV = 701da282cb6b6018dabd00d3 -PT = -AAD = -CT = -Tag = ab1d40dda1798d56687892e2159decfd - -Count = 6 -Key = dcf4e339c487b6797aaca931725f7bbd -IV = 2c1d955e35366760ead8817c -PT = -AAD = -CT = -Tag = 32b542c5f344cceceb460a02938d6b0c - -Count = 7 -Key = 7658cdbb81572a23a78ee4596f844ee9 -IV = 1c3baae9b9065961842cbe52 -PT = -AAD = -CT = -Tag = 70c7123fc819aa060ed2d3c159b6ea41 - -Count = 8 -Key = 281a570b1e8f265ee09303ecae0cc46d -IV = 8c2941f73cf8713ad5bc13df -PT = -AAD = -CT = -Tag = a42e5e5f6fb00a9f1206b302edbfd87c - -Count = 9 -Key = cd332a986f82d98c215278131ad387b7 -IV = 1d12b259f44b873d3942bc11 -PT = -AAD = -CT = -Tag = 34238023648185d7ef0cfcf5836e93cc - -Count = 10 -Key = 80e1d98d10b27237386f029189ec0448 -IV = 239ebab2f524fd62c554a190 -PT = -AAD = -CT = -Tag = 4c0f29d963f0ed68dccf34496cf43d00 - -Count = 11 -Key = 40650cdb61e3e19a1a98fb4e05377d35 -IV = 69f0a81aaf6bb8486282f1b9 -PT = -AAD = -CT = -Tag = 2657e12dec21c3ecf071af6179529fb4 - -Count = 12 -Key = 1e89a6cd7528cce1e2b2b5f7fd2b6b52 -IV = e11fd427a782d543f78efc60 -PT = -AAD = -CT = -Tag = eeedff874c8edeea53e8be2a13afd81b - -Count = 13 -Key = 2a7ad6146676057db777dea4683d0d45 -IV = ed721ea67456d4594aafbd51 -PT = -AAD = -CT = -Tag = ee3cab5778888439d90fa718b75738ad - -Count = 14 -Key = a364f494a4cd0147c34731074dc1a85b -IV = 4aa8470dd404e4054b30093a -PT = -AAD = -CT = -Tag = d8a7bba3a451902e3adc01060c3c91a7 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 77be63708971c4e240d1cb79e8d77feb -IV = e0e00f19fed7ba0136a797f3 -PT = -AAD = 7a43ec1d9c0a5a78a0b16533a6213cab -CT = -Tag = 209fcc8d3675ed938e9c7166709dd946 - -Count = 1 -Key = 7680c5d3ca6154758e510f4d25b98820 -IV = f8f105f9c3df4965780321f8 -PT = -AAD = c94c410194c765e3dcc7964379758ed3 -CT = -Tag = 94dca8edfcf90bb74b153c8d48a17930 - -Count = 2 -Key = a82bb1edc7c01a3689006f34bfed783e -IV = 963836b67b188becf9ba1411 -PT = -AAD = 9d115bb9bbd119fb777b6316065a9ac8 -CT = -Tag = c491889fa3eca4544ba0d51b8e0f3837 - -Count = 3 -Key = b9782d0a5986c63f352d3bc4c7ecc96d -IV = 4541e15b92edea44eceb1f2a -PT = -AAD = f1a9f0723429c5b26185ac3ea7e13d7a -CT = -Tag = 74d0d36949f0276670f9ddc579e94f3a - -Count = 4 -Key = 59b95785b30f205679fc4f3f9a90102f -IV = 1908787cc1e1880a6ef5dd17 -PT = -AAD = 39852d3182944a5177db277b63910702 -CT = -Tag = 8f9a96c013992485b43e2b62745ad173 - -Count = 5 -Key = 34dd7926ab13d4078160d87de2e3c724 -IV = c11ccdaf798ab03af2d97ef9 -PT = -AAD = af698717a6d790b3bfc39195857bb5ff -CT = -Tag = 48116050bbd9118270d0be252d29d5d4 - -Count = 6 -Key = 8ec86fab55aaab0e77455e9cd3dbc78e -IV = 15fd90a9867e14f0d63b53b9 -PT = -AAD = e7509e276209a6d3ecfabb53ccdcd236 -CT = -Tag = d96d6ac0d309cebedeba2af9f262132f - -Count = 7 -Key = 66b2473d9e0121666d47633f7008eb1c -IV = c1716c68a24d57770b867e51 -PT = -AAD = c20f686317d67e53dd79bae5c46dc111 -CT = -Tag = 9a08616809cf15247dfeb9756ba4f609 - -Count = 8 -Key = 5b262a9d00904d30a2587caade091381 -IV = f7bc154ca562e8f2c1845598 -PT = -AAD = 23112d078c9914fa3dfe5218cd191016 -CT = -Tag = 98854d193a06dbe32ce4497eec5c9a8b - -Count = 9 -Key = 2e4fb9cc320188a6f1fa89a7a252273a -IV = 7a6d4ee69c7256c14fba8f5e -PT = -AAD = 80ba4a202a68c3590d6557912c6f878e -CT = -Tag = 9280313273befb8afa0bceca5a966d85 - -Count = 10 -Key = 5ea94973d8616dafa7f31db0716d1729 -IV = a05b62669d250e61b077d28a -PT = -AAD = 9620baf2f58d013f8a4c4871989c1b17 -CT = -Tag = 7e550398dee728256d6928cdaac43b73 - -Count = 11 -Key = 910385f6f07f9e57e483c47dd5206bcc -IV = 518f56e33658df311d42d9fe -PT = -AAD = 5d157909a2a4607117e77da0e4493b88 -CT = -Tag = a7041ea4a1d74d9e66b9571b59b6a1d8 - -Count = 12 -Key = cab3af7a15b430e034e793bb30db8ab2 -IV = 963a56e2e12f387062e18498 -PT = -AAD = a094a1dd1121d3aa52c81e8f10bf9f0c -CT = -Tag = 1a31d295601eb3c82a54b234984ffdf5 - -Count = 13 -Key = 89c949e9c804af014d5604b39459f2c8 -IV = d1b104c815bf1e94e28c8f16 -PT = -AAD = 82adcd638d3fa9d9f3e84100d61e0777 -CT = -Tag = 88db9d62172ed043aa10f16d227dc41b - -Count = 14 -Key = a4d994c4ac5ac0f02913245714fbe235 -IV = a9472dadcca8d7e0e3b8084d -PT = -AAD = eb318b9e17575203dd29ebed20ec82f9 -CT = -Tag = 323df7f33694106f56739de0973216a3 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = 2fb45e5b8f993a2bfebc4b15b533e0b4 -IV = 5b05755f984d2b90f94b8027 -PT = -AAD = e85491b2202caf1d7dce03b97e09331c32473941 -CT = -Tag = c75b7832b2a2d9bd827412b6ef5769db - -Count = 1 -Key = 952117048f77e276c2ef6580537c1403 -IV = 070b8fb46a7ad52885be1b26 -PT = -AAD = 34b088f982818b5f07dabe2b62f9547f4ed09912 -CT = -Tag = bedd4cf30fd7a4abc49bdcc3f3b248b1 - -Count = 2 -Key = 7f6453b39bde018560a16a2704217543 -IV = 0f3eecf48d68353226a77fe4 -PT = -AAD = 11e4ecb256ebff56453fa2e75e43eb9d641049e6 -CT = -Tag = b512623a12d5492b7d76d39be0df5777 - -Count = 3 -Key = 9332e433bf6100c6cc23b08710627c40 -IV = aab3db3015b29d24f329beb4 -PT = -AAD = bd843a08f0a822f8f4f76c3648380aab7622e719 -CT = -Tag = e54f1d18c61d8be15484727605b5a5dc - -Count = 4 -Key = 5773750a493096a99d84c0563fc293e9 -IV = c390ed70dc9497234413ad52 -PT = -AAD = 6012517258716c1f0035efa60a0f36b5c65e7379 -CT = -Tag = b011b264610e58082705476f040b8c86 - -Count = 5 -Key = 41b0d0fce5d31359cfd5db4064e2d46b -IV = b903e9d0cea25795a82e73e3 -PT = -AAD = 4cba501876f33e1fda9cd456e3180683e3863bd9 -CT = -Tag = 18bc39d0b95cf059cd8c25004f5e507c - -Count = 6 -Key = 4748b782e3fe5e4effeb7c67232d2b07 -IV = c5e4dcf18f86076b88a5d5e9 -PT = -AAD = 3b2fcad8739ed87e1d02e80845f120e249ea92b1 -CT = -Tag = b8ae718e2879c9cb658d5d1122e69bb7 - -Count = 7 -Key = e30cc22077d5951216d07f37c51b58f9 -IV = fc583ad159b52e0b6378157e -PT = -AAD = c3cb7be8888ef44ca5aa93dde26d2751288e1f5a -CT = -Tag = a8ce25b5dc8f84e2f5dae5f085aaccd4 - -Count = 8 -Key = 7c8b10ba75ee6ab4a997d3f598b79d40 -IV = 6fb55188ddf00dde09596587 -PT = -AAD = 2ddc0acf9705f8d18f905b8f9d472e7dbf6b91e3 -CT = -Tag = 5791d3805109c5e18adff4e80906a018 - -Count = 9 -Key = 72c7db6ca29f83641c3fff5b71c4bc30 -IV = f2000742e249ac56d5b2f65f -PT = -AAD = cd994d2d08232770927d854ef2b6ca2f087370cf -CT = -Tag = a5966df39feeba0336f0b9a3f4ffe6c3 - -Count = 10 -Key = 2833cc10195030e4a1155532666cb049 -IV = ad802b9a5c9409fa3e7dcfcc -PT = -AAD = b3ecbea2797d006c07b8ce621be3b0eccd37c3ec -CT = -Tag = 81deab8bdee0d391495eed4029a6d205 - -Count = 11 -Key = d8985bb5ac0258adad86660ebbc6d19f -IV = b5ee26f8c463bbfc27115b0a -PT = -AAD = 613f51f832fbf434b8e3fe9454ae46a862d831f0 -CT = -Tag = fe9f0b1bdc68dee6e8dc2ce12665d336 - -Count = 12 -Key = 9b8f6924dc22f1073c1a38448a2f0447 -IV = 09cdabf87d82828eca1c0c7f -PT = -AAD = 69210e4e0a1cfd5038756652790b9a8cfbbd943d -CT = -Tag = a60c104a6fb4638427a88a86c04923bd - -Count = 13 -Key = 72132213d5d95309bf7e10f8318d7c20 -IV = fb90bf283c5411230355d7a1 -PT = -AAD = a30bb17c8089c6f5f61b250a94cbbbfdf5f2a3e6 -CT = -Tag = 09191af418949fe6be8dbf13e006527a - -Count = 14 -Key = 652ffbad4e1fcbe75564395e6c1c3924 -IV = 111349636d106fd5f6a1e088 -PT = -AAD = 5f52aa85dc3ac042647e32ada050d67e59b519aa -CT = -Tag = 28d980d7bfd878c227c140de3482765b - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 99e3e8793e686e571d8285c564f75e2b -IV = c2dd0ab868da6aa8ad9c0d23 -PT = -AAD = b668e42d4e444ca8b23cfdd95a9fedd5178aa521144890b093733cf5cf22526c5917ee476541809ac6867a8c399309fc -CT = -Tag = 3f4fba100eaf1f34b0baadaae9995d85 - -Count = 1 -Key = f8e29efd00a423c4ea9456863f83c54f -IV = 2d3cf67cbce69d639bd1c092 -PT = -AAD = 02c70fc8a2544619c1c3e9fce6b3c6c3bc24643e0f140e6b48ac505ea666cd9a2010c3a8e2f5f10437887fe803b54db3 -CT = -Tag = 963cb50aca3e09dd0d9a013c8734155f - -Count = 2 -Key = 00e3491dfcf3bec39c89ccfd80a5a896 -IV = 29f6ff4edc4ac3e97ffb1680 -PT = -AAD = 73813351b39f5e4000a9ee8d2b85f131634acaede0dd25d691a2b829ad4fe9ea699f12242519847cb083b0b4d3d8b3bc -CT = -Tag = 01b2e9ba719ad77c753b364ecc5aabeb - -Count = 3 -Key = 0ad06f4c19af1d5f602b38f86e56291c -IV = 0b235c6a75cecdfcba9001ce -PT = -AAD = 7d4f26f7895b2ef3da2e4f93e411cdb74025c7759c038d872344a45ce56d92a581862c3bace039090a2ccfa43b623dcb -CT = -Tag = b4bc9ce1475d0c93dfd5a5d8d45bd8e5 - -Count = 4 -Key = eeeb33e0c8a406ea236a075cdbe9d6f9 -IV = b935e8eed66227836ede189a -PT = -AAD = 9a4291acb9924bba4241b0c9c3c2e1262b25a7c7f02c92adeadf92254d618ab59388aa30b47eafa58899c357cf281e31 -CT = -Tag = 143d6954eb6fe70aff70da978ccd4509 - -Count = 5 -Key = 600b5442a0b550a38f85d2fb0acc9c96 -IV = 5e65dd6e8b20d6b2931fe6c2 -PT = -AAD = 461e54a092f8392466849fb0370ae30c14c1bf3987ab2ebbe98e18d13f041d09d043f7aea78bfcc42f864a9fb40f0031 -CT = -Tag = 2cd626f9a0686300cf23c0bc597c63b4 - -Count = 6 -Key = ce8d1103100fa290f953fbb439efdee4 -IV = 4874c6f8082366fc7e49b933 -PT = -AAD = d69d033c32029789263c689e11ff7e9e8eefc48ddbc4e10eeae1c9edbb44f04e7cc6471501eadda3940ab433d0a8c210 -CT = -Tag = a5964b77af0b8aecd844d6adec8b7b1c - -Count = 7 -Key = ae7114c09ffa04298834412f6a8de453 -IV = f380c2d860be2af41e1be5c6 -PT = -AAD = 7e16082f689c63e8adddd5cb2da610bbfb88d073cf8b204384a937aab0376523a50d3d5f1392978f79609f12df8fc288 -CT = -Tag = 40d3a36358a6f6caaa6af92cfd874a22 - -Count = 8 -Key = d8f520b6f3cf6b835ce4cce48f4cb033 -IV = 019a55c98615c022afff9644 -PT = -AAD = c3fb518ddb2d73417e243359a0ed8c126750eb163e7bd845637159397075e3db1db72fe2f0e13b599c333c473feb2245 -CT = -Tag = 467cfad5af11852d6eca289c86f967ad - -Count = 9 -Key = 13ba95606b01af035bf961e39852e34b -IV = 9ec9cf3b002cfed9e761934f -PT = -AAD = bb9de563836d1f1b1de964514ecebb8ad10501db562280b7bd98804814735817908b2856cafadecd40b04832fbde2bfb -CT = -Tag = 172a3bcbc5001dfd3815175a88f7056c - -Count = 10 -Key = 1c97da5fc5a9640f289622842408cba2 -IV = 6d765a988e934588163e29b7 -PT = -AAD = 1026a590816d2e1aa67aa0d13d50a8413af4d8ee9b1fa5ceb8deacc9f41e8e764b3ac15f98295e8800adf6a7175448cd -CT = -Tag = 4945a79d5edbb934c5cf94395c359deb - -Count = 11 -Key = 8dd46f271a201cc21ca0823248157e6b -IV = 1821b310ce2dba999cdf7576 -PT = -AAD = 34ba409997ceba065f4a5457078a9e232a84f594011aecfdbfbd24a802ca129e01cb1327e265b4a9004fb4c5003fffd3 -CT = -Tag = 304cc2cd2fcdd4abc844bc9c1cbe0241 - -Count = 12 -Key = 0c545d95333b6acf8b2928f3efd083de -IV = 31de89d07e7577956fa95ef3 -PT = -AAD = 5574d65f5afffb2d31cca8f58cf5945b83553cd45d2dba0e05fa54e42aa3f5a051e1624de16d4b93cbab7988c6d95f8c -CT = -Tag = 4ed91cfe90a49900e0565697bc82b659 - -Count = 13 -Key = 790b39f301383a82b377f585d3bf0f26 -IV = 2fd9c142b5fc62e87efff1fd -PT = -AAD = 45634e0afc59ae9f6e30f7f5fe43cf5a4e1f78d0aebb9e5a7ad9d86f25278e521f4845d49d6cb533cac6439839647fd0 -CT = -Tag = 69637c3f9233da23f8df7b09e8cfb252 - -Count = 14 -Key = 8f63652632d07b2a4a83c26dedd32657 -IV = 747bee0e1d462a9016f1468d -PT = -AAD = 9c00ff969b55a497dc523fa0cedaa339dc3c6ce18e61c7bf800c361201351bc49728c3bb15067e906162ee791b8d333a -CT = -Tag = bd5a0cbf859a6133a7f2d504d97cae05 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 20b5b6b854e187b058a84d57bc1538b6 -IV = 94c1935afc061cbf254b936f -PT = -AAD = ca418e71dbf810038174eaa3719b3fcb80531c7110ad9192d105eeaafa15b819ac005668752b344ed1b22faf77048baf03dbddb3b47d6b00e95c4f005e0cc9b7627ccafd3f21b3312aa8d91d3fa0893fe5bff7d44ca46f23afe0 -CT = -Tag = b37286ebaf4a54e0ffc2a1deafc9f6db - -Count = 1 -Key = 7aa53188a9c597126a10d248603ebb62 -IV = aa45ca5dac41a825c45d36bf -PT = -AAD = 417fd5147d56de0c74329597824ec2788a344fb60b403edf0187afa12e72a05009bb70f83ccad11efa487c1965cf84feac067c1ffdbf531fca97c554f875c4a1a1d3ab3c53c8a74ef3ee9415a87e231699c82d764debeda18132 -CT = -Tag = 997bf84654bb9616c0cc9b45f82c7673 - -Count = 2 -Key = 72b5848ed1d2badbd427e16fc3b3e44d -IV = a84c7e928dc6e6379a513a20 -PT = -AAD = 1c0dfcecbd7bb0e680ce042d08b2d9a741267bd1da768df2ba08379233a9973f14928e9da6353768b9b2601c033fd964b16a16daaa3ea35ad7cef7e31eb1f7340aa34e8bfc08b0a6e6205292570ced43316876d0d499d9192e6b -CT = -Tag = 270cd786b95e6820cdb65a231b7530ed - -Count = 3 -Key = 6d0512ebf2e73d63f42849c57f073fd0 -IV = c1c46927c74c03f19342c33a -PT = -AAD = 28bf8903b2dfb7e69f1a735121c7efe9a4c42b6a295327bceb0246c85d782ce62bf075dbdf6e8ec6589c26d30696ccceef03870bd0abfd26d30600eafc65613740b54d777d379e8aacf241ecfba11b060186ac065db171aab099 -CT = -Tag = a686f5941ceb510e126a6316e3404dc0 - -Count = 4 -Key = 6438bc79520def5db58e49639774687a -IV = d682b47418ceb5bc09c713c2 -PT = -AAD = d252b164ae559ed155c8417b96652529df151f24ccf1ce98d0c7ddf293f4f1236630a19b24dc23978d3377a099065d0ba71d4bb8a7dc0cb76760ca7c4a0e12c8cb56c6102646323c08c4f4f56226fd5b71a84590913ad20da287 -CT = -Tag = 04e78796dbf42e9ffa6bb9e346581f13 - -Count = 5 -Key = 117a0aa592fff17ae36c94917db16c65 -IV = c3537be6029d54ffefab2730 -PT = -AAD = 29e959b96817547ae06bf85fe164e82a2693f82a7aeb66d535f0d2c3bffd1ba18e94ef457939f0c0733eda4738d136380fc876075c4943220237a5929b01b32da2bc2a6afd6ae1d89fd470093835962ff6708bb39ba365202f56 -CT = -Tag = b87fcc4d5c484e68ea52c01b55ffa438 - -Count = 6 -Key = 5d995a338ed60f8ab0b59da6c9a40c52 -IV = 2723c54e31c5c57f0236e816 -PT = -AAD = 239c80683feb6afd38f8759a27cb5f350fbc2f757838c40858c9d08f699cc56c4236f4a77bd80df0e8e41d5f9ba732db2e0a3a5e952ede7bfdd5fcbebd23d07271134db5b82461537c47e2ca51b348b0830f5ee575ad4b4414dc -CT = -Tag = 94356a3bfaf07f2ef0ebe3a507076b16 - -Count = 7 -Key = c8a863a1ebaf10c0fc0e80df12444e6e -IV = c3e8cdf086827fee7095d0ea -PT = -AAD = 9927da88c5d336256699c76845e946dc53c87bf0e11e4bec9450981602b32010d2b52bfc91283a6329d455598998ede2e61e352e553110154b4da5ce668d664b83f671c010bf220b7d32b34f4ca69b66cc87233d792337cb2bff -CT = -Tag = 098837de27707ea3593e31ceb8276732 - -Count = 8 -Key = 69cc28b161f214a580e6ba4bc2e3de9d -IV = f2a566f9cf83fd280c8fe08e -PT = -AAD = f8c5263a4e06b49e184589a1e071978643c353aa27b4817fe39e45abc442e22ab5d683bcee5dbbd589fa583f171bb59536addd2b6cefd49823413005efb2a665e26a6029c927d3891cb0d4f23e8ccc60cfd02ce8978c451ddc11 -CT = -Tag = c9c806cb8b1a889809695c2ec5a7a86e - -Count = 9 -Key = bbf35920fcab2cedaafdf3f00321f544 -IV = 2c7ee3ff1df84f3650bc9298 -PT = -AAD = a75f50ba9a50f48799594b6195b3125ed92df73144bfcb624ce67323d834ba1afaf0df4c6c022c11d48bd75c86675a5927ac1250030f720f97498d4fe0787bae655dc5537ac1bcac198a893f9af7c2ef9b971dd64f7e7b62603e -CT = -Tag = c7cd3f938f4ab18642d86234edfc17ed - -Count = 10 -Key = 9690de669702ba72aeb934f5ac50e03c -IV = da8713fe2b2058c438aff260 -PT = -AAD = f30ee950da37c7224b5c93e9a29cafdbf8e2070f65c226244b1a683459e0c5c11c9b77c8fc286d4298a5b9cd1fee3e13d4690a88780d35b558b5d9e52b1a67fc8857076691dca7f5fe8ef22065cc5d9c003ffd25ebe23e61440e -CT = -Tag = 7f92914518ddbe842b06771f64c40f59 - -Count = 11 -Key = e5d8c6e2ac6935c85e81ee0ef723eacf -IV = c73140ee90cc1dcf88457da2 -PT = -AAD = f6c267a6ae5ce3cf4bcdf59cfd1f777c66133e0ec4772785f33e5fa800d310b24b5773bc603a76b30fc32328a8e40f02f823a813a9e4b4fac726e992c183bd0815111c1d3a35884a4eff32027ba60dba679b469af31bc50c0591 -CT = -Tag = f938fd0d8c148d81765109df66dac9aa - -Count = 12 -Key = e23458f6b304c2d8feb3dedd3741bc24 -IV = 4619036b50ba012fe50be1d7 -PT = -AAD = 74bfdc6bc4bfc38d666b985cfe043c67798b2db98f149268dba24436cab83e9a91f244ffc5748c93f8df339ae24ba4318c50da011ab368d3167c16e503309b01351a11f14d067cc6769b9989c7d952e3315011ee2ea034db8cb8 -CT = -Tag = 6053ab80c746821ec50c97e5a1424a85 - -Count = 13 -Key = 5372ac5d3b08d860919110bdeb7f31df -IV = 06ca979d8c250d9b7be45573 -PT = -AAD = e1f958834e63c75c8c758bafaa2f257ea5689d0d55b877b4d67b8b73c25ce24e9b094b976db920a159968da9d33c511aa8999aba42b8bb886e6545dd108693150af357496bb5898b4e8f725d50ef474afb836a3358da2217bb93 -CT = -Tag = 9338e14fe0b08a969a104c828528a6a4 - -Count = 14 -Key = bf1cb49e980cec0b153fe3573875ac6c -IV = 5426669d25524036fbe81e89 -PT = -AAD = b336949766e9948a7e6f36a2d377b84a25c4b4988794f3deab7af4b14a12dac641e25fe2ae9ff53450ace1513acd0b284a490b455f04f40af94418c8792ec1a0983fb1d9a31d93dc3ed2c75e6a6ce092111eabad039bac2a49f6 -CT = -Tag = e2996a2b3b6bf52217cfc4d0f5bb351b - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 7fddb57453c241d03efbed3ac44e371c -IV = ee283a3fc75575e33efd4887 -PT = d5de42b461646c255c87bd2962d3b9a2 -AAD = -CT = 2ccda4a5415cb91e135c2a0f78c9b2fd -Tag = b36d1df9b9d5e596f83e8b7f52971cb3 - -Count = 1 -Key = ab72c77b97cb5fe9a382d9fe81ffdbed -IV = 54cc7dc2c37ec006bcc6d1da -PT = 007c5e5b3e59df24a7c355584fc1518d -AAD = -CT = 0e1bde206a07a9c2c1b65300f8c64997 -Tag = 2b4401346697138c7a4891ee59867d0c - -Count = 2 -Key = 77b0a58a1e60541e5ea3d4d42007940e -IV = ae7a27904d95fe800e83b345 -PT = 6931a3ea07a9e95207334f0274a454dd -AAD = -CT = 76e39fad4000a07d35d879b785bd7fca -Tag = 5cb3724712f129f86b7927f13b45c835 - -Count = 3 -Key = caaa3f6fd31822ed2d2125f225b0169f -IV = 7f6d9041483e8c1412fa552a -PT = 84c907b11ae3b79fc4451d1bf17f4a99 -AAD = -CT = fdb4aafa3519d3c055be8b347764ea33 -Tag = 89e43bfead01692c4ebe656586e3fbe3 - -Count = 4 -Key = 02c8e81debc563e99cd262bfc64b0e11 -IV = b49057c9778d8c02fe00d029 -PT = ca2a51e9d05e96e6f1d14ced36811c5c -AAD = -CT = 5db602fb31bb9268d233bee0dd6b87ae -Tag = 789d2be2cc70b7c389b31912e1c0a041 - -Count = 5 -Key = 4e625a3edc61f0cb2f002da8f8a70245 -IV = 66d632dd5ca10b08d4d8f97b -PT = 0b76d498add6e09c96d7694e5d620bd5 -AAD = -CT = 17bdc7ef5649bec9cf6c565ce33cf889 -Tag = 3f7944bad062605f937ff6d6598a7651 - -Count = 6 -Key = 41ab3fc488f8d4a820e65b9d41a87de3 -IV = 9b5d27d75a0571e93f581885 -PT = 5ed0836e0a52777599800d4fe754ccbe -AAD = -CT = 88c0eb8c33a10a22e7561866566b191f -Tag = 83e885802a594a8b008a94aa7ef06907 - -Count = 7 -Key = 0047184240a5948ed55701eac2c4c26c -IV = a3ab8da22648c2453cdef55b -PT = 89ee9502871be15ee4a8c47ab123bfc9 -AAD = -CT = 8b5cb59e7ad2e15c40d5fbcde28a0d17 -Tag = 538e79f880e2f65c72148f5ade4080a1 - -Count = 8 -Key = 735c5a4ff2438852df3530c23590ac28 -IV = 7bee7c6938f1ae59671e2ddb -PT = 479e8d3bf0de4ce7cd4377d2ed3925cd -AAD = -CT = 2ca09b58178fbbfb82556599b92329a3 -Tag = 2e3cf2895f111ec2a86508c36a24e45d - -Count = 9 -Key = 016dbb38daa76dfe7da384ebf1240364 -IV = 0793ef3ada782f78c98affe3 -PT = 4b34a9ec5763524b191d5616c547f6b7 -AAD = -CT = 609aa3f4541bc0fe9931daad2ee15d0c -Tag = 33afec59c45baf689a5e1b13ae423619 - -Count = 10 -Key = 2d176607883aface75011d14818f1be6 -IV = 02162c3635bf6d543e1cc148 -PT = 71905ad5df601d056effd80dd7333662 -AAD = -CT = 1b68598e1676d2cfd37aa00396fa9676 -Tag = 5d060aa8a729774da001aa9fdef2b3d2 - -Count = 11 -Key = 94fd0269a0ce813133626f93c4af7e6f -IV = 11fc3928028dfa34db06a1bc -PT = a1aefec976cd87cf8a4c21bbe902f7b4 -AAD = -CT = b1baf8c58cdec88238b1b0ab0b40337d -Tag = 882f865df7da529f768d4944e8387f69 - -Count = 12 -Key = a7bec5e24f0db2629a257d02fdfaea02 -IV = 9d2ec94b927327793583b818 -PT = a17bc5d428700f94c641e74aaacf2c5d -AAD = -CT = d460fda5b24425b5caa8176c8c67b3a9 -Tag = 0df724340b8ca56e8dea6bbeb4b55c35 - -Count = 13 -Key = 39d945a00e05d70a16e61334d2010209 -IV = 1f931448e9013ec4ec61af0c -PT = 9dd90ebfc054da214cbb30db7f75c692 -AAD = -CT = e4cb765408697cf85917a7a9264086e4 -Tag = fe9a1fe7a58d66e3b922693a163c1ff4 - -Count = 14 -Key = 6620ca65f72de7b865de731928a4723e -IV = e6428b6b77e9b6993b809aef -PT = 7044f7c27d776f6a7d43abea35908de4 -AAD = -CT = a1c5634a07d05ca909dba87bf02228e4 -Tag = d8b40a60a65237337db05b045de8074c - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = c939cc13397c1d37de6ae0e1cb7c423c -IV = b3d8cc017cbb89b39e0f67e2 -PT = c3b3c41f113a31b73d9a5cd432103069 -AAD = 24825602bd12a984e0092d3e448eda5f -CT = 93fe7d9e9bfd10348a5606e5cafa7354 -Tag = 0032a1dc85f1c9786925a2e71d8272dd - -Count = 1 -Key = 599eb65e6b2a2a7fcc40e51c4f6e3257 -IV = d407301cfa29af8525981c17 -PT = a6c9e0f248f07a3046ece12125666921 -AAD = 10e72efe048648d40139477a2016f8ce -CT = 1be9359a543fd7ec3c4bc6f3c9395e89 -Tag = e2e9c07d4c3c10a6137ca433da42f9a8 - -Count = 2 -Key = 2d265491712fe6d7087a5545852f4f44 -IV = c59868b8701fbf88e6343262 -PT = 301873be69f05a84f22408aa0862d19a -AAD = 67105634ac9fbf849970dc416de7ad30 -CT = 98b03c77a67831bcf16b1dd96c324e1c -Tag = 39152e26bdc4d17e8c00493fa0be92f2 - -Count = 3 -Key = 1fd1e536a1c39c75fd583bc8e3372029 -IV = 281f2552f8c34fb9b3ec85aa -PT = f801e0839619d2c1465f0245869360da -AAD = bf12a140d86727f67b860bcf6f34e55f -CT = 35371f2779f4140dfdb1afe79d563ed9 -Tag = cc2b0b0f1f8b3db5dc1b41ce73f5c221 - -Count = 4 -Key = 7b0345f6dcf469ecf9b17efa39de5359 -IV = b15d6fcde5e6cf1fa99ba145 -PT = 822ae01a0372b6aa46c2e5bf19db92f2 -AAD = 72e9cb26885154d4629e7bc91279bb19 -CT = 382e440694b0c93be8dd438e37635194 -Tag = 2fa042bff9a9cd35e343b520017841bb - -Count = 5 -Key = 9db91a40020cdb07f88769309a6ac40b -IV = f89e1b7e598cc2535a5c8659 -PT = f4a5003db4a4ebbc2fdb8c6756830391 -AAD = 70910598e7abd4f0503ecd9e21bdafb5 -CT = 40d7fc4ccc8147581f40655a07f23ee9 -Tag = 243331b48404859c66af4d7b2ee44109 - -Count = 6 -Key = e2f483989b349efb59ae0a7cadc74b7a -IV = 3338343f9b97ebb784e75027 -PT = 14d80ad66e8f5f2e6c43c3109e023a93 -AAD = 8b12987e600ff58df54f1f5e62e59e61 -CT = 43c2d68384d486e9788950bbb8cd8fd1 -Tag = 47d7e9144ff0ed4aa3300a944a007882 - -Count = 7 -Key = 5c1155084cc0ede76b3bc22e9f7574ef -IV = 9549e4ba69a61cad7856efc1 -PT = d1448fa852b84408e2dad8381f363de7 -AAD = e98e9d9c618e46fef32660976f854ee3 -CT = f78b60ca125218493bea1c50a2e12ef4 -Tag = d72da7f5c6cf0bca7242c71835809449 - -Count = 8 -Key = 2352503740a4e1b22dcc9c002f53bd11 -IV = 474ecccc3182e03c80a7be74 -PT = dc1c35bc78b985f2d2b1a13ce635dd69 -AAD = a1bc98dacec4b6aa7fee6dfa0802f21a -CT = 3f6f4daf6d07743b9bd2a069d3710834 -Tag = b9c2b319adbd743f5e4ffd44304a1b5f - -Count = 9 -Key = fc1f971b514a167865341b828a4295d6 -IV = 8851ea68d20ce0beff1e3a98 -PT = 2fec17b1a9570f6651bbe9a657d82bce -AAD = ece8d5f63aebda80ebde4b750637f654 -CT = 2d27e5fa08e218f02b2e36dfad87a50e -Tag = eb9966774c588a31b71c4d8daa495e9e - -Count = 10 -Key = 00ef3c6762be3fbab38154d902ff43b5 -IV = c3c1c3079cda49a75a53b3cc -PT = be425e008e9b0c083b19a2d945c2ede9 -AAD = 714fa1d6904187b3c5c08a30dffc86e8 -CT = c961a1758dcf91e539658372db18968e -Tag = eaf9bda9b3322f501f7329cb61c1c428 - -Count = 11 -Key = 2d70b9569943cc49cdef8495bdb6f0e6 -IV = b401d0f50880a6211fde9d9c -PT = 47a87a387944f739bd3cb03e0e8be499 -AAD = 592e7276bda066327f2b3cd8cc39f571 -CT = c1b2af4d273231e71e7e066c206bf567 -Tag = c68d8d3cf8b89e6b15f623d60fef60bd - -Count = 12 -Key = 775cb7f8dc73f04fe4f9d22126bb7b57 -IV = 81ceb17deee19b8153ff927c -PT = 8242c6c0eed6d5d1ab69cd11dbe361d0 -AAD = 97e07cd65065d1edc863192de98bc62c -CT = 580f063ab1a4801d279e4ee773200abe -Tag = 29e4d7e054a6b0a4e01133573fbe632b - -Count = 13 -Key = 58ba3cb7c0a0cf5775002bf3b112d051 -IV = bb923c93ddca303ab131238d -PT = 6b93d2d92de05b53769ec398ab8097dc -AAD = 0898ea55c0ca0594806e2dc78be15c27 -CT = d0564006b1897bf21922fef4f6386fd4 -Tag = 3a92f3c9e3ae6b0c69dcb8868d4de27c - -Count = 14 -Key = 955b761de8e98f37acb41259fa308442 -IV = a103db8a0825e606b70427fc -PT = d18344c86caffc4237d2daae47817b13 -AAD = c2d0d8b77a6fd03ced080e0f89de8a4b -CT = 065d228c1289007a682aa847a36b6f30 -Tag = fb367f47922d67c84bf47aabb2b98421 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = d4a22488f8dd1d5c6c19a7d6ca17964c -IV = f3d5837f22ac1a0425e0d1d5 -PT = 7b43016a16896497fb457be6d2a54122 -AAD = f1c5d424b83f96c6ad8cb28ca0d20e475e023b5a -CT = c2bd67eef5e95cac27e3b06e3031d0a8 -Tag = f23eacf9d1cdf8737726c58648826e9c - -Count = 1 -Key = e8899345e4d89b76f7695ddf2a24bb3c -IV = 9dfaeb5d73372ceb06ca7bbe -PT = c2807e403e9babf645268c92bc9d1de6 -AAD = fed0b45a9a7b07c6da5474907f5890e317e74a42 -CT = 8e44bf07454255aa9e36eb34cdfd0036 -Tag = 2f501e5249aa595a53e1985e90346a22 - -Count = 2 -Key = c1629d6320b9da80a23c81be53f0ef57 -IV = b8615f6ffa30668947556cd8 -PT = 65771ab52532c9cdfcb3a9eb7b8193df -AAD = 5f2955e4301852a70684f978f89e7a61531f0861 -CT = c2a72d693181c819f69b42b52088d3a2 -Tag = cadaee305d8bb6d70259a6503280d99a - -Count = 3 -Key = 196ed78281bb7543d60e68cca2aaa941 -IV = 6e7d2c8f135715532a075c50 -PT = 15b42e7ea21a8ad5dcd7a9bba0253d44 -AAD = d6fc98c632d2e2641041ff7384d92a8358ae9abe -CT = 06e5cc81c2d022cb2b5de5a881c62d09 -Tag = 28e8cad3346ce583d5eebaa796e50974 - -Count = 4 -Key = 55fe8a1bdc6806ed2f4a84891db943a0 -IV = af4d0ba0a90f1e713d71ae94 -PT = 81315972f0b1aeaa005363e9eca09d7a -AAD = 677cd4e6c0a67913085dba4cc2a778b894e174ad -CT = c47bcb27c5a8d9beb19fee38b90861b7 -Tag = e061ee4868edf2d969e875b8685ca8a9 - -Count = 5 -Key = 6d86a855508657f804091be2290a17e0 -IV = 65dce18a4461afd83f1480f5 -PT = 0423bd1c8aea943637c7c3b0ca61d54b -AAD = e0ef8f0e1f442a2c090568d2af336ec59f57c896 -CT = 53505d449369c9bcd8a138740ea6602e -Tag = 86f928b4532825af9cac3820234afe73 - -Count = 6 -Key = 66bd7b5dfd0aaaed8bb8890eee9b9c9a -IV = 6e92bf7e8fd0fb932451fdf2 -PT = 8005865c8794b79612447f5ef33397d0 -AAD = 60459c681bda631ece1aacca4a7b1b369c56d2bb -CT = 83b99253de05625aa8e68490bb368bb9 -Tag = 65d444b02a23e854a85423217562d07f - -Count = 7 -Key = e7e825707c5b7ccf6cfc009dd134f166 -IV = dd0c7a9c68d14e073f16a7a0 -PT = 88b1b11e47dfe2f81096c360cf1e30e7 -AAD = 11c69ed187f165160683e7f0103038b77512460b -CT = 550fa499a7cb4783c1957288a5cc557f -Tag = 5d2c2f71a2e6ad9b3001bdbf04690093 - -Count = 8 -Key = 92591b15e28ce471316c575f3963103a -IV = 2c30d215e5c950f1fe9184f6 -PT = dc8842b3c146678627600742126ea714 -AAD = 46e1bd5fa646e4605e2fbec700fa592a714bc7ef -CT = a541d3d8f079bfe053ba8835e02b349d -Tag = d322a924bf44809cb8cfe8c4b972a307 - -Count = 9 -Key = 74f08353d4139ddad46691da888ee897 -IV = e2619217dc8b093e2c7c5b78 -PT = 1690d6c8f95ef5ac35c56e3129717b44 -AAD = 92277cf78abe24720ce219bba3a7a339a2e011b2 -CT = b413557c0df29e3072bb1b326e2002dc -Tag = 3bb6273687ec6a3f4a0366f1b54bd318 - -Count = 10 -Key = 5c951cd038a3c65cd65325bfdde86964 -IV = 3bf5623fd1155f1036ea893f -PT = b609ec6673e394176dd982b981a5436b -AAD = dc34014513fd0eede8e9ca44a16e400a5f89cdd0 -CT = 009cf623e57a3129626a30489b730607 -Tag = 1d202825db813c0fc521c284dd543fff - -Count = 11 -Key = 72301c093ba804671c44a6bf52839d9c -IV = 87cc7e6579cc92822f5744f6 -PT = d59bbae4ff3e3755c0a61a9b6d3e234c -AAD = f461946c4feba79c18366555d85311248d269c87 -CT = ee743d29dcbaa084fda91eb48b3be961 -Tag = 07934a5372d41928f2ee7d4bb8c18982 - -Count = 12 -Key = 39b4f826b520830941b3b1bcd57e41d5 -IV = ca32ac523fe7dfefe415cba1 -PT = aa2b7a6c918ed6715441d046858b525f -AAD = c586cd939b27821695b4ee4dd799fb0e3449a80e -CT = 8b64f5ea9a8cb521c66df9c74d4b7ecd -Tag = 3db56a792b67ac6d0c4001e17f446111 - -Count = 13 -Key = 79449e5f670d55ee2d91ca994a267a8c -IV = c779da00d672811d8a5124f1 -PT = 767e120debd8a1dc8d2db8b7f4750741 -AAD = 54780846dc3df77c8d90c9f2decb0738da36fbda -CT = eb864412add08abb4f89d72d412d0085 -Tag = 494a547f617840267d3fed5280e3eb30 - -Count = 14 -Key = cc90c2f37f970f97ac97e3e3b88e8ae3 -IV = 67bcc08f223f12107e4d9122 -PT = b0fe0dcdcd526017f551da1f73ef9fe1 -AAD = 065acdc19233af4be7c067744aabab024c677c5e -CT = 501cda2c954f830e8922c3d7405b5ee1 -Tag = 9deee5d0e4778a9f770367f19c74daef - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 89850dd398e1f1e28443a33d40162664 -IV = e462c58482fe8264aeeb7231 -PT = 2805cdefb3ef6cc35cd1f169f98da81a -AAD = d74e99d1bdaa712864eec422ac507bddbe2b0d4633cd3dff29ce5059b49fe868526c59a2a3a604457bc2afea866e7606 -CT = ba80e244b7fc9025cd031d0f63677e06 -Tag = d84a8c3eac57d1bb0e890a8f461d1065 - -Count = 1 -Key = cdb850da94d3b56563897c5961ef3ad8 -IV = 841587b7174fb38fb7b3626e -PT = c16837cb486c04bd30dcae4bcd0bc098 -AAD = de33e6d20c14796484293dff48caffc784367f4bd7b957512ec026c0abc4a39217af0db35be154c45833b97a0b6454df -CT = f41a9ba9ff296ebdbe3fdd8b1c27dcdb -Tag = 506cc2136c15238b0f24f61b520fb5e6 - -Count = 2 -Key = 45551710464a9ea105a30e056167cfb0 -IV = 5727688c9e74bcd23c14a345 -PT = 6adeaaa151b58c337471653c99affbdc -AAD = 3eebcdc5c5e9970b3fca94bd0d28ead70d1f36a94f27780472bc3cc9ff39dd7b7e3a76ebce967d6ae5724ad904dc5548 -CT = ec18f1d675dd056baeb374829ce45a33 -Tag = 378bdc4c34753a1284b654af049b853a - -Count = 3 -Key = c8650e8695396b84a3fdeea8f95c8215 -IV = 5a1c26d3848910137df9f76c -PT = 88aecd97435d97e2dff8763f640a5640 -AAD = 3dace39b7284ea2786a6bc670ced1c7cc0c28c4ae4e7494a6d834eb09260b68898b914d5a6b0b5334eff9669f233aeb8 -CT = 49a9398c70a89c0e43ce7a7bd7a90c58 -Tag = 8509ef5fa8046a48a5f081e5215db2eb - -Count = 4 -Key = 76470ff92aaeeeb24172b823fce630b1 -IV = c70088e92633688bebe3265b -PT = ff4f74af151c292a0b35ba7049c9a5ad -AAD = a262fc02a3d0db113493d4179cc9ec806825f20f5864bb105c6116ea72f0284950ecc8a05dc548023853a657b67ce01e -CT = 2404868e6bfee5ffe6ec851785618aab -Tag = b338a9ccf10d45dfd4e0ccb8a87b3c1a - -Count = 5 -Key = 247b0330aa35a8a855142f933d182581 -IV = 6df7990b60e41f1fac5f283f -PT = fa979c20be9f7f7e802fd5ca55c14618 -AAD = 0cec69d6f6532bf781f5b0fe70e33e1cd68f8b2019aa73951baf978bc1141b51083a8e5c785c994b12ffeca01b6c94f4 -CT = ca4b66a09606caae8a100ce994da9452 -Tag = 534188f439b929183d21109d962145ea - -Count = 6 -Key = 1ea5cdfe206130596b655bc6fb935fad -IV = 0ec93072e726ec58352d5a90 -PT = 1ac044b5f8b693fa236986ad1621edd8 -AAD = d9da4741fda4821eb391a23f7f6b377bed923260b6f8c8ac9bbca4edef1bc2a48a45c8676cb598a668e28fe1103efa23 -CT = 33d387a3b73a590bfd78320ddad8c169 -Tag = ef36d6c01b5a54bf06ba218aa237fa54 - -Count = 7 -Key = d5a707d2e3163fbd9fba2f12e8dd980c -IV = 4a4ed3d33e5a1dd6befdb382 -PT = 639331ff4efaadc93e92e58de9e886ee -AAD = f5392e014cbe2d33cd0a0497cf0398883338748491a8543991990f9958e4a827e190e6f5ce89baac5f3bef91dcb5858b -CT = c986c4c805092a51103176b56507dd95 -Tag = 5da4fe4e281e995d0c75587b4945ca85 - -Count = 8 -Key = 3d2c604398c247e3ae7d90cc1e11f6cf -IV = 5dfafa52cbb52f57ac304381 -PT = 9c12cb73902608e7b2ea30da7397b66a -AAD = 53e050b559308705376a23ee2b22b7642f06ab77a00259bf7bf28cf6665912af4b8901f8af76e982a8bcbafe5ea1aaf6 -CT = 7fe6b5a881c8a6b8e3e29f1a3819383b -Tag = c528fddf8166a5c0ec3f0295b2c3d7a6 - -Count = 9 -Key = a335f0577c876e61d94522d526159f57 -IV = 6ea85a74513f664a907fef80 -PT = db38cf3bb14825a6c11ac978fb516647 -AAD = 038af270aece9687e34c55ec30494e9f72b6a90ac43280a9b8e958353d8c02a83ed163c6924b7201759615779cd5661e -CT = 7e81df8bf0b671e89a639d6432d44952 -Tag = 2180e6c8fe8fbb3394f9dfdc1c439d80 - -Count = 10 -Key = afb3ab51cf05e0cfa2ccc2c3c8f4b67f -IV = 26a5d1667feae062c14663bc -PT = 26821b2fe21c26d20843af266fce1f16 -AAD = 130b15bde79749d0577bff6c98ab50f035abae041b0d5f666db27c262c0ed2a801c24feffcfe248cf3af5afcb6b0dd1a -CT = c5317ad695606124662453dbfb96a26d -Tag = 2ace2fa75daa31fe4f2020cea9e71ec6 - -Count = 11 -Key = 0b4d033bf0182bb06f8b9714d525ee74 -IV = f0807dcca355aa339febada2 -PT = 7c90709d6ea3e586bbf11913bb2b5261 -AAD = 9cb373a8b7cc61eb382dfe1ea17d78877e9366207c3a5161a1f34b75ac503dc20e4af9d9962b7d4fb0f39ac9666c660c -CT = bfdde06e311240348f04277504fd75fb -Tag = 1dc5898c49e2dab4ae1a599547a76ab1 - -Count = 12 -Key = d32b7c3cb327780d1422116c40470ab0 -IV = fcc79573051011685ee0d9e1 -PT = f015f4ab3bc159db9cf6b4bb6750db46 -AAD = cdaae988d8bf01e24a4baf489893ee329b7d0dcfdef684fe3e382b200cbd5a7ea3e46be281b0c6cc00417d67f4d3db02 -CT = 48bec210f66942f877993e9486a678e7 -Tag = e4a3821709626cc3006c805a75f067cc - -Count = 13 -Key = 086a0cdd8d520a8a695d17e869e03efc -IV = f0a463c0d1e28633da98b1e2 -PT = ad6fbcf714ab893455eddb3c5fb406dc -AAD = aa7ebac61f7e0b9da0d941e801730a393b2728476dfd065e2f6ef4b343bc2ba6e17c59a2e5381597948a73ff25493f8e -CT = f0b1a368b832ed35d54c80067a06a2ae -Tag = e3c80910db9ce1f3ad2519fe1ee2dfd7 - -Count = 14 -Key = e47e1e3a95627418ed659452a3c92d45 -IV = 78adcf3f732dd3787cb5490b -PT = 801efcab1e329a536a7b506c4a7509ec -AAD = 41913a6c5c4dddae06f3c0f68e8ece139ca902fe340a820e7c40d895b35e8f4cba7809c7eed0b2b7ad45c6d152ec3053 -CT = 6751a4a5e0cc3c0f46cb5540937efde8 -Tag = 7b07d21a4cbadeedcadce817d9ab81be - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = bd7c5c63b7542b56a00ebe71336a1588 -IV = 87721f23ba9c3c8ea5571abc -PT = de15ddbb1e202161e8a79af6a55ac6f3 -AAD = a6ec8075a0d3370eb7598918f3b93e48444751624997b899a87fa6a9939f844e008aa8b70e9f4c3b1a19d3286bf543e7127bfecba1ad17a5ec53fccc26faecacc4c75369498eaa7d706aef634d0009279b11e4ba6c993e5e9ed9 -CT = 41eb28c0fee4d762de972361c863bc80 -Tag = 9cb567220d0b252eb97bff46e4b00ff8 - -Count = 1 -Key = 11f47551416154006bf89e7594ea2082 -IV = d546fcd3ff2a6a17461e9e94 -PT = d3783a3d7a1e091f9cb647bf45604457 -AAD = 49efdce48e821eb14eca5f1dd661f8b6b9a5a6917b08ec9486c29124ef1e7a9af2217494eecad3d8eef9fc22d29ce18d92006de1588c3b06f8db9fe809bede40908cef4f46d2c4b6f92ff5a8304362749143dab266de45bf5b4a -CT = e97988a6645b93a32e8296bb1dbcb8f9 -Tag = 399345f974a82a2a75007c84aa08dc1a - -Count = 2 -Key = 0736a1f074919dfe23bf2a828eac2b26 -IV = 5b2105166bcb15efc07f1c03 -PT = 402b5b45dbbef7f1d955423e95cda404 -AAD = f331a6f6d31de69f116b27fcd7f914aa0b2c3a09490360e7863417a2346030cc99b6ba389e65e0f10fe0815d383e6f98dd8bb97d29908560ce98e4bf177e42e14a7137cfd30b7dcb4d8655b3c03514e95adf698645584475865a -CT = 6e9e79e29f3085183e0a7ac7f6ba1d67 -Tag = 84434e0c82b858ec27e61c54ecf6cd94 - -Count = 3 -Key = a3929d753fe45a6f326a85bb9f1e777f -IV = aed85f89844f061113004d2c -PT = f024e796f449712b70d5c7fe5be5fe14 -AAD = ecef72a7ae9e6bd15e63c8e9fb2a3a7c53eb9a88bc05296ff6f25544f681fff5289a099d38abb68316eed8215ead9ca0462065bee79fdb63b4405384053fdc68fe4124a883f50a2b4bc4df6e29383c2ceea424e4ac539b26c9ce -CT = 349e770a7f7dc2fb41fa089bf723f6b6 -Tag = 26f12bc8777d724fe59ad4fe2b9757f4 - -Count = 4 -Key = 85abd6c7b90314b29bbd293ff113637e -IV = f48f4ed2eb7b7aaeb017ee72 -PT = 542c6fa7e7cdaf21e6f6b34517f26ab5 -AAD = 2b825d477eb96e0d8d787ee4f284eca567fb5214b47e26705389cf9fce4b8dbc49a152df5e4accb0adaa19b37c90fe7d6eb456a067f1c2b63b61f6d596209f7ee96c85aa48f1870e9338743edff1d8ffb61dbdab88b6755fa135 -CT = 8374f96f03780724a8e8d1f11768d44f -Tag = b41b53c46ae76eff505cfee47a8daaa3 - -Count = 5 -Key = 0a2f29710feb7c86175a37c41e32fadd -IV = b190fdb91061a08ef82100b8 -PT = dfb6284ffd6cc195ed75db0c9faf5559 -AAD = 0af4d5c1ec517a1fc104aea7d513b591b603634fc558007e06d6cd22997407eb8281a742aef6e88ba08f10c64b423121d898bcd04c1f1d6c7c12d673aa1abb004a8525f1d7abc23c8724885179e292c0565a39d9f5c6d2369e37 -CT = fb6cb6527b92dc2ef6a227e8067879aa -Tag = e01037f6e9d62c18b163a714f85a92cc - -Count = 6 -Key = 470d577137c5014b78137dc6b24efa6d -IV = 4afa7f5766f8345a1b12042b -PT = 4745cb9a3ee3a76ae166dad5a1b62b1c -AAD = cfdd5d42e0d0127a1c0d3c4bad302ef23ab63d879fad71109f4792e5b21156dafdcec022fc323028a9fbcafe0c3606ed61b582bfa00ba6e5c9a1b13b976d67c14c79905a769399d967b0dd45f0e74967b67d7bb67d9466618fa1 -CT = ca58ced863696bf80ae0191de1252333 -Tag = 246d451faab88511467e38b60c5b46c7 - -Count = 7 -Key = 5cf9cfa4d367752f1354037e132bc948 -IV = 13e6a286a6c7b189974d7ea3 -PT = c7ef33e7abc8f298b2f224cf5218661d -AAD = 65da4dbd6cef7fc8a09a766a6f5b474e9711a2d40faf841c467a8838e5c8cada3f1cca74ed3b4cdda6d5d334c91763e798b9c7891b291dbf46d89ddc728d72f93c95e081bc340448519aeccc6d105bf1696b7ff9c0b7c006444c -CT = ad88f4e7b980be05b3df0fc05a49d1eb -Tag = 0ad15378f18f4338966e8e17951d8dad - -Count = 8 -Key = d1dafd9e07ab0f903a9b00d6e353d67f -IV = 8a96a0fe88f0c7e3077c38f4 -PT = bbe4ccbd26522d35ca0d483341385e2b -AAD = d3e1ecd06f79e6839767d957c4d715b4228f4cbca7afa429d860c5db2a6bf4a3ade2d00b91875fedbf9b09e9ee5e69182f326fb36fcc35475efb32e5eada3a6fa6046c8d0c0ee933b0e7f37c87b3eb8b9c0c2b457f8695d25875 -CT = 9d016cd94933c07c10b92af40eafac7d -Tag = 022e2dd58ac862962e7fa0536bad87cb - -Count = 9 -Key = da5236b254ee2ff5d7e73d7a09574177 -IV = d2d91f5c302212557fd62bce -PT = 3aaa2a7b2605686c3444bb16df8c57a5 -AAD = 9ddfa05290e228e5eceb7e96de3a097afaa96d8d3e0d5ffc0e0116f43814f5b0947919267c2dbf0e5f52a97296e7826f2891dd4a043c845046c9ab9ae8327346c7695a72875b9062dd5578be8985edf9faa4917981aacc6f112f -CT = 202a8e67d7f22ff83757fc9ef9b20a0f -Tag = a55bab242a4ebe73b52cc7202f5cdd57 - -Count = 10 -Key = c3e577da2a2b7fdd05c99dc6fc81ccdd -IV = dfa747b08f536915345766f0 -PT = b863120426d4cbd5c73124c7b0342fa7 -AAD = 872a6d0e3a0a3b32f4c92a4e5baf7efb7270a9ab9cfcd3c1173a2fcb2c155a923f9d8b8e35a965b11d15e2e0cc591e953da81c172b8882344cff7b40eeaa30d4793900dd85cb65fbeae9d1d3b2a62c66cb932dac1e6806ab6150 -CT = 43da888047cb1cfc7dd42329310c8234 -Tag = f8267635aa7b51b89c80fa979861eb3f - -Count = 11 -Key = 69e1c0917ca8d49aa69f38cf9c66eb4d -IV = 0c55672336d219e64c60e15d -PT = 7dac3e31269dd79399c94798f4bbc640 -AAD = c1b423f27d794e947bc56aace3995065279221f5b8bef6568b5b2882209bf0dd7776e9ae6eb1a1eda0b768aeaaed9e3884cc3968b6d179e9e5abf08df8261c3ee54f8b0eaf2646cb221288a879c5ea4e9183805dc1da8a636a58 -CT = 37d215a13362bf087bcba8f95901eb05 -Tag = 1b3eecb7ae9386dbc1409e70f5827f58 - -Count = 12 -Key = 08818d516558631161e49eebd621f78d -IV = f1f855eb8aeccc9ddf7aa80e -PT = 1a89c9c9623a26b7c8062c5f6a5f7f98 -AAD = 68fedf6a42b780eeb011aa0b242636668e5c8941d6045b05c948f82c5db3977831435ab4049895b607e854f710e3d8b7a26afaa2e7913093313e93c3e106a8356d6c44579398ce4341aacb3b726e7f42fab75934920df230cb4b -CT = 9e12e3842ff7f5c25a171cc4c5a3dfa8 -Tag = 01cd4980d92df6739bedf22201a2cc12 - -Count = 13 -Key = bfa4a12b357605b11e65fa92b90d22fc -IV = 9aeb721b698db40dc9080e23 -PT = 9383358a4065f3e365924f7fa664012b -AAD = 53bc66164811866e12ebcd64447c999777378119a257fe00d45b5c9392d5618f2c2c784696f5a9fea85d0f8c9cb5438b15b3f5661d49e0b0980ff61aeee0cdf650ab4fa82bcb0d0390f99daf02d8561bf5bca5627e3b194951ae -CT = df469d986744c33244682184912cdd68 -Tag = 8c12f8338ffb7840e085fdedaa6ab3cc - -Count = 14 -Key = e16a57c83f230c368a0f599a7ebf3f5e -IV = 2631b811ea57cb7d58fa232a -PT = 2a37e380f575e4365116fe89a58ee8dc -AAD = d5bc101ad26f7d03999eac122f4e060f20a402ff8a2a0324a77754e1eb8b7a65f78743ac2ee34b5429ec9fd6120fe6d17e71f738cebf0ae39a5be5a4dde85384d98cd90d218785b08daa662f24187156118fba981b9691cf12f8 -CT = 9278d1eab07dc7fa68742059d9fdbe60 -Tag = 27a474294ff811db4f6e0c88b1a86b0c - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = fe9bb47deb3a61e423c2231841cfd1fb -IV = 4d328eb776f500a2f7fb47aa -PT = f1cc3818e421876bb6b8bbd6c9 -AAD = -CT = b88c5c1977b35b517b0aeae967 -Tag = 43fd4727fe5cdb4b5b42818dea7ef8c9 - -Count = 1 -Key = 6703df3701a7f54911ca72e24dca046a -IV = 12823ab601c350ea4bc2488c -PT = 793cd125b0b84a043e3ac67717 -AAD = -CT = b2051c80014f42f08735a7b0cd -Tag = 38e6bcd29962e5f2c13626b85a877101 - -Count = 2 -Key = 5bd7362f38bafd33ff4068860eb35c27 -IV = 6064368166c48633b090cb9a -PT = 634852a6b68543ead889aa19ef -AAD = -CT = 3a44f911376c371e6d597539d3 -Tag = 452b67e9d36a9ec5a893272b4d2f2103 - -Count = 3 -Key = 2591360228dd945aae8fba95dc2725c5 -IV = 2adabc15c16e5c5954c8ab01 -PT = c580b051600dd902b273e26677 -AAD = -CT = 9ac66aa93d7547bc0a45baf5ac -Tag = a609413c9c13817287f39cfcf4da2e6e - -Count = 4 -Key = 3c85f64e35953f2caded63f987592611 -IV = 7ad13cb40e21ee633251968f -PT = 7bddb4037c2be00f4ef6f85ccd -AAD = -CT = 9c2030e3e19e490c309610d889 -Tag = b0e4080a8dae54a6770f4e21d5324e90 - -Count = 5 -Key = 7b8d32382d29c00198f1d41fc6b52b8c -IV = bd65d7281a9a6aa9fc268f61 -PT = 10f27dabb9c9e9facbd21b13cd -AAD = -CT = 707efbd54aabbecc22ee6b5304 -Tag = ca35f5dea869508653ce556c9c05d32e - -Count = 6 -Key = dd95a8ca25883353aff5c414ad9ac5c0 -IV = be2ed3a4d38fa65cf341e5ee -PT = 5b0c29c8bef219d52932b33041 -AAD = -CT = 4918ace25961fae06dbd891d16 -Tag = ae6f069accfacba61a38323dd65f4c02 - -Count = 7 -Key = 4db01983f6ad9e39385070b810c26c80 -IV = 2342dc3fb660e3925509b6ed -PT = 5cef6c4f05073ae39e05356dc5 -AAD = -CT = 12e41f4373f1e5dcfcf758e2c8 -Tag = 36fe1b8981946fd16cf12ad80f04d59e - -Count = 8 -Key = 8d59f931d4cf8a2683e269008ee86062 -IV = 7ac862a09c3408b667e8cd38 -PT = 2c47413a8256f25677b1de8ef1 -AAD = -CT = 284ff4dfe4255f56b4a56585a7 -Tag = 16c0a4a5826e291d4b3f7ead6892c392 - -Count = 9 -Key = 01c681e2cf1d7c8484c3811201376187 -IV = 56a8f48a3198b977f5064d02 -PT = 37dc0f572c9e51c6fc18642d7f -AAD = -CT = 54922c65023605c1eba146d448 -Tag = dddbf654030e73be0dd6d26b67efd0e6 - -Count = 10 -Key = dae6cfda8979801d9399006797a2366b -IV = 1cb41dac13ffa72e72a405d0 -PT = 9f43ac53d4cec80dd29a902d86 -AAD = -CT = e156a5f0711096cadd489937a7 -Tag = dfa2d2a342b78ac6e7276365f2fa6dc0 - -Count = 11 -Key = 5146ebe3d1fdf166ffa4099b638c5b64 -IV = 10014449817d881328c2b882 -PT = 700af6989527eb16ffab6634d2 -AAD = -CT = 8ab35c288f09084da3c0cbd240 -Tag = eec8232f2907b2e1cb2c940622530d25 - -Count = 12 -Key = cd70f86fc0a1780740fefef5742e4398 -IV = c2abd119f22d310b34f41c5c -PT = 39fb497a2691264f02fcba4887 -AAD = -CT = 01339a3a9119836f6b038a1a50 -Tag = e45a0a12c84ebaaf1885f457507b9a5e - -Count = 13 -Key = 8828454ceefd9004e30ae8a03d71f9d1 -IV = 8d9e3c61aa687a8f2b9ee30a -PT = a94b020f4724178a3f4f9137c5 -AAD = -CT = c4a94f89e03305aa415c7b350c -Tag = 1acc1c75b9fc826af2e950cc7be6cf64 - -Count = 14 -Key = 47982f133cb72342dd642f3475bde634 -IV = 8304304acea2def778f2bf9e -PT = 2c97a5fb6df85153a5c3bf414c -AAD = -CT = 37e0962960edcf0a09a8538cac -Tag = 07459fa438e1f159a6649a8ed6f934b8 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = dfefde23c6122bf0370ab5890e804b73 -IV = 92d6a8029990670f16de79e2 -PT = 64260a8c287de978e96c7521d0 -AAD = a2b16d78251de6c191ce350e5c5ef242 -CT = bf78de948a847c173649d4b4d0 -Tag = 9da3829968cdc50794d1c30d41cd4515 - -Count = 1 -Key = 3016620015db1d85eef09bbce50ae294 -IV = eb481db3a52201173e2d4ad7 -PT = 38b57c0d4151d7ee57e032829f -AAD = fa3d95b81a619638cea3f68dfbc02133 -CT = 7738601ab14748223164d1f69d -Tag = 63ca9e8c27d9fa837ca4a0bb7039e390 - -Count = 2 -Key = b3ba382909e94ef5d318ee32cb54a33e -IV = 3cf10b1700711486119cfd9e -PT = 4a90ad3f97c9c7e82efcbb318b -AAD = d1e17c0189b04561699bd2f791d69491 -CT = bdf6a8a11288e83126932cd946 -Tag = ca7ff7458c3adf388eef7e0e32d6b2c4 - -Count = 3 -Key = 0a8fc9e07eb50b092cd9fccb3db2373e -IV = 371d0af80bb20f2ead09dc22 -PT = 7826bf01e962a201f5c8e7f742 -AAD = 9f42976847531ddfe428694f61260b2a -CT = 665cdb3e2568ee1157d877dd25 -Tag = c66fc129ecb30ea0d54b6d6932d9d7a8 - -Count = 4 -Key = 3d1fc93233e86cb882e4cd754df63754 -IV = 1ede8cadc78bb4733c341bac -PT = 74232bfedc377efd5a63ab77cc -AAD = 5807c856944fee1e6c2e70ad9a08de00 -CT = ff3e09311d59bf1f3dff474fd4 -Tag = 7dbaf75ab6084504e080460ebfd255af - -Count = 5 -Key = 936ba9fc715c6e2d70a7986b14b82ce6 -IV = 45b3239d045bd56ea5a0e77f -PT = 941255369704ec192bab1cf039 -AAD = a2570d9548bd6c05f824577871784ee4 -CT = b3ead079446053a8206f4a37a6 -Tag = fa5d98f053e8520f45e1597ee38b3751 - -Count = 6 -Key = 96a05889a7591c1918472fd26977451a -IV = 7d80492afefce80da6689ffc -PT = b09b2dc5c5463a03dd5c9b0ecf -AAD = f4ffa36a478c795e0d28d37fa9e6fcc2 -CT = f7cb053d447dddcb6e3a2d891f -Tag = 2a38f63a1b7cdccec426683b34a44ff5 - -Count = 7 -Key = 7c98567fb5ae9601fca412e72dc9fe2f -IV = 1218ce69073eefd25a7944e6 -PT = 0df75d39d8facc3accbdefc87c -AAD = df4203c3402d2b328bcb44e7683e08ab -CT = 7e5ca0d1c1ff83bc3633f2301c -Tag = 7ea717458ca93d8844da5df7ef74005a - -Count = 8 -Key = 4e1b199c12f12b591c051c7edc608d11 -IV = a4bd3af7f35d0fa21f73641e -PT = 051ed5d700a7e59990f0358928 -AAD = dae2cd749195bcfb67a663789e85995e -CT = ae50359f104ba2089ae98eb45a -Tag = c08a7cce7c38626604032d2be9bd519c - -Count = 9 -Key = 9491cb5d4f2b94cc5a50dc67bfedd074 -IV = 8377399607418e8d51dac5ea -PT = 2a1e50ccb5a52be3d338e8f0a6 -AAD = 972d9c486961334afc104765c2863253 -CT = afe759b51318f67d872a1dfdae -Tag = 77a4493aed7e3a6e014d0a1a314c3f86 - -Count = 10 -Key = 0993571183089c4a7bd8e8789854c265 -IV = d72ce6db33b33e2a2d430d2e -PT = daf7f3ec2e2592c65847734f40 -AAD = e47252d2a8ef5190faf328176588609b -CT = c6fadec0c7520f717144f0104a -Tag = 6670c8cbf7e9eb431e899f61acccf456 - -Count = 11 -Key = d45b6c85293d609310eb3179cfbac4fb -IV = b02328302cc469cda1c7eb48 -PT = 70f5af8c1da987f6ab5dea31de -AAD = 74ca5b46ab31a11b4b4c253666844b32 -CT = da6b359072accf5f036c85600d -Tag = d8e496c53797b124e356967ee525c0ca - -Count = 12 -Key = 9326155a9b81013c1edb143f9f5ae9d2 -IV = c95383eb3050ebea4deb80e9 -PT = aa80cbebfb01b035a4e1e50e35 -AAD = 64a73f0497746436ac94c3c18e1ef6e1 -CT = 45ec8de633c7bb585c0a7fea1f -Tag = 537b6103b0f7c5dce82bfa37c2734877 - -Count = 13 -Key = 9192ce4d383752e9d9c66b93ef7f05ab -IV = adabd3baa4374697c53b4289 -PT = c55b5d16e3cee22bad1f5420ba -AAD = 14cad0cb1736ccde73f86897ea017570 -CT = 3aa22a57646229fd33bbfae6ce -Tag = 5ce7cd439823538fbc194886348ff029 - -Count = 14 -Key = 3dd104297e803dc22b8f11f1951c8508 -IV = 8abd1fd8cd88ef848e8ce082 -PT = e1eb53704ccd5d7992f1c91097 -AAD = 96f6c82aa93ccca47056efc3ac971613 -CT = 8e4125514870003f0b0e8044a8 -Tag = d951047cd8d50ca5f7ffdebf78725c56 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = fe0121f42e599f88ff02a985403e19bb -IV = 3bb9eb7724cbe1943d43de21 -PT = fd331ca8646091c29f21e5f0a1 -AAD = 2662d895035b6519f3510eae0faa3900ad23cfdf -CT = 59fe29b07b0de8d869efbbd9b4 -Tag = d24c3e9c1c73c0af1097e26061c857de - -Count = 1 -Key = 544ec82f837fbe561f371b266cc52ed5 -IV = b756952a0e98cf4cb024a499 -PT = a2e81f78b8e3e39e6cdf2f2982 -AAD = cd0a24fd0f6a693a1578b9dfd2a212e990aa662b -CT = a4f08997e2d93c3c622137f9a8 -Tag = 059cf266240236fd3f41a3f4fabb36bf - -Count = 2 -Key = 91b73e2061b02b1e5e4c150ce1df4d27 -IV = 8b15597c84db62e2d8b03857 -PT = 21e1b4b405050408b08e5e2a97 -AAD = eba7f1a060e81f4ae7a77346d74dae9263ec284c -CT = 0f819b25fc683c182533503ad8 -Tag = 5a1da6290fef801f2131614f7cd2d0bf - -Count = 3 -Key = e6a1e4260efb2bb3073a1ab475e901b9 -IV = be445fbabc3866d702965b08 -PT = 2897d77c7f20679cbf27181aca -AAD = 9452137225de644f94556b382ac13915e8261913 -CT = d56e2d6d52923205291fffa50a -Tag = a6acf19c5434f95e333827ed9c7b88ec - -Count = 4 -Key = 49c18bed9412346a8ef02351cd4680d6 -IV = 7b5a7e9beec5b627f78bfd1d -PT = bafe851c800f6df67e941fb496 -AAD = 251b9e935d72c1ed05795c74c88b6d4a03bd729b -CT = 6f0c2eeb0a37d51d78314c3414 -Tag = 1a75d962d34205d60f79e4de87381046 - -Count = 5 -Key = ed0334239eb6f1ee1d686df163d219b7 -IV = 6146338e40fcd8bf264bc83b -PT = 954ddf553bf66473657110a028 -AAD = cdba8eb5713075497eb5abf1434045a010f81832 -CT = 3eb76dfd40c5ebc840951d1b28 -Tag = 5d5aa1dc4a663eeb847e540f9a468155 - -Count = 6 -Key = 14ab4d3a91e8f8320edba5b045b9474a -IV = 83c6ac97704afdd24fbe3eba -PT = de5f1521ce9423526932917863 -AAD = e3981ea2e7468973a6a998deb7676d06630bad47 -CT = 19936ae7d6620899649a5c7887 -Tag = 66a805353bde0b1315f772d49eeaf8f2 - -Count = 7 -Key = f822c39eaba3ebb3d8b58cff3845ac59 -IV = 1f5d11c469e9fb74f19d8581 -PT = c0fac87ca518ab22853c8fa02b -AAD = b33871f65233bb2ba773cd8fedb517179a2a24a5 -CT = a072381956210925148e3bc55d -Tag = f716ec012f7f9be988a9e450da7aa2fe - -Count = 8 -Key = c566e9995c03a777f9999446382ef2fc -IV = 4f343477387f48b9c6d15e69 -PT = a9eafd8903c71862c7c99cf068 -AAD = c2b73bf0d1abd6d484df725a760f184bc315e0ba -CT = 9f9551a3ad017c3fa518964704 -Tag = 15383fb8ace2e001c194474031c14e87 - -Count = 9 -Key = fa2fe01b7cb4ca24aba5880da268398a -IV = 93f19d0a8edf1f29364743f2 -PT = 006c3b0681f21ad705cf94d070 -AAD = e80f337eb56c336d1e928db3b7eeee968e2f75bd -CT = a73b314c7f0bbd79ee56bd77bb -Tag = d2f9ecc80a5ae2e1d2735b9fbf01be25 - -Count = 10 -Key = 77b34970d4300069e0092cd64ad17305 -IV = d88e76814f3cf7a2f887e371 -PT = 4e65a46a4579f08130272e5c83 -AAD = 7c772010e83befec22f6aebe8e18a0437f50a573 -CT = d2d8ffd3f841e6039f1d551905 -Tag = ee2c73c455081d84a631b18a7fe5f789 - -Count = 11 -Key = 3c1c2aae3954d6f645ce2a697a4f3af8 -IV = 04b54f6447ebbcfbda57445a -PT = f73e226b50a75558a389ccd738 -AAD = e7a9d5c8328278311dca3e84da2bf0f573198d4f -CT = 770e4b798b91850ec4e90136ca -Tag = 8cb9ce2c90417f1c49a235de9b2ada2d - -Count = 12 -Key = 15ca2910df4e43c44a7c01d485b99157 -IV = 4a65ca77dde14bbf131dd597 -PT = 786744b394e40bfe5db938c0ad -AAD = f9011e2cfb9c82d37f6b3f2af730a2e28c036f2c -CT = 43c00fac7c11c3273078f09fe2 -Tag = 955beaa87737d3094bacc42a15986d83 - -Count = 13 -Key = 998990fe4a9a6c56efdf1deac41a1ef5 -IV = 1b7a766436f4a674b5ed86ab -PT = e53a9954c3943691dee5b17991 -AAD = 2eba6f2c61704917434507f4a2db16c4906bb4e5 -CT = e5682045f438f4a96ac870690b -Tag = 1afddc03809e565321ea66d8c83a324a - -Count = 14 -Key = 268ba76816d00e20997da268bd8faa18 -IV = 21cd5d21ed193612fd6db854 -PT = 16339986d092027e7cbece0fb6 -AAD = 1971b90da0554ee7b6b0a5e9a782f05d511c1b99 -CT = 7cfd53b8c3c834c213d9860499 -Tag = 1f8522bfab97bec436d768332ae37c20 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = cbd3b8dbfcfb11ce345706e6cd73881a -IV = dc62bb68d0ec9a5d759d6741 -PT = 85f83bf598dfd55bc8bfde2a64 -AAD = 0944b661fe6294f3c92abb087ec1b259b032dc4e0c5f28681cbe6e63c2178f474326f35ad3ca80c28e3485e7e5b252c8 -CT = 206f6b3bb032dfecd39f8340b1 -Tag = 425a21b2ea90580c889134032b914bb5 - -Count = 1 -Key = a78f34cd0cac70aab64acae18e3cbeee -IV = 3c88570498da96e7b52c7929 -PT = bf61b1fb3b24506cc8c730d399 -AAD = 36b66ff81ec23a28944c98d2834cc764bb70703f0b26e079b6eb008ec11ccfb54a189ad393878f0824436ae69e7e2d8c -CT = f72057f873ad12b5e19ce433e0 -Tag = 1fea5b4176464b1f5dce11558a75ec21 - -Count = 2 -Key = 0e038a1368999e2e70b6e350e01684bd -IV = a58952b8135420cd0f61be18 -PT = 801bbabf908ff04d5856cadc2b -AAD = 765203b3d61537be2883fba9899c3f3eff60cb9714e54de3a78a96dbf29cf53d82112e19b10141f13b11627a8fa55026 -CT = 7f0f35cb15fb4e7e3820d9ab1f -Tag = 8dce643720d9d6f90f13a155e0be5936 - -Count = 3 -Key = b69d82e78b22a473af6234066b891778 -IV = 0415ab2f32d2a15006c3bdd5 -PT = d4ab346edaca5c84d45b45c6fe -AAD = f0be65105e1cd4fd1a272f7f6db958040b44edd0608b2225789cf34217cfcd6a5879b8e79dfa7d24345ad20f0c4f9a1c -CT = ad77c91c6ba6cb29eb5e4f6071 -Tag = f67061dbded1a8df55fe9fcd68f61168 - -Count = 4 -Key = 78faf937758f34b6d314e2fa30f60c2e -IV = 85c9ef0e17ebcbb7227ba4c1 -PT = 0ad91a8be4ccd6ee0ce75413a3 -AAD = 70fec6e608b6264228b822e7490e5e76398494c6489de5e839fb80513442cd0dfcf883000995185213e283f49234280b -CT = 4298d0a1ea4c54950021d91921 -Tag = 19893b83fd24a8c21bb4ff14612cdb27 - -Count = 5 -Key = f812627cb6dc5921d3567dd17f1f3b9a -IV = 37beb9c060f240d9ff78c844 -PT = dbce5235bccd0bc6249b30e9b1 -AAD = a27fd811330efa672bbfa1cb2a221fa45bab88c5183eed6383e34c7e7450fd577f6c783c75d9ecaf74bb2ad2b2e8c143 -CT = 100ab04960a762db73174666b4 -Tag = 122172ee3093b8cb238a7c991da3b94f - -Count = 6 -Key = a495f82751bf7781fee36d265607aa6b -IV = 729a513baf1ccd1c97311700 -PT = 0ac413fa533b01be459e95d784 -AAD = 3a44a7ea6d3ed13005d46c19f5ec7d2f7e50e8a268fc49e3c6fe15b41b6f6ea7245d88cb358e53cdba82cf297ea0ea97 -CT = d05f52a875f56d3a6971495b7b -Tag = 14ae378a5f75b386202194c677377803 - -Count = 7 -Key = 63eed2623c80ea1c5d06a0003c4b3065 -IV = 3a276f4361cc6d7bdb340986 -PT = 65067b281d5aafc0146d206fe2 -AAD = d484646fdca9f5d3d4fa2c85ed145f99e3c73f4d81f6c08eadf318694bd7cc94382cc73a5610f9cbfd9987dc167d670c -CT = 4cf2ff71e44a39eb6a9611e150 -Tag = 113e7d239946d784c331bccd5e098194 - -Count = 8 -Key = 3ad85304b4267dd603070c1a999eb658 -IV = 2a02a6220d395dc91fa0d220 -PT = e0620a9e28ad8dba32b601c662 -AAD = 7a1511cab8aa9f7277f7b26cdee602e4a608b5565a20eedd66d70507a90e79da6521cae1e2ca810771392567af51d883 -CT = cf38f7abaf4f92414ecb7021a8 -Tag = 8bebb0b62c81a4a3ae765dbc7c8747a8 - -Count = 9 -Key = 63010b75ada3ccd0c1338613d57e3f53 -IV = 9898b912da0a2f169c3bf907 -PT = fc10d85cb5485be263374aaadf -AAD = 565e1e581089098451ccaf1d594d1b4edbdcd5cb00ba4b2e08e4db780ce8258df41d01dbdd50521b75a72a8259f70321 -CT = 8f2390e88bc6f18ecdc1a1b9d2 -Tag = 15c40e98b6bd5b07d4757727ad6b7b71 - -Count = 10 -Key = d2a18188bb88312ec18916431b6dd880 -IV = aedf2efb80b633d7afbe5a51 -PT = 343f8363662077fb0ab50ba284 -AAD = 52492921f6b76e888baa5a4cb391af04faeb31bf00e8ed4363482fa95148f573b9adbebabf48d3ad33cb5ed3c0d6df61 -CT = 97a6f44a04055850779bc70842 -Tag = 5ffb75b58b4572366fb006455f692f93 - -Count = 11 -Key = 7b3b81fa87f6fc20795e5fe33fe0d1e8 -IV = b858127e11ea0d5ba523f7ce -PT = e574920cdba3524bac8c2294bf -AAD = c23d4cf74bd76adee0973e4b3ac31a96fdeb0f2455e044d2d1b82ebd1937e09623921c81b6a1b9698b5b097b7c5c483d -CT = 016a7b57db778fd019628016f6 -Tag = e8035022b05e4c10792321d195b75854 - -Count = 12 -Key = 852c34591e7ffef09259a9edf25020e1 -IV = 9e4243f5356d48f853cc3acb -PT = c991389c242c48e31a9ae00d59 -AAD = 8a4514a5e7d4e2e036490b541206bfe6471c14bb50af6fc869048bae954b5dd813429359ee5eef23ee42ea35e0c36bb8 -CT = 5c319983e5e276658f10a58edb -Tag = 5343086d4ac0e45e4adc6dc27d566296 - -Count = 13 -Key = b9840f1c04f7c9e9b2c9bec0c6176738 -IV = 7af462cc891270fe78566890 -PT = c9171685284b205bf4fd9d3f45 -AAD = 493ef83c18389c1e52050d2569f0d6f955cf8e76cf0a1697ffcb1665e285fe6e3595f456cff7f32feb7bde4cc82d4ebb -CT = 988c2c3df37c68fc8bc7a29b11 -Tag = d81b0bc3543fef4a929867bff63a1c17 - -Count = 14 -Key = 9449043071de904f5e6e7922b263f122 -IV = 39f0713e60cbc8e41e4d7328 -PT = 869a917e056f4460d6c2076d10 -AAD = 0b7a25e3e3027095772f3f8b8336813b607031eddd6f354a171e4b585504952cb51326c3edf4c48e41498da441cc090f -CT = cc878c8f760961e4ad08ad09a5 -Tag = c303c9680b673c049e9b7bec8c28428b - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = e5b1e7a94e9e1fda0873571eec713429 -IV = 5ddde829a81713346af8e5b7 -PT = 850069e5ed768b5dc9ed7ad485 -AAD = b0ce75da427fba93da6d3455b2b440a877599a6d8d6d2d66ee90b5cf9a33baaa8329a9ffaac290e8e33f2af2548c2a8a181b3d4d9f8fac860cc26b0d26b9cc53bc9f405afa73605ebeb376f2d1d7fcb065bab92f20f295556ade -CT = c211d9079d5562659db01e17d1 -Tag = 884893fb035d3d7237d47c363de62bb3 - -Count = 1 -Key = 1b96a8699f84058591f28590a5e63c0e -IV = d437b28673240ddc63d22d2b -PT = 802192b9c2d78e1df9ac223598 -AAD = 0f985a66d350c153a4882d0a4fc6e1b8b8450cd0825182358521b1be5fc734338af72a48170fde7512a8a92ac81d12e3a7fdcf7d98933732a9893d92d9435fcaee6033b726d28f73c5f76fd6b93d13bc8904d11cd4a713cd353f -CT = 8c13cded61d08c1f2db878378e -Tag = 43ee877c121d4a329e81e51d68a9d845 - -Count = 2 -Key = 94874b6f3738d963577553a19155f4fa -IV = 8e9f61edc853db24fb162062 -PT = ab5fa8933bf8b4b6eb8fd4a0f6 -AAD = d30b11456b68d89dfecc00930c5102cabdb207abadfc7e26286e822a14c6e723ea5492ef53cc2206dbe9860583e2fd2a8ed26fcf5dba8914cae4829ff83745bcf203c2c9729ec5f635d368f8697139b18f1c39ea4e3e849f4b3f -CT = e359459af9418493dd8af46d27 -Tag = 4dd94f3b128f34ddd4036886fa084506 - -Count = 3 -Key = 7434e4ec0aa26aa89f7a025b7cabee6b -IV = ed9fa99d2a22cb4fcb2d25ee -PT = fd53183688a51d4bcbe52f6d37 -AAD = ec9bad331852febf4ee1928c65d57df5eea95caf852fbb821c022978d33d07fec1ced606caed13624bb6d08a22da7e23e39298e10395b29d91a46220f64ca4d7d333d93ddec412322b67d5e101784e0a65088779b8c44f7cd05d -CT = 97f74cd6ff2ea7d43262fe6f19 -Tag = 7ed5bcf0ce0448fa661d0c0fbcd36578 - -Count = 4 -Key = 72a565d3b3b6814bea37db7f659ba1d2 -IV = 6f975cfb8f0973eba7cff602 -PT = 46a9956585a9c06507ec073e2c -AAD = bac017084cdd4c035a1917de4abc453e875d1ec9f7d603683cccdd64e6273eaf11619acbef407fed03ff3e76373132c5bd680f7645e4fcdb09ccc60ce65584f607a090426f660df5bf4daba95e7cfb3f30e4197218f8decf0dca -CT = a657482d12377846ebe3ca6f66 -Tag = 0f10964e776b25ae079b357e199c8cd0 - -Count = 5 -Key = a85a8e0f16c7af9e7f32c817611a0249 -IV = 12b4a1c1bed206c426c1d977 -PT = 4544079578dc90631c616a89cb -AAD = 40741eac93ba6f3b60fdf1ac1b17fa3dd70d1ad4755f5a6bbd59c9c5aa99bb65bf7e077e5863b1d0b93104dea7b8e455d7bc149668822dc788b46980b2b439c33e10cc7c17415529c942e9eaf33eaeb627bc4cffc35cae4d37c9 -CT = b0be95166bf557bae6152b360b -Tag = 46391f35d73901732a7b9c7eb976aed9 - -Count = 6 -Key = 96c837ca5294446d389a6f06cb42e737 -IV = b37ce0928e17982ef783b2b8 -PT = 8b77fe7aac6a70fcae1ee74157 -AAD = 8f67abbb7a9394821c7196349262c589d5e1c156d6126fb3da0562bf403e733508f1f1926d6c9045350cad3d1243504dc70aa17a4de748e4a1fd804ae262c8ad557adaf799466434266b91d2c083f96218473adfc9dd2e8c3700 -CT = d950ab8631a66c313d6801977d -Tag = 31e109753cbb651ed194369f00840323 - -Count = 7 -Key = fad699fe2dfb8a2b955708ff97b15892 -IV = 61d9979bb5dd655e826abf68 -PT = ca88d99b2c88b078a9878fcfde -AAD = 7c02b7f2e7be357843a86596d7ba3a87e922bb0a982c32a20e809491c6343cfee2ee92fa2b6f898ee5b77a9ec5719de356c5e7507b1cac49b06e6fd5311eb9cf7a0c42b5252ca90632296d12ff5316a56253cc6666fb4d0a38f2 -CT = bfa286323d4904de8cd21389c0 -Tag = cf3af80df6bde595d6b5a28d6b7112f1 - -Count = 8 -Key = ca83a1109cf5bfb7d24d6ba72c6c1a74 -IV = ee40762d9a5fcdb41438ce05 -PT = 53c7fa9eba69541113c1998c46 -AAD = f54c4418df498c782ed61ccba4e657c8de9032231fd6a98c718063600d96f0e5f17fa73b9492faa264b5b9706e0d096386983694fb41b904c109b32b67c4e472e2a416fdd8f2a41fbfb1c5ecdf5be97fcd347c2541c1e50cfe18 -CT = 8cedd6149a203beb47d78489ff -Tag = 00906817785539306d07775e215bfb4b - -Count = 9 -Key = 65a467d5e8d503a0916e5ccaaf240b20 -IV = 0cc6f2f2a5cf96ce6adc2c5e -PT = b619af43215d41b1b0650bbe0d -AAD = ae98d8e675bca2cd4bf8f0860d46bd2c18f2d15dd431c51fe63c878cc9b1cf47a3b84cf1e9a02a4f0a8940008b72f4f1ed9cb5aae670899705573a8045008cad1284cddd1532791d38c8067694669d8b7d06a46969c413e6e35c -CT = 6c24bd0ecc97873f0f7c8802c5 -Tag = 03168a06b495f3f31d46f0de87d5471a - -Count = 10 -Key = 4cf328e1f2f180c2dd9e6d703cae188f -IV = 35b7cfe65331e520265d6657 -PT = 9c1a195735a84e6491a8ac07ff -AAD = 72a6a4f43598b91169a834d906cbe4cb40da1a41502a7f4bc80265a239330a9102de94a7fe8d57d28dc125aa5e6d061e7d2a90cdad8406ee899687d02f780f0c1ae8e944b300b61cd3489852d61eb2349a447be85d25d3cdde0e -CT = eb4d38c23be97445c25e8bf2f4 -Tag = b005f424f77a81f4a965aa7a1bf8cfe5 - -Count = 11 -Key = 7d62b16a551c12ac2102472492a4d3af -IV = d464c988013cfee4bafd7a9b -PT = 6de52d4b0878c26b0d8a6ff127 -AAD = 12a9155e72f6c19a9f00a651fe52d6dac331cac06b3ba594e24021900cdaa7d73a75a0968dd5d7d2f16ebab2197c620a1768bbc0839e21c8a37203af4c2ba146fdcac2b48701cc4bb5863f514c6562e01e807cd5308c9274ad9e -CT = a6dd42b752cacb47f1de9adaa1 -Tag = c6472e722a39ae44be5e4242cc58e046 - -Count = 12 -Key = ef6c85fa490919d342734357fe3656bd -IV = 7790d3a8deb8712c68ddae80 -PT = bf45d58e3cf0cd47bfe90814ea -AAD = fb04ccc1d78523c9aef6e8285fa991026c5aa4cbc8c37f9e0969d74c571e2409775d116c4a55b03f029842d7e3a53df8f7ceb9469b4461649dfb4183e57ebea8971bd967ee95d5f656873368a83313fa31cf6ab11d7b2c77d20d -CT = 7cf1afa60d3428c8fd25d9479b -Tag = 63e3a5eebcd72468e8ffab55e3caefe7 - -Count = 13 -Key = ac5b4ad09c73ed0b80931b920ceb0fad -IV = 1c0ab2941025ce7f084b8509 -PT = bf64de420133b29d1d50f4757d -AAD = e8cb8547ac67dccb3cb88e0443f9566944a79adaed7680b9e174080751d91e4d83357f28802a576e0fb53fb32e8d4d879d55aa9e79e201be363f4ddb16dad35e058a7d69e262c359c036f0d72151aa0bf04fbef5c4c3f7e91d05 -CT = 3761f611ec3ff853c915e61ef6 -Tag = bf906c3dabd785968ba5c7abd4a1eceb - -Count = 14 -Key = 35818c93c54a321f2ccc28e967d22ce1 -IV = 18dfcc73829a3c13287a6112 -PT = 6f32f25bfc511e8a7c60854944 -AAD = 09be731cd52fe4f7c6dd9aef978f8f117c358997842ffbb2df96727625669b58513e2bc97ef9c7119afa6b088a4f9312bebebfa6e71080a6e7f369207f3396f9c240a13143d7bfc5cad5049cb067ce4f57876d883bc8283fed87 -CT = 9553eb0378229fdb213fd46002 -Tag = ec228ec0fc273b67d922c2ba3dde5bdf - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 9971071059abc009e4f2bd69869db338 -IV = 07a9a95ea3821e9c13c63251 -PT = f54bc3501fed4f6f6dfb5ea80106df0bd836e6826225b75c0222f6e859b35983 -AAD = -CT = 0556c159f84ef36cb1602b4526b12009c775611bffb64dc0d9ca9297cd2c6a01 -Tag = 7870d9117f54811a346970f1de090c41 - -Count = 1 -Key = f0a551c56973e1cfdfe2d353aad66c2a -IV = 94e95e0544ab0b0b9997aee3 -PT = 734c0907ef49a1d86bc665bb9da9cedeeecd2abfed7f591c201ac360ca42f941 -AAD = -CT = f2c2f0c35e0bf6c5f5c24d8aadba19ed35848959b9c586604c396428493418d0 -Tag = 8855aecbe9604a839fa5d481f8760ffc - -Count = 2 -Key = c635775fa1416abe375c792ea7a486ac -IV = 5b9f038596f55115986a3109 -PT = 54172156fcb2c40392009807bd3ec4a11c2c1b6d69ad20c773df3d9e7cf35e3d -AAD = -CT = 73a9d9de0a3dcdc52dd9745fdf12353f4d63d0c7646443f5206883f6b7da2b94 -Tag = 11970a60855b0fe890d4f5988f6cafae - -Count = 3 -Key = 43d0651aa5d06f2846fed833fbb72241 -IV = 2ae626772b73c7cd25dab014 -PT = cec1607ccdc6332e5371766190cc7b03a09fb814b3d2afc52edc747d70b7fff4 -AAD = -CT = ea742cc41afac5ffbfa81e89bad82f1f8a07eca281fc253b533cc157eceec4e0 -Tag = db1e19fb545ae218f4ad3c9a6da64997 - -Count = 4 -Key = defa2f0eba651799c6041e6f28a0db3b -IV = 102158d6ed54ecc7efdeba7a -PT = 67844577a198b456fa410afcede8fc24fb970459096ebae03bfe1dd32a6b9665 -AAD = -CT = 4d87782c99ea2b18c58393eef975007b9019f42667b98098404137dc085d631b -Tag = fbdf857c1bff89bd725b8ca90d643e5b - -Count = 5 -Key = f098deb1e8149b3c88320efbfea087e2 -IV = 8146393ed0dd09d89d1ae7e5 -PT = 8ee6f4c01e98b501a9914f57239bda7d5831ac147c320651863e06db60c1a02d -AAD = -CT = 122309ab94c98901104bda0488efb563959da64979653ee4f8e658a3ea8a3c9c -Tag = 93e3d93d0580c5567ecfac274da211e2 - -Count = 6 -Key = 63b28aec8f7dd44af269e48e35294a34 -IV = 4c3d88500f6a483b63ba1139 -PT = 5b86eb718b3917537d4ef51b6c74a85cc9a90002410d8f346cbe56c86ac72d4d -AAD = -CT = d0281117e29fbf9676f7887811b010a19a34475ad9e4516cd8424d0b9e5a2c3c -Tag = 904ba928205fdda9e2674805be07e93e - -Count = 7 -Key = 765ed884a7554c792cc671e93c02433f -IV = 667467b168db56adf48a26e2 -PT = b941bb1f73980b0d76324a49a6c33623d4a1063b05c82cb43e4b0cdd4f913860 -AAD = -CT = 84906e78ac79df67a0fb4ccf4c8da439094339adc92d98abbe032cdf4f5d92ec -Tag = 750a89a842a6dd7d1317f561b9038402 - -Count = 8 -Key = 816ed7edadca9e8fa2b2b9f9ebd14d51 -IV = 7da514e274b5b812722b5c3f -PT = c76908234954ff939ba2293fa1ac654a4bee41a574f2694d090980481a08083f -AAD = -CT = b59a50e4414b4903c195ff47e8f9028d77b7e73a9a54e1ced9ebb1636b123864 -Tag = 007af223e7ac139eafd78d0a2c87ca25 - -Count = 9 -Key = f7b38d0d340373b98b89725fd889be49 -IV = bc2b87a883af1c0bff8388fb -PT = 0a8de4df6e01bc7b2a36e4a123af8ce6240bec42cd4e4f09aa92520c1658103c -AAD = -CT = 65ee08ab751bef3720db313491fca20a87cdfd6b8b028f53bf352304da504911 -Tag = abbc81ca718fcbc6a75c85ada74e466f - -Count = 10 -Key = dc662c77a2d520a067cbd6bd7e119696 -IV = 23aa76d1e8c3a72be862a5eb -PT = 5fb66e144d2564e096832065647dae768659d6dcd10a1dbe00858ce4f5148912 -AAD = -CT = 612713f9e6bd8017f61410c10ba1bd21adc87565bafbd1839d9572e270e94210 -Tag = 9d7616c3b486107cc74a8a2aa9c65209 - -Count = 11 -Key = 5c5b3799a19098b9c5737783ef0c80e9 -IV = 34fb9e101915639def30f40e -PT = 05f15cd45a82f36bc4e5e3d6db7a60640faa0e929c00f0354e913bcb02d83118 -AAD = -CT = ad60f53d51b6b00fc3366a4b4bc16b678ecd12473e8bd55c363bc0d94a844b70 -Tag = 1a528398ee2c9f436743d1a08602c5b4 - -Count = 12 -Key = 3a541317198a2fb1b90470e90d6d7f38 -IV = dfa6eb2b53177ff5d0924295 -PT = 3ac18af46d3fb15d477b849fe1ead087840742cbd8b2ec31b45b8ac2e4a53975 -AAD = -CT = 66755e7ec710a8ed7c776521f214ceb54e550220177eb89fe3949c9e74e2e108 -Tag = 20425ac5f07868b49edf9896af64396a - -Count = 13 -Key = 8f85d36616a95fc10586c316b3053770 -IV = d320b500269609ace1be67ce -PT = 3a758ee072fc70a64275b56e72cb23a15904589cefbeeb5848ec53ffc06c7a5d -AAD = -CT = fb2fe3eb40edfbd22a516bec359d4bb4238a0700a46fee1136a0618540229c41 -Tag = 42269316cece7d882cc68c3ed9d2f0ae - -Count = 14 -Key = 5fe2650c0598d918e49bb33e3c31d5b4 -IV = dd9501aa9c0e452f6786ebef -PT = 5a6b60ec0ac23f6d63ff2b1919ba6382927ef6de693a855f3e3efd49bd4453d8 -AAD = -CT = f0ac2d9153f00be3fce82d24fd3df3ea49f8265137417468724ae1342c6d9f00 -Tag = 6bab3332c8d370fa31634c6908a4b080 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 298efa1ccf29cf62ae6824bfc19557fc -IV = 6f58a93fe1d207fae4ed2f6d -PT = cc38bccd6bc536ad919b1395f5d63801f99f8068d65ca5ac63872daf16b93901 -AAD = 021fafd238463973ffe80256e5b1c6b1 -CT = dfce4e9cd291103d7fe4e63351d9e79d3dfd391e3267104658212da96521b7db -Tag = 542465ef599316f73a7a560509a2d9f2 - -Count = 1 -Key = 9b2ddd1af666b91e052d624b04e6b042 -IV = 4ee12e62899c61f9520a13c1 -PT = 01e5dc87a242782ca3156a27446f386bd9a060ffef1f63c3bc11a93ce305175d -AAD = e591e6ee094981b0e383429a31cceaaa -CT = 87b976488ac07750aa529e1602290db36f4d38d5c5ccb41292b66c3139617ebe -Tag = c4e7ea53efd59354ec6b4b8d9f8b237c - -Count = 2 -Key = 8737490bdc02e3543c312e081e2785cd -IV = cf3460b8010d410fd5524720 -PT = aa0acbbf2b847910d56ee4da8a9f40973f85d6cce1d6326a777eff01173e66d0 -AAD = eba8c1ca49e977cf26eb52325e59afa8 -CT = 893902594834c3a72da17bd73ccd53238a581a3e33edf8b9b901662b5f7e1d3a -Tag = 36a3a106d3c10a65da7d81942c98b349 - -Count = 3 -Key = f7fc73fc1c428e56af92e6b2870845e3 -IV = 375b1a84fefaaa807ffeba18 -PT = f871a9a695b74f9501942f99a3489d4befec6768d7c17d1c38f51fd6cd16adc4 -AAD = 0d668901163a08a338c427342d31e799 -CT = ef65290d220227147154f66a12004ce292507527f17c5119c69fa4f81e56d0a1 -Tag = 2d48c8b198610cdea73965f6ab1d9a12 - -Count = 4 -Key = e522d6715bb408401c5a7af3ef190caa -IV = 1a3b2a313418ed26de8ddf57 -PT = d3f10233505f524ffb8d961d8321be88c975704bdd9df958f3795adf0085aaa7 -AAD = b993eb193e9d59382919ebbc9e3ad829 -CT = e1519156cc27905b8da24d29fb502d54042eb6fab10c5f6a99d1ef54c92c555d -Tag = 7fd04f637b748db17da7ee34099a112a - -Count = 5 -Key = 55190de13cfbbedf4a0787f9ecc34e45 -IV = 87803bcf6a69962abae929e5 -PT = ee5da0026ce103140873226149b75fa734888b00518aeac0224466bbb0d23d0c -AAD = 067c3857cc240c6bb5f628bcc7cf5559 -CT = 06362d236e9618037d31d4f1ea0df6064e0bf06b6c5904530e1002e8479c16fb -Tag = 342a27aea0ef0aa26ad92ea3a92afa37 - -Count = 6 -Key = 65f7a5ff7feaa8d50736dce3c8524cf9 -IV = dfa0822065b1ed4987685217 -PT = a32d3aed1371cfcddf5e735a9d95b96d1ac59c3ab784be8364cc1cf3b71bf70e -AAD = cc4fd4d82584059b5a165d632d56fe1e -CT = bdf356a54a5cfa281edbe7e35966b5b8a68894f282cd7a734d502dfee6dcb1f5 -Tag = 4ff05b2898df6edc27574a2eb395ffc8 - -Count = 7 -Key = df0ceb73dfbd06782f69cd51cc4fc1fb -IV = c5fb4bf0b40477e10e5d15d4 -PT = fa9da35d8d812585322fa1c0cf4633b06424272cfac1c5a51138b0b9b91d443d -AAD = f292c4c2a2356e70feb0003a28708ed8 -CT = e81cd00a96dcb719fc2c3af7b5420cb5667fed53af8f561dc216fc7215ab16a1 -Tag = 60848116706be55b4ea939ba899eb2b7 - -Count = 8 -Key = 72205e651f03e2c16eea7689af43bc4a -IV = 42c47b2f95b0ec02652f1fff -PT = 7fbe781650c396ca8cdc6b2efddae0007cb008c4fc7310fa17ec5ae060171391 -AAD = 7f978fc1f1b2f9f37b88b96b8c14ebec -CT = b3f3a8bfe2906ac1bbc93ddc701a5529c2cb156354cedf85928f605ed6005bdc -Tag = 9151c8000dc25eba4a57908b238afb21 - -Count = 9 -Key = a2c96c0b051c633ec10b2fccb43f4517 -IV = c4c13fc9f15f482bf6bd8d0b -PT = 5f0a50d976eb2048bc481d7bca9b3e7367c3b12c9e98ac8521f45c715ae3bfff -AAD = 94afc74a7040c47705722627e05f159c -CT = 2bde225ca63b40ce64500c40c00fa5c50086c431e95d1f99678cb9a90bda2502 -Tag = 6a296aa47e52737304eaafec0c3d0c65 - -Count = 10 -Key = 108146de148bd4dba69c4ad2c11a35c0 -IV = 9dfbe2fa46a46c3ebaf31c48 -PT = 0104c3da4cbe50f31ccfcc426d634d8d39686444a3b75bfb54d67349fb7e7017 -AAD = bc83808f9e884967c84d28ce981dfd1b -CT = 3f4424912dfaafd8f8b08ba7baea95effb3e4571720a2626b92ad8f7a69d4477 -Tag = eedec85ed9e14a5fcc2cd0ce50ff00a4 - -Count = 11 -Key = 37b9352444bcaa9624b267566a59095a -IV = d7a72473b99b2890ef7c4928 -PT = 93037b2b4814541f425ea0bcc88ce1486632919cef443a5374d9944edc7e42ed -AAD = f7751af2dcbf5a7eb81d6bd73ced1220 -CT = 491e0893a652a5975d3db72868b5619311a9cddad11c5522e95893c42e3b63a9 -Tag = fcd8120512eb3f14295efd3b045b0868 - -Count = 12 -Key = dd1332f17e62b2be889e9a399fb0d3fe -IV = 3f0028cb7cb8f1091a4e2f4a -PT = 9c2e07683c6ca06d012708ad6dae95082eebd36261ccc874226ad354cc8ba82e -AAD = 2f33c5f85f976811ef67533f488917fa -CT = a4fa9311e3c02c3b068a3f11ae7657efc3a3e69991251280503940ac4a7e8950 -Tag = 0e5e77baa0f36db11cc5bfc27ffc7a49 - -Count = 13 -Key = 39e215f1a2572257efd939ac0365ec97 -IV = e1f4da712c4c1eb31027352c -PT = 21f7d62bb2918dde6acf9b6c9b7afed4be7d623c3e2070444b087fb40de7e6f1 -AAD = 9368e8d525e77707d316542dcd735c6e -CT = 3c93eb8df00556e3f42d54acfd635fbffc0f77f868a68f738ec2918213ba9a22 -Tag = 0dd8352d507e5253ee0849688d2ee86d - -Count = 14 -Key = 06f36f4939473b540e71db35f398a53d -IV = 13efe211cb6ef3a374f4da85 -PT = a5aafedc4c1ddb7f6b38f7974d16a1c88cf7ef1ebe5027ea4fb55db16101fc20 -AAD = 8cbe3e3eb19818db197901bd4ee42de2 -CT = 7d21fb06002d19f40741b275b72cdbabbe032460ecf13d98f1cafcb30f704af0 -Tag = dd4beca1670cf437372aba77bc3e9261 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = fedc7155192d00b23cdd98750db9ebba -IV = a76b74f55c1a1756a08338b1 -PT = 6831435b8857daf1c513b148820d13b5a72cc490bda79a98a6f520d8763c39d1 -AAD = 2ad206c4176e7e552aa08836886816fafa77e759 -CT = 15823805da89a1923bfc1d6f87784d56bad1128b4dffdbdeefbb2fa562c35e68 -Tag = d23dc455ced49887c717e8eabeec2984 - -Count = 1 -Key = 8bdec458a733c52cd994b7c2a37947d9 -IV = bf8d954df5f1ee51fc3f1890 -PT = 9d5f1c905df900111f2052a60913d8a9d83cd40e43ba88203b05e3dbf0e37fbe -AAD = ffe26874a54bd38a026c5c729e2852a748457412 -CT = f056cf8ea6c4f353f08d54c27a8ef3324ab927a641563f9f5dc5f02c3b2204b1 -Tag = 2f8b9351426363f09f5d17f634a381a9 - -Count = 2 -Key = 0a651f95b6fe5d9442fd311cee245229 -IV = b7b2349b60ac5cf09885ef4e -PT = 1cd7be7611d8f7c9d75fdf3f53d28172ae4d462c06da56cb386687f2c098e28b -AAD = 725a089a37ba50e53143722140ce5c37bc0a48e7 -CT = e2926f34c30883a3b7eb0dc47627aad090111654a4980fc4fc952fe7a7b6b60a -Tag = 617345dab8973c21ad711c2a51885f83 - -Count = 3 -Key = fec2452d0883a54c0e33fccc092ddcf6 -IV = 9e3e354d30c2c77cd0d9a0fe -PT = 95b9c5e6adb7fcce212abf535095bd955c3aa0f7ac2428841f4de9035263446a -AAD = 6c12b112110ebf36930910f1bfc9ed49e14440b1 -CT = a85754f451b40f3ab576327b4b99fa09adc95380299f61c5c7a8e28188d2a40b -Tag = 94b979f7718ec13412e03f3461440100 - -Count = 4 -Key = e5f6d9f2c8ad08a1500157e027b92219 -IV = 94358eeb6829f1be4de3abfc -PT = 3204856040edd9401a890769875cc252e5dcb4a77e951e6eaef6d7318a06bcf4 -AAD = b3b860929cdc3fb0e393f21287f3dddc4a1c927a -CT = b1ba514ae4c41270d7beafaa1bac2fa993cf5af3607a008c6bb4aee2a1212dd4 -Tag = 7e0f5aa40553128f2c15cb9567c950e1 - -Count = 5 -Key = aeccfc65063c3fccfc5a0b29193d1ef4 -IV = 70649c9d2848d21c575d6914 -PT = 46ac375da56527c3c6fd5f28f33c63b1ffaf06c33b8f329eae37f8579a62291b -AAD = 637dc392cfe3a8e2fe5e871799a46dbe38f59610 -CT = 7f8841d3c82907596c4aa6ed433b9eb33b24d66f0a0cdd846d5ea51668975d9d -Tag = dfbab7a42d60cda73b03189034e44ff5 - -Count = 6 -Key = 1dbaf0bdd974b48ae373f686a961aeba -IV = a3a6454d17ac622248ae9857 -PT = 83a131f7737b4e881fb255ab9225f7faba96476626ed27168d6342ccca8d3e75 -AAD = 393843360c388a6e2f83c7202e8da6fa7041a6be -CT = 2471d23957d6305a86520b757c54890a57f665a44a19af2f8d55e6833659e730 -Tag = 4693b10c8998580e986be0bb26a22e3f - -Count = 7 -Key = 540f40fe8ac2e506b69bb2ba356ff8db -IV = 0502e51ac42f641d7a0176b0 -PT = 910a000c5e99245870f08dd658b648f944d04426a70d6d46d8e88ec8eddfb324 -AAD = 9b1f2b2fd7265792852628df926abc5609aaa762 -CT = 9381d4b72d740b58c3f27f8dff01d8bef45e769b834539a439173c88a6d18e62 -Tag = 7c678893a122a50f777dfcebf514f81d - -Count = 8 -Key = 55d0e0560a2027bb873d84a39ff87046 -IV = 616d61ba94216c9c7c0903b0 -PT = 1610431777c01136c0a0073f5c114c357f0216d5eaa31cd40b8cd605ac56dfab -AAD = a0203e1f31f66bfdc819d086a48b705d1eb7721b -CT = 5d846a8dfe02cf2454e11075a236b2a6acc59819e9ca6af580690664c195edd3 -Tag = 24cd0dd950859ab9d1ae654ef7174f98 - -Count = 9 -Key = b7ff8402f1325d945c98662003323db7 -IV = 6b6163fb2d1641bce33459e6 -PT = a2a653ee98df41fe873bc036a5fa7ddfea8d63ff0949ae8e1489cdb0c3a80c7f -AAD = 50a7649f5ac25f110f9408ecf3289d978a55620a -CT = 820a373f446a8341c8d928d223a5aea854b643ff07902b0c5bd0c6319b42d855 -Tag = 764c69deed533ab29bd85dd35d4dcf9a - -Count = 10 -Key = 48c901ba4e905bd68afdaec739ae00c2 -IV = 5bbe3dede5ebbd8cb845a9b6 -PT = 80b845888bd2f25defcd62b72b6bdeebd6152b3aa6b006891b0d69769fcc06d3 -AAD = 0c0cbcdcdbb35a35116b12b62715df4b647d78c5 -CT = 512779582d1fe1831f333bb563634acef8021c3c76b06beb6c7da98daac4c229 -Tag = 15fd32f96a4b9505bc1373525d40eeb7 - -Count = 11 -Key = c82cc4d9ff0681968839991afd0dfc2a -IV = 26a95931946fd2118ccd01cb -PT = 7516c4a781be02cafc36df4a07d2c9ffb978fdecf5217240097d5c26ff1e77bd -AAD = 8bbe80d4f4cd6c61b4fe3d24e98853acd4dd83fc -CT = f98436fe4bf6e5993adab0f0001bebfb449735eb365b9e7ce4b151f82005c5c7 -Tag = c83be461e1fedbb4ddf3ee72b9debe20 - -Count = 12 -Key = 748a88bf4e264a1180bfd665072aba65 -IV = b0a768b62de3cbbc1bcfe93f -PT = 1e1df61a9f10c7b4057d684ccef74e09f2a87f7e4aed393a451461d574c8ddbc -AAD = f4b102d885495fb893189aa216d8ab653bb97b99 -CT = 5e1af9511989069a615a6850402547ef4788197452461f1241e24be674c60074 -Tag = 734e1cc937ca384e282410fd9fc4bff2 - -Count = 13 -Key = 2393180bb81320965a58424b287c9b3e -IV = 480053c69ac54b93f5e81338 -PT = d46fcbf950bfcfca3906769f922821473d3005d5a1d81278622d4d3cd9721a33 -AAD = f6a2a3ac8e462fb01bbedcc9b0f8686ad4477929 -CT = 125874ff5a7f8936a76b11587bbebd461e27638bff5a1e993465c9cde82f2bd4 -Tag = 9b625b4c2f66cf2fc88043b9b4c6f2fa - -Count = 14 -Key = d651166baf42b75adb26e370b76016e5 -IV = 4af70e3be1357501cbb16bca -PT = 21d76d04488d4c33a7e8822797f785b43540bd374206966c9ef7832c51cc009f -AAD = 2c1072d5df5306e20d323a9897abac120bfb4d04 -CT = bc557572490f4d63811f8d83e58214ba4d8d24290264381838328a2962f010b2 -Tag = 8bd1f65c551c4affa517a8b03b6337e2 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 48b7f337cdf9252687ecc760bd8ec184 -IV = 3e894ebb16ce82a53c3e05b2 -PT = bb2bac67a4709430c39c2eb9acfabc0d456c80d30aa1734e57997d548a8f0603 -AAD = 7d924cfd37b3d046a96eb5e132042405c8731e06509787bbeb41f258275746495e884d69871f77634c584bb007312234 -CT = d263228b8ce051f67e9baf1ce7df97d10cd5f3bc972362055130c7d13c3ab2e7 -Tag = 71446737ca1fa92e6d026d7d2ed1aa9c - -Count = 1 -Key = 35a7eabe7de2d176e97cdb905c0b7f17 -IV = 2fa0cfef89fd9849df559c98 -PT = 08f23fc6fde45fe044cc2c397390bb362524bb16cfab7c548de89faf3ad98947 -AAD = 314e0423ac429f43ed90d731fcb5bdc7849595ee16553a1b7f91412bf98ac4cb052ca91c62a33b3928ee2887ebc273b7 -CT = cf040174f8e280d10aa65eb59db8bf3e4e2a8aa01b1f320564314946b3749af2 -Tag = 94f78c8ab96107437826050e1a89b9e2 - -Count = 2 -Key = 23c31e0e50ed44fae7e6df38abf0b16a -IV = 779034aee3e3b1942ef3e713 -PT = 681d498d7e85684c5996ce27270fe8065089e58617cc6deae49cceb27dc1e967 -AAD = 6a7877001fb018519c7f660d77cae7bd892af075ae2d68940071f9156bda7010eb25d57885913544d4922a21347c808e -CT = 7b14a15674755b66af08d581ee6f8b98691927cb1f5c43e5589de61c1b3883c9 -Tag = 2fa40d9c65eed28a99f95af468293006 - -Count = 3 -Key = 4b4f9155d8db85e0e2b36bf3aa981e6c -IV = 7c8d933778e1414e7338d934 -PT = f8a26c7a9a614a17151fcd54406891adf34e31a0d55046e1b413195b44113bb7 -AAD = 43b6c54526318efaa8f0a4979ccfa0f299f5d9889433b19971f60a663e359d1f2c1af393928c9b4165c07d7536c910de -CT = 3f9bdea3c3561ad417c205887aea6ca1ee070057388dc80226f331ffb0017de5 -Tag = e8ea1d3077df2c3d20f02a5046fdae73 - -Count = 4 -Key = 4148dd87bc6aaa908a0dbe1e5d2f6cc7 -IV = d01ffa7787117f8cb0b4014b -PT = bf1968a91d5da5c9e42ffb5cdf11e0d31b69935b22958c149c005d52576b262b -AAD = fdeceb385ed6de0d2d15453f022dd455b8db3bd9f13e44f085722a6935ea6631058e0cb5fcbd3b9e97db339b529de123 -CT = bfc9ecbbaf49371107cec37f80171f94141e25a486e1b42d8258208a6038fa34 -Tag = f2dad0b16bb728cb957ad9ab0716d195 - -Count = 5 -Key = 5d50961aa7fad7cae9a8d043e191c9c6 -IV = 263f4dc6464e89110a77f24f -PT = 0fed89fa86e5fbc4bf2e352caf8e1e8910f106db7b5092feec9fff5f4f768ae4 -AAD = e74cd8621c2db03d6b47cda4ae0671dfe8bb62f26715bd4397adc679c987016bf305a1e555ebc91a048e2a7bdc7cb8b9 -CT = 2190380bee10ade973aea0db269835649f4e53e4724598e1a935704a40411b16 -Tag = 0aa3d68d90ef3d329ff394451db0a2c2 - -Count = 6 -Key = c2428b54a781242f896bbc8816e8176b -IV = 715d8c8397ee55eb53f86a2a -PT = 0088129bb514a66d5a208838e20c7978ea6389cbd56e85de87e0db0608d8c1a4 -AAD = 435bb2a96fae0ab64c0a499d6e50bf2e5560643338aadabaa795f82d6503588d6522a70e4e475297aa9c5bbca7138b05 -CT = a9fb750c009ffd7fe76703e3588f747fa58cef68b1d9dd2f953bbf3ab6da2b59 -Tag = 613bb91239aafdced8fb87b6ba0f9e5d - -Count = 7 -Key = 6a3408481a54a1d9231142ffb9fd354f -IV = bb2fdedd1a33321ace0a5c66 -PT = 63c934eeea0dca9732734d800034e57616f4d339aedefd515a829300937e6d5f -AAD = 448f17c604cb976cb527b3b1f8d40350420c94545d73ab72a3dc10a32cec537d78a17d32fe073b329e25bb2d538b5bc1 -CT = b413a9c842fa51001b8949aa81dfc10408391892eda84785e725745378536d24 -Tag = 1e323d12856a644a86f394f96185a07a - -Count = 8 -Key = c5a7ef970a7f42b83194bfaa62dc092c -IV = 9505924d0b11200db3c40529 -PT = 84ba18d1e1503d1c512e0956380811bc70f2d97f65269712431a3720ddac91b3 -AAD = c2b989d3d56d6dc0c3e846631e11f096a1c3f016984a2a60f593f5b45acd28319ac9828773c6d1e043c6213ce970e749 -CT = b07c02dabffaa8f7b11f644e547f887f78bdc9babbaa0ca66e350e2b5a293b35 -Tag = 11393df432636dc7d7a3f183f531166a - -Count = 9 -Key = 3f45c5c7d042ee34e8257bf83a46144e -IV = 0c732f208ec1f8e0e0de0eb0 -PT = d46fafdf04468e91b9b87a84f71261bcd44b438e3a943590c6d1990786909ec1 -AAD = 991c82c9e48dc887f054bc0b45979dd8d244954ea910e30139da9dad476843691f32c7b494114e058d2b27284ea13a62 -CT = 54cbb18328682037bdddb8c585b731b18b5cfc495d9b899c9b8db8a11d9e46e9 -Tag = 289349ea094839dc6e9570c1d7d62a91 - -Count = 10 -Key = 10f0569b4e6c441858f8053a646b775f -IV = 863dbdc9eb8a9c1ac1af6ac9 -PT = f99eead51bb2a17f370a50079d93167179af5c49965af2d3f06d211fd96d6ba0 -AAD = 41d372deba9b25bb982d8c4662f063f95d1859640550ee6177862644b028f42c435636cdc0cdc57509a5fcb75657e581 -CT = 566f59cf4fe7b14dca35575743867351f18b1fa7e39417f8e7fe4e8bf1052ca4 -Tag = df39c291b26f8ca2557abc6074694070 - -Count = 11 -Key = 66f958e09896ab2b21eb36fc36fbfcad -IV = 371a4dbdf80e6d46508a9621 -PT = c0458f59bac039a4349e39c259edf6cf62fbd87910064409c64d8f6ef55d96ef -AAD = 19f19eafb6191fb0452807ba2ba6ae4ac36b37138f092cba1a63be58e4f8b994f2f6958799446b5d226fd23a95fe793b -CT = 192474ad795e3e3e36abcef2d42c038d39ece8119fb058a752b7959fe46703f5 -Tag = d17dc61d1513fc1cc2df45283afeb556 - -Count = 12 -Key = 0f46ef6999a3cbcc2e539a8952a7fbcc -IV = ff8829c2fb56cdf74914ad2d -PT = 37401d56052412f91aa9398f3ab3afe68ae500aaf40f7941c8a82ae56379fd5d -AAD = fc9a1c16b0f4cf133843a7664a17e97c02e7aa360153f5b4b881ed3825f7b2a414adae94c9a6479a9eeaaa206f99c3db -CT = 6866aa7699a8ce2c747880001987c28393fea80acb7b24a9e6e61086df68f5b6 -Tag = c996fc3e44887ad4d703b72dc2ecb1b8 - -Count = 13 -Key = 90838209bbc8d07846127667564dd696 -IV = febfb4dd04eb313933b9c278 -PT = cec0527329847a7eece6afa65c7f50ff2d7df4bc4e8d2990c41bf42aa9bda615 -AAD = 01cbb3a7a70001027b064c337260ddde8cd07fc786d71e293fe0bd44c794dbf7b054114bcd259e115e3acc98cd2ed7b1 -CT = e6275470454a9e0b6f6ea2a4d64cb93462a6cddc69e80f338098fe8b1d4bc364 -Tag = 50ddc254d7504590c938a503048cc8fe - -Count = 14 -Key = f94e9d80b48dc5bdca82f14daa46be16 -IV = 29bf1931f0dc4fe3c807e234 -PT = 64971fdf74f93f8aae32a998e5acf2b09623795a77cb9ad888abe6c7756b0a9d -AAD = 449e68d78fcaa2e0f2811a87a9c48a3cd18e4d644eb88ef05b91f4528e35c713f4df2ff97de251bc5b04a177d2e29299 -CT = f317607d97ed51fcc2f6ff7b394470758df772abb33b7ba049c6748b39fc4005 -Tag = 6c473bbc8881239f85eddc79f5daa0b9 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 8fbf7ca12fd525dde91e625873fe51c2 -IV = 200bea517b9790a1cfadaf5e -PT = 39d3e6277c4b4963840d1642e6faae0a5be2da97f61c4e55bb57ce021903d4c4 -AAD = a414c07fe2e60bec9ccc409e9e899c6fe60580bb2607c861f7f08523e69cda1b9c3a711d1d9c35091771e4c950b9996d0ad04f2e00d1b3105853542a96e09ffffc2ec80f8cf88728f594f0aeb14f98a688234e8bfbf70327b364 -CT = fe678ef76f69ac95db553b6dadd5a07a9dc8e151fe6a9fa3a1cd621636b87868 -Tag = 7c860774f88332b9a7ce6bbd0272a727 - -Count = 1 -Key = 93a45b16f2c06a487218d761eabf1873 -IV = f658ed7ce508e710d5815f18 -PT = b6a2afb916a235c7fac5cd6a8e9057c2fff437b7544532a296a3c80c35f47c99 -AAD = 33156a775586e8c92c7e99c467a840281abc19483b9a320e707bf1ffe856ff1c473bb52f5b940e44df2c2f766cbe9ed360d844283f8daa3ef68def4bf5f2c3aae3028c2d348ca1963e9227cdfa6f6205dbd9f3832e46a4f552ec -CT = 6564e15287e995886395353c65c830e6fdd295c7ec2633c7f8d280f2340cdd15 -Tag = e4f4dfef764270a068a9095b9618ffef - -Count = 2 -Key = 5015f6b267f7ba8f83b46ef9440a0083 -IV = b66dd42e69f8a614516ab6cf -PT = d1207549cc831a4afc7e82415776a5a42664bc33833d061da409fbe1fb1e84df -AAD = f06fe187ad55df4c1575043afb490c117c66e631b6a026ac8b3663d65f4e605b57f467ed6c0a3fde03db61f82d98a238955a3e0f51bac78d14b94a0b75057a432ff375a09b0a41def3c887fcb103ee99f4b9f4474a64600b87eb -CT = 9600b7aa6f5d8e30d3bbca6800643ee764b59bcb83de3dfd03364bbc9a48252e -Tag = 49a0ad2dfbb49e8acc6ad1de4d9311d7 - -Count = 3 -Key = 408722e80d9cae213180efc0f2675f32 -IV = e9ed15b1942f1ab5e9cf9421 -PT = 39ed45bdd73f72aa16ae833d05c6d9ab1fca2b5ea478db553027787857fc9fcd -AAD = 19fb7034ac4f57035cf19f68d76c4581054edbabe884e076a0498542d42f0412f5eb87c2cafbe13b9936c6fcee4c7bb46df2274306fb1a86bae4660290c13eddeb8cfe8de585e415563bc1a6ca9823b66c8f2da5da5df8f41677 -CT = 9241526c638c2f0a2d1e52bb049f71039565bba5c59876eb136f92ac68ac7f6c -Tag = a6a9b62c36b156ad4024e705c1d78360 - -Count = 4 -Key = 678c4bf414452f1c5a659669646d4161 -IV = 295d2762261d1a536e1c057c -PT = 53f4ab78c16a20c07095afa50f7e96d66bdb5da90e7e3a8a49fac34652726edd -AAD = bc84743a0c42bb3423032a89857de5a9355ed7821980bf18379ae503b69da35601608f62bbfcb2e2ad9eff7e03fcb4b6d1768ad3a4d92831c5b2e3fc0eea3ab7b874f64e84c376a8f9e15b9aeb5392de10122605699f7d03a999 -CT = 2c821a0eb61cbdb09f84f086f69652b38ac9d07a90985f3ef36482a9ef8edbb2 -Tag = e6e042fe0894df45b7d9898e96e9b906 - -Count = 5 -Key = 8df843ad9376d7326114143899b4ca6f -IV = cdf3b88613e485fe6886e720 -PT = c1fcfda327533d17e1a6ac7e25cca02546c66635a115cf3f6d008eba55947d60 -AAD = e5bd7fa8a56f3c155120f3bccb0fa557063e7bb9517cd04d9996533ef3924ee6197ee7512c6ef09d2177e75b4909c6cff0e86cdadce20e279a0503956f4c2196391a8ffec2d17a1d6614be7847cd114df70b93959f1765826592 -CT = 71b822b6d39c9a801a4c2a2c9173b0f3d9b50cf18e8e95291136527a9778edc2 -Tag = b584a7e51d40ab28732c11ed602730a5 - -Count = 6 -Key = 64b43dfcdcf30dfb97373d75d09ab733 -IV = 9359d85361a3e4c110d715f4 -PT = 7c5c94ac7b138273de768d2bda16bef0774799df333fdd1a756e344ec35f2844 -AAD = 01acee6296478134999280ed47a5bc65dd5122c5d35092df54718900d04cfb81457ba9ec9d01e55dd8a65d6b3865fa0e7a45382f287c688c51ffcc951945e3e9c87b03c5545cec0d966926b8ee0453b69f25ce9fdf0a3065c81e -CT = 5f9aa615e13b7b585bdc2d4c3a83d1304d6f78ebba0d5b329d86ca730a515702 -Tag = 3cbf9fa530b049e067868433307425db - -Count = 7 -Key = 93a951295d4428902a5cce8fe2068763 -IV = 8aed35ae4ae714cf756e686b -PT = 0029b749b4db477dcf47d0296eb88806ef0b56060d598e48c9b5a6f9d046404d -AAD = 8186788a93a764a866944a2056279ad7f1d2083a96ce224fe6de60e70b17db18022a1504e1bf45c326c6d6992d8c005b675715016e00ec965b398b2ea4ab09cca2ac4ac312e6840ce00a36f6467028328fa30d4086e5bcb677ba -CT = 792cd1a143304fc737d0739be52b2e61841a908963832cff06ab6ec585be6467 -Tag = e1bb3eac7f570055fc2d2f0588c4935e - -Count = 8 -Key = 4f3114710c0e7f393b91c982beb3cfcc -IV = 03994d0b244f94d13cedce90 -PT = 36831744fd1c17a5df65a63d6642502075a0109f0f0c093ff33505140371136c -AAD = d294f939361af1bff5674a5235ba3e79bf30a5341b8634b5dac613e9a567ccce01b0596282ea584e579719206b2313f6675e7834f8a6d941e164169e97648ce77968ab4ecdfb3d639898468a1e8d285a9327dc958093eb33f8b1 -CT = 557e78350ebe53d1b7c1652669621db7a71a8fe2c0a84e61badf2dd9f034b91b -Tag = bc6c1f1322064eab75737067973d56a7 - -Count = 9 -Key = f00a034ea2f732863f9030257c8dcbf9 -IV = 2bd288fc2fabba6c44a04705 -PT = 85472091a37ec5f37d50fc09fb6b9d803577227b4c079ae64a9264e7a784c4fc -AAD = 312de02725a53b8a3dca7f02876dd9a4665de7a3f3dab7e4ac37b71d9d02478829ca38d3ec76d7792eb32478b92552e90154cf5608dcad4f33496061161af933d066e146888d1b7fa9b0c5255d59a8fdd88da638d06ee6d16d93 -CT = 9aa27810c3761ae175560340144610c7d263ad35234ecc55feed1c5dd3a4dadf -Tag = 02724d14a7dcb5ef81ce8aa937f1419d - -Count = 10 -Key = 49dfbd368a541721d6cd5b2513ec6087 -IV = 8b0214ec3a6a6af65be84ceb -PT = ef6cff08cbcb63a72e841340513f4e289ad34e89733731456cbfbc9a87b20f9b -AAD = 6d3dc86af4bb9e92af0dec8cea981481341f37be457093d98a818d8cb4b68b9f7197b1fa310147701f047949af41d0b226af4a3b0b92e5342224766dab7830e1687aa3918a89d4d3b50d69595944f492d3d68b3609ca594e7f26 -CT = e0802e60f73aa2fd669cf5870e963b1f33707ad4cc551f658b18bb72fd7cd9e3 -Tag = cd6d9a33458ac709385acfbcffa457e5 - -Count = 11 -Key = 3c0f57982449fad339c7ac5f6501b9ec -IV = 4db6301b638bab6a833001eb -PT = d1d5e1f3d8b491b2345d4a020add93e31596a5a204045f75fad53305d6b5aab5 -AAD = ea3872b0d48dad649a876a6b3672e9c7ffcd69695a4d2eb1853ed5c26eca0e8f21385563d42dfef2e1430e06561b8e0b73b5f62ba51a4aca78c56c06c479961c3d21c1fa3823cf80145f7b24e4740127e9e9960fa2480e36e4c4 -CT = 32c508251494d05ed9413b0011a028a1bb9bf7e18f72de4b750cc7ab96ec034d -Tag = 27c994680810f7b538c37b551b2f17df - -Count = 12 -Key = 8bb2aa3219c604544b4187d491586d9f -IV = 341d76da6e3094fc3570ae78 -PT = 274a2097708c53fd2a81444e13285691eec192c223b84dc9824c67ed3a050ba9 -AAD = 69c5e98cad9aa3327444b9625eabcd086367e64170d35c4586fa385a396b159425f8dd3969446529d651ce5a3b6432529487f91d193d05d2e345a28b50dffccc0396f76e418086e1fe2768e340c1fcffdb29e9514829548823f3 -CT = ed8775001f33bafdb1ef577698116e9ae656085fca8b969740c7c697450f9879 -Tag = 6c8936c42dc46321695d3af2a33ada14 - -Count = 13 -Key = 4d8154426d1b12eaf98d09ac05b1f9e4 -IV = 23e3916b9d64f98d122e6be6 -PT = d8a69c57969c6551c328675f7d772faad6c2c6843bf4b209e483fbdfc5efcaa4 -AAD = 2355631b9d487f4a7ec98d497f251cb79acfc58c0517d5e7b92a1abbae6ae7353b874d02faaf6410438539e02710e4d7cdada686871fef7582d562f384a571ce1edc68effdb932462e648c712b4e1d4e2e46718abd3cc5973aa0 -CT = 2fa53c6fd1846db81002e9c14da634480b352225e9190ab03d2598ef49a3b2b8 -Tag = a4023fd8d0f076eed5992f680b154433 - -Count = 14 -Key = 2c14b55dc1f8e3acf85258a12360053f -IV = 5b5930a7f63b1a8ec445dfa0 -PT = 41a7569d5f3f39ae06547d0ed681e8922382cfc940bc7e55da200ebf905bf476 -AAD = dc8fb70d3afd3c67c9a86b3467ddfa23298c6523ebe7ef17b7bcdb2ef130c61bd5adca2eebc897fd4126470e0a9088e8ee4a60939024b9abc7ed551d0e79214edea566ca4d970198f9b3a20b6822f4e30fc2cbe76596a01817ff -CT = f64364ee15acf049d8bf90aaa914bffae9ac6073b8d56122276efe04b202d0f9 -Tag = fa09390c1ce9ec97fc10c55ef2da2425 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 594157ec4693202b030f33798b07176d -IV = 49b12054082660803a1df3df -PT = 3feef98a976a1bd634f364ac428bb59cd51fb159ec1789946918dbd50ea6c9d594a3a31a5269b0da6936c29d063a5fa2cc8a1c -AAD = -CT = c1b7a46a335f23d65b8db4008a49796906e225474f4fe7d39e55bf2efd97fd82d4167de082ae30fa01e465a601235d8d68bc69 -Tag = ba92d3661ce8b04687e8788d55417dc2 - -Count = 1 -Key = 7e6a5b6d296ac7a7494b72c93bad15ce -IV = 5225c255bc82949a1cdb86c8 -PT = 8bd452633f9dae0639fe0e67e36401adf65b3edf6799ff9eec80d85c13c85e0ee09491d4f5acaf8ae920281801a2f5d12c9370 -AAD = -CT = 2348f512a3a8501be9eaa41d8a127fcd8f0368d5053981a5626f85405363d218af7ba52a2bdb87a1ff07329f21792f4c64fc39 -Tag = 8753cee020ac668e9e1a37f63231543e - -Count = 2 -Key = 0d54e78be0eba65446682721368567f2 -IV = aefce9f80307fbff0965881b -PT = 5b335be97a86c8c1a29b7408833f752c8c5d4c912e7f26c73b909239e1222fc851b4e3c0accc5148cc60af2f019f9ee0060131 -AAD = -CT = 7277aebd1beb239a3a610587b0d7cd71640291a4e4d6dca73a5d0e05f058e7a0e151a0d087ff256d08876e1fc3e0e5e69c72b0 -Tag = bda879404fc226cfad834a3e85e04415 - -Count = 3 -Key = 0bdbb7986a6026d17a9ded7700831f59 -IV = e3bdba2fe3b5cad727071202 -PT = 77ec68b51f5eb0f2d80d3af696627f365b6e83e69f105c7bad8e4869b228a0c496aa05c96e97a6bfcb33aa172f22c6bf3d5116 -AAD = -CT = e7a5a701e950ca26987e1c40c889b475dba50cea13f09e9d3bc3cf4c84382c15bde4c34ff05eb278b4b745e51cbf4f12c12689 -Tag = b794991a8a4a9f3d59d9987e9fb7ac30 - -Count = 4 -Key = 823e852ef0b9551b2700bed65edcc808 -IV = 85798ee5fd33ef752a363d85 -PT = c1ebd968d861fddffab41857de7049bdee73acfea5564cf44ce40d75b960ca5453cda093a55c5527687f25433bd6dcde443030 -AAD = -CT = e8e976e8175a41ec6a629a225cf277a1a7e2b839b2f581c88698a39300e4a54ef381f7b433e0ea9acffe59801d516cd4c61135 -Tag = ccfdc010bd16ddd651d0a189255a7035 - -Count = 5 -Key = 99c0001a7c12f331e7b3b164daf4616f -IV = 383e8df9db398c5e9842257c -PT = 9d8ab6774cbf486fc4378a05a7aabba7ba7ff4a0f5eeb51c54c2ae9a5dd829d2735089955d5ae240d28da8b79994cd72234ee6 -AAD = -CT = 23c5e30b40b0946cf5b4df15407ff2d973397a10e94a303b71a4a5de074644006a10fcab198f86c4156c59e28900b958efcb8a -Tag = 8ecd6196137905263729dafc06860720 - -Count = 6 -Key = 6fa5f5b79f6f2fa7c1051d2a374db822 -IV = d466bfcf72789143eade1e84 -PT = d9528856db087849264ac811689420ef2beea9c6767644f3ca8bfc6345a3e2e5c49e7e0fd9b1c2e1671bd1b6275b0bd43306c5 -AAD = -CT = 1128b1da86b71d3c0cb9904f2513d2329c033754fc0d40f87cdfc7ee53dbe3ab565719c8d1dc5d3314123bc9e096fc8509b85d -Tag = 19092b9776c4a1f6e30354fa5115dc04 - -Count = 7 -Key = bce7d033f24ba8fbc237f06f40c6ae25 -IV = c0d68906e987fe22344cae52 -PT = e533180c0c73d75799025303d660e43d5795ad46b84a05741b441f855eeea299a6484c17f39e884aee28b7d384afb49c134c73 -AAD = -CT = 4723daa516b920ec039dd8c0704a37f0bbad9340a7e987888db120459c39cc069554638ab6b32cff585ed58e2d7c1808229776 -Tag = 1ae612e476f5beb99f65aa9b5f02b3db - -Count = 8 -Key = f78a05cd2621e9385ca111f3a168fdab -IV = a16aef83dbbd5f69c2569103 -PT = 9e761d4b7bdce2b851e508f77faf447ff83505755494f1bb5169dc23bb02d9ba8fb8b4878c8a47dfd14ea0dcef3e83c688e597 -AAD = -CT = 7ead6bde964c35fcf5de23f19725387601f705ac11c5fe1fc531746bf2d871fda54264a623c70e72b5b5ecadc4434f9e696ffc -Tag = 2f13e4bd9883c747f0c79c91e661aa8f - -Count = 9 -Key = dc1b8569a8046e3f294c3cca018f6613 -IV = 5b3cbbe0e948db8efe42062e -PT = 6a3a1a9815690106d1908bc7e63e25bfd801900e94a9fbc28b6d52b8f9b4de7003b066bbb18bba33da83c67809e3bcf98b5cbc -AAD = -CT = b02a253a17fb9248277cae0305473870c19e70b7930a0be9be905423479413dbe3702f42024d69476415290b1422f2c030e99e -Tag = f0fb85e3d6b3a5ddc5da3ec797f758dd - -Count = 10 -Key = cebef154b3ca2167230daf3b8205f11e -IV = e0dc23aa50a52cae644874b0 -PT = b8cb070ebf5b27a51f14f22c6b38fc29d04c431c484c117ad250ec4f97fc4df44b0ec847b69a363963d419ce9ad11a321686b0 -AAD = -CT = 4c0918e86b152be2c4dfe36c78b8a559c2c7f83fa7776d0341318a065c2a2f1b2678aaaff76cad30ccaa1dcd03a5bb16d00f3f -Tag = 79267bdf70e74eaa011e889369f5831d - -Count = 11 -Key = d7e95109127e83b4d43c81d7ef6d5972 -IV = 43ac0d8895ed785e2cb69d48 -PT = b2601f216b5e6f60c518dc817c38be940ac03babf2e6f5ddca0874e819f9aabe046460e3ccf6511566bbde2d9b191fc16ac4b6 -AAD = -CT = 957e712dc34ad891cdb3adcce62b0454eae9c792e64eb4e08624de103089cc19499749e8ae6d8c92e2c04c5cb36ef097bb00dd -Tag = f569562cb94828fe71fbddcfd984bae5 - -Count = 12 -Key = 39ab7819dbf944cccd2648445337158f -IV = 4594840e05c33bdbc0187174 -PT = 834cb05681e9a7876bca891eb7824392c7ac29d4ff4c9a8ad96447d2cc5f0ff218043d3510201452ba5c789ba2a667bcf79b9c -AAD = -CT = 362acf79df28c3c858e92c0c5f0a323b3ea2e81be67cfd903a627ed163c06393287b73fe33a435b96672b9bf1a5a2c2cff4a15 -Tag = e58a30e2c91e6d25f423abde987cf2f7 - -Count = 13 -Key = 73388f83e409ea236129e46dc9a9b20b -IV = a9069b00e1cd29a2b07b8db6 -PT = a2e138d5611c5043214f7d9f9c87aab94e0b8e99b311d0cae90829078c3898c8fffa7de9789af0a6c05f375b2f710dd4ba2610 -AAD = -CT = 77e0fa6b2765428ae418b57ecf5a392230fa2a9bd1686b91df69845cfa0a2dd9add219229e65ff6a2f887b78ebe8c0c5d1be21 -Tag = 32385ced195a16dad5eea5a19fd0fa43 - -Count = 14 -Key = d590e53b695315cc0b917d9fa0aac643 -IV = 102de7df461a5578e75c4975 -PT = 7ee631fb685d4a94563e01480ec5526d04a4035d1f615fdbad6656e2495fe5d7f0d6c40dff659fc85f4ccd78433a192313c3d4 -AAD = -CT = e1322d0c9265cd774d2e9d9b6771799600b79ba38374ee1756aa6871e204e5f6871cd50db15225ded64a9c8899bab37288a792 -Tag = 13e606a9a4c786b65e2260cdda4b1843 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = b61553bb854895b929751cd0c5f80384 -IV = 8863f999ae64e55d0bbd7457 -PT = 9b1b113217d0c4ea7943cf123c69c6ad2e3c97368c51c9754145d155dde1ee8640c8cafff17a5c9737d26a137eee4bf369096d -AAD = d914b5f2d1b08ce53ea59cb310587245 -CT = acfab4632b8a25805112f13d85e082bc89dc49bd92164fa8a2dad242c3a1b2f2696f2fdff579025f3f146ea97da3e47dc34b65 -Tag = 5d9b5f4a9868c1c69cbd6fd851f01340 - -Count = 1 -Key = 4324c97ba8c9f2a1bd447bde5e75938d -IV = bcac68106a3fc22048462bc9 -PT = 789fc14b7d4ec83ec783c0ef38faa6706031ade4e65ae91f0e1c579b8c8652e94e04c4ee5d85d23d0525c133a93a9539448ca1 -AAD = 2a893eec2eeef4c2e9c305428b9e3293 -CT = 2ba721de1aa7afba69cd0fa492fcad5fe639d855c1f280802b9cd5dff37f4bf54a117b8f400cb63906a3c78cdc1ae98b0c30d1 -Tag = 171df263a72252f2c44f5a63f089adb1 - -Count = 2 -Key = 51e42ceb83175d1df09b8385a84fbdef -IV = ec6b7f21db6eb16ce87f89b0 -PT = 4c5a34b0acc8745f45c04d6c82716b83ec6be5146d1272835ea642b49f55353fbc72a3acd16624e5377cbab54e356e3af6be01 -AAD = 3a081b5734537305222f314ef39a8d20 -CT = 1b4bb70f3ed38f378e29edb7e65081f794725a0340daec5708a163a3a81272ac2bd4b3e3db8f8ad57d571b5eb24af652e3c87e -Tag = 6a9f2a4b73290fc566f37c286887eded - -Count = 3 -Key = 9280e05a614d452f407aab696afad52f -IV = 099ef02922592254e44517cd -PT = db91108d47f266dd9371698b194b3a183f2936782be417cf1a048c6504162d37e11a41e3bbfeb98f995ec8e35de94bffe0a363 -AAD = 12dc4da623d082c767a3f7efe9a6ebc9 -CT = 8ac070ab975218af0c22435174abcab01af5db9917095e67140b31feeb78b7d5be3186b4fc41f106303a519b5a32399d2de77b -Tag = 7811b48513d9bcf1999b52304492b0ad - -Count = 4 -Key = 89be3c09ae7e2eff5b63f913aa8b575c -IV = 449d852d65585185bc4298f2 -PT = 93ccf5d907dea9b0fed5507f8a26400d0a568c0ef53b9fa6bf9d6802b20fe672c9a9536fc75b85f08e4d2c45cf032422f30ea9 -AAD = d232713c2b024b5affd4a15050dcba41 -CT = 5b38069d695b76a609318e93cde6e239465ac52264017c3e5169bddbda0d2ac76ef0451a3a39d07e8e8da3b0cd2ee808912b4c -Tag = e316e6032fff56e5242caa1b4ef2bb6e - -Count = 5 -Key = 04cbf7dbeba906e1d0e8a98d796e8613 -IV = b58059139429a6a6a38ccb07 -PT = 8890c63ab730d9135e19ca3ada35b34a2d5bd9f4968d60e8c65bf43f0d6def7de472c26b89af9e5d6e48c125d84b0fef7d194e -AAD = 7532c6237ba1da8b99c4a091c5159eb4 -CT = 52bc0be1920a4f1fb3ba3f9fc3e7969c75e40fade163897428f49fc52b6feffb61b65344ab3ac995e07dd5f615c24b447df9a7 -Tag = 239b60518f3c35b24c2557549179fd36 - -Count = 6 -Key = 8f1c70136852dc27ae5162b8743c90ea -IV = d372f92b0cf030aab042a6fa -PT = 0b6446af88c455d7f1ff5116c7af949803cc50bcf1ecfc81c6627141a42b363f7eb7fc628503bb6f037dae843fd2d319b61118 -AAD = 7eeff5d17e79f00d68e26cb7e6bee76c -CT = 4f235f6cc2c0474ab50557e2cf612ab09ffc85975de082b9cb9649a522b8a47f24e1b2c48f3cd57dce49542bd3560fe5e44bca -Tag = c541b78244efd2b9e61e75296f164aad - -Count = 7 -Key = 1ac69a35f749c65d5d27ec109b58f336 -IV = f0b9c6e8cfc7ba4c880d99a8 -PT = 9695507b944865587f27395c74468af6a845716b34db61e437b77d0107387b3fda581c466b6df40948da35906b77ff8ed09402 -AAD = 251d75d69ab64f1363efeaa771f3dc01 -CT = f41dc7402768705dbe3bf7cdbeb4fc672d3a6c3d65520dab3082727dff084b6e0bab17f96c2b137a4bd564a13f77ee37347383 -Tag = 022edf7437b41653db3bf2479a9e74a1 - -Count = 8 -Key = 16cbfdc8f9900f6702a430b0d8b624cf -IV = 28dd5c46e03680f2c01a7bba -PT = e1562d6e6a469cfd9f0a6a15be9a033cd454959ef8b37b2da58164fff1d8dbd3fac2b97bf1b503046fd9cc68bc942d0f727a3c -AAD = b1bcbdd27c0ef4de462fce0be8855a36 -CT = 10915ff87b80e42d548950e53ff6642ad44afa695175d24c9b5197f64c15570ebe0bc969c0251be940b42889464cf562c3e1a4 -Tag = f9606f7a0e41153a1b45c25f1784cace - -Count = 9 -Key = 4c12a54aa7bb7a0c0c798834f39b3fa8 -IV = e5854fac9adca3bb1bc549b7 -PT = 7e7fe58f9f13907a694b47f053c9270c2e4d73b52642a71446943a5c5f3e2fcd554b376dd2f549aa7e0737b62c6414f542bba2 -AAD = 7f42a7791e705345888f00573be98980 -CT = df46d7519910899b7c3d9e7d0dab82c93b7d8ee03f4f5aa82ecf64cacf3c9fb58f17a021536028744e412770e57562249e5f09 -Tag = 2823d4b59cf8f8837bebd5efdfb92929 - -Count = 10 -Key = 32aced5414e267cf77844c0acbb8872c -IV = 3d108e912d53b88e0dff9d6c -PT = c7fcf53c93a521c6e244f203cfc40b80bd8ab1e4e54cdb581fc14c31dc6a93805edbba32a729acf1a7c04c8b0366c2035c65b3 -AAD = 7be4c5df7935453d50f1c6c79ae6c13a -CT = 80beec8c20c7e9514c38ac6e3775de206754433cb1d7c89bbefb33b1b41245e0d1baf7cc870b1f1ec387f2dded3e0f479ef160 -Tag = d97f7d82b3ff97f2f6c652194c004748 - -Count = 11 -Key = 6275270952263f5f008b16f2456c7ddc -IV = 1d1837ea4cb3732a6ea6487d -PT = fd4de28a18a3de3b9660acf08eeac40e192b77c5264c80651c28628e61c3916f7ac03d849ae39c981a2808866a8292746a4793 -AAD = 6ee8ed2ed241f1d7cee55ca67001729b -CT = d69490708893f1638ad594c3a0ad8eb4f17da3203b18aced930976ee1abf4df1ae8a768ddc9df6ccdca2d579165023e52bb9d7 -Tag = aa47cda3928f7a2ea42feae4dfb0800f - -Count = 12 -Key = 7796d479bcb213f19e2ed73ef1069fe6 -IV = f0ebb6fb1df60069b00a34c7 -PT = f72603b6e74bafc20f423bea2a1036ab44461b5e5a5631b013573d953e1fb073b855511860d1782c1f3b146b5c41eb946e2fca -AAD = 87563b4d72e2f2c0094bff678e3b7975 -CT = 44c4d7ba2af1be22daa6352b58bf8cda28999bc33c420f8881001719fe639a9e9e5c48df120f7cbe73af4c1513a637b9de33e8 -Tag = 8b7002219f586318150132e0e5cbf2e9 - -Count = 13 -Key = f7c50f29479ff0f9945ab9df56872eaa -IV = 1bb94d7b399eb7a9a0efaf6e -PT = fa86691b746424b3426dd9ce8cf0f132de5c575e001701324ca7ce474d5813a19904591055fc7f343e20d0f4c92118b14ce774 -AAD = 88a9f81078d6a0820c56c582a30333b9 -CT = 55024fc5e95e5f7c33bf948c167b13382236b2cf187cc09e37dce043f6293fe457a1dde728cf407c702d75a670397ffe28e8ba -Tag = 645ca60cfc8046a0253f438e69b8e47c - -Count = 14 -Key = f3e302a1568a5340b5745ae87f5a5bea -IV = ce41f436f2e84643f673603e -PT = e4abaa66875bd8d45b6ed5e7671b03e09423ea41b7d89039da92728151bd690ccdef4fa16392a7f85efc0bc2b1664bd3f15e77 -AAD = 87ba36d234ec508b308ff258c6bd427b -CT = 123b69b2d0f10934da3fdb5c1b96b4ffc8ffc1446088b634b38e145e6dd98e8fea17214b5c9136f039577d4493b8bcf935ae19 -Tag = 97ca8cf064a408c7b764cf32d3b79c0a - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = fe47fcce5fc32665d2ae399e4eec72ba -IV = 5adb9609dbaeb58cbd6e7275 -PT = 7c0e88c88899a779228465074797cd4c2e1498d259b54390b85e3eef1c02df60e743f1b840382c4bccaf3bafb4ca8429bea063 -AAD = 88319d6e1d3ffa5f987199166c8a9b56c2aeba5a -CT = 98f4826f05a265e6dd2be82db241c0fbbbf9ffb1c173aa83964b7cf5393043736365253ddbc5db8778371495da76d269e5db3e -Tag = 291ef1982e4defedaa2249f898556b47 - -Count = 1 -Key = ec0c2ba17aa95cd6afffe949da9cc3a8 -IV = 296bce5b50b7d66096d627ef -PT = b85b3753535b825cbe5f632c0b843c741351f18aa484281aebec2f45bb9eea2d79d987b764b9611f6c0f8641843d5d58f3a242 -AAD = f8d00f05d22bf68599bcdeb131292ad6e2df5d14 -CT = a7443d31c26bdf2a1c945e29ee4bd344a99cfaf3aa71f8b3f191f83c2adfc7a07162995506fde6309ffc19e716eddf1a828c5a -Tag = 890147971946b627c40016da1ecf3e77 - -Count = 2 -Key = d441280905a33bcf02ac16f8cabe97cc -IV = 53294f8b440c82dbd9bd7543 -PT = 5cd42b150db7d0bd6556e37e386dfafafabe2aefed2823be932f9daf1234aa0402bead485ebda3a0a6e392d5b0e603ae2dfca5 -AAD = aecd49cb8890806d47a950c8e92ab294f325961d -CT = 3ae74193c94ebb96fbb1bc5ecd180b2c0efa1ef4a9ecb6959631f8554f0eb237893476cc0d4fb55fa1880989c1616dd32b964f -Tag = 0eae01a8473a8f603c6ae6b637e4aeba - -Count = 3 -Key = 4f66f21817d1865c2fb62d4de344e085 -IV = 4c780a2707f56747b24a4aa0 -PT = 04eade2d68dc3c5d83f2d3f1c44240bf86127c9f6b3966085ef41ef50107d042b18bbe80bd43cdd1585fc5a99df8271b9b8767 -AAD = 4c0ec2531542bc801b3ddf593c2e1ba4afeb603e -CT = dcdf8d2b0d388072ce273ad3502dea5122bac0020a7ae3b97705d3a2bb49a5cb4f95e6cbd74183758c2eabc9ea38155c7ef647 -Tag = 2558c59cc7d71a2fcedd13f1c6659a63 - -Count = 4 -Key = 638276070f70a48dfdd3074905f4dd8b -IV = 08aa05eee9be39f28f61299c -PT = bca63b1fd480b7c682f992b3ac40712cd412e5bd5141126311ea3c5cd91ff8d75b7ad7be0ac7f61d41292e673177e55e148b8c -AAD = 7e3ef6f9d9d33a6bc5904b1317d235ce1a99ffb3 -CT = fab16aaf8cce26586b50e794e889839e0edb63f14f927f353569cac1694604de593d72c52977bf7fe2b6fcecb2d8918d0de8e9 -Tag = bd97aacdb02b80a01487d690b5e905bb - -Count = 5 -Key = dc7fa9348b7fe1b3befa5a09b2dc0f7a -IV = 51e208cfa9b9d990013f50f3 -PT = 0b65800b4dc2aaafbc837f9ece7a9111f3ba0309196babaa6b63ef0fedab779e0d352933536520e4ff1c7f079505ead882adf0 -AAD = b7219b5b1801457d71cfbe342148849622592c40 -CT = 2caae5923cad79802d682172f58191349240a24e25891461ae65394b95413b34e03f3551baf1a055d22a53a8a38f8ef78f6d40 -Tag = 10769ae854f8298cd94c28c3e28e94e3 - -Count = 6 -Key = eaf1659e08d0f22a7042358ab0ee0f0d -IV = d6911b68856038ef9dec1215 -PT = 0e71b3765f17e016c3024be23d0af6cf50ce98d86943b38cbbe8f3dcb540dda64b77bf73c7cda108e1a5c4bdb590a7f747ecfd -AAD = 433ae638214c48207fe9cdc76ef99e28913d6a8c -CT = bf4aff65fb7df0858962474bee9fbf95b0f06637c7d72bb1cbabe46662f455d3813665477b4badfb206a4d8f01346119e559ec -Tag = 866f204b04a309d45e65ea890a17ed0d - -Count = 7 -Key = 382697fc2ca220a5d6a700f7fadbaae5 -IV = 3fe9d400d10dc33545d6cc5c -PT = 7d187a1fd4d518197c1e843d613797d4a9fa9da6fe9f773b947dcc0023c43e917df575baadea90237d95f88c54692ef8be672e -AAD = a3cd4b0216378918a46252ca16f2ac9775e993f9 -CT = 8e640b879d473d7ce6689175808b925b6ba1177ad8b0c53208e1b7c6303844f52c8cae5791d0aeceea028dac107fad5e80866c -Tag = 3849e4fefcecb108f83ddc039a21dd91 - -Count = 8 -Key = 186f6a73ac82e33f69c5b158c7ee1cbe -IV = bad41bfe8b67151131e85b2b -PT = cc4d9dc2df86165343aada60cb5c1d9f991331d530d860dbf9166907d394721b2a22b53a6b070c5cb32ba3788ff55bc6a0d5f3 -AAD = dab496ae14125af2fef47ee3b226a6c92e99b9e0 -CT = 41a17c3b18e67d84bfab344bff1429a87c3076879ea42383d1e622e710a60612eecf2fae8a56a95a08c958a52f873ecb303785 -Tag = 335015e14d2cd8eb9813799c5c703a89 - -Count = 9 -Key = 14ba3901daf9db40d5dfbd828a361ab8 -IV = af37192707a3804beb57c836 -PT = 85f016f83ceba76a068e5def3ed5ebac85e203c69e32676550c6ed864edfd2ccb2c8da415a42cc6ead791e869296091efe7ca0 -AAD = 1ac4a38e83649004727d2b2b71075264cfcade09 -CT = 2a682e5579d7f801fdbdddb2b5f8564c9e91c39cde47c48ac1dffdf7ef1674ed937e77215691110ab730af97349f84128eed56 -Tag = b1b50298f48b96e679c3d71f3d17d623 - -Count = 10 -Key = c0552b2f54f4e8292119dbf61285fecd -IV = b5a580ec23753690d6c7392f -PT = 88c04f3421de415f9ee9b47e033666c0d182d04f38e6faff5fee5ec89d1bd391079e90fb22c537efe4561718588eab313cfd5c -AAD = 46cad83fbea4c47b9374bacb072472edcece9acf -CT = 2ca83a4a63de404ad2306a4918420fe3105cf7f9a52d16aa610e3b69a0fed246da41768c801c19d7502ccccd5ba0a1bc0b50f6 -Tag = 8c03304e8a74dd52d4e3baec89cd397d - -Count = 11 -Key = c6efbeedca979cb2c4fa5d6454a77dc1 -IV = 4e57df4988d93d13dc512487 -PT = a52077491b20ac65eff89bd0bdb6150ca755cf469c42ebbc5c95bbcf3aba91a9002bf386fc9a126fae73dbb2daa7ceb79d0b5f -AAD = 9e65d0542711fe57abfda27587ef4161eb3fe32e -CT = 4dd803cf6c99d2ce3ee8a1996f52837e52c3bb386cfc2792318e1ba64c35b638c9508b2e21d1da6e635e59e37c02c0b0a2529d -Tag = af847ce419fa54045a8bf31062f6d349 - -Count = 12 -Key = 3d68401d7c5f5c0a2529ede00724be14 -IV = 3f3eaf76e786e8af54baa56f -PT = 8bfeae1dadfc55baca191a6a3f54ab721862c51ce684e4aea6e9a3e2f3d2aac14af1cb0252f29a4c8c0984ce867acebc7596c7 -AAD = 6a6e3ea815e01cda78a76b0fb8bdafb8a25a6b7e -CT = 8a62b81a69e6e104dc075cc32730ffcb419b9f41711e06d7c2d9e891a88dc6e88817cf5bc2b87e95c4678daf0ca4b8f1e03927 -Tag = 9eebbcee46565fd4c34b8f47bcd94b31 - -Count = 13 -Key = 0657bb596cc28eafd51cc09a3e6ec1f6 -IV = 8e11a0625fba51698614f8f9 -PT = 435f16f56aa71734dc6571e2714207f7ff85c7eeaa1879901f2ffa00ea45038db54329f0a2e78ac58a5d76314788d8351777fa -AAD = cf73715474e49d71f4f5ad08e209ff9774ae9639 -CT = d876339f0db3bff022cb4504fe0a8ae26040102f575ecd4e4583b04959976254d07384141ba5748d3579815e3b5e1d1e8fddaa -Tag = 7e6f7096e425911fe739ac90cca05fda - -Count = 14 -Key = b2c645e0f2dd0d21e9511364f9355919 -IV = 91f6f089f5e828d6fdf12510 -PT = 3c01159e4787a74a707b4ead3be126b819831296821f1add394762ac97599cc810bd97205d0743548e7150bfbe6d9c1ba5d581 -AAD = e6781ff89032df5e5398108f1d569d7f8327b25c -CT = 1a06dec18eb4c9b361f1f2ec6391daf275f15d97a7f1a73fbe1d144bc1e1018200f725d52400c693a438edb595fd4558c4227a -Tag = 451783874f9d925328208bc4c56eed33 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 3c50622868f450aa0928990c15e1eb36 -IV = 811d5290768d57e7d87bb6c7 -PT = edd0a8f82833e919740fe2bf9edecf4ac86c72dc89490cef7b6983aaaf99fc856c5cc87d63f98a7c861bf3271fea6da86a15ab -AAD = dae2c7e0a3d3fd2bc04eca19b15178a003b5cf84890c28c2a615f20f8adb427f70698c12b2ef87780c1193fbb8cd1674 -CT = a51425b0608d3b4b46d4ec05ca1ddaf02bdd2089ae0554ecfb2a1c84c63d82dc71ddb9ab1b1f0b49de2ad27c2b5173e7000aa6 -Tag = bd9b5efca48008cd973a4f7d2c723844 - -Count = 1 -Key = a7268c7ef7bbc2be4a3ffc282019fba6 -IV = df2c5bd03f2cc45a07173144 -PT = f88beae931a68ed813a35bef54bd9999fd23ce4a1d258e34fac184ba799132a408bde4ced23748db5b35ea9692f4e1561d4cdc -AAD = 445b4ec6c505f132d3b012df624fe8f6e9cda0d8ec5e1ef7cde8b89259e167d68c1fb4dc4a78e5c59377f32ef5cea4b9 -CT = ea53e264e1b0f67ee37c81234d3b9c253ab1a94a4ad17779efcbeef0526129b0fd224b5884eb8b38e35ce0bdda222e30f576f3 -Tag = 38b5ef8d660f856d495db50f702bb462 - -Count = 2 -Key = 183dc6bc9a497304011e5aa41dc575b4 -IV = 0f4e2961d8ac4f81f559de7c -PT = aaad38b847c7a6fce801ff4ba62639592c487382e7e3ab0f29d0dde432f31028c0b14c67c15cc3664c660c197b4792433924d4 -AAD = 8ade36c0d68fa431838beb9f1d6a422365024bd5019979fa9b09b7c44b785e051dded5c9e21f342cf376e72cdae95207 -CT = 38e09d7612a536a80d2e32a46b0e1e4ab1e1022e854461aa7e695d7aa4a003e379c0e270face29e19d74d40a60fb2e8c726aca -Tag = 4004e9763f4a7d0fcb0ba57c7611f281 - -Count = 3 -Key = 047dcb88c16bd0d32d9a6272b079e379 -IV = d174ed8d60c0d5c814dad4f6 -PT = f957104f1fd87e9e1d6d35171a1cbe8fb22cb4ea7aba31e763e77c6f291db81c63c910cf9b8d37bf93fa28fd4e2808480b5836 -AAD = c6567022bdb5f2f3a1e3d78e0202a5f6b457c0ebf46a4b0620afa2b5ba706f1a37f932058afdb8cf4eb9a3815ecad445 -CT = b7f83cb77ef93895a6721dfafde8930090d2a9f39a1d605bbb8d7fe0f0fa838fc6d1f0e5e532592d0c688231e24139e635b502 -Tag = 452368d42f8a1211b4a018ad1acf837d - -Count = 4 -Key = 7286fe98ac0c03252f3ab7eabb8988eb -IV = e32e708c6302ce26902bd599 -PT = 58fad037e6efa65630ca14698725538c686ced497c584afad218fa3b753beaa7a72fab9c4c108ad14bf5f024613f91a1155679 -AAD = 4b9003a0259ed70aebfabc90abe750b888e9db453d9f95790d752d4ab9f208ee478046abaa9b2bf24564216071613297 -CT = ead0bc4e5902600598f9ca9e91cf4543420cd64e281a710fe890e0cffefa803d8c046390da6f50fd44b7e87861ac4088b5266d -Tag = 970659d5170d654b55ca5f79a9e06957 - -Count = 5 -Key = 0dc3090d2786eff167b291e895ac2261 -IV = 6ac8f3a8a61448e1fec06d6d -PT = 3017261d20002fafdae4252dcc9b1214e9a9ee959533d34aab136249ca4ef52ab205ea69efe6fd21ed3c90f8933593fc63454c -AAD = a85588d465b1ec2d935ce1ba5d6397bd57055915329830b1aa4a934f2080ecf48ab5f6269ccaaed8a10f398be64cdb8b -CT = 1fd7efc41a54374048e5d2a196bbb5b78452639db232c4c106fa8da6b1471ac14aaf2328e959a9c55f201d7271451151bfb48d -Tag = be7ff0322d4d42009dadf48e5aa939d5 - -Count = 6 -Key = d169282809ddae3384a10b908b8526c3 -IV = c9448a902e05f8ab10ad92e8 -PT = 490b469f84939d62e00fdef53430232e5b0ef130d586bbfa8a3d3ba30d91614b64e0da092f16b83a46c9386ebed0bf9e863950 -AAD = 71b1efec4e50041d0446e03b07ffdff05c6259d90aa7b33189e95360bfeba23afe914d0f17db6ba47ea165cc06d501e7 -CT = ca693b2350d23808840870c2371f49eda453f2e189c70b975af2531b9e8b0d8c262829e61f8990804844ac941b2fe47399a88d -Tag = 8bc9e25a568987b427cfc5b42e412d7a - -Count = 7 -Key = 93814839da20b560268ad8fe257a9372 -IV = f157ac4a83a7b73b8085085d -PT = bbad922de6dea7153724a333554e1aaf2e37aecd182b45885d04f3d11c3763fe59c26828d30c9da95adb75fbd5fbd2e6ece12c -AAD = 9b422e74f2109925264c1c0dda2b68c979afdac110e42b81afd2c59e2df3ff3f93832552b626b3821212a3e20c401949 -CT = be069b414d93d4f641b053f1ee7a61e23bf287a63b1d06c05393e8faa5856d22724bfc511a306ae4ba12c0a051b479e35c229a -Tag = 53a62f9431b8e6124c9bf6298f1b2880 - -Count = 8 -Key = 3262f2442b89a3641456cfa3d4d186fc -IV = d0fc4f8f7bb74a1763862407 -PT = fcdd7cd83a366f94289d8b470345fccea2aff778edd9f60c6d8273b3277a843965f0d4ff8be1e61ee82caae8754b87e747b2d5 -AAD = bee1c8ed52bf347431babccac2a64275224045d5c1122eb8c2ac3d8791a5a9c37abf050c406ebeb947428bb60d58d062 -CT = d0e5cecf32ef65035546cf8a99dc7e6f4320376f8e16a51958dc796c9b9a37a0d74e7b9979a0ab5b88ad92988dc184b964a11f -Tag = 37c52cd41ee2d519aa8363b186aadcc4 - -Count = 9 -Key = fc937348a4468afaa629f158dcff5a6e -IV = 783aa881ba0938ed8fe8ea30 -PT = 0db6285ed23143762d6e9b708f0c84ed3f48d51e8b3da549f1ce130bd434d0c38238d0e2c6e2b7f6a35eba2cd84d28781dff19 -AAD = 31b2892a669cce974c2b467d84c45189b335a5943d43b2f158d5c173be4fe31f8142f1b697c772f175a65dd87ae5fb52 -CT = 29d665791fac09a72dd2178d69de16a5ea3432bf70acfaa174ec4cc93df7efff5f3c057c1ffacc80eb2991b1c79ab565c1f97a -Tag = 113a2dd0be60dd45ea4f3d8b90c1122c - -Count = 10 -Key = a9a33b71eb81d091ac1d15e48a19a067 -IV = bb86b999753142de6573e863 -PT = 910246d2435786fdc8f950a0e3a79d081ea1c41eebb875de2eee9daaa8250850f636522cc953419767ad24982bf14427243971 -AAD = 7a4ba8b30eeee2f457b74699d2ff77d8f9912f09757972bf8e5e8ec37684a8e1523b0afec0aeb5fababdd945fb55eac4 -CT = a4cb039956e398846bac343db72b72ded486f64fc58c8b3c3d8fbf1f91b00f4c7c2a560f88f73b7eda4bf2bcc9d4f7a6c62f9f -Tag = dd594f34a29fa02af3accf567d7c5206 - -Count = 11 -Key = 7cb2f97b5609e76040712a95bfe84fad -IV = 1c2398ea67c1246540c469ab -PT = ede4b5732c8fa7bebc87f72da2e243dd4173ddad700bef65adeeaa0c570392fc477b3d2b7d404bea40074a6d58a00f2466c1bc -AAD = add3e89872e09f64d828463d5df7519de1a9db7639229b67901bd27ac3c3ea61ac1612067d72037adadd2e14475584a8 -CT = 6c6dd8a691eb22294818e61e33afea9e49353d1bb6f645e821d7c4c31fb440dd8cc2651450a764a22038978651ffd33d4be108 -Tag = ea246bb5e2ab3282c27927cd983a7297 - -Count = 12 -Key = 402fc879126ff144792af40975f0a24c -IV = bdbf6e81feff5a11df17e205 -PT = 8c60dce80b0a5ef578d680d1c811967265cc7664c751faf4d1472dac5b96e26e3be439b19e3da83b1a19dc82ba00d435e03342 -AAD = de8443df44d93b3734d8820b9a26010d6ce09c1bb9a02260235a40299d38330f67792d0f54c0c0fb35ef9febcbccd02b -CT = 8753e01ee5c088bcae1309b2e4269d9fb15491831a1e17140808f30aee4fa528020a7fc7df8627cda9b7401c44b15aa1e7c644 -Tag = 0f457c92a99ac1eba1b6105d6d23ce53 - -Count = 13 -Key = ca5549614dc0324564002139fd6a360e -IV = 8a4de31b0ddc6d2a3570fac0 -PT = 37610c187d287982e9afc15a9250aeb91933369dedc5910e4de584d70c27b7e4e0a7b02869299100fd8ef75bc66ae4bed2a853 -AAD = 6b88709627c28825569d60772b6642a9dadbf3ea9904b290dc632a837d579d2e81284bf4350923c1863e0e8d5894a34b -CT = 29505af512768c89d84054cce8f8889e9b4a095098b9cec7e26a6afcf7aee5132fb43caf7edc068fb6aea3570ad9310a5c3329 -Tag = d0918033b6db5f999f26bed94d352af6 - -Count = 14 -Key = a68b64267d0d1bc2d94b9f691ff8e9e4 -IV = a27706bd8eae8bb3dc95a1b9 -PT = 4a99ab41c604d7210069d9228dd3223b6f7da215ddda16cf93bf6658784cbbfe08ef6a0152cef368415dff9f8d1d05ead043f9 -AAD = 8734fa3cecb5793b2b7bcb4fcde7808303c27c2c002a27e0dbaa378b3df4909e37c238a24faf49b6cd134419948bdec6 -CT = 43aa0432a1b468bec64de45b66b5fb3e8b2bd9277801ef53a1cd6757bfd45aab9c6b23f0a1f4b30fa33fe52fabe7bb86281964 -Tag = fd39ef2e94707a1aba57ff2de7c17927 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 2c1f21cf0f6fb3661943155c3e3d8492 -IV = 23cb5ff362e22426984d1907 -PT = 42f758836986954db44bf37c6ef5e4ac0adaf38f27252a1b82d02ea949c8a1a2dbc0d68b5615ba7c1220ff6510e259f06655d8 -AAD = 5d3624879d35e46849953e45a32a624d6a6c536ed9857c613b572b0333e701557a713e3f010ecdf9a6bd6c9e3e44b065208645aff4aabee611b391528514170084ccf587177f4488f33cfb5e979e42b6e1cfc0a60238982a7aec -CT = 81824f0e0d523db30d3da369fdc0d60894c7a0a20646dd015073ad2732bd989b14a222b6ad57af43e1895df9dca2a5344a62cc -Tag = 57a3ee28136e94c74838997ae9823f3a - -Count = 1 -Key = d9f7d2411091f947b4d6f1e2d1f0fb2e -IV = e1934f5db57cc983e6b180e7 -PT = 73ed042327f70fe9c572a61545eda8b2a0c6e1d6c291ef19248e973aee6c312012f490c2c6f6166f4a59431e182663fcaea05a -AAD = 0a8a18a7150e940c3d87b38e73baee9a5c049ee21795663e264b694a949822b639092d0e67015e86363583fcf0ca645af9f43375f05fdb4ce84f411dcbca73c2220dea03a20115d2e51398344b16bee1ed7c499b353d6c597af8 -CT = aaadbd5c92e9151ce3db7210b8714126b73e43436d242677afa50384f2149b831f1d573c7891c2a91fbc48db29967ec9542b23 -Tag = 21b51ca862cb637cdd03b99a0f93b134 - -Count = 2 -Key = b818752aa4452120808c3d211d57c224 -IV = d679a0be22c2daf619b11463 -PT = 7ccdecf13130c20f67dd6f47adec33dfb52bc84a7700431b7fd398d652a123f086ae197328cfaed127a91866c95bdfdb4849ce -AAD = bb853b60b5fd8bd24acc9db9dd3de48b775d4a5cb2a879c1dd78bde94cafee06db12a1574eade205dfd3a8c6f68599e120ec73b6b4559cd03d3118b2b1bbe340bb15320c6bf8d8a1c3c1247b4023ba2949ba6a5ab13f2d85b93b -CT = bc1a886c9e5accc34f0c237f7ed996e940e4b0ec882638e69866ed24d86467f5433aee23448df39565a0ecfff2c40e6857f725 -Tag = 5ff9c449d0bfa870ebefe78d519a8d12 - -Count = 3 -Key = 528b8948b534d5f780ae3f1e23a47a25 -IV = fec5eaf0a6d6f5c4adec9618 -PT = 9c5280591311dc212d6ee2ad8b83dedf03b91e244d8a42690c9a5821ab971453c8b4f63e15bb8af96aeb4a3e35515b651bc68d -AAD = d5134d84a96921537a17869c3ed08c55c29e0a67a30943cb248849843794c1c6fefc98659da9b0f505bdefc2e4ebe9523d2a165b63b5e3b2ba9535821d62aaf95b9c7e6ff1f8807a13e79b9fe589c0d9febbabf9372b01ac2051 -CT = bdf0b752160e64b626d5c543954570169e28b033f77b6ef8a37bcbae2a294a9e7060c3235b290f79c69c39a66b0d5ecc81d02a -Tag = f93768c97781ad0486f2f9e8210f2a22 - -Count = 4 -Key = 824ca85e2e4b2a6c6e6a65ef8616c57b -IV = d2bf92e7dc53676aac4e6d1d -PT = cd4828e5977d7fc5bbf7f6d1870bf6333c204087639a3b494a4037170b73fc6b32c4555d1a02a8837441734d6835a54bf35a44 -AAD = 465afd08d7260308d8d21025f31570e5dcd6bcbd6520ecb6ff85de58378d5af6eaf7cb2f1242c0c47b759c58dbc6e4b45c8b993514f14b82eda3fcb6a0df2075a0ab76fa0c5b6cb37d1d28f773dac591790887d2d72f03bcc5ae -CT = 4da02474ef189de863d53323ff6737c12efb3d60a890a8d53991de57ffc6cafd44c429a762a2154c5a937120db2161f2cf2ea1 -Tag = 949d399a7e2567b275c6f842de602605 - -Count = 5 -Key = 4f60b753a36b4b1f2e4d8300ddc667a5 -IV = 35fa2551581f8592134bba45 -PT = 83807c042900611f50fd42557b7cf66315872225143d2cdf8c05ccf688ff21da8f6a2556b0051285b8e7cb8aee05b72816abd5 -AAD = 9a006b7cea27f3b4a305ffb0c5bec7e3582c6a3be028ebf44bb2496dae1f492f765cc66c82d3a2212abd6142524e0727dab8ae506e6d5b9dd361e3a37df3bec95b14f1174e7f25c656aabb42981b91950755281c5ef8f52e57bf -CT = cd2291ac182ab6d0f7b6b93e67abc4228ab63a4c1b214caa11698d40d2a8aa10164b48624d39dd967f4c35eebf09acdfe59f45 -Tag = b231bb4e63dda90a11700f204dc2b175 - -Count = 6 -Key = 07b122a618bb54b8c39d579fe5518a5c -IV = 26fa33d4c5b37f0c5d07e2d0 -PT = 06cf2fa1c9057d4974ae9048b4878d75b0b4720ed2d7c340e6d983a7cf08d20013abeef881cc3213fe25b3f6ac1e17fe1c2e11 -AAD = 20966308f57d3a3e7a4ea149cc1f3edeaef11e8af780a16534472d8df7f706152ee376614426094fd745d77cdca28682d0d2e689d28a50610168d638b23cb4dffa95dd260bc72e0098722cd00126a07fd23ffba1d10a3ce46b85 -CT = 61a69d35967c85dd5e0741a9b88152c3b04b1824930cf6c03f1cb44c1258b71fa3f5233d2f4ee256353c0b8f6d470b53d7811a -Tag = e98a7a33748de95e22b520ba2254bce3 - -Count = 7 -Key = 288e7efe62b93b990f2398c2460e415d -IV = c7ebc0cd756d9501faf71a7d -PT = 5fafe873b9d30771f2ef8dad397a8b42af3fc8f7ebbea80d0132e1af14269a463dbd87e3e01a58c2d991eb3badcf156fe8260d -AAD = fcb20124c58b29ef7e39800d1e11c4063774dd2c462dd9e07d140d9f4b5ebe4cba7bb8cc03bf357b22096c9897cdcdf112b7a5f7d1e38d5c74c16924522cbe2443c157cc93146c12bae4da2b2f1df07f334aa1cc99fd7f7e2899 -CT = e5e69100c77d57e05a41b28be74b1c8542fd1f15e73fc589535ea1fac2d263fd92cdaa9908eab6ffd9194586aa3fed5fcd109f -Tag = 537516fb827cbf6ce0500c6feff4db34 - -Count = 8 -Key = f66c5b44e7a9dade5765c3f64fb2bab9 -IV = 3482a46c8d4f173e62ce1dc5 -PT = 80501408e23e2a656720b32b9f41f542fc64e9e8d824af115ece88d551a5f5d5f7fdb67e2339fc263dfdb18a78d423fd868caf -AAD = 1e77645efa4419b2c9696b8f989051929ad6a01fe2223ae68325f8176cc467fffbd198e008904b82af6469a3bbb095c4d00cfed143723ed6cf6ba4198c40eabd05c03e0260f8b2f55038e5c382690886280f6989357c50f74fe5 -CT = e778a946529444e2656505e4f5f6519d3ecad5458f8f1a04f31a8af97ca185ff717764bca6e99258a24dc97c322ac1c7f54fba -Tag = c5b2cb532cd05b162b47e94f6d79cb8e - -Count = 9 -Key = 41e8af55426edbe8f0339d0fba400497 -IV = 07eb87d42e90a075d4b34911 -PT = adc5504d0a9735d7b73fc53bd0ff60f2c881394fdecfcce3483efe126bf148e48db9c0fd356f82e62d743ec09f8906431eb5e0 -AAD = bb2e5c52f2eacc9b7706a2efe4b607858922fd6914a1e22dfbecab2a06464942f769a9c544f046b88a7570e2cf6fd8146c86b2b4decb934f04a81e6d48affbce1f5381ab31a9736b63f5a4e744731726a36357e858c0980d3732 -CT = 040d99698b2a5e0169f6f94e61159c135fb19c5917c015aaf8ebb4a451ffd8347428ebfdd80c83841d299318084c779dc91b0c -Tag = a16d6267efaeec13d6bc281316ab8be7 - -Count = 10 -Key = bbf947c0e805ac0641d540b471eb9d26 -IV = b57daf0004f43821f1ba86de -PT = 1211e9224ebb862f2d27de692362324942da12da441176c4742a228d7928d3c1fb3e83c66d68c619a10911fc2ed90226d4ae48 -AAD = e18d861dc9bb35a9efa63c7c1deaf53910256809a477f1c3db893b2389f1d137659033a5841b888cd6491bb574b782dec2c840f6350825406387d71340d275e62af3cc070c1389375d81ce98ad37c7afcadcd79f1c520a462e7d -CT = a6f6aa1750118b402ee1b5f025d29007e3cb162ad9e363efb9ef2d24c850f62db925bbb7e9a83ca6cd6f74251db72622857b29 -Tag = a72dcc29d358f794361f84202c9832f9 - -Count = 11 -Key = a56f4de6772b1242f1dff344ec9b512d -IV = 94d228087e821e301409f305 -PT = af537682c419eb7ca3fed65bcc364b01efc2455ff65128dedc88f2224603ef3d7246622269a12b269bbf6ac9d2d3b81abd366f -AAD = 6a9c61dbbfaa20a13320a5f1dead28bfbe5dcbe84fe0a3617c348bd702fbe746f439dfcabdad22ac2fa629793f545bc68459f1c0462453b5b31b747c3d29614f0ccd0745fbaa4b204d47d5cc7db35d6bc44bfcecdfae910faa72 -CT = 55b60587eb879105ce4a36555d8f799618238bf1f7fd4df622662bd07f450a18375ab7eef02a8036470428c4834f881bf05cd4 -Tag = 8cbe48d46b5c1296b05b2b6f4b24f7c6 - -Count = 12 -Key = 766067fa8f0dc348b77d55ab5317a609 -IV = 8716219953becc2d8918f3aa -PT = ab910f7300ec6bf57d7baf2b4474a26a7d7dfcd6b1044cd0b0b32995029a70627f8d2554429e13d14d78950fb1c79ed1f48c32 -AAD = 8106f9cacb894dc2f0c93c67cc06cd54af6c6d94193bd0bd9673fc702fc6b995941476f2dc584ff753cdf24517c2153f1e1c6e37fe6d86c1e4fc63bceb25749f9372d62a1932749dd21ef6010b2942bd0464bd64171063a778a0 -CT = 8bc822183f9e42f05429e064934d9f84dfe1713d71690e68981f94256fa4a60736607c5864e3b05e3730caed80004a9bb3adb6 -Tag = 439b0bcdd24a87429a4098fd8a05514c - -Count = 13 -Key = 557ef21e91f108f6ab451980837cf029 -IV = ac1010f6dcec713cba17cb13 -PT = a2ae838532cebfc9ff8fb62242b84df706ad1777a62f54c64d9b1777bdc0819438d34aa4c1906e0fae1e845b32d8fb65763dc6 -AAD = 5d09aa2a302e3ec2bd71b25d52053463c9c38a3b460f7b980aad6c91d5011570be8c23b4db518701f4c5a157882695ba4ac140f94bda13d9824a8976d436492baaae6c4f8367683199695a1f6bcda2f645b188aa5c286fb91c8a -CT = 94c1941887ff94f34cb96cff2b6a25f660ce9b3ac54963960e70ee49500dae6a20d3307393f37d3a4a35c13b58f7bff0f5de7b -Tag = 95e574f70f5efa14b8ee21961972ee3c - -Count = 14 -Key = 55c8bcb0021090e4b2c785c79cb966b8 -IV = 5e9f1313282f73d7ffb92837 -PT = 2d7c1b689189bbfa2be26ad5c1f296dee4c0f61456ffc94cf8e70aad0f09d0608c4115aa6ed5eba93ed5820b3f3426bbf4d64a -AAD = f7e14a57e3bb6b99866b90573d7bc355baeb7ac347e43d0b65d97ecc2eb9c772401a8e3c7e9e2871c2b79579d44c139e62c33b42a9e0c87686960009d659d5e3874e168c334b6650c6d36168633757a7c20764232ce94a0de1a5 -CT = ba59002df3394c5b80983519dc163eca5c44df80f8c4c4e15d3ff73f13c170c80a59d87a2165a7b450be01031a8e41c505c89f -Tag = 28418c564731bddf3d504d8ed32e66ee - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test1.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test1.txt deleted file mode 100644 index 29bab8fc..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test1.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 11754cd72aec309bf52f7687212e8957 -IV = 3c819d9a9bed087615030b65 -PT = -AAD = -CT = -Tag = 250327c674aaf477aef2675748cf6971 - -Count = 1 -Key = ca47248ac0b6f8372a97ac43508308ed -IV = ffd2b598feabc9019262d2be -PT = -AAD = -CT = -Tag = 60d20404af527d248d893ae495707d1a - -Count = 2 -Key = db1ad0bd1cf6db0b5d86efdd8914b218 -IV = 36fad6acb3c98e0138aeb9b1 -PT = -AAD = -CT = -Tag = 5ee2ba737d3f2a944b335a81f6653cce - -Count = 3 -Key = 1c7135af627c04c32957f33f9ac08590 -IV = 355c094fa09c8e9281178d34 -PT = -AAD = -CT = -Tag = b6ab2c7d906c9d9ec4c1498d2cbb5029 - -Count = 4 -Key = 6ca2c11205a6e55ab504dbf3491f8bdc -IV = b1008b650a2fee642175c60d -PT = -AAD = -CT = -Tag = 7a9a225d5f9a0ebfe0e69f371871a672 - -Count = 5 -Key = 69f2ca78bb5690acc6587302628828d5 -IV = 701da282cb6b6018dabd00d3 -PT = -AAD = -CT = -Tag = ab1d40dda1798d56687892e2159decfd - -Count = 6 -Key = dcf4e339c487b6797aaca931725f7bbd -IV = 2c1d955e35366760ead8817c -PT = -AAD = -CT = -Tag = 32b542c5f344cceceb460a02938d6b0c - -Count = 7 -Key = 7658cdbb81572a23a78ee4596f844ee9 -IV = 1c3baae9b9065961842cbe52 -PT = -AAD = -CT = -Tag = 70c7123fc819aa060ed2d3c159b6ea41 - -Count = 8 -Key = 281a570b1e8f265ee09303ecae0cc46d -IV = 8c2941f73cf8713ad5bc13df -PT = -AAD = -CT = -Tag = a42e5e5f6fb00a9f1206b302edbfd87c - -Count = 9 -Key = cd332a986f82d98c215278131ad387b7 -IV = 1d12b259f44b873d3942bc11 -PT = -AAD = -CT = -Tag = 34238023648185d7ef0cfcf5836e93cc - -Count = 10 -Key = 80e1d98d10b27237386f029189ec0448 -IV = 239ebab2f524fd62c554a190 -PT = -AAD = -CT = -Tag = 4c0f29d963f0ed68dccf34496cf43d00 - -Count = 11 -Key = 40650cdb61e3e19a1a98fb4e05377d35 -IV = 69f0a81aaf6bb8486282f1b9 -PT = -AAD = -CT = -Tag = 2657e12dec21c3ecf071af6179529fb4 - -Count = 12 -Key = 1e89a6cd7528cce1e2b2b5f7fd2b6b52 -IV = e11fd427a782d543f78efc60 -PT = -AAD = -CT = -Tag = eeedff874c8edeea53e8be2a13afd81b - -Count = 13 -Key = 2a7ad6146676057db777dea4683d0d45 -IV = ed721ea67456d4594aafbd51 -PT = -AAD = -CT = -Tag = ee3cab5778888439d90fa718b75738ad - -Count = 14 -Key = a364f494a4cd0147c34731074dc1a85b -IV = 4aa8470dd404e4054b30093a -PT = -AAD = -CT = -Tag = d8a7bba3a451902e3adc01060c3c91a7 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test10.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test10.txt deleted file mode 100644 index 76afe92e..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test10.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = bd7c5c63b7542b56a00ebe71336a1588 -IV = 87721f23ba9c3c8ea5571abc -PT = de15ddbb1e202161e8a79af6a55ac6f3 -AAD = a6ec8075a0d3370eb7598918f3b93e48444751624997b899a87fa6a9939f844e008aa8b70e9f4c3b1a19d3286bf543e7127bfecba1ad17a5ec53fccc26faecacc4c75369498eaa7d706aef634d0009279b11e4ba6c993e5e9ed9 -CT = 41eb28c0fee4d762de972361c863bc80 -Tag = 9cb567220d0b252eb97bff46e4b00ff8 - -Count = 1 -Key = 11f47551416154006bf89e7594ea2082 -IV = d546fcd3ff2a6a17461e9e94 -PT = d3783a3d7a1e091f9cb647bf45604457 -AAD = 49efdce48e821eb14eca5f1dd661f8b6b9a5a6917b08ec9486c29124ef1e7a9af2217494eecad3d8eef9fc22d29ce18d92006de1588c3b06f8db9fe809bede40908cef4f46d2c4b6f92ff5a8304362749143dab266de45bf5b4a -CT = e97988a6645b93a32e8296bb1dbcb8f9 -Tag = 399345f974a82a2a75007c84aa08dc1a - -Count = 2 -Key = 0736a1f074919dfe23bf2a828eac2b26 -IV = 5b2105166bcb15efc07f1c03 -PT = 402b5b45dbbef7f1d955423e95cda404 -AAD = f331a6f6d31de69f116b27fcd7f914aa0b2c3a09490360e7863417a2346030cc99b6ba389e65e0f10fe0815d383e6f98dd8bb97d29908560ce98e4bf177e42e14a7137cfd30b7dcb4d8655b3c03514e95adf698645584475865a -CT = 6e9e79e29f3085183e0a7ac7f6ba1d67 -Tag = 84434e0c82b858ec27e61c54ecf6cd94 - -Count = 3 -Key = a3929d753fe45a6f326a85bb9f1e777f -IV = aed85f89844f061113004d2c -PT = f024e796f449712b70d5c7fe5be5fe14 -AAD = ecef72a7ae9e6bd15e63c8e9fb2a3a7c53eb9a88bc05296ff6f25544f681fff5289a099d38abb68316eed8215ead9ca0462065bee79fdb63b4405384053fdc68fe4124a883f50a2b4bc4df6e29383c2ceea424e4ac539b26c9ce -CT = 349e770a7f7dc2fb41fa089bf723f6b6 -Tag = 26f12bc8777d724fe59ad4fe2b9757f4 - -Count = 4 -Key = 85abd6c7b90314b29bbd293ff113637e -IV = f48f4ed2eb7b7aaeb017ee72 -PT = 542c6fa7e7cdaf21e6f6b34517f26ab5 -AAD = 2b825d477eb96e0d8d787ee4f284eca567fb5214b47e26705389cf9fce4b8dbc49a152df5e4accb0adaa19b37c90fe7d6eb456a067f1c2b63b61f6d596209f7ee96c85aa48f1870e9338743edff1d8ffb61dbdab88b6755fa135 -CT = 8374f96f03780724a8e8d1f11768d44f -Tag = b41b53c46ae76eff505cfee47a8daaa3 - -Count = 5 -Key = 0a2f29710feb7c86175a37c41e32fadd -IV = b190fdb91061a08ef82100b8 -PT = dfb6284ffd6cc195ed75db0c9faf5559 -AAD = 0af4d5c1ec517a1fc104aea7d513b591b603634fc558007e06d6cd22997407eb8281a742aef6e88ba08f10c64b423121d898bcd04c1f1d6c7c12d673aa1abb004a8525f1d7abc23c8724885179e292c0565a39d9f5c6d2369e37 -CT = fb6cb6527b92dc2ef6a227e8067879aa -Tag = e01037f6e9d62c18b163a714f85a92cc - -Count = 6 -Key = 470d577137c5014b78137dc6b24efa6d -IV = 4afa7f5766f8345a1b12042b -PT = 4745cb9a3ee3a76ae166dad5a1b62b1c -AAD = cfdd5d42e0d0127a1c0d3c4bad302ef23ab63d879fad71109f4792e5b21156dafdcec022fc323028a9fbcafe0c3606ed61b582bfa00ba6e5c9a1b13b976d67c14c79905a769399d967b0dd45f0e74967b67d7bb67d9466618fa1 -CT = ca58ced863696bf80ae0191de1252333 -Tag = 246d451faab88511467e38b60c5b46c7 - -Count = 7 -Key = 5cf9cfa4d367752f1354037e132bc948 -IV = 13e6a286a6c7b189974d7ea3 -PT = c7ef33e7abc8f298b2f224cf5218661d -AAD = 65da4dbd6cef7fc8a09a766a6f5b474e9711a2d40faf841c467a8838e5c8cada3f1cca74ed3b4cdda6d5d334c91763e798b9c7891b291dbf46d89ddc728d72f93c95e081bc340448519aeccc6d105bf1696b7ff9c0b7c006444c -CT = ad88f4e7b980be05b3df0fc05a49d1eb -Tag = 0ad15378f18f4338966e8e17951d8dad - -Count = 8 -Key = d1dafd9e07ab0f903a9b00d6e353d67f -IV = 8a96a0fe88f0c7e3077c38f4 -PT = bbe4ccbd26522d35ca0d483341385e2b -AAD = d3e1ecd06f79e6839767d957c4d715b4228f4cbca7afa429d860c5db2a6bf4a3ade2d00b91875fedbf9b09e9ee5e69182f326fb36fcc35475efb32e5eada3a6fa6046c8d0c0ee933b0e7f37c87b3eb8b9c0c2b457f8695d25875 -CT = 9d016cd94933c07c10b92af40eafac7d -Tag = 022e2dd58ac862962e7fa0536bad87cb - -Count = 9 -Key = da5236b254ee2ff5d7e73d7a09574177 -IV = d2d91f5c302212557fd62bce -PT = 3aaa2a7b2605686c3444bb16df8c57a5 -AAD = 9ddfa05290e228e5eceb7e96de3a097afaa96d8d3e0d5ffc0e0116f43814f5b0947919267c2dbf0e5f52a97296e7826f2891dd4a043c845046c9ab9ae8327346c7695a72875b9062dd5578be8985edf9faa4917981aacc6f112f -CT = 202a8e67d7f22ff83757fc9ef9b20a0f -Tag = a55bab242a4ebe73b52cc7202f5cdd57 - -Count = 10 -Key = c3e577da2a2b7fdd05c99dc6fc81ccdd -IV = dfa747b08f536915345766f0 -PT = b863120426d4cbd5c73124c7b0342fa7 -AAD = 872a6d0e3a0a3b32f4c92a4e5baf7efb7270a9ab9cfcd3c1173a2fcb2c155a923f9d8b8e35a965b11d15e2e0cc591e953da81c172b8882344cff7b40eeaa30d4793900dd85cb65fbeae9d1d3b2a62c66cb932dac1e6806ab6150 -CT = 43da888047cb1cfc7dd42329310c8234 -Tag = f8267635aa7b51b89c80fa979861eb3f - -Count = 11 -Key = 69e1c0917ca8d49aa69f38cf9c66eb4d -IV = 0c55672336d219e64c60e15d -PT = 7dac3e31269dd79399c94798f4bbc640 -AAD = c1b423f27d794e947bc56aace3995065279221f5b8bef6568b5b2882209bf0dd7776e9ae6eb1a1eda0b768aeaaed9e3884cc3968b6d179e9e5abf08df8261c3ee54f8b0eaf2646cb221288a879c5ea4e9183805dc1da8a636a58 -CT = 37d215a13362bf087bcba8f95901eb05 -Tag = 1b3eecb7ae9386dbc1409e70f5827f58 - -Count = 12 -Key = 08818d516558631161e49eebd621f78d -IV = f1f855eb8aeccc9ddf7aa80e -PT = 1a89c9c9623a26b7c8062c5f6a5f7f98 -AAD = 68fedf6a42b780eeb011aa0b242636668e5c8941d6045b05c948f82c5db3977831435ab4049895b607e854f710e3d8b7a26afaa2e7913093313e93c3e106a8356d6c44579398ce4341aacb3b726e7f42fab75934920df230cb4b -CT = 9e12e3842ff7f5c25a171cc4c5a3dfa8 -Tag = 01cd4980d92df6739bedf22201a2cc12 - -Count = 13 -Key = bfa4a12b357605b11e65fa92b90d22fc -IV = 9aeb721b698db40dc9080e23 -PT = 9383358a4065f3e365924f7fa664012b -AAD = 53bc66164811866e12ebcd64447c999777378119a257fe00d45b5c9392d5618f2c2c784696f5a9fea85d0f8c9cb5438b15b3f5661d49e0b0980ff61aeee0cdf650ab4fa82bcb0d0390f99daf02d8561bf5bca5627e3b194951ae -CT = df469d986744c33244682184912cdd68 -Tag = 8c12f8338ffb7840e085fdedaa6ab3cc - -Count = 14 -Key = e16a57c83f230c368a0f599a7ebf3f5e -IV = 2631b811ea57cb7d58fa232a -PT = 2a37e380f575e4365116fe89a58ee8dc -AAD = d5bc101ad26f7d03999eac122f4e060f20a402ff8a2a0324a77754e1eb8b7a65f78743ac2ee34b5429ec9fd6120fe6d17e71f738cebf0ae39a5be5a4dde85384d98cd90d218785b08daa662f24187156118fba981b9691cf12f8 -CT = 9278d1eab07dc7fa68742059d9fdbe60 -Tag = 27a474294ff811db4f6e0c88b1a86b0c - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test11.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test11.txt deleted file mode 100644 index ad71d55b..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test11.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = fe9bb47deb3a61e423c2231841cfd1fb -IV = 4d328eb776f500a2f7fb47aa -PT = f1cc3818e421876bb6b8bbd6c9 -AAD = -CT = b88c5c1977b35b517b0aeae967 -Tag = 43fd4727fe5cdb4b5b42818dea7ef8c9 - -Count = 1 -Key = 6703df3701a7f54911ca72e24dca046a -IV = 12823ab601c350ea4bc2488c -PT = 793cd125b0b84a043e3ac67717 -AAD = -CT = b2051c80014f42f08735a7b0cd -Tag = 38e6bcd29962e5f2c13626b85a877101 - -Count = 2 -Key = 5bd7362f38bafd33ff4068860eb35c27 -IV = 6064368166c48633b090cb9a -PT = 634852a6b68543ead889aa19ef -AAD = -CT = 3a44f911376c371e6d597539d3 -Tag = 452b67e9d36a9ec5a893272b4d2f2103 - -Count = 3 -Key = 2591360228dd945aae8fba95dc2725c5 -IV = 2adabc15c16e5c5954c8ab01 -PT = c580b051600dd902b273e26677 -AAD = -CT = 9ac66aa93d7547bc0a45baf5ac -Tag = a609413c9c13817287f39cfcf4da2e6e - -Count = 4 -Key = 3c85f64e35953f2caded63f987592611 -IV = 7ad13cb40e21ee633251968f -PT = 7bddb4037c2be00f4ef6f85ccd -AAD = -CT = 9c2030e3e19e490c309610d889 -Tag = b0e4080a8dae54a6770f4e21d5324e90 - -Count = 5 -Key = 7b8d32382d29c00198f1d41fc6b52b8c -IV = bd65d7281a9a6aa9fc268f61 -PT = 10f27dabb9c9e9facbd21b13cd -AAD = -CT = 707efbd54aabbecc22ee6b5304 -Tag = ca35f5dea869508653ce556c9c05d32e - -Count = 6 -Key = dd95a8ca25883353aff5c414ad9ac5c0 -IV = be2ed3a4d38fa65cf341e5ee -PT = 5b0c29c8bef219d52932b33041 -AAD = -CT = 4918ace25961fae06dbd891d16 -Tag = ae6f069accfacba61a38323dd65f4c02 - -Count = 7 -Key = 4db01983f6ad9e39385070b810c26c80 -IV = 2342dc3fb660e3925509b6ed -PT = 5cef6c4f05073ae39e05356dc5 -AAD = -CT = 12e41f4373f1e5dcfcf758e2c8 -Tag = 36fe1b8981946fd16cf12ad80f04d59e - -Count = 8 -Key = 8d59f931d4cf8a2683e269008ee86062 -IV = 7ac862a09c3408b667e8cd38 -PT = 2c47413a8256f25677b1de8ef1 -AAD = -CT = 284ff4dfe4255f56b4a56585a7 -Tag = 16c0a4a5826e291d4b3f7ead6892c392 - -Count = 9 -Key = 01c681e2cf1d7c8484c3811201376187 -IV = 56a8f48a3198b977f5064d02 -PT = 37dc0f572c9e51c6fc18642d7f -AAD = -CT = 54922c65023605c1eba146d448 -Tag = dddbf654030e73be0dd6d26b67efd0e6 - -Count = 10 -Key = dae6cfda8979801d9399006797a2366b -IV = 1cb41dac13ffa72e72a405d0 -PT = 9f43ac53d4cec80dd29a902d86 -AAD = -CT = e156a5f0711096cadd489937a7 -Tag = dfa2d2a342b78ac6e7276365f2fa6dc0 - -Count = 11 -Key = 5146ebe3d1fdf166ffa4099b638c5b64 -IV = 10014449817d881328c2b882 -PT = 700af6989527eb16ffab6634d2 -AAD = -CT = 8ab35c288f09084da3c0cbd240 -Tag = eec8232f2907b2e1cb2c940622530d25 - -Count = 12 -Key = cd70f86fc0a1780740fefef5742e4398 -IV = c2abd119f22d310b34f41c5c -PT = 39fb497a2691264f02fcba4887 -AAD = -CT = 01339a3a9119836f6b038a1a50 -Tag = e45a0a12c84ebaaf1885f457507b9a5e - -Count = 13 -Key = 8828454ceefd9004e30ae8a03d71f9d1 -IV = 8d9e3c61aa687a8f2b9ee30a -PT = a94b020f4724178a3f4f9137c5 -AAD = -CT = c4a94f89e03305aa415c7b350c -Tag = 1acc1c75b9fc826af2e950cc7be6cf64 - -Count = 14 -Key = 47982f133cb72342dd642f3475bde634 -IV = 8304304acea2def778f2bf9e -PT = 2c97a5fb6df85153a5c3bf414c -AAD = -CT = 37e0962960edcf0a09a8538cac -Tag = 07459fa438e1f159a6649a8ed6f934b8 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test12.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test12.txt deleted file mode 100644 index 5f500594..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test12.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = dfefde23c6122bf0370ab5890e804b73 -IV = 92d6a8029990670f16de79e2 -PT = 64260a8c287de978e96c7521d0 -AAD = a2b16d78251de6c191ce350e5c5ef242 -CT = bf78de948a847c173649d4b4d0 -Tag = 9da3829968cdc50794d1c30d41cd4515 - -Count = 1 -Key = 3016620015db1d85eef09bbce50ae294 -IV = eb481db3a52201173e2d4ad7 -PT = 38b57c0d4151d7ee57e032829f -AAD = fa3d95b81a619638cea3f68dfbc02133 -CT = 7738601ab14748223164d1f69d -Tag = 63ca9e8c27d9fa837ca4a0bb7039e390 - -Count = 2 -Key = b3ba382909e94ef5d318ee32cb54a33e -IV = 3cf10b1700711486119cfd9e -PT = 4a90ad3f97c9c7e82efcbb318b -AAD = d1e17c0189b04561699bd2f791d69491 -CT = bdf6a8a11288e83126932cd946 -Tag = ca7ff7458c3adf388eef7e0e32d6b2c4 - -Count = 3 -Key = 0a8fc9e07eb50b092cd9fccb3db2373e -IV = 371d0af80bb20f2ead09dc22 -PT = 7826bf01e962a201f5c8e7f742 -AAD = 9f42976847531ddfe428694f61260b2a -CT = 665cdb3e2568ee1157d877dd25 -Tag = c66fc129ecb30ea0d54b6d6932d9d7a8 - -Count = 4 -Key = 3d1fc93233e86cb882e4cd754df63754 -IV = 1ede8cadc78bb4733c341bac -PT = 74232bfedc377efd5a63ab77cc -AAD = 5807c856944fee1e6c2e70ad9a08de00 -CT = ff3e09311d59bf1f3dff474fd4 -Tag = 7dbaf75ab6084504e080460ebfd255af - -Count = 5 -Key = 936ba9fc715c6e2d70a7986b14b82ce6 -IV = 45b3239d045bd56ea5a0e77f -PT = 941255369704ec192bab1cf039 -AAD = a2570d9548bd6c05f824577871784ee4 -CT = b3ead079446053a8206f4a37a6 -Tag = fa5d98f053e8520f45e1597ee38b3751 - -Count = 6 -Key = 96a05889a7591c1918472fd26977451a -IV = 7d80492afefce80da6689ffc -PT = b09b2dc5c5463a03dd5c9b0ecf -AAD = f4ffa36a478c795e0d28d37fa9e6fcc2 -CT = f7cb053d447dddcb6e3a2d891f -Tag = 2a38f63a1b7cdccec426683b34a44ff5 - -Count = 7 -Key = 7c98567fb5ae9601fca412e72dc9fe2f -IV = 1218ce69073eefd25a7944e6 -PT = 0df75d39d8facc3accbdefc87c -AAD = df4203c3402d2b328bcb44e7683e08ab -CT = 7e5ca0d1c1ff83bc3633f2301c -Tag = 7ea717458ca93d8844da5df7ef74005a - -Count = 8 -Key = 4e1b199c12f12b591c051c7edc608d11 -IV = a4bd3af7f35d0fa21f73641e -PT = 051ed5d700a7e59990f0358928 -AAD = dae2cd749195bcfb67a663789e85995e -CT = ae50359f104ba2089ae98eb45a -Tag = c08a7cce7c38626604032d2be9bd519c - -Count = 9 -Key = 9491cb5d4f2b94cc5a50dc67bfedd074 -IV = 8377399607418e8d51dac5ea -PT = 2a1e50ccb5a52be3d338e8f0a6 -AAD = 972d9c486961334afc104765c2863253 -CT = afe759b51318f67d872a1dfdae -Tag = 77a4493aed7e3a6e014d0a1a314c3f86 - -Count = 10 -Key = 0993571183089c4a7bd8e8789854c265 -IV = d72ce6db33b33e2a2d430d2e -PT = daf7f3ec2e2592c65847734f40 -AAD = e47252d2a8ef5190faf328176588609b -CT = c6fadec0c7520f717144f0104a -Tag = 6670c8cbf7e9eb431e899f61acccf456 - -Count = 11 -Key = d45b6c85293d609310eb3179cfbac4fb -IV = b02328302cc469cda1c7eb48 -PT = 70f5af8c1da987f6ab5dea31de -AAD = 74ca5b46ab31a11b4b4c253666844b32 -CT = da6b359072accf5f036c85600d -Tag = d8e496c53797b124e356967ee525c0ca - -Count = 12 -Key = 9326155a9b81013c1edb143f9f5ae9d2 -IV = c95383eb3050ebea4deb80e9 -PT = aa80cbebfb01b035a4e1e50e35 -AAD = 64a73f0497746436ac94c3c18e1ef6e1 -CT = 45ec8de633c7bb585c0a7fea1f -Tag = 537b6103b0f7c5dce82bfa37c2734877 - -Count = 13 -Key = 9192ce4d383752e9d9c66b93ef7f05ab -IV = adabd3baa4374697c53b4289 -PT = c55b5d16e3cee22bad1f5420ba -AAD = 14cad0cb1736ccde73f86897ea017570 -CT = 3aa22a57646229fd33bbfae6ce -Tag = 5ce7cd439823538fbc194886348ff029 - -Count = 14 -Key = 3dd104297e803dc22b8f11f1951c8508 -IV = 8abd1fd8cd88ef848e8ce082 -PT = e1eb53704ccd5d7992f1c91097 -AAD = 96f6c82aa93ccca47056efc3ac971613 -CT = 8e4125514870003f0b0e8044a8 -Tag = d951047cd8d50ca5f7ffdebf78725c56 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test13.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test13.txt deleted file mode 100644 index 5fd88983..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test13.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = fe0121f42e599f88ff02a985403e19bb -IV = 3bb9eb7724cbe1943d43de21 -PT = fd331ca8646091c29f21e5f0a1 -AAD = 2662d895035b6519f3510eae0faa3900ad23cfdf -CT = 59fe29b07b0de8d869efbbd9b4 -Tag = d24c3e9c1c73c0af1097e26061c857de - -Count = 1 -Key = 544ec82f837fbe561f371b266cc52ed5 -IV = b756952a0e98cf4cb024a499 -PT = a2e81f78b8e3e39e6cdf2f2982 -AAD = cd0a24fd0f6a693a1578b9dfd2a212e990aa662b -CT = a4f08997e2d93c3c622137f9a8 -Tag = 059cf266240236fd3f41a3f4fabb36bf - -Count = 2 -Key = 91b73e2061b02b1e5e4c150ce1df4d27 -IV = 8b15597c84db62e2d8b03857 -PT = 21e1b4b405050408b08e5e2a97 -AAD = eba7f1a060e81f4ae7a77346d74dae9263ec284c -CT = 0f819b25fc683c182533503ad8 -Tag = 5a1da6290fef801f2131614f7cd2d0bf - -Count = 3 -Key = e6a1e4260efb2bb3073a1ab475e901b9 -IV = be445fbabc3866d702965b08 -PT = 2897d77c7f20679cbf27181aca -AAD = 9452137225de644f94556b382ac13915e8261913 -CT = d56e2d6d52923205291fffa50a -Tag = a6acf19c5434f95e333827ed9c7b88ec - -Count = 4 -Key = 49c18bed9412346a8ef02351cd4680d6 -IV = 7b5a7e9beec5b627f78bfd1d -PT = bafe851c800f6df67e941fb496 -AAD = 251b9e935d72c1ed05795c74c88b6d4a03bd729b -CT = 6f0c2eeb0a37d51d78314c3414 -Tag = 1a75d962d34205d60f79e4de87381046 - -Count = 5 -Key = ed0334239eb6f1ee1d686df163d219b7 -IV = 6146338e40fcd8bf264bc83b -PT = 954ddf553bf66473657110a028 -AAD = cdba8eb5713075497eb5abf1434045a010f81832 -CT = 3eb76dfd40c5ebc840951d1b28 -Tag = 5d5aa1dc4a663eeb847e540f9a468155 - -Count = 6 -Key = 14ab4d3a91e8f8320edba5b045b9474a -IV = 83c6ac97704afdd24fbe3eba -PT = de5f1521ce9423526932917863 -AAD = e3981ea2e7468973a6a998deb7676d06630bad47 -CT = 19936ae7d6620899649a5c7887 -Tag = 66a805353bde0b1315f772d49eeaf8f2 - -Count = 7 -Key = f822c39eaba3ebb3d8b58cff3845ac59 -IV = 1f5d11c469e9fb74f19d8581 -PT = c0fac87ca518ab22853c8fa02b -AAD = b33871f65233bb2ba773cd8fedb517179a2a24a5 -CT = a072381956210925148e3bc55d -Tag = f716ec012f7f9be988a9e450da7aa2fe - -Count = 8 -Key = c566e9995c03a777f9999446382ef2fc -IV = 4f343477387f48b9c6d15e69 -PT = a9eafd8903c71862c7c99cf068 -AAD = c2b73bf0d1abd6d484df725a760f184bc315e0ba -CT = 9f9551a3ad017c3fa518964704 -Tag = 15383fb8ace2e001c194474031c14e87 - -Count = 9 -Key = fa2fe01b7cb4ca24aba5880da268398a -IV = 93f19d0a8edf1f29364743f2 -PT = 006c3b0681f21ad705cf94d070 -AAD = e80f337eb56c336d1e928db3b7eeee968e2f75bd -CT = a73b314c7f0bbd79ee56bd77bb -Tag = d2f9ecc80a5ae2e1d2735b9fbf01be25 - -Count = 10 -Key = 77b34970d4300069e0092cd64ad17305 -IV = d88e76814f3cf7a2f887e371 -PT = 4e65a46a4579f08130272e5c83 -AAD = 7c772010e83befec22f6aebe8e18a0437f50a573 -CT = d2d8ffd3f841e6039f1d551905 -Tag = ee2c73c455081d84a631b18a7fe5f789 - -Count = 11 -Key = 3c1c2aae3954d6f645ce2a697a4f3af8 -IV = 04b54f6447ebbcfbda57445a -PT = f73e226b50a75558a389ccd738 -AAD = e7a9d5c8328278311dca3e84da2bf0f573198d4f -CT = 770e4b798b91850ec4e90136ca -Tag = 8cb9ce2c90417f1c49a235de9b2ada2d - -Count = 12 -Key = 15ca2910df4e43c44a7c01d485b99157 -IV = 4a65ca77dde14bbf131dd597 -PT = 786744b394e40bfe5db938c0ad -AAD = f9011e2cfb9c82d37f6b3f2af730a2e28c036f2c -CT = 43c00fac7c11c3273078f09fe2 -Tag = 955beaa87737d3094bacc42a15986d83 - -Count = 13 -Key = 998990fe4a9a6c56efdf1deac41a1ef5 -IV = 1b7a766436f4a674b5ed86ab -PT = e53a9954c3943691dee5b17991 -AAD = 2eba6f2c61704917434507f4a2db16c4906bb4e5 -CT = e5682045f438f4a96ac870690b -Tag = 1afddc03809e565321ea66d8c83a324a - -Count = 14 -Key = 268ba76816d00e20997da268bd8faa18 -IV = 21cd5d21ed193612fd6db854 -PT = 16339986d092027e7cbece0fb6 -AAD = 1971b90da0554ee7b6b0a5e9a782f05d511c1b99 -CT = 7cfd53b8c3c834c213d9860499 -Tag = 1f8522bfab97bec436d768332ae37c20 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test14.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test14.txt deleted file mode 100644 index 7c8f16c7..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test14.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = cbd3b8dbfcfb11ce345706e6cd73881a -IV = dc62bb68d0ec9a5d759d6741 -PT = 85f83bf598dfd55bc8bfde2a64 -AAD = 0944b661fe6294f3c92abb087ec1b259b032dc4e0c5f28681cbe6e63c2178f474326f35ad3ca80c28e3485e7e5b252c8 -CT = 206f6b3bb032dfecd39f8340b1 -Tag = 425a21b2ea90580c889134032b914bb5 - -Count = 1 -Key = a78f34cd0cac70aab64acae18e3cbeee -IV = 3c88570498da96e7b52c7929 -PT = bf61b1fb3b24506cc8c730d399 -AAD = 36b66ff81ec23a28944c98d2834cc764bb70703f0b26e079b6eb008ec11ccfb54a189ad393878f0824436ae69e7e2d8c -CT = f72057f873ad12b5e19ce433e0 -Tag = 1fea5b4176464b1f5dce11558a75ec21 - -Count = 2 -Key = 0e038a1368999e2e70b6e350e01684bd -IV = a58952b8135420cd0f61be18 -PT = 801bbabf908ff04d5856cadc2b -AAD = 765203b3d61537be2883fba9899c3f3eff60cb9714e54de3a78a96dbf29cf53d82112e19b10141f13b11627a8fa55026 -CT = 7f0f35cb15fb4e7e3820d9ab1f -Tag = 8dce643720d9d6f90f13a155e0be5936 - -Count = 3 -Key = b69d82e78b22a473af6234066b891778 -IV = 0415ab2f32d2a15006c3bdd5 -PT = d4ab346edaca5c84d45b45c6fe -AAD = f0be65105e1cd4fd1a272f7f6db958040b44edd0608b2225789cf34217cfcd6a5879b8e79dfa7d24345ad20f0c4f9a1c -CT = ad77c91c6ba6cb29eb5e4f6071 -Tag = f67061dbded1a8df55fe9fcd68f61168 - -Count = 4 -Key = 78faf937758f34b6d314e2fa30f60c2e -IV = 85c9ef0e17ebcbb7227ba4c1 -PT = 0ad91a8be4ccd6ee0ce75413a3 -AAD = 70fec6e608b6264228b822e7490e5e76398494c6489de5e839fb80513442cd0dfcf883000995185213e283f49234280b -CT = 4298d0a1ea4c54950021d91921 -Tag = 19893b83fd24a8c21bb4ff14612cdb27 - -Count = 5 -Key = f812627cb6dc5921d3567dd17f1f3b9a -IV = 37beb9c060f240d9ff78c844 -PT = dbce5235bccd0bc6249b30e9b1 -AAD = a27fd811330efa672bbfa1cb2a221fa45bab88c5183eed6383e34c7e7450fd577f6c783c75d9ecaf74bb2ad2b2e8c143 -CT = 100ab04960a762db73174666b4 -Tag = 122172ee3093b8cb238a7c991da3b94f - -Count = 6 -Key = a495f82751bf7781fee36d265607aa6b -IV = 729a513baf1ccd1c97311700 -PT = 0ac413fa533b01be459e95d784 -AAD = 3a44a7ea6d3ed13005d46c19f5ec7d2f7e50e8a268fc49e3c6fe15b41b6f6ea7245d88cb358e53cdba82cf297ea0ea97 -CT = d05f52a875f56d3a6971495b7b -Tag = 14ae378a5f75b386202194c677377803 - -Count = 7 -Key = 63eed2623c80ea1c5d06a0003c4b3065 -IV = 3a276f4361cc6d7bdb340986 -PT = 65067b281d5aafc0146d206fe2 -AAD = d484646fdca9f5d3d4fa2c85ed145f99e3c73f4d81f6c08eadf318694bd7cc94382cc73a5610f9cbfd9987dc167d670c -CT = 4cf2ff71e44a39eb6a9611e150 -Tag = 113e7d239946d784c331bccd5e098194 - -Count = 8 -Key = 3ad85304b4267dd603070c1a999eb658 -IV = 2a02a6220d395dc91fa0d220 -PT = e0620a9e28ad8dba32b601c662 -AAD = 7a1511cab8aa9f7277f7b26cdee602e4a608b5565a20eedd66d70507a90e79da6521cae1e2ca810771392567af51d883 -CT = cf38f7abaf4f92414ecb7021a8 -Tag = 8bebb0b62c81a4a3ae765dbc7c8747a8 - -Count = 9 -Key = 63010b75ada3ccd0c1338613d57e3f53 -IV = 9898b912da0a2f169c3bf907 -PT = fc10d85cb5485be263374aaadf -AAD = 565e1e581089098451ccaf1d594d1b4edbdcd5cb00ba4b2e08e4db780ce8258df41d01dbdd50521b75a72a8259f70321 -CT = 8f2390e88bc6f18ecdc1a1b9d2 -Tag = 15c40e98b6bd5b07d4757727ad6b7b71 - -Count = 10 -Key = d2a18188bb88312ec18916431b6dd880 -IV = aedf2efb80b633d7afbe5a51 -PT = 343f8363662077fb0ab50ba284 -AAD = 52492921f6b76e888baa5a4cb391af04faeb31bf00e8ed4363482fa95148f573b9adbebabf48d3ad33cb5ed3c0d6df61 -CT = 97a6f44a04055850779bc70842 -Tag = 5ffb75b58b4572366fb006455f692f93 - -Count = 11 -Key = 7b3b81fa87f6fc20795e5fe33fe0d1e8 -IV = b858127e11ea0d5ba523f7ce -PT = e574920cdba3524bac8c2294bf -AAD = c23d4cf74bd76adee0973e4b3ac31a96fdeb0f2455e044d2d1b82ebd1937e09623921c81b6a1b9698b5b097b7c5c483d -CT = 016a7b57db778fd019628016f6 -Tag = e8035022b05e4c10792321d195b75854 - -Count = 12 -Key = 852c34591e7ffef09259a9edf25020e1 -IV = 9e4243f5356d48f853cc3acb -PT = c991389c242c48e31a9ae00d59 -AAD = 8a4514a5e7d4e2e036490b541206bfe6471c14bb50af6fc869048bae954b5dd813429359ee5eef23ee42ea35e0c36bb8 -CT = 5c319983e5e276658f10a58edb -Tag = 5343086d4ac0e45e4adc6dc27d566296 - -Count = 13 -Key = b9840f1c04f7c9e9b2c9bec0c6176738 -IV = 7af462cc891270fe78566890 -PT = c9171685284b205bf4fd9d3f45 -AAD = 493ef83c18389c1e52050d2569f0d6f955cf8e76cf0a1697ffcb1665e285fe6e3595f456cff7f32feb7bde4cc82d4ebb -CT = 988c2c3df37c68fc8bc7a29b11 -Tag = d81b0bc3543fef4a929867bff63a1c17 - -Count = 14 -Key = 9449043071de904f5e6e7922b263f122 -IV = 39f0713e60cbc8e41e4d7328 -PT = 869a917e056f4460d6c2076d10 -AAD = 0b7a25e3e3027095772f3f8b8336813b607031eddd6f354a171e4b585504952cb51326c3edf4c48e41498da441cc090f -CT = cc878c8f760961e4ad08ad09a5 -Tag = c303c9680b673c049e9b7bec8c28428b - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test15.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test15.txt deleted file mode 100644 index cee5e2d5..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test15.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = e5b1e7a94e9e1fda0873571eec713429 -IV = 5ddde829a81713346af8e5b7 -PT = 850069e5ed768b5dc9ed7ad485 -AAD = b0ce75da427fba93da6d3455b2b440a877599a6d8d6d2d66ee90b5cf9a33baaa8329a9ffaac290e8e33f2af2548c2a8a181b3d4d9f8fac860cc26b0d26b9cc53bc9f405afa73605ebeb376f2d1d7fcb065bab92f20f295556ade -CT = c211d9079d5562659db01e17d1 -Tag = 884893fb035d3d7237d47c363de62bb3 - -Count = 1 -Key = 1b96a8699f84058591f28590a5e63c0e -IV = d437b28673240ddc63d22d2b -PT = 802192b9c2d78e1df9ac223598 -AAD = 0f985a66d350c153a4882d0a4fc6e1b8b8450cd0825182358521b1be5fc734338af72a48170fde7512a8a92ac81d12e3a7fdcf7d98933732a9893d92d9435fcaee6033b726d28f73c5f76fd6b93d13bc8904d11cd4a713cd353f -CT = 8c13cded61d08c1f2db878378e -Tag = 43ee877c121d4a329e81e51d68a9d845 - -Count = 2 -Key = 94874b6f3738d963577553a19155f4fa -IV = 8e9f61edc853db24fb162062 -PT = ab5fa8933bf8b4b6eb8fd4a0f6 -AAD = d30b11456b68d89dfecc00930c5102cabdb207abadfc7e26286e822a14c6e723ea5492ef53cc2206dbe9860583e2fd2a8ed26fcf5dba8914cae4829ff83745bcf203c2c9729ec5f635d368f8697139b18f1c39ea4e3e849f4b3f -CT = e359459af9418493dd8af46d27 -Tag = 4dd94f3b128f34ddd4036886fa084506 - -Count = 3 -Key = 7434e4ec0aa26aa89f7a025b7cabee6b -IV = ed9fa99d2a22cb4fcb2d25ee -PT = fd53183688a51d4bcbe52f6d37 -AAD = ec9bad331852febf4ee1928c65d57df5eea95caf852fbb821c022978d33d07fec1ced606caed13624bb6d08a22da7e23e39298e10395b29d91a46220f64ca4d7d333d93ddec412322b67d5e101784e0a65088779b8c44f7cd05d -CT = 97f74cd6ff2ea7d43262fe6f19 -Tag = 7ed5bcf0ce0448fa661d0c0fbcd36578 - -Count = 4 -Key = 72a565d3b3b6814bea37db7f659ba1d2 -IV = 6f975cfb8f0973eba7cff602 -PT = 46a9956585a9c06507ec073e2c -AAD = bac017084cdd4c035a1917de4abc453e875d1ec9f7d603683cccdd64e6273eaf11619acbef407fed03ff3e76373132c5bd680f7645e4fcdb09ccc60ce65584f607a090426f660df5bf4daba95e7cfb3f30e4197218f8decf0dca -CT = a657482d12377846ebe3ca6f66 -Tag = 0f10964e776b25ae079b357e199c8cd0 - -Count = 5 -Key = a85a8e0f16c7af9e7f32c817611a0249 -IV = 12b4a1c1bed206c426c1d977 -PT = 4544079578dc90631c616a89cb -AAD = 40741eac93ba6f3b60fdf1ac1b17fa3dd70d1ad4755f5a6bbd59c9c5aa99bb65bf7e077e5863b1d0b93104dea7b8e455d7bc149668822dc788b46980b2b439c33e10cc7c17415529c942e9eaf33eaeb627bc4cffc35cae4d37c9 -CT = b0be95166bf557bae6152b360b -Tag = 46391f35d73901732a7b9c7eb976aed9 - -Count = 6 -Key = 96c837ca5294446d389a6f06cb42e737 -IV = b37ce0928e17982ef783b2b8 -PT = 8b77fe7aac6a70fcae1ee74157 -AAD = 8f67abbb7a9394821c7196349262c589d5e1c156d6126fb3da0562bf403e733508f1f1926d6c9045350cad3d1243504dc70aa17a4de748e4a1fd804ae262c8ad557adaf799466434266b91d2c083f96218473adfc9dd2e8c3700 -CT = d950ab8631a66c313d6801977d -Tag = 31e109753cbb651ed194369f00840323 - -Count = 7 -Key = fad699fe2dfb8a2b955708ff97b15892 -IV = 61d9979bb5dd655e826abf68 -PT = ca88d99b2c88b078a9878fcfde -AAD = 7c02b7f2e7be357843a86596d7ba3a87e922bb0a982c32a20e809491c6343cfee2ee92fa2b6f898ee5b77a9ec5719de356c5e7507b1cac49b06e6fd5311eb9cf7a0c42b5252ca90632296d12ff5316a56253cc6666fb4d0a38f2 -CT = bfa286323d4904de8cd21389c0 -Tag = cf3af80df6bde595d6b5a28d6b7112f1 - -Count = 8 -Key = ca83a1109cf5bfb7d24d6ba72c6c1a74 -IV = ee40762d9a5fcdb41438ce05 -PT = 53c7fa9eba69541113c1998c46 -AAD = f54c4418df498c782ed61ccba4e657c8de9032231fd6a98c718063600d96f0e5f17fa73b9492faa264b5b9706e0d096386983694fb41b904c109b32b67c4e472e2a416fdd8f2a41fbfb1c5ecdf5be97fcd347c2541c1e50cfe18 -CT = 8cedd6149a203beb47d78489ff -Tag = 00906817785539306d07775e215bfb4b - -Count = 9 -Key = 65a467d5e8d503a0916e5ccaaf240b20 -IV = 0cc6f2f2a5cf96ce6adc2c5e -PT = b619af43215d41b1b0650bbe0d -AAD = ae98d8e675bca2cd4bf8f0860d46bd2c18f2d15dd431c51fe63c878cc9b1cf47a3b84cf1e9a02a4f0a8940008b72f4f1ed9cb5aae670899705573a8045008cad1284cddd1532791d38c8067694669d8b7d06a46969c413e6e35c -CT = 6c24bd0ecc97873f0f7c8802c5 -Tag = 03168a06b495f3f31d46f0de87d5471a - -Count = 10 -Key = 4cf328e1f2f180c2dd9e6d703cae188f -IV = 35b7cfe65331e520265d6657 -PT = 9c1a195735a84e6491a8ac07ff -AAD = 72a6a4f43598b91169a834d906cbe4cb40da1a41502a7f4bc80265a239330a9102de94a7fe8d57d28dc125aa5e6d061e7d2a90cdad8406ee899687d02f780f0c1ae8e944b300b61cd3489852d61eb2349a447be85d25d3cdde0e -CT = eb4d38c23be97445c25e8bf2f4 -Tag = b005f424f77a81f4a965aa7a1bf8cfe5 - -Count = 11 -Key = 7d62b16a551c12ac2102472492a4d3af -IV = d464c988013cfee4bafd7a9b -PT = 6de52d4b0878c26b0d8a6ff127 -AAD = 12a9155e72f6c19a9f00a651fe52d6dac331cac06b3ba594e24021900cdaa7d73a75a0968dd5d7d2f16ebab2197c620a1768bbc0839e21c8a37203af4c2ba146fdcac2b48701cc4bb5863f514c6562e01e807cd5308c9274ad9e -CT = a6dd42b752cacb47f1de9adaa1 -Tag = c6472e722a39ae44be5e4242cc58e046 - -Count = 12 -Key = ef6c85fa490919d342734357fe3656bd -IV = 7790d3a8deb8712c68ddae80 -PT = bf45d58e3cf0cd47bfe90814ea -AAD = fb04ccc1d78523c9aef6e8285fa991026c5aa4cbc8c37f9e0969d74c571e2409775d116c4a55b03f029842d7e3a53df8f7ceb9469b4461649dfb4183e57ebea8971bd967ee95d5f656873368a83313fa31cf6ab11d7b2c77d20d -CT = 7cf1afa60d3428c8fd25d9479b -Tag = 63e3a5eebcd72468e8ffab55e3caefe7 - -Count = 13 -Key = ac5b4ad09c73ed0b80931b920ceb0fad -IV = 1c0ab2941025ce7f084b8509 -PT = bf64de420133b29d1d50f4757d -AAD = e8cb8547ac67dccb3cb88e0443f9566944a79adaed7680b9e174080751d91e4d83357f28802a576e0fb53fb32e8d4d879d55aa9e79e201be363f4ddb16dad35e058a7d69e262c359c036f0d72151aa0bf04fbef5c4c3f7e91d05 -CT = 3761f611ec3ff853c915e61ef6 -Tag = bf906c3dabd785968ba5c7abd4a1eceb - -Count = 14 -Key = 35818c93c54a321f2ccc28e967d22ce1 -IV = 18dfcc73829a3c13287a6112 -PT = 6f32f25bfc511e8a7c60854944 -AAD = 09be731cd52fe4f7c6dd9aef978f8f117c358997842ffbb2df96727625669b58513e2bc97ef9c7119afa6b088a4f9312bebebfa6e71080a6e7f369207f3396f9c240a13143d7bfc5cad5049cb067ce4f57876d883bc8283fed87 -CT = 9553eb0378229fdb213fd46002 -Tag = ec228ec0fc273b67d922c2ba3dde5bdf - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test16.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test16.txt deleted file mode 100644 index 18223696..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test16.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 9971071059abc009e4f2bd69869db338 -IV = 07a9a95ea3821e9c13c63251 -PT = f54bc3501fed4f6f6dfb5ea80106df0bd836e6826225b75c0222f6e859b35983 -AAD = -CT = 0556c159f84ef36cb1602b4526b12009c775611bffb64dc0d9ca9297cd2c6a01 -Tag = 7870d9117f54811a346970f1de090c41 - -Count = 1 -Key = f0a551c56973e1cfdfe2d353aad66c2a -IV = 94e95e0544ab0b0b9997aee3 -PT = 734c0907ef49a1d86bc665bb9da9cedeeecd2abfed7f591c201ac360ca42f941 -AAD = -CT = f2c2f0c35e0bf6c5f5c24d8aadba19ed35848959b9c586604c396428493418d0 -Tag = 8855aecbe9604a839fa5d481f8760ffc - -Count = 2 -Key = c635775fa1416abe375c792ea7a486ac -IV = 5b9f038596f55115986a3109 -PT = 54172156fcb2c40392009807bd3ec4a11c2c1b6d69ad20c773df3d9e7cf35e3d -AAD = -CT = 73a9d9de0a3dcdc52dd9745fdf12353f4d63d0c7646443f5206883f6b7da2b94 -Tag = 11970a60855b0fe890d4f5988f6cafae - -Count = 3 -Key = 43d0651aa5d06f2846fed833fbb72241 -IV = 2ae626772b73c7cd25dab014 -PT = cec1607ccdc6332e5371766190cc7b03a09fb814b3d2afc52edc747d70b7fff4 -AAD = -CT = ea742cc41afac5ffbfa81e89bad82f1f8a07eca281fc253b533cc157eceec4e0 -Tag = db1e19fb545ae218f4ad3c9a6da64997 - -Count = 4 -Key = defa2f0eba651799c6041e6f28a0db3b -IV = 102158d6ed54ecc7efdeba7a -PT = 67844577a198b456fa410afcede8fc24fb970459096ebae03bfe1dd32a6b9665 -AAD = -CT = 4d87782c99ea2b18c58393eef975007b9019f42667b98098404137dc085d631b -Tag = fbdf857c1bff89bd725b8ca90d643e5b - -Count = 5 -Key = f098deb1e8149b3c88320efbfea087e2 -IV = 8146393ed0dd09d89d1ae7e5 -PT = 8ee6f4c01e98b501a9914f57239bda7d5831ac147c320651863e06db60c1a02d -AAD = -CT = 122309ab94c98901104bda0488efb563959da64979653ee4f8e658a3ea8a3c9c -Tag = 93e3d93d0580c5567ecfac274da211e2 - -Count = 6 -Key = 63b28aec8f7dd44af269e48e35294a34 -IV = 4c3d88500f6a483b63ba1139 -PT = 5b86eb718b3917537d4ef51b6c74a85cc9a90002410d8f346cbe56c86ac72d4d -AAD = -CT = d0281117e29fbf9676f7887811b010a19a34475ad9e4516cd8424d0b9e5a2c3c -Tag = 904ba928205fdda9e2674805be07e93e - -Count = 7 -Key = 765ed884a7554c792cc671e93c02433f -IV = 667467b168db56adf48a26e2 -PT = b941bb1f73980b0d76324a49a6c33623d4a1063b05c82cb43e4b0cdd4f913860 -AAD = -CT = 84906e78ac79df67a0fb4ccf4c8da439094339adc92d98abbe032cdf4f5d92ec -Tag = 750a89a842a6dd7d1317f561b9038402 - -Count = 8 -Key = 816ed7edadca9e8fa2b2b9f9ebd14d51 -IV = 7da514e274b5b812722b5c3f -PT = c76908234954ff939ba2293fa1ac654a4bee41a574f2694d090980481a08083f -AAD = -CT = b59a50e4414b4903c195ff47e8f9028d77b7e73a9a54e1ced9ebb1636b123864 -Tag = 007af223e7ac139eafd78d0a2c87ca25 - -Count = 9 -Key = f7b38d0d340373b98b89725fd889be49 -IV = bc2b87a883af1c0bff8388fb -PT = 0a8de4df6e01bc7b2a36e4a123af8ce6240bec42cd4e4f09aa92520c1658103c -AAD = -CT = 65ee08ab751bef3720db313491fca20a87cdfd6b8b028f53bf352304da504911 -Tag = abbc81ca718fcbc6a75c85ada74e466f - -Count = 10 -Key = dc662c77a2d520a067cbd6bd7e119696 -IV = 23aa76d1e8c3a72be862a5eb -PT = 5fb66e144d2564e096832065647dae768659d6dcd10a1dbe00858ce4f5148912 -AAD = -CT = 612713f9e6bd8017f61410c10ba1bd21adc87565bafbd1839d9572e270e94210 -Tag = 9d7616c3b486107cc74a8a2aa9c65209 - -Count = 11 -Key = 5c5b3799a19098b9c5737783ef0c80e9 -IV = 34fb9e101915639def30f40e -PT = 05f15cd45a82f36bc4e5e3d6db7a60640faa0e929c00f0354e913bcb02d83118 -AAD = -CT = ad60f53d51b6b00fc3366a4b4bc16b678ecd12473e8bd55c363bc0d94a844b70 -Tag = 1a528398ee2c9f436743d1a08602c5b4 - -Count = 12 -Key = 3a541317198a2fb1b90470e90d6d7f38 -IV = dfa6eb2b53177ff5d0924295 -PT = 3ac18af46d3fb15d477b849fe1ead087840742cbd8b2ec31b45b8ac2e4a53975 -AAD = -CT = 66755e7ec710a8ed7c776521f214ceb54e550220177eb89fe3949c9e74e2e108 -Tag = 20425ac5f07868b49edf9896af64396a - -Count = 13 -Key = 8f85d36616a95fc10586c316b3053770 -IV = d320b500269609ace1be67ce -PT = 3a758ee072fc70a64275b56e72cb23a15904589cefbeeb5848ec53ffc06c7a5d -AAD = -CT = fb2fe3eb40edfbd22a516bec359d4bb4238a0700a46fee1136a0618540229c41 -Tag = 42269316cece7d882cc68c3ed9d2f0ae - -Count = 14 -Key = 5fe2650c0598d918e49bb33e3c31d5b4 -IV = dd9501aa9c0e452f6786ebef -PT = 5a6b60ec0ac23f6d63ff2b1919ba6382927ef6de693a855f3e3efd49bd4453d8 -AAD = -CT = f0ac2d9153f00be3fce82d24fd3df3ea49f8265137417468724ae1342c6d9f00 -Tag = 6bab3332c8d370fa31634c6908a4b080 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test17.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test17.txt deleted file mode 100644 index a276cb4c..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test17.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 298efa1ccf29cf62ae6824bfc19557fc -IV = 6f58a93fe1d207fae4ed2f6d -PT = cc38bccd6bc536ad919b1395f5d63801f99f8068d65ca5ac63872daf16b93901 -AAD = 021fafd238463973ffe80256e5b1c6b1 -CT = dfce4e9cd291103d7fe4e63351d9e79d3dfd391e3267104658212da96521b7db -Tag = 542465ef599316f73a7a560509a2d9f2 - -Count = 1 -Key = 9b2ddd1af666b91e052d624b04e6b042 -IV = 4ee12e62899c61f9520a13c1 -PT = 01e5dc87a242782ca3156a27446f386bd9a060ffef1f63c3bc11a93ce305175d -AAD = e591e6ee094981b0e383429a31cceaaa -CT = 87b976488ac07750aa529e1602290db36f4d38d5c5ccb41292b66c3139617ebe -Tag = c4e7ea53efd59354ec6b4b8d9f8b237c - -Count = 2 -Key = 8737490bdc02e3543c312e081e2785cd -IV = cf3460b8010d410fd5524720 -PT = aa0acbbf2b847910d56ee4da8a9f40973f85d6cce1d6326a777eff01173e66d0 -AAD = eba8c1ca49e977cf26eb52325e59afa8 -CT = 893902594834c3a72da17bd73ccd53238a581a3e33edf8b9b901662b5f7e1d3a -Tag = 36a3a106d3c10a65da7d81942c98b349 - -Count = 3 -Key = f7fc73fc1c428e56af92e6b2870845e3 -IV = 375b1a84fefaaa807ffeba18 -PT = f871a9a695b74f9501942f99a3489d4befec6768d7c17d1c38f51fd6cd16adc4 -AAD = 0d668901163a08a338c427342d31e799 -CT = ef65290d220227147154f66a12004ce292507527f17c5119c69fa4f81e56d0a1 -Tag = 2d48c8b198610cdea73965f6ab1d9a12 - -Count = 4 -Key = e522d6715bb408401c5a7af3ef190caa -IV = 1a3b2a313418ed26de8ddf57 -PT = d3f10233505f524ffb8d961d8321be88c975704bdd9df958f3795adf0085aaa7 -AAD = b993eb193e9d59382919ebbc9e3ad829 -CT = e1519156cc27905b8da24d29fb502d54042eb6fab10c5f6a99d1ef54c92c555d -Tag = 7fd04f637b748db17da7ee34099a112a - -Count = 5 -Key = 55190de13cfbbedf4a0787f9ecc34e45 -IV = 87803bcf6a69962abae929e5 -PT = ee5da0026ce103140873226149b75fa734888b00518aeac0224466bbb0d23d0c -AAD = 067c3857cc240c6bb5f628bcc7cf5559 -CT = 06362d236e9618037d31d4f1ea0df6064e0bf06b6c5904530e1002e8479c16fb -Tag = 342a27aea0ef0aa26ad92ea3a92afa37 - -Count = 6 -Key = 65f7a5ff7feaa8d50736dce3c8524cf9 -IV = dfa0822065b1ed4987685217 -PT = a32d3aed1371cfcddf5e735a9d95b96d1ac59c3ab784be8364cc1cf3b71bf70e -AAD = cc4fd4d82584059b5a165d632d56fe1e -CT = bdf356a54a5cfa281edbe7e35966b5b8a68894f282cd7a734d502dfee6dcb1f5 -Tag = 4ff05b2898df6edc27574a2eb395ffc8 - -Count = 7 -Key = df0ceb73dfbd06782f69cd51cc4fc1fb -IV = c5fb4bf0b40477e10e5d15d4 -PT = fa9da35d8d812585322fa1c0cf4633b06424272cfac1c5a51138b0b9b91d443d -AAD = f292c4c2a2356e70feb0003a28708ed8 -CT = e81cd00a96dcb719fc2c3af7b5420cb5667fed53af8f561dc216fc7215ab16a1 -Tag = 60848116706be55b4ea939ba899eb2b7 - -Count = 8 -Key = 72205e651f03e2c16eea7689af43bc4a -IV = 42c47b2f95b0ec02652f1fff -PT = 7fbe781650c396ca8cdc6b2efddae0007cb008c4fc7310fa17ec5ae060171391 -AAD = 7f978fc1f1b2f9f37b88b96b8c14ebec -CT = b3f3a8bfe2906ac1bbc93ddc701a5529c2cb156354cedf85928f605ed6005bdc -Tag = 9151c8000dc25eba4a57908b238afb21 - -Count = 9 -Key = a2c96c0b051c633ec10b2fccb43f4517 -IV = c4c13fc9f15f482bf6bd8d0b -PT = 5f0a50d976eb2048bc481d7bca9b3e7367c3b12c9e98ac8521f45c715ae3bfff -AAD = 94afc74a7040c47705722627e05f159c -CT = 2bde225ca63b40ce64500c40c00fa5c50086c431e95d1f99678cb9a90bda2502 -Tag = 6a296aa47e52737304eaafec0c3d0c65 - -Count = 10 -Key = 108146de148bd4dba69c4ad2c11a35c0 -IV = 9dfbe2fa46a46c3ebaf31c48 -PT = 0104c3da4cbe50f31ccfcc426d634d8d39686444a3b75bfb54d67349fb7e7017 -AAD = bc83808f9e884967c84d28ce981dfd1b -CT = 3f4424912dfaafd8f8b08ba7baea95effb3e4571720a2626b92ad8f7a69d4477 -Tag = eedec85ed9e14a5fcc2cd0ce50ff00a4 - -Count = 11 -Key = 37b9352444bcaa9624b267566a59095a -IV = d7a72473b99b2890ef7c4928 -PT = 93037b2b4814541f425ea0bcc88ce1486632919cef443a5374d9944edc7e42ed -AAD = f7751af2dcbf5a7eb81d6bd73ced1220 -CT = 491e0893a652a5975d3db72868b5619311a9cddad11c5522e95893c42e3b63a9 -Tag = fcd8120512eb3f14295efd3b045b0868 - -Count = 12 -Key = dd1332f17e62b2be889e9a399fb0d3fe -IV = 3f0028cb7cb8f1091a4e2f4a -PT = 9c2e07683c6ca06d012708ad6dae95082eebd36261ccc874226ad354cc8ba82e -AAD = 2f33c5f85f976811ef67533f488917fa -CT = a4fa9311e3c02c3b068a3f11ae7657efc3a3e69991251280503940ac4a7e8950 -Tag = 0e5e77baa0f36db11cc5bfc27ffc7a49 - -Count = 13 -Key = 39e215f1a2572257efd939ac0365ec97 -IV = e1f4da712c4c1eb31027352c -PT = 21f7d62bb2918dde6acf9b6c9b7afed4be7d623c3e2070444b087fb40de7e6f1 -AAD = 9368e8d525e77707d316542dcd735c6e -CT = 3c93eb8df00556e3f42d54acfd635fbffc0f77f868a68f738ec2918213ba9a22 -Tag = 0dd8352d507e5253ee0849688d2ee86d - -Count = 14 -Key = 06f36f4939473b540e71db35f398a53d -IV = 13efe211cb6ef3a374f4da85 -PT = a5aafedc4c1ddb7f6b38f7974d16a1c88cf7ef1ebe5027ea4fb55db16101fc20 -AAD = 8cbe3e3eb19818db197901bd4ee42de2 -CT = 7d21fb06002d19f40741b275b72cdbabbe032460ecf13d98f1cafcb30f704af0 -Tag = dd4beca1670cf437372aba77bc3e9261 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test18.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test18.txt deleted file mode 100644 index 7c311097..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test18.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = fedc7155192d00b23cdd98750db9ebba -IV = a76b74f55c1a1756a08338b1 -PT = 6831435b8857daf1c513b148820d13b5a72cc490bda79a98a6f520d8763c39d1 -AAD = 2ad206c4176e7e552aa08836886816fafa77e759 -CT = 15823805da89a1923bfc1d6f87784d56bad1128b4dffdbdeefbb2fa562c35e68 -Tag = d23dc455ced49887c717e8eabeec2984 - -Count = 1 -Key = 8bdec458a733c52cd994b7c2a37947d9 -IV = bf8d954df5f1ee51fc3f1890 -PT = 9d5f1c905df900111f2052a60913d8a9d83cd40e43ba88203b05e3dbf0e37fbe -AAD = ffe26874a54bd38a026c5c729e2852a748457412 -CT = f056cf8ea6c4f353f08d54c27a8ef3324ab927a641563f9f5dc5f02c3b2204b1 -Tag = 2f8b9351426363f09f5d17f634a381a9 - -Count = 2 -Key = 0a651f95b6fe5d9442fd311cee245229 -IV = b7b2349b60ac5cf09885ef4e -PT = 1cd7be7611d8f7c9d75fdf3f53d28172ae4d462c06da56cb386687f2c098e28b -AAD = 725a089a37ba50e53143722140ce5c37bc0a48e7 -CT = e2926f34c30883a3b7eb0dc47627aad090111654a4980fc4fc952fe7a7b6b60a -Tag = 617345dab8973c21ad711c2a51885f83 - -Count = 3 -Key = fec2452d0883a54c0e33fccc092ddcf6 -IV = 9e3e354d30c2c77cd0d9a0fe -PT = 95b9c5e6adb7fcce212abf535095bd955c3aa0f7ac2428841f4de9035263446a -AAD = 6c12b112110ebf36930910f1bfc9ed49e14440b1 -CT = a85754f451b40f3ab576327b4b99fa09adc95380299f61c5c7a8e28188d2a40b -Tag = 94b979f7718ec13412e03f3461440100 - -Count = 4 -Key = e5f6d9f2c8ad08a1500157e027b92219 -IV = 94358eeb6829f1be4de3abfc -PT = 3204856040edd9401a890769875cc252e5dcb4a77e951e6eaef6d7318a06bcf4 -AAD = b3b860929cdc3fb0e393f21287f3dddc4a1c927a -CT = b1ba514ae4c41270d7beafaa1bac2fa993cf5af3607a008c6bb4aee2a1212dd4 -Tag = 7e0f5aa40553128f2c15cb9567c950e1 - -Count = 5 -Key = aeccfc65063c3fccfc5a0b29193d1ef4 -IV = 70649c9d2848d21c575d6914 -PT = 46ac375da56527c3c6fd5f28f33c63b1ffaf06c33b8f329eae37f8579a62291b -AAD = 637dc392cfe3a8e2fe5e871799a46dbe38f59610 -CT = 7f8841d3c82907596c4aa6ed433b9eb33b24d66f0a0cdd846d5ea51668975d9d -Tag = dfbab7a42d60cda73b03189034e44ff5 - -Count = 6 -Key = 1dbaf0bdd974b48ae373f686a961aeba -IV = a3a6454d17ac622248ae9857 -PT = 83a131f7737b4e881fb255ab9225f7faba96476626ed27168d6342ccca8d3e75 -AAD = 393843360c388a6e2f83c7202e8da6fa7041a6be -CT = 2471d23957d6305a86520b757c54890a57f665a44a19af2f8d55e6833659e730 -Tag = 4693b10c8998580e986be0bb26a22e3f - -Count = 7 -Key = 540f40fe8ac2e506b69bb2ba356ff8db -IV = 0502e51ac42f641d7a0176b0 -PT = 910a000c5e99245870f08dd658b648f944d04426a70d6d46d8e88ec8eddfb324 -AAD = 9b1f2b2fd7265792852628df926abc5609aaa762 -CT = 9381d4b72d740b58c3f27f8dff01d8bef45e769b834539a439173c88a6d18e62 -Tag = 7c678893a122a50f777dfcebf514f81d - -Count = 8 -Key = 55d0e0560a2027bb873d84a39ff87046 -IV = 616d61ba94216c9c7c0903b0 -PT = 1610431777c01136c0a0073f5c114c357f0216d5eaa31cd40b8cd605ac56dfab -AAD = a0203e1f31f66bfdc819d086a48b705d1eb7721b -CT = 5d846a8dfe02cf2454e11075a236b2a6acc59819e9ca6af580690664c195edd3 -Tag = 24cd0dd950859ab9d1ae654ef7174f98 - -Count = 9 -Key = b7ff8402f1325d945c98662003323db7 -IV = 6b6163fb2d1641bce33459e6 -PT = a2a653ee98df41fe873bc036a5fa7ddfea8d63ff0949ae8e1489cdb0c3a80c7f -AAD = 50a7649f5ac25f110f9408ecf3289d978a55620a -CT = 820a373f446a8341c8d928d223a5aea854b643ff07902b0c5bd0c6319b42d855 -Tag = 764c69deed533ab29bd85dd35d4dcf9a - -Count = 10 -Key = 48c901ba4e905bd68afdaec739ae00c2 -IV = 5bbe3dede5ebbd8cb845a9b6 -PT = 80b845888bd2f25defcd62b72b6bdeebd6152b3aa6b006891b0d69769fcc06d3 -AAD = 0c0cbcdcdbb35a35116b12b62715df4b647d78c5 -CT = 512779582d1fe1831f333bb563634acef8021c3c76b06beb6c7da98daac4c229 -Tag = 15fd32f96a4b9505bc1373525d40eeb7 - -Count = 11 -Key = c82cc4d9ff0681968839991afd0dfc2a -IV = 26a95931946fd2118ccd01cb -PT = 7516c4a781be02cafc36df4a07d2c9ffb978fdecf5217240097d5c26ff1e77bd -AAD = 8bbe80d4f4cd6c61b4fe3d24e98853acd4dd83fc -CT = f98436fe4bf6e5993adab0f0001bebfb449735eb365b9e7ce4b151f82005c5c7 -Tag = c83be461e1fedbb4ddf3ee72b9debe20 - -Count = 12 -Key = 748a88bf4e264a1180bfd665072aba65 -IV = b0a768b62de3cbbc1bcfe93f -PT = 1e1df61a9f10c7b4057d684ccef74e09f2a87f7e4aed393a451461d574c8ddbc -AAD = f4b102d885495fb893189aa216d8ab653bb97b99 -CT = 5e1af9511989069a615a6850402547ef4788197452461f1241e24be674c60074 -Tag = 734e1cc937ca384e282410fd9fc4bff2 - -Count = 13 -Key = 2393180bb81320965a58424b287c9b3e -IV = 480053c69ac54b93f5e81338 -PT = d46fcbf950bfcfca3906769f922821473d3005d5a1d81278622d4d3cd9721a33 -AAD = f6a2a3ac8e462fb01bbedcc9b0f8686ad4477929 -CT = 125874ff5a7f8936a76b11587bbebd461e27638bff5a1e993465c9cde82f2bd4 -Tag = 9b625b4c2f66cf2fc88043b9b4c6f2fa - -Count = 14 -Key = d651166baf42b75adb26e370b76016e5 -IV = 4af70e3be1357501cbb16bca -PT = 21d76d04488d4c33a7e8822797f785b43540bd374206966c9ef7832c51cc009f -AAD = 2c1072d5df5306e20d323a9897abac120bfb4d04 -CT = bc557572490f4d63811f8d83e58214ba4d8d24290264381838328a2962f010b2 -Tag = 8bd1f65c551c4affa517a8b03b6337e2 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test19.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test19.txt deleted file mode 100644 index a43be865..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test19.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 48b7f337cdf9252687ecc760bd8ec184 -IV = 3e894ebb16ce82a53c3e05b2 -PT = bb2bac67a4709430c39c2eb9acfabc0d456c80d30aa1734e57997d548a8f0603 -AAD = 7d924cfd37b3d046a96eb5e132042405c8731e06509787bbeb41f258275746495e884d69871f77634c584bb007312234 -CT = d263228b8ce051f67e9baf1ce7df97d10cd5f3bc972362055130c7d13c3ab2e7 -Tag = 71446737ca1fa92e6d026d7d2ed1aa9c - -Count = 1 -Key = 35a7eabe7de2d176e97cdb905c0b7f17 -IV = 2fa0cfef89fd9849df559c98 -PT = 08f23fc6fde45fe044cc2c397390bb362524bb16cfab7c548de89faf3ad98947 -AAD = 314e0423ac429f43ed90d731fcb5bdc7849595ee16553a1b7f91412bf98ac4cb052ca91c62a33b3928ee2887ebc273b7 -CT = cf040174f8e280d10aa65eb59db8bf3e4e2a8aa01b1f320564314946b3749af2 -Tag = 94f78c8ab96107437826050e1a89b9e2 - -Count = 2 -Key = 23c31e0e50ed44fae7e6df38abf0b16a -IV = 779034aee3e3b1942ef3e713 -PT = 681d498d7e85684c5996ce27270fe8065089e58617cc6deae49cceb27dc1e967 -AAD = 6a7877001fb018519c7f660d77cae7bd892af075ae2d68940071f9156bda7010eb25d57885913544d4922a21347c808e -CT = 7b14a15674755b66af08d581ee6f8b98691927cb1f5c43e5589de61c1b3883c9 -Tag = 2fa40d9c65eed28a99f95af468293006 - -Count = 3 -Key = 4b4f9155d8db85e0e2b36bf3aa981e6c -IV = 7c8d933778e1414e7338d934 -PT = f8a26c7a9a614a17151fcd54406891adf34e31a0d55046e1b413195b44113bb7 -AAD = 43b6c54526318efaa8f0a4979ccfa0f299f5d9889433b19971f60a663e359d1f2c1af393928c9b4165c07d7536c910de -CT = 3f9bdea3c3561ad417c205887aea6ca1ee070057388dc80226f331ffb0017de5 -Tag = e8ea1d3077df2c3d20f02a5046fdae73 - -Count = 4 -Key = 4148dd87bc6aaa908a0dbe1e5d2f6cc7 -IV = d01ffa7787117f8cb0b4014b -PT = bf1968a91d5da5c9e42ffb5cdf11e0d31b69935b22958c149c005d52576b262b -AAD = fdeceb385ed6de0d2d15453f022dd455b8db3bd9f13e44f085722a6935ea6631058e0cb5fcbd3b9e97db339b529de123 -CT = bfc9ecbbaf49371107cec37f80171f94141e25a486e1b42d8258208a6038fa34 -Tag = f2dad0b16bb728cb957ad9ab0716d195 - -Count = 5 -Key = 5d50961aa7fad7cae9a8d043e191c9c6 -IV = 263f4dc6464e89110a77f24f -PT = 0fed89fa86e5fbc4bf2e352caf8e1e8910f106db7b5092feec9fff5f4f768ae4 -AAD = e74cd8621c2db03d6b47cda4ae0671dfe8bb62f26715bd4397adc679c987016bf305a1e555ebc91a048e2a7bdc7cb8b9 -CT = 2190380bee10ade973aea0db269835649f4e53e4724598e1a935704a40411b16 -Tag = 0aa3d68d90ef3d329ff394451db0a2c2 - -Count = 6 -Key = c2428b54a781242f896bbc8816e8176b -IV = 715d8c8397ee55eb53f86a2a -PT = 0088129bb514a66d5a208838e20c7978ea6389cbd56e85de87e0db0608d8c1a4 -AAD = 435bb2a96fae0ab64c0a499d6e50bf2e5560643338aadabaa795f82d6503588d6522a70e4e475297aa9c5bbca7138b05 -CT = a9fb750c009ffd7fe76703e3588f747fa58cef68b1d9dd2f953bbf3ab6da2b59 -Tag = 613bb91239aafdced8fb87b6ba0f9e5d - -Count = 7 -Key = 6a3408481a54a1d9231142ffb9fd354f -IV = bb2fdedd1a33321ace0a5c66 -PT = 63c934eeea0dca9732734d800034e57616f4d339aedefd515a829300937e6d5f -AAD = 448f17c604cb976cb527b3b1f8d40350420c94545d73ab72a3dc10a32cec537d78a17d32fe073b329e25bb2d538b5bc1 -CT = b413a9c842fa51001b8949aa81dfc10408391892eda84785e725745378536d24 -Tag = 1e323d12856a644a86f394f96185a07a - -Count = 8 -Key = c5a7ef970a7f42b83194bfaa62dc092c -IV = 9505924d0b11200db3c40529 -PT = 84ba18d1e1503d1c512e0956380811bc70f2d97f65269712431a3720ddac91b3 -AAD = c2b989d3d56d6dc0c3e846631e11f096a1c3f016984a2a60f593f5b45acd28319ac9828773c6d1e043c6213ce970e749 -CT = b07c02dabffaa8f7b11f644e547f887f78bdc9babbaa0ca66e350e2b5a293b35 -Tag = 11393df432636dc7d7a3f183f531166a - -Count = 9 -Key = 3f45c5c7d042ee34e8257bf83a46144e -IV = 0c732f208ec1f8e0e0de0eb0 -PT = d46fafdf04468e91b9b87a84f71261bcd44b438e3a943590c6d1990786909ec1 -AAD = 991c82c9e48dc887f054bc0b45979dd8d244954ea910e30139da9dad476843691f32c7b494114e058d2b27284ea13a62 -CT = 54cbb18328682037bdddb8c585b731b18b5cfc495d9b899c9b8db8a11d9e46e9 -Tag = 289349ea094839dc6e9570c1d7d62a91 - -Count = 10 -Key = 10f0569b4e6c441858f8053a646b775f -IV = 863dbdc9eb8a9c1ac1af6ac9 -PT = f99eead51bb2a17f370a50079d93167179af5c49965af2d3f06d211fd96d6ba0 -AAD = 41d372deba9b25bb982d8c4662f063f95d1859640550ee6177862644b028f42c435636cdc0cdc57509a5fcb75657e581 -CT = 566f59cf4fe7b14dca35575743867351f18b1fa7e39417f8e7fe4e8bf1052ca4 -Tag = df39c291b26f8ca2557abc6074694070 - -Count = 11 -Key = 66f958e09896ab2b21eb36fc36fbfcad -IV = 371a4dbdf80e6d46508a9621 -PT = c0458f59bac039a4349e39c259edf6cf62fbd87910064409c64d8f6ef55d96ef -AAD = 19f19eafb6191fb0452807ba2ba6ae4ac36b37138f092cba1a63be58e4f8b994f2f6958799446b5d226fd23a95fe793b -CT = 192474ad795e3e3e36abcef2d42c038d39ece8119fb058a752b7959fe46703f5 -Tag = d17dc61d1513fc1cc2df45283afeb556 - -Count = 12 -Key = 0f46ef6999a3cbcc2e539a8952a7fbcc -IV = ff8829c2fb56cdf74914ad2d -PT = 37401d56052412f91aa9398f3ab3afe68ae500aaf40f7941c8a82ae56379fd5d -AAD = fc9a1c16b0f4cf133843a7664a17e97c02e7aa360153f5b4b881ed3825f7b2a414adae94c9a6479a9eeaaa206f99c3db -CT = 6866aa7699a8ce2c747880001987c28393fea80acb7b24a9e6e61086df68f5b6 -Tag = c996fc3e44887ad4d703b72dc2ecb1b8 - -Count = 13 -Key = 90838209bbc8d07846127667564dd696 -IV = febfb4dd04eb313933b9c278 -PT = cec0527329847a7eece6afa65c7f50ff2d7df4bc4e8d2990c41bf42aa9bda615 -AAD = 01cbb3a7a70001027b064c337260ddde8cd07fc786d71e293fe0bd44c794dbf7b054114bcd259e115e3acc98cd2ed7b1 -CT = e6275470454a9e0b6f6ea2a4d64cb93462a6cddc69e80f338098fe8b1d4bc364 -Tag = 50ddc254d7504590c938a503048cc8fe - -Count = 14 -Key = f94e9d80b48dc5bdca82f14daa46be16 -IV = 29bf1931f0dc4fe3c807e234 -PT = 64971fdf74f93f8aae32a998e5acf2b09623795a77cb9ad888abe6c7756b0a9d -AAD = 449e68d78fcaa2e0f2811a87a9c48a3cd18e4d644eb88ef05b91f4528e35c713f4df2ff97de251bc5b04a177d2e29299 -CT = f317607d97ed51fcc2f6ff7b394470758df772abb33b7ba049c6748b39fc4005 -Tag = 6c473bbc8881239f85eddc79f5daa0b9 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test2.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test2.txt deleted file mode 100644 index 472a50ca..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test2.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 77be63708971c4e240d1cb79e8d77feb -IV = e0e00f19fed7ba0136a797f3 -PT = -AAD = 7a43ec1d9c0a5a78a0b16533a6213cab -CT = -Tag = 209fcc8d3675ed938e9c7166709dd946 - -Count = 1 -Key = 7680c5d3ca6154758e510f4d25b98820 -IV = f8f105f9c3df4965780321f8 -PT = -AAD = c94c410194c765e3dcc7964379758ed3 -CT = -Tag = 94dca8edfcf90bb74b153c8d48a17930 - -Count = 2 -Key = a82bb1edc7c01a3689006f34bfed783e -IV = 963836b67b188becf9ba1411 -PT = -AAD = 9d115bb9bbd119fb777b6316065a9ac8 -CT = -Tag = c491889fa3eca4544ba0d51b8e0f3837 - -Count = 3 -Key = b9782d0a5986c63f352d3bc4c7ecc96d -IV = 4541e15b92edea44eceb1f2a -PT = -AAD = f1a9f0723429c5b26185ac3ea7e13d7a -CT = -Tag = 74d0d36949f0276670f9ddc579e94f3a - -Count = 4 -Key = 59b95785b30f205679fc4f3f9a90102f -IV = 1908787cc1e1880a6ef5dd17 -PT = -AAD = 39852d3182944a5177db277b63910702 -CT = -Tag = 8f9a96c013992485b43e2b62745ad173 - -Count = 5 -Key = 34dd7926ab13d4078160d87de2e3c724 -IV = c11ccdaf798ab03af2d97ef9 -PT = -AAD = af698717a6d790b3bfc39195857bb5ff -CT = -Tag = 48116050bbd9118270d0be252d29d5d4 - -Count = 6 -Key = 8ec86fab55aaab0e77455e9cd3dbc78e -IV = 15fd90a9867e14f0d63b53b9 -PT = -AAD = e7509e276209a6d3ecfabb53ccdcd236 -CT = -Tag = d96d6ac0d309cebedeba2af9f262132f - -Count = 7 -Key = 66b2473d9e0121666d47633f7008eb1c -IV = c1716c68a24d57770b867e51 -PT = -AAD = c20f686317d67e53dd79bae5c46dc111 -CT = -Tag = 9a08616809cf15247dfeb9756ba4f609 - -Count = 8 -Key = 5b262a9d00904d30a2587caade091381 -IV = f7bc154ca562e8f2c1845598 -PT = -AAD = 23112d078c9914fa3dfe5218cd191016 -CT = -Tag = 98854d193a06dbe32ce4497eec5c9a8b - -Count = 9 -Key = 2e4fb9cc320188a6f1fa89a7a252273a -IV = 7a6d4ee69c7256c14fba8f5e -PT = -AAD = 80ba4a202a68c3590d6557912c6f878e -CT = -Tag = 9280313273befb8afa0bceca5a966d85 - -Count = 10 -Key = 5ea94973d8616dafa7f31db0716d1729 -IV = a05b62669d250e61b077d28a -PT = -AAD = 9620baf2f58d013f8a4c4871989c1b17 -CT = -Tag = 7e550398dee728256d6928cdaac43b73 - -Count = 11 -Key = 910385f6f07f9e57e483c47dd5206bcc -IV = 518f56e33658df311d42d9fe -PT = -AAD = 5d157909a2a4607117e77da0e4493b88 -CT = -Tag = a7041ea4a1d74d9e66b9571b59b6a1d8 - -Count = 12 -Key = cab3af7a15b430e034e793bb30db8ab2 -IV = 963a56e2e12f387062e18498 -PT = -AAD = a094a1dd1121d3aa52c81e8f10bf9f0c -CT = -Tag = 1a31d295601eb3c82a54b234984ffdf5 - -Count = 13 -Key = 89c949e9c804af014d5604b39459f2c8 -IV = d1b104c815bf1e94e28c8f16 -PT = -AAD = 82adcd638d3fa9d9f3e84100d61e0777 -CT = -Tag = 88db9d62172ed043aa10f16d227dc41b - -Count = 14 -Key = a4d994c4ac5ac0f02913245714fbe235 -IV = a9472dadcca8d7e0e3b8084d -PT = -AAD = eb318b9e17575203dd29ebed20ec82f9 -CT = -Tag = 323df7f33694106f56739de0973216a3 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test20.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test20.txt deleted file mode 100644 index 4556c5ec..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test20.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 8fbf7ca12fd525dde91e625873fe51c2 -IV = 200bea517b9790a1cfadaf5e -PT = 39d3e6277c4b4963840d1642e6faae0a5be2da97f61c4e55bb57ce021903d4c4 -AAD = a414c07fe2e60bec9ccc409e9e899c6fe60580bb2607c861f7f08523e69cda1b9c3a711d1d9c35091771e4c950b9996d0ad04f2e00d1b3105853542a96e09ffffc2ec80f8cf88728f594f0aeb14f98a688234e8bfbf70327b364 -CT = fe678ef76f69ac95db553b6dadd5a07a9dc8e151fe6a9fa3a1cd621636b87868 -Tag = 7c860774f88332b9a7ce6bbd0272a727 - -Count = 1 -Key = 93a45b16f2c06a487218d761eabf1873 -IV = f658ed7ce508e710d5815f18 -PT = b6a2afb916a235c7fac5cd6a8e9057c2fff437b7544532a296a3c80c35f47c99 -AAD = 33156a775586e8c92c7e99c467a840281abc19483b9a320e707bf1ffe856ff1c473bb52f5b940e44df2c2f766cbe9ed360d844283f8daa3ef68def4bf5f2c3aae3028c2d348ca1963e9227cdfa6f6205dbd9f3832e46a4f552ec -CT = 6564e15287e995886395353c65c830e6fdd295c7ec2633c7f8d280f2340cdd15 -Tag = e4f4dfef764270a068a9095b9618ffef - -Count = 2 -Key = 5015f6b267f7ba8f83b46ef9440a0083 -IV = b66dd42e69f8a614516ab6cf -PT = d1207549cc831a4afc7e82415776a5a42664bc33833d061da409fbe1fb1e84df -AAD = f06fe187ad55df4c1575043afb490c117c66e631b6a026ac8b3663d65f4e605b57f467ed6c0a3fde03db61f82d98a238955a3e0f51bac78d14b94a0b75057a432ff375a09b0a41def3c887fcb103ee99f4b9f4474a64600b87eb -CT = 9600b7aa6f5d8e30d3bbca6800643ee764b59bcb83de3dfd03364bbc9a48252e -Tag = 49a0ad2dfbb49e8acc6ad1de4d9311d7 - -Count = 3 -Key = 408722e80d9cae213180efc0f2675f32 -IV = e9ed15b1942f1ab5e9cf9421 -PT = 39ed45bdd73f72aa16ae833d05c6d9ab1fca2b5ea478db553027787857fc9fcd -AAD = 19fb7034ac4f57035cf19f68d76c4581054edbabe884e076a0498542d42f0412f5eb87c2cafbe13b9936c6fcee4c7bb46df2274306fb1a86bae4660290c13eddeb8cfe8de585e415563bc1a6ca9823b66c8f2da5da5df8f41677 -CT = 9241526c638c2f0a2d1e52bb049f71039565bba5c59876eb136f92ac68ac7f6c -Tag = a6a9b62c36b156ad4024e705c1d78360 - -Count = 4 -Key = 678c4bf414452f1c5a659669646d4161 -IV = 295d2762261d1a536e1c057c -PT = 53f4ab78c16a20c07095afa50f7e96d66bdb5da90e7e3a8a49fac34652726edd -AAD = bc84743a0c42bb3423032a89857de5a9355ed7821980bf18379ae503b69da35601608f62bbfcb2e2ad9eff7e03fcb4b6d1768ad3a4d92831c5b2e3fc0eea3ab7b874f64e84c376a8f9e15b9aeb5392de10122605699f7d03a999 -CT = 2c821a0eb61cbdb09f84f086f69652b38ac9d07a90985f3ef36482a9ef8edbb2 -Tag = e6e042fe0894df45b7d9898e96e9b906 - -Count = 5 -Key = 8df843ad9376d7326114143899b4ca6f -IV = cdf3b88613e485fe6886e720 -PT = c1fcfda327533d17e1a6ac7e25cca02546c66635a115cf3f6d008eba55947d60 -AAD = e5bd7fa8a56f3c155120f3bccb0fa557063e7bb9517cd04d9996533ef3924ee6197ee7512c6ef09d2177e75b4909c6cff0e86cdadce20e279a0503956f4c2196391a8ffec2d17a1d6614be7847cd114df70b93959f1765826592 -CT = 71b822b6d39c9a801a4c2a2c9173b0f3d9b50cf18e8e95291136527a9778edc2 -Tag = b584a7e51d40ab28732c11ed602730a5 - -Count = 6 -Key = 64b43dfcdcf30dfb97373d75d09ab733 -IV = 9359d85361a3e4c110d715f4 -PT = 7c5c94ac7b138273de768d2bda16bef0774799df333fdd1a756e344ec35f2844 -AAD = 01acee6296478134999280ed47a5bc65dd5122c5d35092df54718900d04cfb81457ba9ec9d01e55dd8a65d6b3865fa0e7a45382f287c688c51ffcc951945e3e9c87b03c5545cec0d966926b8ee0453b69f25ce9fdf0a3065c81e -CT = 5f9aa615e13b7b585bdc2d4c3a83d1304d6f78ebba0d5b329d86ca730a515702 -Tag = 3cbf9fa530b049e067868433307425db - -Count = 7 -Key = 93a951295d4428902a5cce8fe2068763 -IV = 8aed35ae4ae714cf756e686b -PT = 0029b749b4db477dcf47d0296eb88806ef0b56060d598e48c9b5a6f9d046404d -AAD = 8186788a93a764a866944a2056279ad7f1d2083a96ce224fe6de60e70b17db18022a1504e1bf45c326c6d6992d8c005b675715016e00ec965b398b2ea4ab09cca2ac4ac312e6840ce00a36f6467028328fa30d4086e5bcb677ba -CT = 792cd1a143304fc737d0739be52b2e61841a908963832cff06ab6ec585be6467 -Tag = e1bb3eac7f570055fc2d2f0588c4935e - -Count = 8 -Key = 4f3114710c0e7f393b91c982beb3cfcc -IV = 03994d0b244f94d13cedce90 -PT = 36831744fd1c17a5df65a63d6642502075a0109f0f0c093ff33505140371136c -AAD = d294f939361af1bff5674a5235ba3e79bf30a5341b8634b5dac613e9a567ccce01b0596282ea584e579719206b2313f6675e7834f8a6d941e164169e97648ce77968ab4ecdfb3d639898468a1e8d285a9327dc958093eb33f8b1 -CT = 557e78350ebe53d1b7c1652669621db7a71a8fe2c0a84e61badf2dd9f034b91b -Tag = bc6c1f1322064eab75737067973d56a7 - -Count = 9 -Key = f00a034ea2f732863f9030257c8dcbf9 -IV = 2bd288fc2fabba6c44a04705 -PT = 85472091a37ec5f37d50fc09fb6b9d803577227b4c079ae64a9264e7a784c4fc -AAD = 312de02725a53b8a3dca7f02876dd9a4665de7a3f3dab7e4ac37b71d9d02478829ca38d3ec76d7792eb32478b92552e90154cf5608dcad4f33496061161af933d066e146888d1b7fa9b0c5255d59a8fdd88da638d06ee6d16d93 -CT = 9aa27810c3761ae175560340144610c7d263ad35234ecc55feed1c5dd3a4dadf -Tag = 02724d14a7dcb5ef81ce8aa937f1419d - -Count = 10 -Key = 49dfbd368a541721d6cd5b2513ec6087 -IV = 8b0214ec3a6a6af65be84ceb -PT = ef6cff08cbcb63a72e841340513f4e289ad34e89733731456cbfbc9a87b20f9b -AAD = 6d3dc86af4bb9e92af0dec8cea981481341f37be457093d98a818d8cb4b68b9f7197b1fa310147701f047949af41d0b226af4a3b0b92e5342224766dab7830e1687aa3918a89d4d3b50d69595944f492d3d68b3609ca594e7f26 -CT = e0802e60f73aa2fd669cf5870e963b1f33707ad4cc551f658b18bb72fd7cd9e3 -Tag = cd6d9a33458ac709385acfbcffa457e5 - -Count = 11 -Key = 3c0f57982449fad339c7ac5f6501b9ec -IV = 4db6301b638bab6a833001eb -PT = d1d5e1f3d8b491b2345d4a020add93e31596a5a204045f75fad53305d6b5aab5 -AAD = ea3872b0d48dad649a876a6b3672e9c7ffcd69695a4d2eb1853ed5c26eca0e8f21385563d42dfef2e1430e06561b8e0b73b5f62ba51a4aca78c56c06c479961c3d21c1fa3823cf80145f7b24e4740127e9e9960fa2480e36e4c4 -CT = 32c508251494d05ed9413b0011a028a1bb9bf7e18f72de4b750cc7ab96ec034d -Tag = 27c994680810f7b538c37b551b2f17df - -Count = 12 -Key = 8bb2aa3219c604544b4187d491586d9f -IV = 341d76da6e3094fc3570ae78 -PT = 274a2097708c53fd2a81444e13285691eec192c223b84dc9824c67ed3a050ba9 -AAD = 69c5e98cad9aa3327444b9625eabcd086367e64170d35c4586fa385a396b159425f8dd3969446529d651ce5a3b6432529487f91d193d05d2e345a28b50dffccc0396f76e418086e1fe2768e340c1fcffdb29e9514829548823f3 -CT = ed8775001f33bafdb1ef577698116e9ae656085fca8b969740c7c697450f9879 -Tag = 6c8936c42dc46321695d3af2a33ada14 - -Count = 13 -Key = 4d8154426d1b12eaf98d09ac05b1f9e4 -IV = 23e3916b9d64f98d122e6be6 -PT = d8a69c57969c6551c328675f7d772faad6c2c6843bf4b209e483fbdfc5efcaa4 -AAD = 2355631b9d487f4a7ec98d497f251cb79acfc58c0517d5e7b92a1abbae6ae7353b874d02faaf6410438539e02710e4d7cdada686871fef7582d562f384a571ce1edc68effdb932462e648c712b4e1d4e2e46718abd3cc5973aa0 -CT = 2fa53c6fd1846db81002e9c14da634480b352225e9190ab03d2598ef49a3b2b8 -Tag = a4023fd8d0f076eed5992f680b154433 - -Count = 14 -Key = 2c14b55dc1f8e3acf85258a12360053f -IV = 5b5930a7f63b1a8ec445dfa0 -PT = 41a7569d5f3f39ae06547d0ed681e8922382cfc940bc7e55da200ebf905bf476 -AAD = dc8fb70d3afd3c67c9a86b3467ddfa23298c6523ebe7ef17b7bcdb2ef130c61bd5adca2eebc897fd4126470e0a9088e8ee4a60939024b9abc7ed551d0e79214edea566ca4d970198f9b3a20b6822f4e30fc2cbe76596a01817ff -CT = f64364ee15acf049d8bf90aaa914bffae9ac6073b8d56122276efe04b202d0f9 -Tag = fa09390c1ce9ec97fc10c55ef2da2425 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test21.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test21.txt deleted file mode 100644 index 2ab4ab0c..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test21.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 594157ec4693202b030f33798b07176d -IV = 49b12054082660803a1df3df -PT = 3feef98a976a1bd634f364ac428bb59cd51fb159ec1789946918dbd50ea6c9d594a3a31a5269b0da6936c29d063a5fa2cc8a1c -AAD = -CT = c1b7a46a335f23d65b8db4008a49796906e225474f4fe7d39e55bf2efd97fd82d4167de082ae30fa01e465a601235d8d68bc69 -Tag = ba92d3661ce8b04687e8788d55417dc2 - -Count = 1 -Key = 7e6a5b6d296ac7a7494b72c93bad15ce -IV = 5225c255bc82949a1cdb86c8 -PT = 8bd452633f9dae0639fe0e67e36401adf65b3edf6799ff9eec80d85c13c85e0ee09491d4f5acaf8ae920281801a2f5d12c9370 -AAD = -CT = 2348f512a3a8501be9eaa41d8a127fcd8f0368d5053981a5626f85405363d218af7ba52a2bdb87a1ff07329f21792f4c64fc39 -Tag = 8753cee020ac668e9e1a37f63231543e - -Count = 2 -Key = 0d54e78be0eba65446682721368567f2 -IV = aefce9f80307fbff0965881b -PT = 5b335be97a86c8c1a29b7408833f752c8c5d4c912e7f26c73b909239e1222fc851b4e3c0accc5148cc60af2f019f9ee0060131 -AAD = -CT = 7277aebd1beb239a3a610587b0d7cd71640291a4e4d6dca73a5d0e05f058e7a0e151a0d087ff256d08876e1fc3e0e5e69c72b0 -Tag = bda879404fc226cfad834a3e85e04415 - -Count = 3 -Key = 0bdbb7986a6026d17a9ded7700831f59 -IV = e3bdba2fe3b5cad727071202 -PT = 77ec68b51f5eb0f2d80d3af696627f365b6e83e69f105c7bad8e4869b228a0c496aa05c96e97a6bfcb33aa172f22c6bf3d5116 -AAD = -CT = e7a5a701e950ca26987e1c40c889b475dba50cea13f09e9d3bc3cf4c84382c15bde4c34ff05eb278b4b745e51cbf4f12c12689 -Tag = b794991a8a4a9f3d59d9987e9fb7ac30 - -Count = 4 -Key = 823e852ef0b9551b2700bed65edcc808 -IV = 85798ee5fd33ef752a363d85 -PT = c1ebd968d861fddffab41857de7049bdee73acfea5564cf44ce40d75b960ca5453cda093a55c5527687f25433bd6dcde443030 -AAD = -CT = e8e976e8175a41ec6a629a225cf277a1a7e2b839b2f581c88698a39300e4a54ef381f7b433e0ea9acffe59801d516cd4c61135 -Tag = ccfdc010bd16ddd651d0a189255a7035 - -Count = 5 -Key = 99c0001a7c12f331e7b3b164daf4616f -IV = 383e8df9db398c5e9842257c -PT = 9d8ab6774cbf486fc4378a05a7aabba7ba7ff4a0f5eeb51c54c2ae9a5dd829d2735089955d5ae240d28da8b79994cd72234ee6 -AAD = -CT = 23c5e30b40b0946cf5b4df15407ff2d973397a10e94a303b71a4a5de074644006a10fcab198f86c4156c59e28900b958efcb8a -Tag = 8ecd6196137905263729dafc06860720 - -Count = 6 -Key = 6fa5f5b79f6f2fa7c1051d2a374db822 -IV = d466bfcf72789143eade1e84 -PT = d9528856db087849264ac811689420ef2beea9c6767644f3ca8bfc6345a3e2e5c49e7e0fd9b1c2e1671bd1b6275b0bd43306c5 -AAD = -CT = 1128b1da86b71d3c0cb9904f2513d2329c033754fc0d40f87cdfc7ee53dbe3ab565719c8d1dc5d3314123bc9e096fc8509b85d -Tag = 19092b9776c4a1f6e30354fa5115dc04 - -Count = 7 -Key = bce7d033f24ba8fbc237f06f40c6ae25 -IV = c0d68906e987fe22344cae52 -PT = e533180c0c73d75799025303d660e43d5795ad46b84a05741b441f855eeea299a6484c17f39e884aee28b7d384afb49c134c73 -AAD = -CT = 4723daa516b920ec039dd8c0704a37f0bbad9340a7e987888db120459c39cc069554638ab6b32cff585ed58e2d7c1808229776 -Tag = 1ae612e476f5beb99f65aa9b5f02b3db - -Count = 8 -Key = f78a05cd2621e9385ca111f3a168fdab -IV = a16aef83dbbd5f69c2569103 -PT = 9e761d4b7bdce2b851e508f77faf447ff83505755494f1bb5169dc23bb02d9ba8fb8b4878c8a47dfd14ea0dcef3e83c688e597 -AAD = -CT = 7ead6bde964c35fcf5de23f19725387601f705ac11c5fe1fc531746bf2d871fda54264a623c70e72b5b5ecadc4434f9e696ffc -Tag = 2f13e4bd9883c747f0c79c91e661aa8f - -Count = 9 -Key = dc1b8569a8046e3f294c3cca018f6613 -IV = 5b3cbbe0e948db8efe42062e -PT = 6a3a1a9815690106d1908bc7e63e25bfd801900e94a9fbc28b6d52b8f9b4de7003b066bbb18bba33da83c67809e3bcf98b5cbc -AAD = -CT = b02a253a17fb9248277cae0305473870c19e70b7930a0be9be905423479413dbe3702f42024d69476415290b1422f2c030e99e -Tag = f0fb85e3d6b3a5ddc5da3ec797f758dd - -Count = 10 -Key = cebef154b3ca2167230daf3b8205f11e -IV = e0dc23aa50a52cae644874b0 -PT = b8cb070ebf5b27a51f14f22c6b38fc29d04c431c484c117ad250ec4f97fc4df44b0ec847b69a363963d419ce9ad11a321686b0 -AAD = -CT = 4c0918e86b152be2c4dfe36c78b8a559c2c7f83fa7776d0341318a065c2a2f1b2678aaaff76cad30ccaa1dcd03a5bb16d00f3f -Tag = 79267bdf70e74eaa011e889369f5831d - -Count = 11 -Key = d7e95109127e83b4d43c81d7ef6d5972 -IV = 43ac0d8895ed785e2cb69d48 -PT = b2601f216b5e6f60c518dc817c38be940ac03babf2e6f5ddca0874e819f9aabe046460e3ccf6511566bbde2d9b191fc16ac4b6 -AAD = -CT = 957e712dc34ad891cdb3adcce62b0454eae9c792e64eb4e08624de103089cc19499749e8ae6d8c92e2c04c5cb36ef097bb00dd -Tag = f569562cb94828fe71fbddcfd984bae5 - -Count = 12 -Key = 39ab7819dbf944cccd2648445337158f -IV = 4594840e05c33bdbc0187174 -PT = 834cb05681e9a7876bca891eb7824392c7ac29d4ff4c9a8ad96447d2cc5f0ff218043d3510201452ba5c789ba2a667bcf79b9c -AAD = -CT = 362acf79df28c3c858e92c0c5f0a323b3ea2e81be67cfd903a627ed163c06393287b73fe33a435b96672b9bf1a5a2c2cff4a15 -Tag = e58a30e2c91e6d25f423abde987cf2f7 - -Count = 13 -Key = 73388f83e409ea236129e46dc9a9b20b -IV = a9069b00e1cd29a2b07b8db6 -PT = a2e138d5611c5043214f7d9f9c87aab94e0b8e99b311d0cae90829078c3898c8fffa7de9789af0a6c05f375b2f710dd4ba2610 -AAD = -CT = 77e0fa6b2765428ae418b57ecf5a392230fa2a9bd1686b91df69845cfa0a2dd9add219229e65ff6a2f887b78ebe8c0c5d1be21 -Tag = 32385ced195a16dad5eea5a19fd0fa43 - -Count = 14 -Key = d590e53b695315cc0b917d9fa0aac643 -IV = 102de7df461a5578e75c4975 -PT = 7ee631fb685d4a94563e01480ec5526d04a4035d1f615fdbad6656e2495fe5d7f0d6c40dff659fc85f4ccd78433a192313c3d4 -AAD = -CT = e1322d0c9265cd774d2e9d9b6771799600b79ba38374ee1756aa6871e204e5f6871cd50db15225ded64a9c8899bab37288a792 -Tag = 13e606a9a4c786b65e2260cdda4b1843 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test22.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test22.txt deleted file mode 100644 index 1549f21e..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test22.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = b61553bb854895b929751cd0c5f80384 -IV = 8863f999ae64e55d0bbd7457 -PT = 9b1b113217d0c4ea7943cf123c69c6ad2e3c97368c51c9754145d155dde1ee8640c8cafff17a5c9737d26a137eee4bf369096d -AAD = d914b5f2d1b08ce53ea59cb310587245 -CT = acfab4632b8a25805112f13d85e082bc89dc49bd92164fa8a2dad242c3a1b2f2696f2fdff579025f3f146ea97da3e47dc34b65 -Tag = 5d9b5f4a9868c1c69cbd6fd851f01340 - -Count = 1 -Key = 4324c97ba8c9f2a1bd447bde5e75938d -IV = bcac68106a3fc22048462bc9 -PT = 789fc14b7d4ec83ec783c0ef38faa6706031ade4e65ae91f0e1c579b8c8652e94e04c4ee5d85d23d0525c133a93a9539448ca1 -AAD = 2a893eec2eeef4c2e9c305428b9e3293 -CT = 2ba721de1aa7afba69cd0fa492fcad5fe639d855c1f280802b9cd5dff37f4bf54a117b8f400cb63906a3c78cdc1ae98b0c30d1 -Tag = 171df263a72252f2c44f5a63f089adb1 - -Count = 2 -Key = 51e42ceb83175d1df09b8385a84fbdef -IV = ec6b7f21db6eb16ce87f89b0 -PT = 4c5a34b0acc8745f45c04d6c82716b83ec6be5146d1272835ea642b49f55353fbc72a3acd16624e5377cbab54e356e3af6be01 -AAD = 3a081b5734537305222f314ef39a8d20 -CT = 1b4bb70f3ed38f378e29edb7e65081f794725a0340daec5708a163a3a81272ac2bd4b3e3db8f8ad57d571b5eb24af652e3c87e -Tag = 6a9f2a4b73290fc566f37c286887eded - -Count = 3 -Key = 9280e05a614d452f407aab696afad52f -IV = 099ef02922592254e44517cd -PT = db91108d47f266dd9371698b194b3a183f2936782be417cf1a048c6504162d37e11a41e3bbfeb98f995ec8e35de94bffe0a363 -AAD = 12dc4da623d082c767a3f7efe9a6ebc9 -CT = 8ac070ab975218af0c22435174abcab01af5db9917095e67140b31feeb78b7d5be3186b4fc41f106303a519b5a32399d2de77b -Tag = 7811b48513d9bcf1999b52304492b0ad - -Count = 4 -Key = 89be3c09ae7e2eff5b63f913aa8b575c -IV = 449d852d65585185bc4298f2 -PT = 93ccf5d907dea9b0fed5507f8a26400d0a568c0ef53b9fa6bf9d6802b20fe672c9a9536fc75b85f08e4d2c45cf032422f30ea9 -AAD = d232713c2b024b5affd4a15050dcba41 -CT = 5b38069d695b76a609318e93cde6e239465ac52264017c3e5169bddbda0d2ac76ef0451a3a39d07e8e8da3b0cd2ee808912b4c -Tag = e316e6032fff56e5242caa1b4ef2bb6e - -Count = 5 -Key = 04cbf7dbeba906e1d0e8a98d796e8613 -IV = b58059139429a6a6a38ccb07 -PT = 8890c63ab730d9135e19ca3ada35b34a2d5bd9f4968d60e8c65bf43f0d6def7de472c26b89af9e5d6e48c125d84b0fef7d194e -AAD = 7532c6237ba1da8b99c4a091c5159eb4 -CT = 52bc0be1920a4f1fb3ba3f9fc3e7969c75e40fade163897428f49fc52b6feffb61b65344ab3ac995e07dd5f615c24b447df9a7 -Tag = 239b60518f3c35b24c2557549179fd36 - -Count = 6 -Key = 8f1c70136852dc27ae5162b8743c90ea -IV = d372f92b0cf030aab042a6fa -PT = 0b6446af88c455d7f1ff5116c7af949803cc50bcf1ecfc81c6627141a42b363f7eb7fc628503bb6f037dae843fd2d319b61118 -AAD = 7eeff5d17e79f00d68e26cb7e6bee76c -CT = 4f235f6cc2c0474ab50557e2cf612ab09ffc85975de082b9cb9649a522b8a47f24e1b2c48f3cd57dce49542bd3560fe5e44bca -Tag = c541b78244efd2b9e61e75296f164aad - -Count = 7 -Key = 1ac69a35f749c65d5d27ec109b58f336 -IV = f0b9c6e8cfc7ba4c880d99a8 -PT = 9695507b944865587f27395c74468af6a845716b34db61e437b77d0107387b3fda581c466b6df40948da35906b77ff8ed09402 -AAD = 251d75d69ab64f1363efeaa771f3dc01 -CT = f41dc7402768705dbe3bf7cdbeb4fc672d3a6c3d65520dab3082727dff084b6e0bab17f96c2b137a4bd564a13f77ee37347383 -Tag = 022edf7437b41653db3bf2479a9e74a1 - -Count = 8 -Key = 16cbfdc8f9900f6702a430b0d8b624cf -IV = 28dd5c46e03680f2c01a7bba -PT = e1562d6e6a469cfd9f0a6a15be9a033cd454959ef8b37b2da58164fff1d8dbd3fac2b97bf1b503046fd9cc68bc942d0f727a3c -AAD = b1bcbdd27c0ef4de462fce0be8855a36 -CT = 10915ff87b80e42d548950e53ff6642ad44afa695175d24c9b5197f64c15570ebe0bc969c0251be940b42889464cf562c3e1a4 -Tag = f9606f7a0e41153a1b45c25f1784cace - -Count = 9 -Key = 4c12a54aa7bb7a0c0c798834f39b3fa8 -IV = e5854fac9adca3bb1bc549b7 -PT = 7e7fe58f9f13907a694b47f053c9270c2e4d73b52642a71446943a5c5f3e2fcd554b376dd2f549aa7e0737b62c6414f542bba2 -AAD = 7f42a7791e705345888f00573be98980 -CT = df46d7519910899b7c3d9e7d0dab82c93b7d8ee03f4f5aa82ecf64cacf3c9fb58f17a021536028744e412770e57562249e5f09 -Tag = 2823d4b59cf8f8837bebd5efdfb92929 - -Count = 10 -Key = 32aced5414e267cf77844c0acbb8872c -IV = 3d108e912d53b88e0dff9d6c -PT = c7fcf53c93a521c6e244f203cfc40b80bd8ab1e4e54cdb581fc14c31dc6a93805edbba32a729acf1a7c04c8b0366c2035c65b3 -AAD = 7be4c5df7935453d50f1c6c79ae6c13a -CT = 80beec8c20c7e9514c38ac6e3775de206754433cb1d7c89bbefb33b1b41245e0d1baf7cc870b1f1ec387f2dded3e0f479ef160 -Tag = d97f7d82b3ff97f2f6c652194c004748 - -Count = 11 -Key = 6275270952263f5f008b16f2456c7ddc -IV = 1d1837ea4cb3732a6ea6487d -PT = fd4de28a18a3de3b9660acf08eeac40e192b77c5264c80651c28628e61c3916f7ac03d849ae39c981a2808866a8292746a4793 -AAD = 6ee8ed2ed241f1d7cee55ca67001729b -CT = d69490708893f1638ad594c3a0ad8eb4f17da3203b18aced930976ee1abf4df1ae8a768ddc9df6ccdca2d579165023e52bb9d7 -Tag = aa47cda3928f7a2ea42feae4dfb0800f - -Count = 12 -Key = 7796d479bcb213f19e2ed73ef1069fe6 -IV = f0ebb6fb1df60069b00a34c7 -PT = f72603b6e74bafc20f423bea2a1036ab44461b5e5a5631b013573d953e1fb073b855511860d1782c1f3b146b5c41eb946e2fca -AAD = 87563b4d72e2f2c0094bff678e3b7975 -CT = 44c4d7ba2af1be22daa6352b58bf8cda28999bc33c420f8881001719fe639a9e9e5c48df120f7cbe73af4c1513a637b9de33e8 -Tag = 8b7002219f586318150132e0e5cbf2e9 - -Count = 13 -Key = f7c50f29479ff0f9945ab9df56872eaa -IV = 1bb94d7b399eb7a9a0efaf6e -PT = fa86691b746424b3426dd9ce8cf0f132de5c575e001701324ca7ce474d5813a19904591055fc7f343e20d0f4c92118b14ce774 -AAD = 88a9f81078d6a0820c56c582a30333b9 -CT = 55024fc5e95e5f7c33bf948c167b13382236b2cf187cc09e37dce043f6293fe457a1dde728cf407c702d75a670397ffe28e8ba -Tag = 645ca60cfc8046a0253f438e69b8e47c - -Count = 14 -Key = f3e302a1568a5340b5745ae87f5a5bea -IV = ce41f436f2e84643f673603e -PT = e4abaa66875bd8d45b6ed5e7671b03e09423ea41b7d89039da92728151bd690ccdef4fa16392a7f85efc0bc2b1664bd3f15e77 -AAD = 87ba36d234ec508b308ff258c6bd427b -CT = 123b69b2d0f10934da3fdb5c1b96b4ffc8ffc1446088b634b38e145e6dd98e8fea17214b5c9136f039577d4493b8bcf935ae19 -Tag = 97ca8cf064a408c7b764cf32d3b79c0a - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test23.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test23.txt deleted file mode 100644 index 08c2b59e..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test23.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = fe47fcce5fc32665d2ae399e4eec72ba -IV = 5adb9609dbaeb58cbd6e7275 -PT = 7c0e88c88899a779228465074797cd4c2e1498d259b54390b85e3eef1c02df60e743f1b840382c4bccaf3bafb4ca8429bea063 -AAD = 88319d6e1d3ffa5f987199166c8a9b56c2aeba5a -CT = 98f4826f05a265e6dd2be82db241c0fbbbf9ffb1c173aa83964b7cf5393043736365253ddbc5db8778371495da76d269e5db3e -Tag = 291ef1982e4defedaa2249f898556b47 - -Count = 1 -Key = ec0c2ba17aa95cd6afffe949da9cc3a8 -IV = 296bce5b50b7d66096d627ef -PT = b85b3753535b825cbe5f632c0b843c741351f18aa484281aebec2f45bb9eea2d79d987b764b9611f6c0f8641843d5d58f3a242 -AAD = f8d00f05d22bf68599bcdeb131292ad6e2df5d14 -CT = a7443d31c26bdf2a1c945e29ee4bd344a99cfaf3aa71f8b3f191f83c2adfc7a07162995506fde6309ffc19e716eddf1a828c5a -Tag = 890147971946b627c40016da1ecf3e77 - -Count = 2 -Key = d441280905a33bcf02ac16f8cabe97cc -IV = 53294f8b440c82dbd9bd7543 -PT = 5cd42b150db7d0bd6556e37e386dfafafabe2aefed2823be932f9daf1234aa0402bead485ebda3a0a6e392d5b0e603ae2dfca5 -AAD = aecd49cb8890806d47a950c8e92ab294f325961d -CT = 3ae74193c94ebb96fbb1bc5ecd180b2c0efa1ef4a9ecb6959631f8554f0eb237893476cc0d4fb55fa1880989c1616dd32b964f -Tag = 0eae01a8473a8f603c6ae6b637e4aeba - -Count = 3 -Key = 4f66f21817d1865c2fb62d4de344e085 -IV = 4c780a2707f56747b24a4aa0 -PT = 04eade2d68dc3c5d83f2d3f1c44240bf86127c9f6b3966085ef41ef50107d042b18bbe80bd43cdd1585fc5a99df8271b9b8767 -AAD = 4c0ec2531542bc801b3ddf593c2e1ba4afeb603e -CT = dcdf8d2b0d388072ce273ad3502dea5122bac0020a7ae3b97705d3a2bb49a5cb4f95e6cbd74183758c2eabc9ea38155c7ef647 -Tag = 2558c59cc7d71a2fcedd13f1c6659a63 - -Count = 4 -Key = 638276070f70a48dfdd3074905f4dd8b -IV = 08aa05eee9be39f28f61299c -PT = bca63b1fd480b7c682f992b3ac40712cd412e5bd5141126311ea3c5cd91ff8d75b7ad7be0ac7f61d41292e673177e55e148b8c -AAD = 7e3ef6f9d9d33a6bc5904b1317d235ce1a99ffb3 -CT = fab16aaf8cce26586b50e794e889839e0edb63f14f927f353569cac1694604de593d72c52977bf7fe2b6fcecb2d8918d0de8e9 -Tag = bd97aacdb02b80a01487d690b5e905bb - -Count = 5 -Key = dc7fa9348b7fe1b3befa5a09b2dc0f7a -IV = 51e208cfa9b9d990013f50f3 -PT = 0b65800b4dc2aaafbc837f9ece7a9111f3ba0309196babaa6b63ef0fedab779e0d352933536520e4ff1c7f079505ead882adf0 -AAD = b7219b5b1801457d71cfbe342148849622592c40 -CT = 2caae5923cad79802d682172f58191349240a24e25891461ae65394b95413b34e03f3551baf1a055d22a53a8a38f8ef78f6d40 -Tag = 10769ae854f8298cd94c28c3e28e94e3 - -Count = 6 -Key = eaf1659e08d0f22a7042358ab0ee0f0d -IV = d6911b68856038ef9dec1215 -PT = 0e71b3765f17e016c3024be23d0af6cf50ce98d86943b38cbbe8f3dcb540dda64b77bf73c7cda108e1a5c4bdb590a7f747ecfd -AAD = 433ae638214c48207fe9cdc76ef99e28913d6a8c -CT = bf4aff65fb7df0858962474bee9fbf95b0f06637c7d72bb1cbabe46662f455d3813665477b4badfb206a4d8f01346119e559ec -Tag = 866f204b04a309d45e65ea890a17ed0d - -Count = 7 -Key = 382697fc2ca220a5d6a700f7fadbaae5 -IV = 3fe9d400d10dc33545d6cc5c -PT = 7d187a1fd4d518197c1e843d613797d4a9fa9da6fe9f773b947dcc0023c43e917df575baadea90237d95f88c54692ef8be672e -AAD = a3cd4b0216378918a46252ca16f2ac9775e993f9 -CT = 8e640b879d473d7ce6689175808b925b6ba1177ad8b0c53208e1b7c6303844f52c8cae5791d0aeceea028dac107fad5e80866c -Tag = 3849e4fefcecb108f83ddc039a21dd91 - -Count = 8 -Key = 186f6a73ac82e33f69c5b158c7ee1cbe -IV = bad41bfe8b67151131e85b2b -PT = cc4d9dc2df86165343aada60cb5c1d9f991331d530d860dbf9166907d394721b2a22b53a6b070c5cb32ba3788ff55bc6a0d5f3 -AAD = dab496ae14125af2fef47ee3b226a6c92e99b9e0 -CT = 41a17c3b18e67d84bfab344bff1429a87c3076879ea42383d1e622e710a60612eecf2fae8a56a95a08c958a52f873ecb303785 -Tag = 335015e14d2cd8eb9813799c5c703a89 - -Count = 9 -Key = 14ba3901daf9db40d5dfbd828a361ab8 -IV = af37192707a3804beb57c836 -PT = 85f016f83ceba76a068e5def3ed5ebac85e203c69e32676550c6ed864edfd2ccb2c8da415a42cc6ead791e869296091efe7ca0 -AAD = 1ac4a38e83649004727d2b2b71075264cfcade09 -CT = 2a682e5579d7f801fdbdddb2b5f8564c9e91c39cde47c48ac1dffdf7ef1674ed937e77215691110ab730af97349f84128eed56 -Tag = b1b50298f48b96e679c3d71f3d17d623 - -Count = 10 -Key = c0552b2f54f4e8292119dbf61285fecd -IV = b5a580ec23753690d6c7392f -PT = 88c04f3421de415f9ee9b47e033666c0d182d04f38e6faff5fee5ec89d1bd391079e90fb22c537efe4561718588eab313cfd5c -AAD = 46cad83fbea4c47b9374bacb072472edcece9acf -CT = 2ca83a4a63de404ad2306a4918420fe3105cf7f9a52d16aa610e3b69a0fed246da41768c801c19d7502ccccd5ba0a1bc0b50f6 -Tag = 8c03304e8a74dd52d4e3baec89cd397d - -Count = 11 -Key = c6efbeedca979cb2c4fa5d6454a77dc1 -IV = 4e57df4988d93d13dc512487 -PT = a52077491b20ac65eff89bd0bdb6150ca755cf469c42ebbc5c95bbcf3aba91a9002bf386fc9a126fae73dbb2daa7ceb79d0b5f -AAD = 9e65d0542711fe57abfda27587ef4161eb3fe32e -CT = 4dd803cf6c99d2ce3ee8a1996f52837e52c3bb386cfc2792318e1ba64c35b638c9508b2e21d1da6e635e59e37c02c0b0a2529d -Tag = af847ce419fa54045a8bf31062f6d349 - -Count = 12 -Key = 3d68401d7c5f5c0a2529ede00724be14 -IV = 3f3eaf76e786e8af54baa56f -PT = 8bfeae1dadfc55baca191a6a3f54ab721862c51ce684e4aea6e9a3e2f3d2aac14af1cb0252f29a4c8c0984ce867acebc7596c7 -AAD = 6a6e3ea815e01cda78a76b0fb8bdafb8a25a6b7e -CT = 8a62b81a69e6e104dc075cc32730ffcb419b9f41711e06d7c2d9e891a88dc6e88817cf5bc2b87e95c4678daf0ca4b8f1e03927 -Tag = 9eebbcee46565fd4c34b8f47bcd94b31 - -Count = 13 -Key = 0657bb596cc28eafd51cc09a3e6ec1f6 -IV = 8e11a0625fba51698614f8f9 -PT = 435f16f56aa71734dc6571e2714207f7ff85c7eeaa1879901f2ffa00ea45038db54329f0a2e78ac58a5d76314788d8351777fa -AAD = cf73715474e49d71f4f5ad08e209ff9774ae9639 -CT = d876339f0db3bff022cb4504fe0a8ae26040102f575ecd4e4583b04959976254d07384141ba5748d3579815e3b5e1d1e8fddaa -Tag = 7e6f7096e425911fe739ac90cca05fda - -Count = 14 -Key = b2c645e0f2dd0d21e9511364f9355919 -IV = 91f6f089f5e828d6fdf12510 -PT = 3c01159e4787a74a707b4ead3be126b819831296821f1add394762ac97599cc810bd97205d0743548e7150bfbe6d9c1ba5d581 -AAD = e6781ff89032df5e5398108f1d569d7f8327b25c -CT = 1a06dec18eb4c9b361f1f2ec6391daf275f15d97a7f1a73fbe1d144bc1e1018200f725d52400c693a438edb595fd4558c4227a -Tag = 451783874f9d925328208bc4c56eed33 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test24.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test24.txt deleted file mode 100644 index 864f6bae..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test24.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 3c50622868f450aa0928990c15e1eb36 -IV = 811d5290768d57e7d87bb6c7 -PT = edd0a8f82833e919740fe2bf9edecf4ac86c72dc89490cef7b6983aaaf99fc856c5cc87d63f98a7c861bf3271fea6da86a15ab -AAD = dae2c7e0a3d3fd2bc04eca19b15178a003b5cf84890c28c2a615f20f8adb427f70698c12b2ef87780c1193fbb8cd1674 -CT = a51425b0608d3b4b46d4ec05ca1ddaf02bdd2089ae0554ecfb2a1c84c63d82dc71ddb9ab1b1f0b49de2ad27c2b5173e7000aa6 -Tag = bd9b5efca48008cd973a4f7d2c723844 - -Count = 1 -Key = a7268c7ef7bbc2be4a3ffc282019fba6 -IV = df2c5bd03f2cc45a07173144 -PT = f88beae931a68ed813a35bef54bd9999fd23ce4a1d258e34fac184ba799132a408bde4ced23748db5b35ea9692f4e1561d4cdc -AAD = 445b4ec6c505f132d3b012df624fe8f6e9cda0d8ec5e1ef7cde8b89259e167d68c1fb4dc4a78e5c59377f32ef5cea4b9 -CT = ea53e264e1b0f67ee37c81234d3b9c253ab1a94a4ad17779efcbeef0526129b0fd224b5884eb8b38e35ce0bdda222e30f576f3 -Tag = 38b5ef8d660f856d495db50f702bb462 - -Count = 2 -Key = 183dc6bc9a497304011e5aa41dc575b4 -IV = 0f4e2961d8ac4f81f559de7c -PT = aaad38b847c7a6fce801ff4ba62639592c487382e7e3ab0f29d0dde432f31028c0b14c67c15cc3664c660c197b4792433924d4 -AAD = 8ade36c0d68fa431838beb9f1d6a422365024bd5019979fa9b09b7c44b785e051dded5c9e21f342cf376e72cdae95207 -CT = 38e09d7612a536a80d2e32a46b0e1e4ab1e1022e854461aa7e695d7aa4a003e379c0e270face29e19d74d40a60fb2e8c726aca -Tag = 4004e9763f4a7d0fcb0ba57c7611f281 - -Count = 3 -Key = 047dcb88c16bd0d32d9a6272b079e379 -IV = d174ed8d60c0d5c814dad4f6 -PT = f957104f1fd87e9e1d6d35171a1cbe8fb22cb4ea7aba31e763e77c6f291db81c63c910cf9b8d37bf93fa28fd4e2808480b5836 -AAD = c6567022bdb5f2f3a1e3d78e0202a5f6b457c0ebf46a4b0620afa2b5ba706f1a37f932058afdb8cf4eb9a3815ecad445 -CT = b7f83cb77ef93895a6721dfafde8930090d2a9f39a1d605bbb8d7fe0f0fa838fc6d1f0e5e532592d0c688231e24139e635b502 -Tag = 452368d42f8a1211b4a018ad1acf837d - -Count = 4 -Key = 7286fe98ac0c03252f3ab7eabb8988eb -IV = e32e708c6302ce26902bd599 -PT = 58fad037e6efa65630ca14698725538c686ced497c584afad218fa3b753beaa7a72fab9c4c108ad14bf5f024613f91a1155679 -AAD = 4b9003a0259ed70aebfabc90abe750b888e9db453d9f95790d752d4ab9f208ee478046abaa9b2bf24564216071613297 -CT = ead0bc4e5902600598f9ca9e91cf4543420cd64e281a710fe890e0cffefa803d8c046390da6f50fd44b7e87861ac4088b5266d -Tag = 970659d5170d654b55ca5f79a9e06957 - -Count = 5 -Key = 0dc3090d2786eff167b291e895ac2261 -IV = 6ac8f3a8a61448e1fec06d6d -PT = 3017261d20002fafdae4252dcc9b1214e9a9ee959533d34aab136249ca4ef52ab205ea69efe6fd21ed3c90f8933593fc63454c -AAD = a85588d465b1ec2d935ce1ba5d6397bd57055915329830b1aa4a934f2080ecf48ab5f6269ccaaed8a10f398be64cdb8b -CT = 1fd7efc41a54374048e5d2a196bbb5b78452639db232c4c106fa8da6b1471ac14aaf2328e959a9c55f201d7271451151bfb48d -Tag = be7ff0322d4d42009dadf48e5aa939d5 - -Count = 6 -Key = d169282809ddae3384a10b908b8526c3 -IV = c9448a902e05f8ab10ad92e8 -PT = 490b469f84939d62e00fdef53430232e5b0ef130d586bbfa8a3d3ba30d91614b64e0da092f16b83a46c9386ebed0bf9e863950 -AAD = 71b1efec4e50041d0446e03b07ffdff05c6259d90aa7b33189e95360bfeba23afe914d0f17db6ba47ea165cc06d501e7 -CT = ca693b2350d23808840870c2371f49eda453f2e189c70b975af2531b9e8b0d8c262829e61f8990804844ac941b2fe47399a88d -Tag = 8bc9e25a568987b427cfc5b42e412d7a - -Count = 7 -Key = 93814839da20b560268ad8fe257a9372 -IV = f157ac4a83a7b73b8085085d -PT = bbad922de6dea7153724a333554e1aaf2e37aecd182b45885d04f3d11c3763fe59c26828d30c9da95adb75fbd5fbd2e6ece12c -AAD = 9b422e74f2109925264c1c0dda2b68c979afdac110e42b81afd2c59e2df3ff3f93832552b626b3821212a3e20c401949 -CT = be069b414d93d4f641b053f1ee7a61e23bf287a63b1d06c05393e8faa5856d22724bfc511a306ae4ba12c0a051b479e35c229a -Tag = 53a62f9431b8e6124c9bf6298f1b2880 - -Count = 8 -Key = 3262f2442b89a3641456cfa3d4d186fc -IV = d0fc4f8f7bb74a1763862407 -PT = fcdd7cd83a366f94289d8b470345fccea2aff778edd9f60c6d8273b3277a843965f0d4ff8be1e61ee82caae8754b87e747b2d5 -AAD = bee1c8ed52bf347431babccac2a64275224045d5c1122eb8c2ac3d8791a5a9c37abf050c406ebeb947428bb60d58d062 -CT = d0e5cecf32ef65035546cf8a99dc7e6f4320376f8e16a51958dc796c9b9a37a0d74e7b9979a0ab5b88ad92988dc184b964a11f -Tag = 37c52cd41ee2d519aa8363b186aadcc4 - -Count = 9 -Key = fc937348a4468afaa629f158dcff5a6e -IV = 783aa881ba0938ed8fe8ea30 -PT = 0db6285ed23143762d6e9b708f0c84ed3f48d51e8b3da549f1ce130bd434d0c38238d0e2c6e2b7f6a35eba2cd84d28781dff19 -AAD = 31b2892a669cce974c2b467d84c45189b335a5943d43b2f158d5c173be4fe31f8142f1b697c772f175a65dd87ae5fb52 -CT = 29d665791fac09a72dd2178d69de16a5ea3432bf70acfaa174ec4cc93df7efff5f3c057c1ffacc80eb2991b1c79ab565c1f97a -Tag = 113a2dd0be60dd45ea4f3d8b90c1122c - -Count = 10 -Key = a9a33b71eb81d091ac1d15e48a19a067 -IV = bb86b999753142de6573e863 -PT = 910246d2435786fdc8f950a0e3a79d081ea1c41eebb875de2eee9daaa8250850f636522cc953419767ad24982bf14427243971 -AAD = 7a4ba8b30eeee2f457b74699d2ff77d8f9912f09757972bf8e5e8ec37684a8e1523b0afec0aeb5fababdd945fb55eac4 -CT = a4cb039956e398846bac343db72b72ded486f64fc58c8b3c3d8fbf1f91b00f4c7c2a560f88f73b7eda4bf2bcc9d4f7a6c62f9f -Tag = dd594f34a29fa02af3accf567d7c5206 - -Count = 11 -Key = 7cb2f97b5609e76040712a95bfe84fad -IV = 1c2398ea67c1246540c469ab -PT = ede4b5732c8fa7bebc87f72da2e243dd4173ddad700bef65adeeaa0c570392fc477b3d2b7d404bea40074a6d58a00f2466c1bc -AAD = add3e89872e09f64d828463d5df7519de1a9db7639229b67901bd27ac3c3ea61ac1612067d72037adadd2e14475584a8 -CT = 6c6dd8a691eb22294818e61e33afea9e49353d1bb6f645e821d7c4c31fb440dd8cc2651450a764a22038978651ffd33d4be108 -Tag = ea246bb5e2ab3282c27927cd983a7297 - -Count = 12 -Key = 402fc879126ff144792af40975f0a24c -IV = bdbf6e81feff5a11df17e205 -PT = 8c60dce80b0a5ef578d680d1c811967265cc7664c751faf4d1472dac5b96e26e3be439b19e3da83b1a19dc82ba00d435e03342 -AAD = de8443df44d93b3734d8820b9a26010d6ce09c1bb9a02260235a40299d38330f67792d0f54c0c0fb35ef9febcbccd02b -CT = 8753e01ee5c088bcae1309b2e4269d9fb15491831a1e17140808f30aee4fa528020a7fc7df8627cda9b7401c44b15aa1e7c644 -Tag = 0f457c92a99ac1eba1b6105d6d23ce53 - -Count = 13 -Key = ca5549614dc0324564002139fd6a360e -IV = 8a4de31b0ddc6d2a3570fac0 -PT = 37610c187d287982e9afc15a9250aeb91933369dedc5910e4de584d70c27b7e4e0a7b02869299100fd8ef75bc66ae4bed2a853 -AAD = 6b88709627c28825569d60772b6642a9dadbf3ea9904b290dc632a837d579d2e81284bf4350923c1863e0e8d5894a34b -CT = 29505af512768c89d84054cce8f8889e9b4a095098b9cec7e26a6afcf7aee5132fb43caf7edc068fb6aea3570ad9310a5c3329 -Tag = d0918033b6db5f999f26bed94d352af6 - -Count = 14 -Key = a68b64267d0d1bc2d94b9f691ff8e9e4 -IV = a27706bd8eae8bb3dc95a1b9 -PT = 4a99ab41c604d7210069d9228dd3223b6f7da215ddda16cf93bf6658784cbbfe08ef6a0152cef368415dff9f8d1d05ead043f9 -AAD = 8734fa3cecb5793b2b7bcb4fcde7808303c27c2c002a27e0dbaa378b3df4909e37c238a24faf49b6cd134419948bdec6 -CT = 43aa0432a1b468bec64de45b66b5fb3e8b2bd9277801ef53a1cd6757bfd45aab9c6b23f0a1f4b30fa33fe52fabe7bb86281964 -Tag = fd39ef2e94707a1aba57ff2de7c17927 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test25.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test25.txt deleted file mode 100644 index 0fc3cc73..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test25.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 2c1f21cf0f6fb3661943155c3e3d8492 -IV = 23cb5ff362e22426984d1907 -PT = 42f758836986954db44bf37c6ef5e4ac0adaf38f27252a1b82d02ea949c8a1a2dbc0d68b5615ba7c1220ff6510e259f06655d8 -AAD = 5d3624879d35e46849953e45a32a624d6a6c536ed9857c613b572b0333e701557a713e3f010ecdf9a6bd6c9e3e44b065208645aff4aabee611b391528514170084ccf587177f4488f33cfb5e979e42b6e1cfc0a60238982a7aec -CT = 81824f0e0d523db30d3da369fdc0d60894c7a0a20646dd015073ad2732bd989b14a222b6ad57af43e1895df9dca2a5344a62cc -Tag = 57a3ee28136e94c74838997ae9823f3a - -Count = 1 -Key = d9f7d2411091f947b4d6f1e2d1f0fb2e -IV = e1934f5db57cc983e6b180e7 -PT = 73ed042327f70fe9c572a61545eda8b2a0c6e1d6c291ef19248e973aee6c312012f490c2c6f6166f4a59431e182663fcaea05a -AAD = 0a8a18a7150e940c3d87b38e73baee9a5c049ee21795663e264b694a949822b639092d0e67015e86363583fcf0ca645af9f43375f05fdb4ce84f411dcbca73c2220dea03a20115d2e51398344b16bee1ed7c499b353d6c597af8 -CT = aaadbd5c92e9151ce3db7210b8714126b73e43436d242677afa50384f2149b831f1d573c7891c2a91fbc48db29967ec9542b23 -Tag = 21b51ca862cb637cdd03b99a0f93b134 - -Count = 2 -Key = b818752aa4452120808c3d211d57c224 -IV = d679a0be22c2daf619b11463 -PT = 7ccdecf13130c20f67dd6f47adec33dfb52bc84a7700431b7fd398d652a123f086ae197328cfaed127a91866c95bdfdb4849ce -AAD = bb853b60b5fd8bd24acc9db9dd3de48b775d4a5cb2a879c1dd78bde94cafee06db12a1574eade205dfd3a8c6f68599e120ec73b6b4559cd03d3118b2b1bbe340bb15320c6bf8d8a1c3c1247b4023ba2949ba6a5ab13f2d85b93b -CT = bc1a886c9e5accc34f0c237f7ed996e940e4b0ec882638e69866ed24d86467f5433aee23448df39565a0ecfff2c40e6857f725 -Tag = 5ff9c449d0bfa870ebefe78d519a8d12 - -Count = 3 -Key = 528b8948b534d5f780ae3f1e23a47a25 -IV = fec5eaf0a6d6f5c4adec9618 -PT = 9c5280591311dc212d6ee2ad8b83dedf03b91e244d8a42690c9a5821ab971453c8b4f63e15bb8af96aeb4a3e35515b651bc68d -AAD = d5134d84a96921537a17869c3ed08c55c29e0a67a30943cb248849843794c1c6fefc98659da9b0f505bdefc2e4ebe9523d2a165b63b5e3b2ba9535821d62aaf95b9c7e6ff1f8807a13e79b9fe589c0d9febbabf9372b01ac2051 -CT = bdf0b752160e64b626d5c543954570169e28b033f77b6ef8a37bcbae2a294a9e7060c3235b290f79c69c39a66b0d5ecc81d02a -Tag = f93768c97781ad0486f2f9e8210f2a22 - -Count = 4 -Key = 824ca85e2e4b2a6c6e6a65ef8616c57b -IV = d2bf92e7dc53676aac4e6d1d -PT = cd4828e5977d7fc5bbf7f6d1870bf6333c204087639a3b494a4037170b73fc6b32c4555d1a02a8837441734d6835a54bf35a44 -AAD = 465afd08d7260308d8d21025f31570e5dcd6bcbd6520ecb6ff85de58378d5af6eaf7cb2f1242c0c47b759c58dbc6e4b45c8b993514f14b82eda3fcb6a0df2075a0ab76fa0c5b6cb37d1d28f773dac591790887d2d72f03bcc5ae -CT = 4da02474ef189de863d53323ff6737c12efb3d60a890a8d53991de57ffc6cafd44c429a762a2154c5a937120db2161f2cf2ea1 -Tag = 949d399a7e2567b275c6f842de602605 - -Count = 5 -Key = 4f60b753a36b4b1f2e4d8300ddc667a5 -IV = 35fa2551581f8592134bba45 -PT = 83807c042900611f50fd42557b7cf66315872225143d2cdf8c05ccf688ff21da8f6a2556b0051285b8e7cb8aee05b72816abd5 -AAD = 9a006b7cea27f3b4a305ffb0c5bec7e3582c6a3be028ebf44bb2496dae1f492f765cc66c82d3a2212abd6142524e0727dab8ae506e6d5b9dd361e3a37df3bec95b14f1174e7f25c656aabb42981b91950755281c5ef8f52e57bf -CT = cd2291ac182ab6d0f7b6b93e67abc4228ab63a4c1b214caa11698d40d2a8aa10164b48624d39dd967f4c35eebf09acdfe59f45 -Tag = b231bb4e63dda90a11700f204dc2b175 - -Count = 6 -Key = 07b122a618bb54b8c39d579fe5518a5c -IV = 26fa33d4c5b37f0c5d07e2d0 -PT = 06cf2fa1c9057d4974ae9048b4878d75b0b4720ed2d7c340e6d983a7cf08d20013abeef881cc3213fe25b3f6ac1e17fe1c2e11 -AAD = 20966308f57d3a3e7a4ea149cc1f3edeaef11e8af780a16534472d8df7f706152ee376614426094fd745d77cdca28682d0d2e689d28a50610168d638b23cb4dffa95dd260bc72e0098722cd00126a07fd23ffba1d10a3ce46b85 -CT = 61a69d35967c85dd5e0741a9b88152c3b04b1824930cf6c03f1cb44c1258b71fa3f5233d2f4ee256353c0b8f6d470b53d7811a -Tag = e98a7a33748de95e22b520ba2254bce3 - -Count = 7 -Key = 288e7efe62b93b990f2398c2460e415d -IV = c7ebc0cd756d9501faf71a7d -PT = 5fafe873b9d30771f2ef8dad397a8b42af3fc8f7ebbea80d0132e1af14269a463dbd87e3e01a58c2d991eb3badcf156fe8260d -AAD = fcb20124c58b29ef7e39800d1e11c4063774dd2c462dd9e07d140d9f4b5ebe4cba7bb8cc03bf357b22096c9897cdcdf112b7a5f7d1e38d5c74c16924522cbe2443c157cc93146c12bae4da2b2f1df07f334aa1cc99fd7f7e2899 -CT = e5e69100c77d57e05a41b28be74b1c8542fd1f15e73fc589535ea1fac2d263fd92cdaa9908eab6ffd9194586aa3fed5fcd109f -Tag = 537516fb827cbf6ce0500c6feff4db34 - -Count = 8 -Key = f66c5b44e7a9dade5765c3f64fb2bab9 -IV = 3482a46c8d4f173e62ce1dc5 -PT = 80501408e23e2a656720b32b9f41f542fc64e9e8d824af115ece88d551a5f5d5f7fdb67e2339fc263dfdb18a78d423fd868caf -AAD = 1e77645efa4419b2c9696b8f989051929ad6a01fe2223ae68325f8176cc467fffbd198e008904b82af6469a3bbb095c4d00cfed143723ed6cf6ba4198c40eabd05c03e0260f8b2f55038e5c382690886280f6989357c50f74fe5 -CT = e778a946529444e2656505e4f5f6519d3ecad5458f8f1a04f31a8af97ca185ff717764bca6e99258a24dc97c322ac1c7f54fba -Tag = c5b2cb532cd05b162b47e94f6d79cb8e - -Count = 9 -Key = 41e8af55426edbe8f0339d0fba400497 -IV = 07eb87d42e90a075d4b34911 -PT = adc5504d0a9735d7b73fc53bd0ff60f2c881394fdecfcce3483efe126bf148e48db9c0fd356f82e62d743ec09f8906431eb5e0 -AAD = bb2e5c52f2eacc9b7706a2efe4b607858922fd6914a1e22dfbecab2a06464942f769a9c544f046b88a7570e2cf6fd8146c86b2b4decb934f04a81e6d48affbce1f5381ab31a9736b63f5a4e744731726a36357e858c0980d3732 -CT = 040d99698b2a5e0169f6f94e61159c135fb19c5917c015aaf8ebb4a451ffd8347428ebfdd80c83841d299318084c779dc91b0c -Tag = a16d6267efaeec13d6bc281316ab8be7 - -Count = 10 -Key = bbf947c0e805ac0641d540b471eb9d26 -IV = b57daf0004f43821f1ba86de -PT = 1211e9224ebb862f2d27de692362324942da12da441176c4742a228d7928d3c1fb3e83c66d68c619a10911fc2ed90226d4ae48 -AAD = e18d861dc9bb35a9efa63c7c1deaf53910256809a477f1c3db893b2389f1d137659033a5841b888cd6491bb574b782dec2c840f6350825406387d71340d275e62af3cc070c1389375d81ce98ad37c7afcadcd79f1c520a462e7d -CT = a6f6aa1750118b402ee1b5f025d29007e3cb162ad9e363efb9ef2d24c850f62db925bbb7e9a83ca6cd6f74251db72622857b29 -Tag = a72dcc29d358f794361f84202c9832f9 - -Count = 11 -Key = a56f4de6772b1242f1dff344ec9b512d -IV = 94d228087e821e301409f305 -PT = af537682c419eb7ca3fed65bcc364b01efc2455ff65128dedc88f2224603ef3d7246622269a12b269bbf6ac9d2d3b81abd366f -AAD = 6a9c61dbbfaa20a13320a5f1dead28bfbe5dcbe84fe0a3617c348bd702fbe746f439dfcabdad22ac2fa629793f545bc68459f1c0462453b5b31b747c3d29614f0ccd0745fbaa4b204d47d5cc7db35d6bc44bfcecdfae910faa72 -CT = 55b60587eb879105ce4a36555d8f799618238bf1f7fd4df622662bd07f450a18375ab7eef02a8036470428c4834f881bf05cd4 -Tag = 8cbe48d46b5c1296b05b2b6f4b24f7c6 - -Count = 12 -Key = 766067fa8f0dc348b77d55ab5317a609 -IV = 8716219953becc2d8918f3aa -PT = ab910f7300ec6bf57d7baf2b4474a26a7d7dfcd6b1044cd0b0b32995029a70627f8d2554429e13d14d78950fb1c79ed1f48c32 -AAD = 8106f9cacb894dc2f0c93c67cc06cd54af6c6d94193bd0bd9673fc702fc6b995941476f2dc584ff753cdf24517c2153f1e1c6e37fe6d86c1e4fc63bceb25749f9372d62a1932749dd21ef6010b2942bd0464bd64171063a778a0 -CT = 8bc822183f9e42f05429e064934d9f84dfe1713d71690e68981f94256fa4a60736607c5864e3b05e3730caed80004a9bb3adb6 -Tag = 439b0bcdd24a87429a4098fd8a05514c - -Count = 13 -Key = 557ef21e91f108f6ab451980837cf029 -IV = ac1010f6dcec713cba17cb13 -PT = a2ae838532cebfc9ff8fb62242b84df706ad1777a62f54c64d9b1777bdc0819438d34aa4c1906e0fae1e845b32d8fb65763dc6 -AAD = 5d09aa2a302e3ec2bd71b25d52053463c9c38a3b460f7b980aad6c91d5011570be8c23b4db518701f4c5a157882695ba4ac140f94bda13d9824a8976d436492baaae6c4f8367683199695a1f6bcda2f645b188aa5c286fb91c8a -CT = 94c1941887ff94f34cb96cff2b6a25f660ce9b3ac54963960e70ee49500dae6a20d3307393f37d3a4a35c13b58f7bff0f5de7b -Tag = 95e574f70f5efa14b8ee21961972ee3c - -Count = 14 -Key = 55c8bcb0021090e4b2c785c79cb966b8 -IV = 5e9f1313282f73d7ffb92837 -PT = 2d7c1b689189bbfa2be26ad5c1f296dee4c0f61456ffc94cf8e70aad0f09d0608c4115aa6ed5eba93ed5820b3f3426bbf4d64a -AAD = f7e14a57e3bb6b99866b90573d7bc355baeb7ac347e43d0b65d97ecc2eb9c772401a8e3c7e9e2871c2b79579d44c139e62c33b42a9e0c87686960009d659d5e3874e168c334b6650c6d36168633757a7c20764232ce94a0de1a5 -CT = ba59002df3394c5b80983519dc163eca5c44df80f8c4c4e15d3ff73f13c170c80a59d87a2165a7b450be01031a8e41c505c89f -Tag = 28418c564731bddf3d504d8ed32e66ee - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test3.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test3.txt deleted file mode 100644 index d76b6bca..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test3.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = 2fb45e5b8f993a2bfebc4b15b533e0b4 -IV = 5b05755f984d2b90f94b8027 -PT = -AAD = e85491b2202caf1d7dce03b97e09331c32473941 -CT = -Tag = c75b7832b2a2d9bd827412b6ef5769db - -Count = 1 -Key = 952117048f77e276c2ef6580537c1403 -IV = 070b8fb46a7ad52885be1b26 -PT = -AAD = 34b088f982818b5f07dabe2b62f9547f4ed09912 -CT = -Tag = bedd4cf30fd7a4abc49bdcc3f3b248b1 - -Count = 2 -Key = 7f6453b39bde018560a16a2704217543 -IV = 0f3eecf48d68353226a77fe4 -PT = -AAD = 11e4ecb256ebff56453fa2e75e43eb9d641049e6 -CT = -Tag = b512623a12d5492b7d76d39be0df5777 - -Count = 3 -Key = 9332e433bf6100c6cc23b08710627c40 -IV = aab3db3015b29d24f329beb4 -PT = -AAD = bd843a08f0a822f8f4f76c3648380aab7622e719 -CT = -Tag = e54f1d18c61d8be15484727605b5a5dc - -Count = 4 -Key = 5773750a493096a99d84c0563fc293e9 -IV = c390ed70dc9497234413ad52 -PT = -AAD = 6012517258716c1f0035efa60a0f36b5c65e7379 -CT = -Tag = b011b264610e58082705476f040b8c86 - -Count = 5 -Key = 41b0d0fce5d31359cfd5db4064e2d46b -IV = b903e9d0cea25795a82e73e3 -PT = -AAD = 4cba501876f33e1fda9cd456e3180683e3863bd9 -CT = -Tag = 18bc39d0b95cf059cd8c25004f5e507c - -Count = 6 -Key = 4748b782e3fe5e4effeb7c67232d2b07 -IV = c5e4dcf18f86076b88a5d5e9 -PT = -AAD = 3b2fcad8739ed87e1d02e80845f120e249ea92b1 -CT = -Tag = b8ae718e2879c9cb658d5d1122e69bb7 - -Count = 7 -Key = e30cc22077d5951216d07f37c51b58f9 -IV = fc583ad159b52e0b6378157e -PT = -AAD = c3cb7be8888ef44ca5aa93dde26d2751288e1f5a -CT = -Tag = a8ce25b5dc8f84e2f5dae5f085aaccd4 - -Count = 8 -Key = 7c8b10ba75ee6ab4a997d3f598b79d40 -IV = 6fb55188ddf00dde09596587 -PT = -AAD = 2ddc0acf9705f8d18f905b8f9d472e7dbf6b91e3 -CT = -Tag = 5791d3805109c5e18adff4e80906a018 - -Count = 9 -Key = 72c7db6ca29f83641c3fff5b71c4bc30 -IV = f2000742e249ac56d5b2f65f -PT = -AAD = cd994d2d08232770927d854ef2b6ca2f087370cf -CT = -Tag = a5966df39feeba0336f0b9a3f4ffe6c3 - -Count = 10 -Key = 2833cc10195030e4a1155532666cb049 -IV = ad802b9a5c9409fa3e7dcfcc -PT = -AAD = b3ecbea2797d006c07b8ce621be3b0eccd37c3ec -CT = -Tag = 81deab8bdee0d391495eed4029a6d205 - -Count = 11 -Key = d8985bb5ac0258adad86660ebbc6d19f -IV = b5ee26f8c463bbfc27115b0a -PT = -AAD = 613f51f832fbf434b8e3fe9454ae46a862d831f0 -CT = -Tag = fe9f0b1bdc68dee6e8dc2ce12665d336 - -Count = 12 -Key = 9b8f6924dc22f1073c1a38448a2f0447 -IV = 09cdabf87d82828eca1c0c7f -PT = -AAD = 69210e4e0a1cfd5038756652790b9a8cfbbd943d -CT = -Tag = a60c104a6fb4638427a88a86c04923bd - -Count = 13 -Key = 72132213d5d95309bf7e10f8318d7c20 -IV = fb90bf283c5411230355d7a1 -PT = -AAD = a30bb17c8089c6f5f61b250a94cbbbfdf5f2a3e6 -CT = -Tag = 09191af418949fe6be8dbf13e006527a - -Count = 14 -Key = 652ffbad4e1fcbe75564395e6c1c3924 -IV = 111349636d106fd5f6a1e088 -PT = -AAD = 5f52aa85dc3ac042647e32ada050d67e59b519aa -CT = -Tag = 28d980d7bfd878c227c140de3482765b - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test4.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test4.txt deleted file mode 100644 index e119b11a..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test4.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 99e3e8793e686e571d8285c564f75e2b -IV = c2dd0ab868da6aa8ad9c0d23 -PT = -AAD = b668e42d4e444ca8b23cfdd95a9fedd5178aa521144890b093733cf5cf22526c5917ee476541809ac6867a8c399309fc -CT = -Tag = 3f4fba100eaf1f34b0baadaae9995d85 - -Count = 1 -Key = f8e29efd00a423c4ea9456863f83c54f -IV = 2d3cf67cbce69d639bd1c092 -PT = -AAD = 02c70fc8a2544619c1c3e9fce6b3c6c3bc24643e0f140e6b48ac505ea666cd9a2010c3a8e2f5f10437887fe803b54db3 -CT = -Tag = 963cb50aca3e09dd0d9a013c8734155f - -Count = 2 -Key = 00e3491dfcf3bec39c89ccfd80a5a896 -IV = 29f6ff4edc4ac3e97ffb1680 -PT = -AAD = 73813351b39f5e4000a9ee8d2b85f131634acaede0dd25d691a2b829ad4fe9ea699f12242519847cb083b0b4d3d8b3bc -CT = -Tag = 01b2e9ba719ad77c753b364ecc5aabeb - -Count = 3 -Key = 0ad06f4c19af1d5f602b38f86e56291c -IV = 0b235c6a75cecdfcba9001ce -PT = -AAD = 7d4f26f7895b2ef3da2e4f93e411cdb74025c7759c038d872344a45ce56d92a581862c3bace039090a2ccfa43b623dcb -CT = -Tag = b4bc9ce1475d0c93dfd5a5d8d45bd8e5 - -Count = 4 -Key = eeeb33e0c8a406ea236a075cdbe9d6f9 -IV = b935e8eed66227836ede189a -PT = -AAD = 9a4291acb9924bba4241b0c9c3c2e1262b25a7c7f02c92adeadf92254d618ab59388aa30b47eafa58899c357cf281e31 -CT = -Tag = 143d6954eb6fe70aff70da978ccd4509 - -Count = 5 -Key = 600b5442a0b550a38f85d2fb0acc9c96 -IV = 5e65dd6e8b20d6b2931fe6c2 -PT = -AAD = 461e54a092f8392466849fb0370ae30c14c1bf3987ab2ebbe98e18d13f041d09d043f7aea78bfcc42f864a9fb40f0031 -CT = -Tag = 2cd626f9a0686300cf23c0bc597c63b4 - -Count = 6 -Key = ce8d1103100fa290f953fbb439efdee4 -IV = 4874c6f8082366fc7e49b933 -PT = -AAD = d69d033c32029789263c689e11ff7e9e8eefc48ddbc4e10eeae1c9edbb44f04e7cc6471501eadda3940ab433d0a8c210 -CT = -Tag = a5964b77af0b8aecd844d6adec8b7b1c - -Count = 7 -Key = ae7114c09ffa04298834412f6a8de453 -IV = f380c2d860be2af41e1be5c6 -PT = -AAD = 7e16082f689c63e8adddd5cb2da610bbfb88d073cf8b204384a937aab0376523a50d3d5f1392978f79609f12df8fc288 -CT = -Tag = 40d3a36358a6f6caaa6af92cfd874a22 - -Count = 8 -Key = d8f520b6f3cf6b835ce4cce48f4cb033 -IV = 019a55c98615c022afff9644 -PT = -AAD = c3fb518ddb2d73417e243359a0ed8c126750eb163e7bd845637159397075e3db1db72fe2f0e13b599c333c473feb2245 -CT = -Tag = 467cfad5af11852d6eca289c86f967ad - -Count = 9 -Key = 13ba95606b01af035bf961e39852e34b -IV = 9ec9cf3b002cfed9e761934f -PT = -AAD = bb9de563836d1f1b1de964514ecebb8ad10501db562280b7bd98804814735817908b2856cafadecd40b04832fbde2bfb -CT = -Tag = 172a3bcbc5001dfd3815175a88f7056c - -Count = 10 -Key = 1c97da5fc5a9640f289622842408cba2 -IV = 6d765a988e934588163e29b7 -PT = -AAD = 1026a590816d2e1aa67aa0d13d50a8413af4d8ee9b1fa5ceb8deacc9f41e8e764b3ac15f98295e8800adf6a7175448cd -CT = -Tag = 4945a79d5edbb934c5cf94395c359deb - -Count = 11 -Key = 8dd46f271a201cc21ca0823248157e6b -IV = 1821b310ce2dba999cdf7576 -PT = -AAD = 34ba409997ceba065f4a5457078a9e232a84f594011aecfdbfbd24a802ca129e01cb1327e265b4a9004fb4c5003fffd3 -CT = -Tag = 304cc2cd2fcdd4abc844bc9c1cbe0241 - -Count = 12 -Key = 0c545d95333b6acf8b2928f3efd083de -IV = 31de89d07e7577956fa95ef3 -PT = -AAD = 5574d65f5afffb2d31cca8f58cf5945b83553cd45d2dba0e05fa54e42aa3f5a051e1624de16d4b93cbab7988c6d95f8c -CT = -Tag = 4ed91cfe90a49900e0565697bc82b659 - -Count = 13 -Key = 790b39f301383a82b377f585d3bf0f26 -IV = 2fd9c142b5fc62e87efff1fd -PT = -AAD = 45634e0afc59ae9f6e30f7f5fe43cf5a4e1f78d0aebb9e5a7ad9d86f25278e521f4845d49d6cb533cac6439839647fd0 -CT = -Tag = 69637c3f9233da23f8df7b09e8cfb252 - -Count = 14 -Key = 8f63652632d07b2a4a83c26dedd32657 -IV = 747bee0e1d462a9016f1468d -PT = -AAD = 9c00ff969b55a497dc523fa0cedaa339dc3c6ce18e61c7bf800c361201351bc49728c3bb15067e906162ee791b8d333a -CT = -Tag = bd5a0cbf859a6133a7f2d504d97cae05 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test5.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test5.txt deleted file mode 100644 index 68a5d6df..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test5.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 20b5b6b854e187b058a84d57bc1538b6 -IV = 94c1935afc061cbf254b936f -PT = -AAD = ca418e71dbf810038174eaa3719b3fcb80531c7110ad9192d105eeaafa15b819ac005668752b344ed1b22faf77048baf03dbddb3b47d6b00e95c4f005e0cc9b7627ccafd3f21b3312aa8d91d3fa0893fe5bff7d44ca46f23afe0 -CT = -Tag = b37286ebaf4a54e0ffc2a1deafc9f6db - -Count = 1 -Key = 7aa53188a9c597126a10d248603ebb62 -IV = aa45ca5dac41a825c45d36bf -PT = -AAD = 417fd5147d56de0c74329597824ec2788a344fb60b403edf0187afa12e72a05009bb70f83ccad11efa487c1965cf84feac067c1ffdbf531fca97c554f875c4a1a1d3ab3c53c8a74ef3ee9415a87e231699c82d764debeda18132 -CT = -Tag = 997bf84654bb9616c0cc9b45f82c7673 - -Count = 2 -Key = 72b5848ed1d2badbd427e16fc3b3e44d -IV = a84c7e928dc6e6379a513a20 -PT = -AAD = 1c0dfcecbd7bb0e680ce042d08b2d9a741267bd1da768df2ba08379233a9973f14928e9da6353768b9b2601c033fd964b16a16daaa3ea35ad7cef7e31eb1f7340aa34e8bfc08b0a6e6205292570ced43316876d0d499d9192e6b -CT = -Tag = 270cd786b95e6820cdb65a231b7530ed - -Count = 3 -Key = 6d0512ebf2e73d63f42849c57f073fd0 -IV = c1c46927c74c03f19342c33a -PT = -AAD = 28bf8903b2dfb7e69f1a735121c7efe9a4c42b6a295327bceb0246c85d782ce62bf075dbdf6e8ec6589c26d30696ccceef03870bd0abfd26d30600eafc65613740b54d777d379e8aacf241ecfba11b060186ac065db171aab099 -CT = -Tag = a686f5941ceb510e126a6316e3404dc0 - -Count = 4 -Key = 6438bc79520def5db58e49639774687a -IV = d682b47418ceb5bc09c713c2 -PT = -AAD = d252b164ae559ed155c8417b96652529df151f24ccf1ce98d0c7ddf293f4f1236630a19b24dc23978d3377a099065d0ba71d4bb8a7dc0cb76760ca7c4a0e12c8cb56c6102646323c08c4f4f56226fd5b71a84590913ad20da287 -CT = -Tag = 04e78796dbf42e9ffa6bb9e346581f13 - -Count = 5 -Key = 117a0aa592fff17ae36c94917db16c65 -IV = c3537be6029d54ffefab2730 -PT = -AAD = 29e959b96817547ae06bf85fe164e82a2693f82a7aeb66d535f0d2c3bffd1ba18e94ef457939f0c0733eda4738d136380fc876075c4943220237a5929b01b32da2bc2a6afd6ae1d89fd470093835962ff6708bb39ba365202f56 -CT = -Tag = b87fcc4d5c484e68ea52c01b55ffa438 - -Count = 6 -Key = 5d995a338ed60f8ab0b59da6c9a40c52 -IV = 2723c54e31c5c57f0236e816 -PT = -AAD = 239c80683feb6afd38f8759a27cb5f350fbc2f757838c40858c9d08f699cc56c4236f4a77bd80df0e8e41d5f9ba732db2e0a3a5e952ede7bfdd5fcbebd23d07271134db5b82461537c47e2ca51b348b0830f5ee575ad4b4414dc -CT = -Tag = 94356a3bfaf07f2ef0ebe3a507076b16 - -Count = 7 -Key = c8a863a1ebaf10c0fc0e80df12444e6e -IV = c3e8cdf086827fee7095d0ea -PT = -AAD = 9927da88c5d336256699c76845e946dc53c87bf0e11e4bec9450981602b32010d2b52bfc91283a6329d455598998ede2e61e352e553110154b4da5ce668d664b83f671c010bf220b7d32b34f4ca69b66cc87233d792337cb2bff -CT = -Tag = 098837de27707ea3593e31ceb8276732 - -Count = 8 -Key = 69cc28b161f214a580e6ba4bc2e3de9d -IV = f2a566f9cf83fd280c8fe08e -PT = -AAD = f8c5263a4e06b49e184589a1e071978643c353aa27b4817fe39e45abc442e22ab5d683bcee5dbbd589fa583f171bb59536addd2b6cefd49823413005efb2a665e26a6029c927d3891cb0d4f23e8ccc60cfd02ce8978c451ddc11 -CT = -Tag = c9c806cb8b1a889809695c2ec5a7a86e - -Count = 9 -Key = bbf35920fcab2cedaafdf3f00321f544 -IV = 2c7ee3ff1df84f3650bc9298 -PT = -AAD = a75f50ba9a50f48799594b6195b3125ed92df73144bfcb624ce67323d834ba1afaf0df4c6c022c11d48bd75c86675a5927ac1250030f720f97498d4fe0787bae655dc5537ac1bcac198a893f9af7c2ef9b971dd64f7e7b62603e -CT = -Tag = c7cd3f938f4ab18642d86234edfc17ed - -Count = 10 -Key = 9690de669702ba72aeb934f5ac50e03c -IV = da8713fe2b2058c438aff260 -PT = -AAD = f30ee950da37c7224b5c93e9a29cafdbf8e2070f65c226244b1a683459e0c5c11c9b77c8fc286d4298a5b9cd1fee3e13d4690a88780d35b558b5d9e52b1a67fc8857076691dca7f5fe8ef22065cc5d9c003ffd25ebe23e61440e -CT = -Tag = 7f92914518ddbe842b06771f64c40f59 - -Count = 11 -Key = e5d8c6e2ac6935c85e81ee0ef723eacf -IV = c73140ee90cc1dcf88457da2 -PT = -AAD = f6c267a6ae5ce3cf4bcdf59cfd1f777c66133e0ec4772785f33e5fa800d310b24b5773bc603a76b30fc32328a8e40f02f823a813a9e4b4fac726e992c183bd0815111c1d3a35884a4eff32027ba60dba679b469af31bc50c0591 -CT = -Tag = f938fd0d8c148d81765109df66dac9aa - -Count = 12 -Key = e23458f6b304c2d8feb3dedd3741bc24 -IV = 4619036b50ba012fe50be1d7 -PT = -AAD = 74bfdc6bc4bfc38d666b985cfe043c67798b2db98f149268dba24436cab83e9a91f244ffc5748c93f8df339ae24ba4318c50da011ab368d3167c16e503309b01351a11f14d067cc6769b9989c7d952e3315011ee2ea034db8cb8 -CT = -Tag = 6053ab80c746821ec50c97e5a1424a85 - -Count = 13 -Key = 5372ac5d3b08d860919110bdeb7f31df -IV = 06ca979d8c250d9b7be45573 -PT = -AAD = e1f958834e63c75c8c758bafaa2f257ea5689d0d55b877b4d67b8b73c25ce24e9b094b976db920a159968da9d33c511aa8999aba42b8bb886e6545dd108693150af357496bb5898b4e8f725d50ef474afb836a3358da2217bb93 -CT = -Tag = 9338e14fe0b08a969a104c828528a6a4 - -Count = 14 -Key = bf1cb49e980cec0b153fe3573875ac6c -IV = 5426669d25524036fbe81e89 -PT = -AAD = b336949766e9948a7e6f36a2d377b84a25c4b4988794f3deab7af4b14a12dac641e25fe2ae9ff53450ace1513acd0b284a490b455f04f40af94418c8792ec1a0983fb1d9a31d93dc3ed2c75e6a6ce092111eabad039bac2a49f6 -CT = -Tag = e2996a2b3b6bf52217cfc4d0f5bb351b - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test6.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test6.txt deleted file mode 100644 index 4eb808d9..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test6.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 7fddb57453c241d03efbed3ac44e371c -IV = ee283a3fc75575e33efd4887 -PT = d5de42b461646c255c87bd2962d3b9a2 -AAD = -CT = 2ccda4a5415cb91e135c2a0f78c9b2fd -Tag = b36d1df9b9d5e596f83e8b7f52971cb3 - -Count = 1 -Key = ab72c77b97cb5fe9a382d9fe81ffdbed -IV = 54cc7dc2c37ec006bcc6d1da -PT = 007c5e5b3e59df24a7c355584fc1518d -AAD = -CT = 0e1bde206a07a9c2c1b65300f8c64997 -Tag = 2b4401346697138c7a4891ee59867d0c - -Count = 2 -Key = 77b0a58a1e60541e5ea3d4d42007940e -IV = ae7a27904d95fe800e83b345 -PT = 6931a3ea07a9e95207334f0274a454dd -AAD = -CT = 76e39fad4000a07d35d879b785bd7fca -Tag = 5cb3724712f129f86b7927f13b45c835 - -Count = 3 -Key = caaa3f6fd31822ed2d2125f225b0169f -IV = 7f6d9041483e8c1412fa552a -PT = 84c907b11ae3b79fc4451d1bf17f4a99 -AAD = -CT = fdb4aafa3519d3c055be8b347764ea33 -Tag = 89e43bfead01692c4ebe656586e3fbe3 - -Count = 4 -Key = 02c8e81debc563e99cd262bfc64b0e11 -IV = b49057c9778d8c02fe00d029 -PT = ca2a51e9d05e96e6f1d14ced36811c5c -AAD = -CT = 5db602fb31bb9268d233bee0dd6b87ae -Tag = 789d2be2cc70b7c389b31912e1c0a041 - -Count = 5 -Key = 4e625a3edc61f0cb2f002da8f8a70245 -IV = 66d632dd5ca10b08d4d8f97b -PT = 0b76d498add6e09c96d7694e5d620bd5 -AAD = -CT = 17bdc7ef5649bec9cf6c565ce33cf889 -Tag = 3f7944bad062605f937ff6d6598a7651 - -Count = 6 -Key = 41ab3fc488f8d4a820e65b9d41a87de3 -IV = 9b5d27d75a0571e93f581885 -PT = 5ed0836e0a52777599800d4fe754ccbe -AAD = -CT = 88c0eb8c33a10a22e7561866566b191f -Tag = 83e885802a594a8b008a94aa7ef06907 - -Count = 7 -Key = 0047184240a5948ed55701eac2c4c26c -IV = a3ab8da22648c2453cdef55b -PT = 89ee9502871be15ee4a8c47ab123bfc9 -AAD = -CT = 8b5cb59e7ad2e15c40d5fbcde28a0d17 -Tag = 538e79f880e2f65c72148f5ade4080a1 - -Count = 8 -Key = 735c5a4ff2438852df3530c23590ac28 -IV = 7bee7c6938f1ae59671e2ddb -PT = 479e8d3bf0de4ce7cd4377d2ed3925cd -AAD = -CT = 2ca09b58178fbbfb82556599b92329a3 -Tag = 2e3cf2895f111ec2a86508c36a24e45d - -Count = 9 -Key = 016dbb38daa76dfe7da384ebf1240364 -IV = 0793ef3ada782f78c98affe3 -PT = 4b34a9ec5763524b191d5616c547f6b7 -AAD = -CT = 609aa3f4541bc0fe9931daad2ee15d0c -Tag = 33afec59c45baf689a5e1b13ae423619 - -Count = 10 -Key = 2d176607883aface75011d14818f1be6 -IV = 02162c3635bf6d543e1cc148 -PT = 71905ad5df601d056effd80dd7333662 -AAD = -CT = 1b68598e1676d2cfd37aa00396fa9676 -Tag = 5d060aa8a729774da001aa9fdef2b3d2 - -Count = 11 -Key = 94fd0269a0ce813133626f93c4af7e6f -IV = 11fc3928028dfa34db06a1bc -PT = a1aefec976cd87cf8a4c21bbe902f7b4 -AAD = -CT = b1baf8c58cdec88238b1b0ab0b40337d -Tag = 882f865df7da529f768d4944e8387f69 - -Count = 12 -Key = a7bec5e24f0db2629a257d02fdfaea02 -IV = 9d2ec94b927327793583b818 -PT = a17bc5d428700f94c641e74aaacf2c5d -AAD = -CT = d460fda5b24425b5caa8176c8c67b3a9 -Tag = 0df724340b8ca56e8dea6bbeb4b55c35 - -Count = 13 -Key = 39d945a00e05d70a16e61334d2010209 -IV = 1f931448e9013ec4ec61af0c -PT = 9dd90ebfc054da214cbb30db7f75c692 -AAD = -CT = e4cb765408697cf85917a7a9264086e4 -Tag = fe9a1fe7a58d66e3b922693a163c1ff4 - -Count = 14 -Key = 6620ca65f72de7b865de731928a4723e -IV = e6428b6b77e9b6993b809aef -PT = 7044f7c27d776f6a7d43abea35908de4 -AAD = -CT = a1c5634a07d05ca909dba87bf02228e4 -Tag = d8b40a60a65237337db05b045de8074c - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test7.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test7.txt deleted file mode 100644 index 92eb2695..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test7.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = c939cc13397c1d37de6ae0e1cb7c423c -IV = b3d8cc017cbb89b39e0f67e2 -PT = c3b3c41f113a31b73d9a5cd432103069 -AAD = 24825602bd12a984e0092d3e448eda5f -CT = 93fe7d9e9bfd10348a5606e5cafa7354 -Tag = 0032a1dc85f1c9786925a2e71d8272dd - -Count = 1 -Key = 599eb65e6b2a2a7fcc40e51c4f6e3257 -IV = d407301cfa29af8525981c17 -PT = a6c9e0f248f07a3046ece12125666921 -AAD = 10e72efe048648d40139477a2016f8ce -CT = 1be9359a543fd7ec3c4bc6f3c9395e89 -Tag = e2e9c07d4c3c10a6137ca433da42f9a8 - -Count = 2 -Key = 2d265491712fe6d7087a5545852f4f44 -IV = c59868b8701fbf88e6343262 -PT = 301873be69f05a84f22408aa0862d19a -AAD = 67105634ac9fbf849970dc416de7ad30 -CT = 98b03c77a67831bcf16b1dd96c324e1c -Tag = 39152e26bdc4d17e8c00493fa0be92f2 - -Count = 3 -Key = 1fd1e536a1c39c75fd583bc8e3372029 -IV = 281f2552f8c34fb9b3ec85aa -PT = f801e0839619d2c1465f0245869360da -AAD = bf12a140d86727f67b860bcf6f34e55f -CT = 35371f2779f4140dfdb1afe79d563ed9 -Tag = cc2b0b0f1f8b3db5dc1b41ce73f5c221 - -Count = 4 -Key = 7b0345f6dcf469ecf9b17efa39de5359 -IV = b15d6fcde5e6cf1fa99ba145 -PT = 822ae01a0372b6aa46c2e5bf19db92f2 -AAD = 72e9cb26885154d4629e7bc91279bb19 -CT = 382e440694b0c93be8dd438e37635194 -Tag = 2fa042bff9a9cd35e343b520017841bb - -Count = 5 -Key = 9db91a40020cdb07f88769309a6ac40b -IV = f89e1b7e598cc2535a5c8659 -PT = f4a5003db4a4ebbc2fdb8c6756830391 -AAD = 70910598e7abd4f0503ecd9e21bdafb5 -CT = 40d7fc4ccc8147581f40655a07f23ee9 -Tag = 243331b48404859c66af4d7b2ee44109 - -Count = 6 -Key = e2f483989b349efb59ae0a7cadc74b7a -IV = 3338343f9b97ebb784e75027 -PT = 14d80ad66e8f5f2e6c43c3109e023a93 -AAD = 8b12987e600ff58df54f1f5e62e59e61 -CT = 43c2d68384d486e9788950bbb8cd8fd1 -Tag = 47d7e9144ff0ed4aa3300a944a007882 - -Count = 7 -Key = 5c1155084cc0ede76b3bc22e9f7574ef -IV = 9549e4ba69a61cad7856efc1 -PT = d1448fa852b84408e2dad8381f363de7 -AAD = e98e9d9c618e46fef32660976f854ee3 -CT = f78b60ca125218493bea1c50a2e12ef4 -Tag = d72da7f5c6cf0bca7242c71835809449 - -Count = 8 -Key = 2352503740a4e1b22dcc9c002f53bd11 -IV = 474ecccc3182e03c80a7be74 -PT = dc1c35bc78b985f2d2b1a13ce635dd69 -AAD = a1bc98dacec4b6aa7fee6dfa0802f21a -CT = 3f6f4daf6d07743b9bd2a069d3710834 -Tag = b9c2b319adbd743f5e4ffd44304a1b5f - -Count = 9 -Key = fc1f971b514a167865341b828a4295d6 -IV = 8851ea68d20ce0beff1e3a98 -PT = 2fec17b1a9570f6651bbe9a657d82bce -AAD = ece8d5f63aebda80ebde4b750637f654 -CT = 2d27e5fa08e218f02b2e36dfad87a50e -Tag = eb9966774c588a31b71c4d8daa495e9e - -Count = 10 -Key = 00ef3c6762be3fbab38154d902ff43b5 -IV = c3c1c3079cda49a75a53b3cc -PT = be425e008e9b0c083b19a2d945c2ede9 -AAD = 714fa1d6904187b3c5c08a30dffc86e8 -CT = c961a1758dcf91e539658372db18968e -Tag = eaf9bda9b3322f501f7329cb61c1c428 - -Count = 11 -Key = 2d70b9569943cc49cdef8495bdb6f0e6 -IV = b401d0f50880a6211fde9d9c -PT = 47a87a387944f739bd3cb03e0e8be499 -AAD = 592e7276bda066327f2b3cd8cc39f571 -CT = c1b2af4d273231e71e7e066c206bf567 -Tag = c68d8d3cf8b89e6b15f623d60fef60bd - -Count = 12 -Key = 775cb7f8dc73f04fe4f9d22126bb7b57 -IV = 81ceb17deee19b8153ff927c -PT = 8242c6c0eed6d5d1ab69cd11dbe361d0 -AAD = 97e07cd65065d1edc863192de98bc62c -CT = 580f063ab1a4801d279e4ee773200abe -Tag = 29e4d7e054a6b0a4e01133573fbe632b - -Count = 13 -Key = 58ba3cb7c0a0cf5775002bf3b112d051 -IV = bb923c93ddca303ab131238d -PT = 6b93d2d92de05b53769ec398ab8097dc -AAD = 0898ea55c0ca0594806e2dc78be15c27 -CT = d0564006b1897bf21922fef4f6386fd4 -Tag = 3a92f3c9e3ae6b0c69dcb8868d4de27c - -Count = 14 -Key = 955b761de8e98f37acb41259fa308442 -IV = a103db8a0825e606b70427fc -PT = d18344c86caffc4237d2daae47817b13 -AAD = c2d0d8b77a6fd03ced080e0f89de8a4b -CT = 065d228c1289007a682aa847a36b6f30 -Tag = fb367f47922d67c84bf47aabb2b98421 - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test8.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test8.txt deleted file mode 100644 index 43d04aee..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test8.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = d4a22488f8dd1d5c6c19a7d6ca17964c -IV = f3d5837f22ac1a0425e0d1d5 -PT = 7b43016a16896497fb457be6d2a54122 -AAD = f1c5d424b83f96c6ad8cb28ca0d20e475e023b5a -CT = c2bd67eef5e95cac27e3b06e3031d0a8 -Tag = f23eacf9d1cdf8737726c58648826e9c - -Count = 1 -Key = e8899345e4d89b76f7695ddf2a24bb3c -IV = 9dfaeb5d73372ceb06ca7bbe -PT = c2807e403e9babf645268c92bc9d1de6 -AAD = fed0b45a9a7b07c6da5474907f5890e317e74a42 -CT = 8e44bf07454255aa9e36eb34cdfd0036 -Tag = 2f501e5249aa595a53e1985e90346a22 - -Count = 2 -Key = c1629d6320b9da80a23c81be53f0ef57 -IV = b8615f6ffa30668947556cd8 -PT = 65771ab52532c9cdfcb3a9eb7b8193df -AAD = 5f2955e4301852a70684f978f89e7a61531f0861 -CT = c2a72d693181c819f69b42b52088d3a2 -Tag = cadaee305d8bb6d70259a6503280d99a - -Count = 3 -Key = 196ed78281bb7543d60e68cca2aaa941 -IV = 6e7d2c8f135715532a075c50 -PT = 15b42e7ea21a8ad5dcd7a9bba0253d44 -AAD = d6fc98c632d2e2641041ff7384d92a8358ae9abe -CT = 06e5cc81c2d022cb2b5de5a881c62d09 -Tag = 28e8cad3346ce583d5eebaa796e50974 - -Count = 4 -Key = 55fe8a1bdc6806ed2f4a84891db943a0 -IV = af4d0ba0a90f1e713d71ae94 -PT = 81315972f0b1aeaa005363e9eca09d7a -AAD = 677cd4e6c0a67913085dba4cc2a778b894e174ad -CT = c47bcb27c5a8d9beb19fee38b90861b7 -Tag = e061ee4868edf2d969e875b8685ca8a9 - -Count = 5 -Key = 6d86a855508657f804091be2290a17e0 -IV = 65dce18a4461afd83f1480f5 -PT = 0423bd1c8aea943637c7c3b0ca61d54b -AAD = e0ef8f0e1f442a2c090568d2af336ec59f57c896 -CT = 53505d449369c9bcd8a138740ea6602e -Tag = 86f928b4532825af9cac3820234afe73 - -Count = 6 -Key = 66bd7b5dfd0aaaed8bb8890eee9b9c9a -IV = 6e92bf7e8fd0fb932451fdf2 -PT = 8005865c8794b79612447f5ef33397d0 -AAD = 60459c681bda631ece1aacca4a7b1b369c56d2bb -CT = 83b99253de05625aa8e68490bb368bb9 -Tag = 65d444b02a23e854a85423217562d07f - -Count = 7 -Key = e7e825707c5b7ccf6cfc009dd134f166 -IV = dd0c7a9c68d14e073f16a7a0 -PT = 88b1b11e47dfe2f81096c360cf1e30e7 -AAD = 11c69ed187f165160683e7f0103038b77512460b -CT = 550fa499a7cb4783c1957288a5cc557f -Tag = 5d2c2f71a2e6ad9b3001bdbf04690093 - -Count = 8 -Key = 92591b15e28ce471316c575f3963103a -IV = 2c30d215e5c950f1fe9184f6 -PT = dc8842b3c146678627600742126ea714 -AAD = 46e1bd5fa646e4605e2fbec700fa592a714bc7ef -CT = a541d3d8f079bfe053ba8835e02b349d -Tag = d322a924bf44809cb8cfe8c4b972a307 - -Count = 9 -Key = 74f08353d4139ddad46691da888ee897 -IV = e2619217dc8b093e2c7c5b78 -PT = 1690d6c8f95ef5ac35c56e3129717b44 -AAD = 92277cf78abe24720ce219bba3a7a339a2e011b2 -CT = b413557c0df29e3072bb1b326e2002dc -Tag = 3bb6273687ec6a3f4a0366f1b54bd318 - -Count = 10 -Key = 5c951cd038a3c65cd65325bfdde86964 -IV = 3bf5623fd1155f1036ea893f -PT = b609ec6673e394176dd982b981a5436b -AAD = dc34014513fd0eede8e9ca44a16e400a5f89cdd0 -CT = 009cf623e57a3129626a30489b730607 -Tag = 1d202825db813c0fc521c284dd543fff - -Count = 11 -Key = 72301c093ba804671c44a6bf52839d9c -IV = 87cc7e6579cc92822f5744f6 -PT = d59bbae4ff3e3755c0a61a9b6d3e234c -AAD = f461946c4feba79c18366555d85311248d269c87 -CT = ee743d29dcbaa084fda91eb48b3be961 -Tag = 07934a5372d41928f2ee7d4bb8c18982 - -Count = 12 -Key = 39b4f826b520830941b3b1bcd57e41d5 -IV = ca32ac523fe7dfefe415cba1 -PT = aa2b7a6c918ed6715441d046858b525f -AAD = c586cd939b27821695b4ee4dd799fb0e3449a80e -CT = 8b64f5ea9a8cb521c66df9c74d4b7ecd -Tag = 3db56a792b67ac6d0c4001e17f446111 - -Count = 13 -Key = 79449e5f670d55ee2d91ca994a267a8c -IV = c779da00d672811d8a5124f1 -PT = 767e120debd8a1dc8d2db8b7f4750741 -AAD = 54780846dc3df77c8d90c9f2decb0738da36fbda -CT = eb864412add08abb4f89d72d412d0085 -Tag = 494a547f617840267d3fed5280e3eb30 - -Count = 14 -Key = cc90c2f37f970f97ac97e3e3b88e8ae3 -IV = 67bcc08f223f12107e4d9122 -PT = b0fe0dcdcd526017f551da1f73ef9fe1 -AAD = 065acdc19233af4be7c067744aabab024c677c5e -CT = 501cda2c954f830e8922c3d7405b5ee1 -Tag = 9deee5d0e4778a9f770367f19c74daef - diff --git a/unit_test/ciphers/gcmtestvectors/Encrypt128/test9.txt b/unit_test/ciphers/gcmtestvectors/Encrypt128/test9.txt deleted file mode 100644 index e88c6a2a..00000000 --- a/unit_test/ciphers/gcmtestvectors/Encrypt128/test9.txt +++ /dev/null @@ -1,126 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 89850dd398e1f1e28443a33d40162664 -IV = e462c58482fe8264aeeb7231 -PT = 2805cdefb3ef6cc35cd1f169f98da81a -AAD = d74e99d1bdaa712864eec422ac507bddbe2b0d4633cd3dff29ce5059b49fe868526c59a2a3a604457bc2afea866e7606 -CT = ba80e244b7fc9025cd031d0f63677e06 -Tag = d84a8c3eac57d1bb0e890a8f461d1065 - -Count = 1 -Key = cdb850da94d3b56563897c5961ef3ad8 -IV = 841587b7174fb38fb7b3626e -PT = c16837cb486c04bd30dcae4bcd0bc098 -AAD = de33e6d20c14796484293dff48caffc784367f4bd7b957512ec026c0abc4a39217af0db35be154c45833b97a0b6454df -CT = f41a9ba9ff296ebdbe3fdd8b1c27dcdb -Tag = 506cc2136c15238b0f24f61b520fb5e6 - -Count = 2 -Key = 45551710464a9ea105a30e056167cfb0 -IV = 5727688c9e74bcd23c14a345 -PT = 6adeaaa151b58c337471653c99affbdc -AAD = 3eebcdc5c5e9970b3fca94bd0d28ead70d1f36a94f27780472bc3cc9ff39dd7b7e3a76ebce967d6ae5724ad904dc5548 -CT = ec18f1d675dd056baeb374829ce45a33 -Tag = 378bdc4c34753a1284b654af049b853a - -Count = 3 -Key = c8650e8695396b84a3fdeea8f95c8215 -IV = 5a1c26d3848910137df9f76c -PT = 88aecd97435d97e2dff8763f640a5640 -AAD = 3dace39b7284ea2786a6bc670ced1c7cc0c28c4ae4e7494a6d834eb09260b68898b914d5a6b0b5334eff9669f233aeb8 -CT = 49a9398c70a89c0e43ce7a7bd7a90c58 -Tag = 8509ef5fa8046a48a5f081e5215db2eb - -Count = 4 -Key = 76470ff92aaeeeb24172b823fce630b1 -IV = c70088e92633688bebe3265b -PT = ff4f74af151c292a0b35ba7049c9a5ad -AAD = a262fc02a3d0db113493d4179cc9ec806825f20f5864bb105c6116ea72f0284950ecc8a05dc548023853a657b67ce01e -CT = 2404868e6bfee5ffe6ec851785618aab -Tag = b338a9ccf10d45dfd4e0ccb8a87b3c1a - -Count = 5 -Key = 247b0330aa35a8a855142f933d182581 -IV = 6df7990b60e41f1fac5f283f -PT = fa979c20be9f7f7e802fd5ca55c14618 -AAD = 0cec69d6f6532bf781f5b0fe70e33e1cd68f8b2019aa73951baf978bc1141b51083a8e5c785c994b12ffeca01b6c94f4 -CT = ca4b66a09606caae8a100ce994da9452 -Tag = 534188f439b929183d21109d962145ea - -Count = 6 -Key = 1ea5cdfe206130596b655bc6fb935fad -IV = 0ec93072e726ec58352d5a90 -PT = 1ac044b5f8b693fa236986ad1621edd8 -AAD = d9da4741fda4821eb391a23f7f6b377bed923260b6f8c8ac9bbca4edef1bc2a48a45c8676cb598a668e28fe1103efa23 -CT = 33d387a3b73a590bfd78320ddad8c169 -Tag = ef36d6c01b5a54bf06ba218aa237fa54 - -Count = 7 -Key = d5a707d2e3163fbd9fba2f12e8dd980c -IV = 4a4ed3d33e5a1dd6befdb382 -PT = 639331ff4efaadc93e92e58de9e886ee -AAD = f5392e014cbe2d33cd0a0497cf0398883338748491a8543991990f9958e4a827e190e6f5ce89baac5f3bef91dcb5858b -CT = c986c4c805092a51103176b56507dd95 -Tag = 5da4fe4e281e995d0c75587b4945ca85 - -Count = 8 -Key = 3d2c604398c247e3ae7d90cc1e11f6cf -IV = 5dfafa52cbb52f57ac304381 -PT = 9c12cb73902608e7b2ea30da7397b66a -AAD = 53e050b559308705376a23ee2b22b7642f06ab77a00259bf7bf28cf6665912af4b8901f8af76e982a8bcbafe5ea1aaf6 -CT = 7fe6b5a881c8a6b8e3e29f1a3819383b -Tag = c528fddf8166a5c0ec3f0295b2c3d7a6 - -Count = 9 -Key = a335f0577c876e61d94522d526159f57 -IV = 6ea85a74513f664a907fef80 -PT = db38cf3bb14825a6c11ac978fb516647 -AAD = 038af270aece9687e34c55ec30494e9f72b6a90ac43280a9b8e958353d8c02a83ed163c6924b7201759615779cd5661e -CT = 7e81df8bf0b671e89a639d6432d44952 -Tag = 2180e6c8fe8fbb3394f9dfdc1c439d80 - -Count = 10 -Key = afb3ab51cf05e0cfa2ccc2c3c8f4b67f -IV = 26a5d1667feae062c14663bc -PT = 26821b2fe21c26d20843af266fce1f16 -AAD = 130b15bde79749d0577bff6c98ab50f035abae041b0d5f666db27c262c0ed2a801c24feffcfe248cf3af5afcb6b0dd1a -CT = c5317ad695606124662453dbfb96a26d -Tag = 2ace2fa75daa31fe4f2020cea9e71ec6 - -Count = 11 -Key = 0b4d033bf0182bb06f8b9714d525ee74 -IV = f0807dcca355aa339febada2 -PT = 7c90709d6ea3e586bbf11913bb2b5261 -AAD = 9cb373a8b7cc61eb382dfe1ea17d78877e9366207c3a5161a1f34b75ac503dc20e4af9d9962b7d4fb0f39ac9666c660c -CT = bfdde06e311240348f04277504fd75fb -Tag = 1dc5898c49e2dab4ae1a599547a76ab1 - -Count = 12 -Key = d32b7c3cb327780d1422116c40470ab0 -IV = fcc79573051011685ee0d9e1 -PT = f015f4ab3bc159db9cf6b4bb6750db46 -AAD = cdaae988d8bf01e24a4baf489893ee329b7d0dcfdef684fe3e382b200cbd5a7ea3e46be281b0c6cc00417d67f4d3db02 -CT = 48bec210f66942f877993e9486a678e7 -Tag = e4a3821709626cc3006c805a75f067cc - -Count = 13 -Key = 086a0cdd8d520a8a695d17e869e03efc -IV = f0a463c0d1e28633da98b1e2 -PT = ad6fbcf714ab893455eddb3c5fb406dc -AAD = aa7ebac61f7e0b9da0d941e801730a393b2728476dfd065e2f6ef4b343bc2ba6e17c59a2e5381597948a73ff25493f8e -CT = f0b1a368b832ed35d54c80067a06a2ae -Tag = e3c80910db9ce1f3ad2519fe1ee2dfd7 - -Count = 14 -Key = e47e1e3a95627418ed659452a3c92d45 -IV = 78adcf3f732dd3787cb5490b -PT = 801efcab1e329a536a7b506c4a7509ec -AAD = 41913a6c5c4dddae06f3c0f68e8ece139ca902fe340a820e7c40d895b35e8f4cba7809c7eed0b2b7ad45c6d152ec3053 -CT = 6751a4a5e0cc3c0f46cb5540937efde8 -Tag = 7b07d21a4cbadeedcadce817d9ab81be - diff --git a/unit_test/ciphers/gcmtestvectors/gcmDecrypt128_stripped.rsp b/unit_test/ciphers/gcmtestvectors/gcmDecrypt128_stripped.rsp deleted file mode 100644 index 69ee2a88..00000000 --- a/unit_test/ciphers/gcmtestvectors/gcmDecrypt128_stripped.rsp +++ /dev/null @@ -1,3150 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = cf063a34d4a9a76c2c86787d3f96db71 -IV = 113b9785971864c83b01c787 -CT = -AAD = -Tag = 72ac8493e3a5228b5d130a69d2510e42 -PT = - -Count = 1 -Key = a49a5e26a2f8cb63d05546c2a62f5343 -IV = 907763b19b9b4ab6bd4f0281 -CT = -AAD = -Tag = a2be08210d8c470a8df6e8fbd79ec5cf -FAIL - -Count = 2 -Key = 2ad0bf5aeb47a0c1a98da3dfdab4fded -IV = 25f1b6091ee7040fea4ba854 -CT = -AAD = -Tag = d7963d240317653e01cf5abe5d0966ae -PT = - -Count = 3 -Key = d8cd400a0a73d114cd3ecf36537cab3d -IV = 3c162c9f16a49b8fe6c92a81 -CT = -AAD = -Tag = 4203aec165f9d397cf9009770a088c16 -FAIL - -Count = 4 -Key = a982a7bae2b3eae1b7832f16faf693b4 -IV = 78d2d2fa43850483ce933576 -CT = -AAD = -Tag = ceabb89ee3179e25ed32d5a225006361 -PT = - -Count = 5 -Key = f9e3992196f7d7a21bd956f4b5a5ffce -IV = 0794a6bdf5f198c9f193b9ba -CT = -AAD = -Tag = f8247fd5dc7bd6d40e96af32aa9c1889 -PT = - -Count = 6 -Key = c91aab7ebe13653a71a4232fd1beb793 -IV = 7799464b6de6383da0daec52 -CT = -AAD = -Tag = 00c4f7033f3c05e9d531f3ca573dc98d -FAIL - -Count = 7 -Key = e7e4eefd0a3abd4ee1bef270d257eab7 -IV = f548f2a04a50a2f0342b2250 -CT = -AAD = -Tag = 044159b8a18668167fbd28ac500c20fe -PT = - -Count = 8 -Key = 1bd49e553457459aee1b5d83e7c216a2 -IV = 2b37cf40ed2685eb2a907cd0 -CT = -AAD = -Tag = fcb41d17fdb023d4d14f84a387d3ad77 -FAIL - -Count = 9 -Key = 4d6486fa68ce5a14b9db7334ab4838cb -IV = afad3f4190d56a1b8eb08e58 -CT = -AAD = -Tag = 4bda04755b7ce9da020ce7467a5ced8f -FAIL - -Count = 10 -Key = da5b59d5eb448fd6c08c350df9a82114 -IV = 15fb65d9fe2fa27f226312c0 -CT = -AAD = -Tag = e407fccbb9f00eeb9cef4a520cff957c -FAIL - -Count = 11 -Key = 07d5a7d405b21c64d74cc0988693b784 -IV = 2eefd7990ea025925e9ca6f9 -CT = -AAD = -Tag = 1439522d18c9eb129f1f776590027761 -FAIL - -Count = 12 -Key = 48760dec952010140ffc4b4078438b56 -IV = 930cc3ff276d7bbb74d187ef -CT = -AAD = -Tag = 8673dcb97934d54dc17de0037344737f -FAIL - -Count = 13 -Key = ed7c50762dc0dc4aa5c8be4cf0a56b88 -IV = 50dfb73b5034cffb6709af8f -CT = -AAD = -Tag = cb02203ee8eccec446ed1c2cf68fd1c0 -FAIL - -Count = 14 -Key = b5d4b3e80a56adbc780ff02c5da6a7ab -IV = abc5b96c5e872502971dcc55 -CT = -AAD = -Tag = 4e85677cc16e2b2fb50a2ca9c0ac1b9c -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = d1f6af919cde85661208bdce0c27cb22 -IV = 898c6929b435017bf031c3c5 -CT = -AAD = 7c5faa40e636bbc91107e68010c92b9f -Tag = ae45f11777540a2caeb128be8092468a -FAIL - -Count = 1 -Key = 2370e320d4344208e0ff5683f243b213 -IV = 04dbb82f044d30831c441228 -CT = -AAD = d43a8e5089eea0d026c03a85178b27da -Tag = 2a049c049d25aa95969b451d93c31c6e -PT = - -Count = 2 -Key = bc3ab28150fd4cb731d5f48ed2784173 -IV = 40408445c203c647312b8f01 -CT = -AAD = 53d2fc19963fc99a36a524e39cb68aa8 -Tag = 3f04dbd2f49909f73044175041fd9eff -PT = - -Count = 3 -Key = 34537f1a0ba093aefedefe8b4b6b34e7 -IV = 9c5fc88eb388ef6776aa2182 -CT = -AAD = 4dd377d089c617dda1ecd42341d1878b -Tag = c0fccde30ba354e23c05b5371c40d088 -PT = - -Count = 4 -Key = 54c3f935982de19de88d6384f9493389 -IV = 3d7eec1cdf3cd419511793ab -CT = -AAD = 2ded8cbc69fa57678aadc7477f2a2173 -Tag = 74107fc192c94a7d85d0f9205f8b02c9 -PT = - -Count = 5 -Key = 790f8945b127a1a418d6d58b4378e0dc -IV = f5694d77b816f2cef0ac80fc -CT = -AAD = e5c71b82a60c97f050511a3b9a09e450 -Tag = 4c75effb688dccd0affe92c0e0391d64 -PT = - -Count = 6 -Key = f6ed6f0afea7e99ab320b525107715c9 -IV = 351e7dc999b9de77ce61b2f7 -CT = -AAD = c9101b64e0b6abc0e46828aec14d29cc -Tag = 4f2ec2e1ab001443a60722671a9c9656 -FAIL - -Count = 7 -Key = 2eccf9cda0e4e70f273ee8251120c768 -IV = 1d869f4b8497bc19d948cea6 -CT = -AAD = 1d86a6a21f23ee56ad0fa6c1de525906 -Tag = 37ffc390298c3ea8cceb382f394c2fc2 -FAIL - -Count = 8 -Key = d61767f07b959e94f73c64cb5a5520b3 -IV = ecfa850395f8cf9348f1324f -CT = -AAD = c3571bf1700b114bbf0c6bb2278d4d88 -Tag = 1065f86bc9e22197880ea87ac326a17f -FAIL - -Count = 9 -Key = 9421cac15ce7d49ec7c088f7524a1ff5 -IV = b3d395bca123b265c05577cc -CT = -AAD = eb6e06071dae4360e8347bfb72d9c188 -Tag = 1f04c228c7efc71f1706d10fd819f35e -PT = - -Count = 10 -Key = 8580395a5d777c1690af79f6068e291b -IV = cad1a0f2b76f064ca56be3cf -CT = -AAD = 174388edf0b7f86fe634cb942c13754b -Tag = 0067b03f2e0efc72cb08792fbe3b0267 -PT = - -Count = 11 -Key = 0c21da9c8b84d371fde59e6d1752113e -IV = f8c13e58aaa329427438db8b -CT = -AAD = b8b197789cfd085b09a47760c28c7e8a -Tag = f8613cc5dcb4cc5c78f1f7c2d8084ec6 -PT = - -Count = 12 -Key = 162fc51e46e771222a04842f5546db8c -IV = 13557e09e738eb895eca2d8d -CT = -AAD = 691e71952c31a6b49b785f627c03e948 -Tag = 4f7ea723b1abd74e53fa356809275ca4 -PT = - -Count = 13 -Key = c46d9562d954801b8e99e4e57cbcc0ec -IV = 30414c934b14e0bb0110ae44 -CT = -AAD = 41ae6a63855c1944446491e80670bf68 -Tag = 3e2366a2cf5632c1ecfde33f1f5f6d18 -FAIL - -Count = 14 -Key = 2904df4dafcc6bbb8375baf6a7eede80 -IV = 6aae8ff4b1609f4026b47259 -CT = -AAD = c4afa7b21e5f41b892be52365a18584e -Tag = e1810fe340207fa83815182bbad62bde -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = b1089cecac8e1a56441353857246773c -IV = 1af1e6f40b1b21fcb38f65a5 -CT = -AAD = ed825cbf40e8f8f198ce1afd1141a3cf391cee73 -Tag = 0edb6756481560956d506a8cdb082db0 -FAIL - -Count = 1 -Key = e6a76441748e6903a8b7ef114f631dd8 -IV = 79706e2030f9938576d8d9ae -CT = -AAD = d2e6fc9e97ed37a0530f2744ca58ed81f0ddd99f -Tag = 102bb898d4ca9780a69aa159e8c92228 -FAIL - -Count = 2 -Key = 5211242698bed4774a090620a6ca56f3 -IV = b1e1349120b6e832ef976f5d -CT = -AAD = b6d729aab8e6416d7002b9faa794c410d8d2f193 -Tag = 0f247e7f9c2505de374006738018493b -PT = - -Count = 3 -Key = 0335807df98f4728dc982efef77686bb -IV = 5cceb5114b6701989957c926 -CT = -AAD = 5bc191e74d849733fea6b8212d01a19ac274bdac -Tag = 3f5e29ded16cb63f9ba8c103fe753595 -FAIL - -Count = 4 -Key = 11200dc2b58b3601f95f95cb80845493 -IV = bfc175513fb49d9be980d6b2 -CT = -AAD = 2740904aa8b7096a7bd7400b3023ecd042061a68 -Tag = 548deef09fb8d22252f956b28d8807a4 -FAIL - -Count = 5 -Key = f8869d9df1ac6da86e905442fc425c92 -IV = 22b0af177e3154cfef3dc2b0 -CT = -AAD = e07715b1d919f8bcb8b2c4ba998b87e6286d82fe -Tag = e08ea41cf27f344db855564cb94842b1 -PT = - -Count = 6 -Key = dc945bb910f648b228482ff6ea37c0dd -IV = 6fe11889b190056d77d3114b -CT = -AAD = 925c4a09fabba4d9df9320735f4753d0d75a2eb1 -Tag = 4f4a5106624a7eb722a4d0ed56b074ae -FAIL - -Count = 7 -Key = e97ef05d5272238514b40eb9dc37254d -IV = 77b02548a863130e64c4f23a -CT = -AAD = 16d11153706a45edcf5ab14775d6fb117c99efba -Tag = 49a4c763ed312224796fa0981b2f6067 -PT = - -Count = 8 -Key = 10486a4ec7a139c45392d11389312b65 -IV = e5fd821c83a47ca17baee945 -CT = -AAD = 9e794623863a6a8f7600e5d3dc906fb569e2d621 -Tag = 2255a12c2d4bd77a1e557f0f332f747e -FAIL - -Count = 9 -Key = 5b360040bb672a55a8a893afe9309169 -IV = d4795970cf41b54f673a5367 -CT = -AAD = 00fccf7ea5873e5bd437b4ef5e3b8543afdf0214 -Tag = a104513ebe3adaf87b7284d1f1c71c12 -FAIL - -Count = 10 -Key = 27bd1dacc704c5bbcbd7615ac5ebee14 -IV = 444d84e15fc7ccfb62aa46c5 -CT = -AAD = 0d964255b4862bc2c790d0112fd0b67c29fd7e88 -Tag = 3330fcc53223b49b5ef51d9352b32e97 -FAIL - -Count = 11 -Key = 7f0cb9efbcda58d5929632770b4ed3c3 -IV = 9d5f05f623dbd0d68c3940af -CT = -AAD = 74af77b5479ff8081486ebb2411d68632b964868 -Tag = d31b61e0c93b825efc7f04a9e219dc03 -FAIL - -Count = 12 -Key = 1bf60336203befd206d5e6cbe485dd1c -IV = 4e75611acd124375b7805908 -CT = -AAD = 32b4b023b13718da023d5f078b8d61c13640a33d -Tag = ee2fdafb44210218c95091dcaf6252b5 -PT = - -Count = 13 -Key = a6647da2721ee284eaec27ef95e6de0a -IV = 4c99b4c11b5403f164fb68c5 -CT = -AAD = c1e82a1c4324eb09add805623f9af291709ad9b0 -Tag = e892470ed058683bd5574c7295d84b2e -PT = - -Count = 14 -Key = 423506441e5237fbdead27eea94fd0a5 -IV = 5d390c71f28a2f09fdab125e -CT = -AAD = d78b51b89e01771483423024184eed27ca0ab8c3 -Tag = 8485ab4c8b8b0f9f2555aafa55680751 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 748146a0b1d5e9b6facdd95e8a3295be -IV = 99e8394910c21207541ca90c -CT = -AAD = 5ce0d8dbac8a82fa8dd7aec334b81301b31ab49f3b40a1857cc540a1d992f27f80945dfcb4730dc81ddfd32dee1825d6 -Tag = 847292904038c42168adf62011dc790e -FAIL - -Count = 1 -Key = 762da58bb000f5d499818bc859989a30 -IV = 584c291ff1aa388a5112521e -CT = -AAD = 91f92e8bbda7b5ec967ade766f4f26e9189eaafad416f37b4891d3e37d70cb9a267aa843dd202858ade020261223dfce -Tag = 9ac7eb2d762facae06086c957959880e -PT = - -Count = 2 -Key = 4ae615ef5f3e1ac590d4e5b8623173ba -IV = 3a998fbdf1131c8992e95bf1 -CT = -AAD = 81edcccd1ace673b96fa3b74a2f99fc63bca822f6b9c6b99477b479d5d13b8dca5f6ef726718346ba22c9f492b30d6ba -Tag = 93cfa8f4dc1da3429eb9dca26ed45024 -FAIL - -Count = 3 -Key = 2dd1a4bc80d9ae6773fe3284e7f7e734 -IV = 404c5b85d1429e48348ee225 -CT = -AAD = 861f17b5e33b17369021b8b2054131715bea7cebaaf732066da9a172341eae3b47a0d49923b25463caabcac6ffb7b5ea -Tag = e0fadad353d1d29ec6503dd2e049d6a9 -PT = - -Count = 4 -Key = d4eb3c0ac7156ebb5267f9ad2de162ac -IV = 74aed5826dc979d6b1c1011d -CT = -AAD = 34d2a785c9f47a83ed19e48ae1ee57745cbd9f30af5b9e6e633e9106d2f36a379e08d85b52acf9a14663a28d68808eab -Tag = 278acb3388978409d9fc2f6380ceffc3 -FAIL - -Count = 5 -Key = efbe4777ad529213599ea7bf82d4b0fa -IV = 8692f09a527d3e5d3cd152f7 -CT = -AAD = 95bff730bea903af3482913f712b4fe9da387f5104131ac03b2f94569957ab93af9bc6c3a405133d6874e6e466a3d011 -Tag = 7ddf730b688f268cdb7a32757f34817a -FAIL - -Count = 6 -Key = e024812778ce3c9659fa6b3ab917f38b -IV = 8a2ea9d140a8193572bc37c5 -CT = -AAD = 56b2c2f68ac50885a3a4bfc4fb8845a1c6e8704c0d89237566e551d59607bffe6e557c0dbff15a91a177905b526838db -Tag = 21706b2f8cd2f4d51aeefa3604d7f6d2 -PT = - -Count = 7 -Key = 293ae2e14a6a874c214ddd12ffd6a908 -IV = 542039d5e5b54222f8153747 -CT = -AAD = bc51a6a29a897a9fe4b955f270e21ef5768e55c11c9d9d16b4934cb3c8524c29e50d4b02b671c5a1b25a46991e62c65e -Tag = 612c4c96e6cd10c13a98ce5fb87bebd8 -PT = - -Count = 8 -Key = cb803f23f8c97ff4774ea37856c90f0f -IV = a3ec912bf0a0ad64e23e6c9d -CT = -AAD = 6c0f16c8e70852270b16a3eafdc5aaab1a3279d803d535b23292bd12bc2fa7da0a63f837c0093167029689c2bbe89bdb -Tag = 396a389e9e59b742dbe52fa277a05458 -FAIL - -Count = 9 -Key = 53101ae08ff3d972d437498253ad4911 -IV = 1748c2f3c6a7d2de3bbf91c2 -CT = -AAD = e166984563c1afb505b220490e3aabc8cfc07cd143960e3f0c068f395b5bcbb2e3f1f43c2e3ab33a4f14ad07d33273d9 -Tag = 250d1b4411d5c3fe0edff3fbc0814be3 -PT = - -Count = 10 -Key = c084b3bab6c3537c65621af9c0967acc -IV = 9a3b67c8288aeeb555e94907 -CT = -AAD = 8a194907eb9fbc4b12b8bb294d552d587cd267ce6dbc46191be1983243b6bc601db78b1ec8ff402e1087614991438bc0 -Tag = e2dede4cebfa914eb7821c912768a3e1 -FAIL - -Count = 11 -Key = 626125a33643839c534556d87b0a485f -IV = e7a2d435326d79f3ab43d3b5 -CT = -AAD = 086edfdb0afd60f10e5e8b628c31ac7094a41f22a33a85f3081aa53e733072825275aed31477246578bd97575e32961c -Tag = 66b38f7467273180d6672d34658fd6b7 -FAIL - -Count = 12 -Key = cc53a3209ed65930bbd535e4ad7be780 -IV = b7606cd869fcf69f5bac64a0 -CT = -AAD = 0ab24056d93d5be92c630fa615864deb7f85712188b576d11f12275b7188e3ac2afa6c4d3a4918df9344deae010902b1 -Tag = fef072eff57121c8c780eb5c6ad55538 -PT = - -Count = 13 -Key = ce84d222d62a6b28c636c1f0a36dfbe1 -IV = 3185d862c8a323ad7b433ea0 -CT = -AAD = 8c6c6de46b003a1265ea02caff3d8474ac99c84874c106d33ffc013c2c60ddc8bd46c7df402db609f854986fcbb44794 -Tag = a5a299bf09883e2fc323ee5eb88818e1 -FAIL - -Count = 14 -Key = 53580849635cce269e3bb897dcf9786a -IV = 76849053a7b046c1fdffd092 -CT = -AAD = 04bfad7c77e4db850c2bfca5a55a2a5c33019a4327bf850f7a70734bca688ce5551fd76d0593105515ad76c12dd69d58 -Tag = 9e7e1c5dccd58fea67a8648d50e5b6ef -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = c1e007d318d0e5c87d28fd890dfb04ba -IV = d7bc58d494491ff57639b60b -CT = -AAD = 10c68681c6d700ffc72ea9a790cdc9ddc1904c7e886e23ca166dbfa364a4c5f95205bdd1f22eeebefbbb9375f1a416ec7faed6cfdf706085f8fd2632c7a261a78875811f17fba19baf905f0aa623e67175f2158cda313a5047e3 -Tag = 2f1ede16f025bc8c5421854b5f0109d1 -FAIL - -Count = 1 -Key = 8dc7a59a71cd76499de67feac53c786a -IV = beb45b75ea5b7750e69a409d -CT = -AAD = 8bade18807ac5fe59cfd34d7eed8ae33dfeeb960d2a15693837f22dd98f68715079d358a49a04a7b231d486ae45f4cd6c0fe3cde6c0d967ce8d84bbf2e4be2db793afb72ea83c7b21a73f65742c214768f7e6133e3814059efb6 -Tag = 46e8457d8d409f2a0690e6502f8b7a87 -PT = - -Count = 2 -Key = 30b0bda9871e1732051ab0facb819848 -IV = a071b9e1f103bdedf419872d -CT = -AAD = f2295256508b41b6849a3a08b3a4586abfa5a2b35f9b30d0cc59755314b32d6a890973c568a14d4c313f79c47c83c1f0d2b76a006224926fec7ab9b208c34a6e8f8d6ef4b4a75c9952ca35cb81071314b70e65faaf9854f8c32d -Tag = 6f51e06b3aa3c7869e00e3fb07f512d8 -FAIL - -Count = 3 -Key = 2a032eb1893c4ad9e78c5ed4fcae3c74 -IV = 36839f2a8b1d6df1f9f0ec38 -CT = -AAD = 9228a9d72656b32e0342bc4ebdcfdafc2a4b11214ac8caa4c772a95809dea77e49ce4e052b748a662bc1ff7bf57ed9b784d75a349769e23018f406aebf6eae30a5e9364795b58620248ef6cd42db55ee7e49f472c602a3445140 -Tag = 610fdb18669a32e7fe24348ebc77ae15 -PT = - -Count = 4 -Key = 68dbff539c8ac07c0d66e3c8aa883655 -IV = daa344a429db89941f629bae -CT = -AAD = 8685accfe29a7e07d92aae2cebd25d3349bc917d81c3e999a009836e14611c083e6b3ca4257ffdfb7c2f53a867bf24c739f18c0d807222fb0bffa921da2835b33d0b79e666af0ac7be3fd288f38a086806045732b5a495d65774 -Tag = b5f74d514ad2eac63aba6367c5d7f843 -PT = - -Count = 5 -Key = d5e22e409e61c7e57687a143ee5dde17 -IV = 6a1b9b8b9fa5d3b14758a9a4 -CT = -AAD = eed5683b9e0c4080f6fd5b4fb896a2ee752df04a8f9cb34ac5fe1a0862b2431d4abe6e96e2983d850c85de17a31b612b02c344fc4c5a8e964ac1c60ea15eb1f6146429304338d3a928c84b0725d0956813f5dec79bc8b9a5acd4 -Tag = adb6051f2a18fdbe63ae4878ec3f3788 -FAIL - -Count = 6 -Key = 7bdc885dfbbda27482afeaa8aa30a94d -IV = 6a52105223c62f0e6761aee1 -CT = -AAD = 7aacf0bc8542d867a77411ddb0c9a70889fd395e01a5befdb26f0b45caf8cceb36696ed5b849251aff29eac75af7b12735daaf671412f6e1a62e21bda88c1618cd0a9fe09d5d340ee67711ae90822877bbce83adbe38b7f25d4d -Tag = 08bba50afb61ae82ed578a139804c3ad -PT = - -Count = 7 -Key = 549cb40fb29c51656d1788024a75b80f -IV = 8f9135503f55ff1a76a41553 -CT = -AAD = ac136573ae52f3a4e4a5f6161a2db70c24428fc2fe0d810b31419690a36c1d5bb6bf36d09f24b601cb558c5eeae8662d29c84e06e2e0927857945543b13db85b50ac28c4de1563d9f0ccfa85d032f3a59c1f3cb0acba07b61097 -Tag = 1fb97bae89bc87d6fea1f5fb571480b0 -FAIL - -Count = 8 -Key = fa52f5e8446617e8029800ab73c109d2 -IV = 92b4eb872cc5acc27b2c8f93 -CT = -AAD = e6f02753b83cdcd961a5455c34329f0358a1d9acc10f17a29dbfb7aaebae6f4b80481dc9aa3abf553aef570b01baa61a84820f20b0c051676fe2fd42cf9fce3c4bf221fec2519237cb9b7da6613a4be3eabb154c37b9c69c9c12 -Tag = 735b2a825bd1e288bd66e98e44fc0348 -PT = - -Count = 9 -Key = a3cc611d369a5c06d1c0d171be2cb25d -IV = 730b0cc99066bc7bd7b3ec9f -CT = -AAD = 84d86f689a1137920c1eef9dc0c27a3ca069f0f7943c4aca10bc47a67da7b8f4ce9558f53397f15dfed1df9f9bef61a7eef2b064b46bacf4f673b37e6d813fd408ccd9632628f0cd89db27c00e268c45c581ee8e189b14adb16b -Tag = a3d510d67716ce87471e807e188822bf -PT = - -Count = 10 -Key = 5fe29162dc4d5a511d373331573a4e26 -IV = d36edb05eaf746fbc48d1dc5 -CT = -AAD = dcd82c91702c2fc562ea7636d89aa7f4679afef80b85a4f3ce9c32a5a632a42d688416c65d47b314c8d272b77d8c447a4ea186230d03d30065b3339b0750f350b18ed7c82ebb16105fc98f2cd04c827f5fe2f3904d67d75a8961 -Tag = aafafcd6c396211704f3f708f167c781 -FAIL - -Count = 11 -Key = 2dcf7a69aea4aaabc9849c57f915bd68 -IV = d1d48a6e01c482f47d7b8871 -CT = -AAD = 345e8d49f3441bd55e3046cca636578084a2a7d7686c56c9bf8e4e29f2eb996b4ec537b7a10046b7ae514c76ddc8293eed583f1bbf0b45a90784e10fb83a5e837935547ab9555c4f8b93b44653944733e3691b9a14c0b9839e60 -Tag = 33b09fc073c3c3404a5661ef2d934e08 -FAIL - -Count = 12 -Key = 1579609bf33cdaa69ced53613557090c -IV = d64d1081db1d825fc692a28b -CT = -AAD = 9ed4a0960782e2fc4b88b6b3f3fa5fe976e5e160053c68def773a55dc8520d626fc0f3447b91a5217054c03ab72f19e53514bf38a3e2ab4b632dd5e338903b727e02327d9919c00657dd3457112714c9e9cda2df44f644b32bd1 -Tag = 198ca0c5e52ba7e8ed8b9310a05a1ebd -FAIL - -Count = 13 -Key = 60920e056ead9a73080f27038956884d -IV = 8cf4c1764ea1e6b9083952c4 -CT = -AAD = ee3fb4f08c9c6f7ecc7537035366d35793fbcb02605f1891acc539d9128ddcc6eff7d91936290490e4b28da8c2126d163565e0bd048a6f0a66a277daff4a03864c746f9dc3faea70d1fb4628d66a34a86fcdf91f2a176ce94863 -Tag = 41927cbc3ee0ed121f7884f0b32b024a -FAIL - -Count = 14 -Key = 2c084c95bb67293258e7e68492cb7d90 -IV = 60f0c5264a7743f548db8b2f -CT = -AAD = 7aac62d17794ce516c4a20e32ae8c7aa0be8e483f6e5643b77df5550498ccb1adcacc28366335d48007a094588e946ea98699e5323be8269151a7df2824e808b1388667170221a74197e3ca403fbe41be95b75afb98bcd2a5c14 -Tag = 84e9567a61b9a6bbf901c86b8f2606f1 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = e98b72a9881a84ca6b76e0f43e68647a -IV = 8b23299fde174053f3d652ba -CT = 5a3c1cf1985dbb8bed818036fdd5ab42 -AAD = -Tag = 23c7ab0f952b7091cd324835043b5eb5 -PT = 28286a321293253c3e0aa2704a278032 - -Count = 1 -Key = 33240636cd3236165f1a553b773e728e -IV = 17c4d61493ecdc8f31700b12 -CT = 47bb7e23f7bdfe05a8091ac90e4f8b2e -AAD = -Tag = b723c70e931d9785f40fd4ab1d612dc9 -PT = 95695a5b12f2870b9cc5fdc8f218a97d - -Count = 2 -Key = 5164df856f1e9cac04a79b808dc5be39 -IV = e76925d5355e0584ce871b2b -CT = 0216c899c88d6e32c958c7e553daa5bc -AAD = -Tag = a145319896329c96df291f64efbe0e3a -FAIL - -Count = 3 -Key = b1191a672cc55496b3c728d6a67de0ae -IV = d0b4fa7c7f107f98f66b0195 -CT = ab957acc04c1034d8acc617c0b20f78d -AAD = -Tag = a93cc22f6086e816016606b9ad0ba697 -FAIL - -Count = 4 -Key = ca7db9e97cfa056b80dcd04f46228640 -IV = 5e8dc246ee835dc5f229d698 -CT = 178ce3bd56ae27f9812e91b942c1309e -AAD = -Tag = c633075a8b608d5f96971d2bc1ea2a0e -PT = 964610fb6585cbbb070fd9ab10a7a600 - -Count = 5 -Key = 206209e6f2d16b268dbec05972431405 -IV = 95194cb4ba24ea0476ca5ae4 -CT = 493461aeda5a0c7d18edfb11ca8277c7 -AAD = -Tag = 865615a1484744a9c55e480871472e81 -FAIL - -Count = 6 -Key = bc722187a3729a4d0292fa73d4471605 -IV = a72d339ad829c9601d00a6ef -CT = b44481ab49863873ffa2a377aa7b759e -AAD = -Tag = 4d587a7d3b5eb1186d2eacce9bb51c04 -PT = 9dfac38da5811b3c4712439117f7520e - -Count = 7 -Key = 0631c9595b5cb7f9f94aea4940125f19 -IV = 673d7e9aaedab36cbb2afa0e -CT = d558f237bc04b41c8155ef643511c52c -AAD = -Tag = 482a54ff2d9270d70375e4d8db646744 -FAIL - -Count = 8 -Key = 722bb99f8321eebaa61dd0086fd63e5e -IV = 47e36c71c70c2bb662cddd6a -CT = 4d3168836b0be7e7cd7b54ac95281408 -AAD = -Tag = 18e18960789cf650bb48d163f881fe55 -FAIL - -Count = 9 -Key = 327f9f12217e54f14bc0b38166a507ec -IV = abf4b77903fd2894516d8fc2 -CT = 3c7512dc35bd8ec80954baf49105a67a -AAD = -Tag = 5e6299deac6594fd59cf073ef14ffdee -FAIL - -Count = 10 -Key = b7d2ebf187562bd4bef0cbfebdd7cdf4 -IV = 76ff7aaa095be4111f79c74a -CT = a998f173007ded002b3ebe264ea7f133 -AAD = -Tag = a71ba4f2385bd5b615a23bdfb9dcb17f -PT = d32e43eb1a90b626b189b6a8eb592bb8 - -Count = 11 -Key = 6956712b7392b3595132f606561c0bdf -IV = 63c54fcd8e648af4bb0f5e39 -CT = 9dc01d985cd4f6cfd1eb2207761ec04b -AAD = -Tag = 1d8dc617e8f49b7e92a3f5480d1d22ff -PT = 44830dd0bc8592f4a28ec79c1d0f2b53 - -Count = 12 -Key = b3ce2c46ddf39059f683ceef05c08d38 -IV = 188549f41ba61ed52e9b14ef -CT = c06aea0ea0ec6a8446ff8f3f722cfd1c -AAD = -Tag = 605ec2fe05d7067ee5371d484e5cd7dc -PT = afff5e9becb62c8b05c26effefa3d7b2 - -Count = 13 -Key = 23ecf56f3c9ddc76e7207873824321fa -IV = bc60bd5bca6802b526cc8361 -CT = f2f8851005b8bfb38cc3488133b004ae -AAD = -Tag = 7d79d1c8742446acb45d4d0cd33886fa -PT = 5926445daca77b55857b9bd4c897c1ec - -Count = 14 -Key = 3cf9882b08500c084ab38f26c0f3e730 -IV = 615f25d13c5c4ac9d6b01932 -CT = 375bca435832c7abccce9eb890807275 -AAD = -Tag = 57e37ba21f0aef8bc70b63f7968e9eda -PT = dc1adbb316be8abccd87ffadfdfc7ca0 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 816e39070410cf2184904da03ea5075a -IV = 32c367a3362613b27fc3e67e -CT = 552ebe012e7bcf90fcef712f8344e8f1 -AAD = f2a30728ed874ee02983c294435d3c16 -Tag = ecaae9fc68276a45ab0ca3cb9dd9539f -PT = ecafe96c67a1646744f1c891f5e69427 - -Count = 1 -Key = 867fc5d5476d5008f0703d81e3622255 -IV = 22945529dff947c3c9264df7 -CT = 1c785025e5a2678e4b29b29276e395bb -AAD = 261a9efd4f32bc3d07c115b4edcf8adf -Tag = 87fdf1261846164a950c37a3f2eea17d -FAIL - -Count = 2 -Key = 3d17f97bf1dae4268b6610dc90c70b28 -IV = ebcd88fc18d4c99d28524d41 -CT = 0128a239bb43c12885f9591386ecac0f -AAD = 681a4feac147ee2d25e9191aaa4c8830 -Tag = 144def0210af9348f07afe27e65bdc7e -PT = ec18a057c22d12373b5efe4d177eb068 - -Count = 3 -Key = 5c32091e288d4780fcaff52a69c1234e -IV = bedb360b22847fc2ff60ab78 -CT = 60c883306c91a0e6e98f8d7bf7ee9fd9 -AAD = dc7c3a89a00b688af2bd372530bfed0b -Tag = ffb93af9106e95e9a65ef147765970da -FAIL - -Count = 4 -Key = 75fb7f243336b78979988c08f39c44ab -IV = 69fed95864cad27f83503f8d -CT = 7bb1d878239966163a3db5712f57b096 -AAD = b4783565715e8cdb46f8a2bb72030ce2 -Tag = bfee0dda5e1afde5c7b0928774f80d21 -FAIL - -Count = 5 -Key = 7a3d71615ec0e6ee2257f33d06611b89 -IV = 1ccf177092a1518be9f6612f -CT = d0bb72968ff7fdbd3499d6e7a34ec043 -AAD = 0753ecc820e7ed3b6ce6b60dde776fdf -Tag = 3a7c708e0e6e74a654987a257ab96461 -PT = 9c0e1b4ea43af8b1d4d173b31424fa40 - -Count = 6 -Key = bf283c584efcc4778bc6091804b2b66d -IV = 1fad1f81b45de44392497629 -CT = 51f94491184b13f46defe609642adc16 -AAD = 791856131d5d4ed0e7b205b8b2ff4012 -Tag = f2e8b0bc4e1bdd9d2604c0607c4f7fc7 -PT = c40fee049bac9b688601506d63450869 - -Count = 7 -Key = 93477009c0bbbde3aead970dd96811a9 -IV = 6f096b1f3773a928301aea03 -CT = 8643e7d1686b916cdd2b74f1cf26ce72 -AAD = 7e61a6b6cb73c187d08509ad5b940a2d -Tag = f98afcefacdc71410eef471d5bb2a599 -FAIL - -Count = 8 -Key = ec3f4315316aca1bdc2806210bbd36ad -IV = fa0698f32e058389f11e519e -CT = 16a9fbf2fe33d6c8c0b22117bc0e6634 -AAD = 414ac255598157e3b506876d00843b31 -Tag = 88f4a30ea229c8c4641f60363436702c -FAIL - -Count = 9 -Key = b431bd21c8ae9845c469b8906618e715 -IV = 8579a353df1f7dd0bac1229c -CT = bca7919e99c8de9ccb7d2dc2e1fde95b -AAD = 79d9a0a2c7536fde809aeb9f084739a0 -Tag = 2b7d96b083a1fdafab7b64839a53b90d -PT = 8347a939a90f4e33dfc70c70e6447994 - -Count = 10 -Key = 71ccaf526ec51e5117c22869289d1b10 -IV = 9fc7b2fc3a762a9c28f64200 -CT = 6f65ed418dad09ffd883afcb3c3f2333 -AAD = 0b8ddf8514761fc60ca20c11b0a9e27b -Tag = 22e0056532a847859e2aa181b80fd97e -FAIL - -Count = 11 -Key = 42deade4fcd2728eef0c258f0f80c56e -IV = 033393d7167c23327271b58f -CT = 0cc5f4e993fcdbc81904f5b26071b360 -AAD = 34ae2559e79d88aa25ec8c0a97f4f8c1 -Tag = cff5af162a6bf4b7e9169632a40f3f41 -FAIL - -Count = 12 -Key = 1fe8b08b096103debbebe1ed1b5e0ecf -IV = 4f2442796ffc2cd7b7a6b6c7 -CT = 61ca6232340df229dea57b2bc45eed28 -AAD = 9c953a6b978ffd3457c0c1e2f9e29358 -Tag = b61b58eda5efa804d42b8038a9ca6472 -PT = 5b90f102d5cb5c4cf10db51f88d5bf03 - -Count = 13 -Key = 3f8a905c888fc42dcceac21ae09027c1 -IV = fb3db97addf0f67eb369c62c -CT = 743cdf63d80bd79d4664af2f5625d95d -AAD = b74eae31f9d55f9666899c8474cdc80e -Tag = a2bc61b1e16ac2ac9c23bf40bbfe18ad -FAIL - -Count = 14 -Key = fba087aa3a2b5b4109e36938d011a0b0 -IV = f92af1ed2065fac9eb4d7601 -CT = 700613d946dedd760da35483ab668685 -AAD = 90501a414620af8e76dcf165f5cbe603 -Tag = 63703fac96bb981f74bc52f557271b2c -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = 4cf56dd7eb109452d7445e79bcad4f86 -IV = 5f3724b27c345ed5d1757e9e -CT = 2d0581c040f4e2bb74423682113b818c -AAD = 20fe2aa2641db7318aa5e339b1e303f952b05dc8 -Tag = f090c0cba2151af2e78ef407720233db -FAIL - -Count = 1 -Key = d9529840200e1c17725ab52c9c927637 -IV = 6e9a639d4aecc25530a8ad75 -CT = 6c779895e78179783c51ade1926436b9 -AAD = 472a6f4e7771ca391e42065030db3ff418f3b636 -Tag = 4522bfdef4a635a38db5784b27d43661 -PT = 8ae823895ee4e7f08bc8bad04d63c220 - -Count = 2 -Key = 43ebcf37e131a9b954bf003136e72ce2 -IV = 643e6d21bda599d486f2bb1c -CT = 6d23fa3b74d3b61f7305fc87e051408b -AAD = 87c99e3b4292e047ae80947fc5d46c4600d9f5ed -Tag = 9c036852b5e3c0aff0bb8933796182ee -PT = d5add8d52c941aeb874cb17d52960210 - -Count = 3 -Key = 23b0b223c477ac83757300dc0c16684a -IV = 907c5c2d91d33ae435b51be4 -CT = 5943b9c9229301ce25b12e798d2f16a5 -AAD = dcaff8fa814e9302f872b89e8656ee1c7c87c0f3 -Tag = 31fe5884756cc3225c42a82489115fa1 -FAIL - -Count = 4 -Key = 1ea8d9a553d2bc1268f528fba611e80b -IV = 91495ca2fb726f317faa265c -CT = fffa077c1741cd9fa1923cfa7bcd8b04 -AAD = 55c0553c29dcf916d2cc4655a962ba18845f3d9d -Tag = e7c433cd59c3ff7e3480f664d13d02e1 -FAIL - -Count = 5 -Key = 73ca3a3548b85406e5512998339f01a8 -IV = fd1990f00d51bdced7a590e0 -CT = 0afcc434cb7b7e1ec0496342aa631f75 -AAD = 64775d9656d9186fedb1ebbe9e45114b3a0664ac -Tag = 77f14cc311d60bcf5ee95049d512eeb1 -FAIL - -Count = 6 -Key = e9a9eb3f226d3d47212bce6498bb489d -IV = 5830becfb7ac36c00f6ff8ae -CT = 08a6f369d29adc3bf94b269938a53b6b -AAD = c4c51491b05de3c2ff006012a2e23d4eb121d3fa -Tag = 1d53e69dca3ff4fae0029d013f7c349b -PT = b7fd70ad0723c5c8e74fff3eac282bf9 - -Count = 7 -Key = 961771c760fe92821f2febe0e3ca06b3 -IV = 8650d3dc83ec5cf702bb990b -CT = 20bc94651a0e4f134aa259298c9942d6 -AAD = 716b3419f61afc44aebdfb2ef21fccac1551de5d -Tag = 868887decab5c3979fc943139d7423ed -FAIL - -Count = 8 -Key = 903ca48ff529c6515c690a896f265999 -IV = 0b42148de0d438ccd434b20c -CT = 3918bf3882b04f0857e7e405a4ebe056 -AAD = a9680e1551a4b8678bf96cbc2c07ea95d0e58787 -Tag = 7b511865c62ac3a077348bc5671bbd50 -FAIL - -Count = 9 -Key = 9368fea0615ff679589ce50b39b097c0 -IV = 5e25fda2e612c707db2ac70c -CT = c3a2134534fbea7f5c2c53cc422e762d -AAD = 01a7c360ffd013282ba1accd509c9b341dc19abc -Tag = b88c003712a5be28ae8b46706091b097 -FAIL - -Count = 10 -Key = 6b01949fe5e343d1639690477bc3a252 -IV = 8d8e6f1b3685908103a9fbc6 -CT = 16f4981c944c6ac60d06def4fd587ac5 -AAD = 38f6601845bf8b194108942da1c4934b5d2025df -Tag = c8b627db732d629be6cfeb6762cbe611 -FAIL - -Count = 11 -Key = 86827950e1d412fe4077e231141c0482 -IV = 5752576285321b6483a2c192 -CT = 24a18516523a69be03a62b0572a8e068 -AAD = 24df844d581ef17959a433bbc44b4d6665f06630 -Tag = 031b8c5c2c7bfcec2fc72d56f605ace7 -PT = 5e0bfc67b327e725351dfdf56f3b3c18 - -Count = 12 -Key = 7ecf54b1d2d81b6ede2cd574d217d5c9 -IV = c335ee604c9055de42b2a672 -CT = fbf1dc7e4645a85ce2cb21b4b52697f6 -AAD = 0e65219827f0acf8b6b0e75f9397f711d0af4b21 -Tag = 1d6c7302bfa6451fe096289629a68049 -PT = c45dc86e1ffc3bc1013d4847b4dceb28 - -Count = 13 -Key = da8298a837229eb7c0eec75873261458 -IV = a500b91e890d278f974f2a77 -CT = 574fb01be46c7aa1e86e53dd3f31e3db -AAD = 2bbcaf47d8b255075da441294403a7b8d2dd5768 -Tag = 3b2ce73552d83efae185506e8ed8729f -FAIL - -Count = 14 -Key = 0ffc47ae5991e8b232d8abea0c323033 -IV = 5e5099b86e4c984072008bd4 -CT = ef3f1e9e81d1708edf657938d76ca394 -AAD = 92879fd84b5c627c67e2ac484f7bee6669272e9c -Tag = cde1f403eeeedf1f983545cc393feb21 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 527da7a4f81d6d4f6f395b623aedac3d -IV = 2acf3f0c64f5ab9282a6f4a9 -CT = ef47b52ebc6d4cc0dfaf09d22a587c73 -AAD = e5492270c1df154e594c689fc505575c6bf5d7dbde0d1ded5ed32ec65e3e8289072bb10c35e385f499c0600a58f721b2 -Tag = 0530cfe49d93d78bfa9d54ffa6d148ae -FAIL - -Count = 1 -Key = a10785641ff210336a96a42001824462 -IV = 906bcc9dcd0fb4caf3c5b691 -CT = 19f30bcdb9f3a4c110e5797c64561c88 -AAD = 96d9404d0a24052efec37c8998726fee2db69d755ac87dae6f9d6b505fdc09799de79757f90053bf503f23283fba3084 -Tag = beeec6ae10e9d7f11188c59c46789e45 -FAIL - -Count = 2 -Key = abbc49ee0bbe3d81afc2b6b84f70b748 -IV = f11db9f7b99a59ed59ade66f -CT = ce2d76f834942c022044eebc91b461c0 -AAD = d533cf7644a48da46fcdec47ae5c77b9b52db775d6c886896e4f4e00c51affd59499a0e572f324989df511c4ea5f93cd -Tag = 62df4b04f219554cd3e69d3c870032d2 -PT = 5135ba1354cbb80478ecaf3db38a443f - -Count = 3 -Key = bc34611aea26c47b028eda43936fbd1f -IV = 68628129aa2fb6ba7fa46b83 -CT = 738d5b0edbbdea4085174c168c11e955 -AAD = 6982a727ab5e75c089467b0c9d909d6da2dddaceb3b042aa9b12c1f8d7be7fab63af0e1f457fde6cfea04f4a6df6936f -Tag = bc0464a8f0f146546b16318dbad4a4ad -PT = b358a0151f05ba85d65ac3698e674d28 - -Count = 4 -Key = 86613911634393460d581276f2fe82c9 -IV = 6433b2a1e47552414cf60e84 -CT = 50c7ba11891c8b40ba74c663df54ec7b -AAD = df81e6b7ed9c4d8dec1accd93cd7f3d9538f3355202c5a545ab548950c5b4598430fc7d88e28241bc04cb00fc50418da -Tag = b7558e17cc7b5b1f6bfcce7f7ec6c16f -FAIL - -Count = 5 -Key = 7fc3f870c3f32a55c912c4b713269dd7 -IV = 828d1d61bdbefed2bcd65905 -CT = d1422903671ac453cf42322cd3341e9c -AAD = 378466552eac129bf147d64db0ecb3717c1add1ad76b416602cacb728c05af70769d00f32bdbbe7d54e950138d969a7a -Tag = cb53f3828dfba1f387254f50d9a69380 -PT = 80d99a194aaa8db085394591791f5481 - -Count = 6 -Key = fb83253786e83ddcdb8ebf89fb37fb32 -IV = 67454a1324f451e0c50eb805 -CT = bf9c0a175cc510b1e474f5cddd923f68 -AAD = 45a84eda3e45dd89d7a2f31ad9982dec9bb59fe7376382f6dfab8c9e8f5fd7a18663170af4557693e3108d51c14f6f9a -Tag = 92f65fae9301fa983a8149e9eed72b25 -FAIL - -Count = 7 -Key = b5291e834f899b3b22a8b77fd5a26642 -IV = 93fa2101e7b13b9e3ae3c248 -CT = 559c48cd0d213296381df40b961de268 -AAD = 8c09c1883ad1957fe7615ad0a465631a78e0a4059680a41c40a542ab94b0f246b3210122e7e6b1088a6067ab0ab39ce8 -Tag = 4b3a4d91ed785fd52836b023b11a8e0c -PT = 052ca393b0230b4b1ea06eedb3048546 - -Count = 8 -Key = c6d138d93b2106db7e62d67b25910586 -IV = 1290dca4047cd031f80afe5c -CT = 488f108ceac7dd6d9b653e5b700b96f0 -AAD = 0434f074ec1cf2b6cd958912ef1e58a7384ad47b4ed6852216954803d4b0eee42848ec28ed1fdef5b99f4a32f0081b15 -Tag = a83bf6bf0198799fde67d4725406d7be -FAIL - -Count = 9 -Key = 5f9c25ef23f1b8cc6d114665095ce500 -IV = a73c0171a14a5c4879dd8692 -CT = 213957e8aa7ec598e27a955b0b26d1b7 -AAD = 6ca8ecae42fd2fee8b285bc2836a1ec51bbbe03d83e20dbe0267983632e512846491e2e501419964c4e7eb9213ae5c44 -Tag = c781ca5e18b8ad91c30af636bfdd5a89 -FAIL - -Count = 10 -Key = a954403e7f5e6116b803fcf61b69fd78 -IV = 36438c3f50c7835800103d64 -CT = 09fb8dadf2aabf5a1eedfe1c7d585f4c -AAD = 2c01e76a3a8d86d199eac169560fde8680f4b14f45e76c0b26581bffef595fff1250051c972eed702eb3b58f5ea7cdb6 -Tag = a014ac75c80738e3b95fa6a4334d3126 -FAIL - -Count = 11 -Key = 229543caa39b8e2647703a09b082be4f -IV = b40f328dcdfb4f94214298cf -CT = eab31b64d8fe898481fcc743f56b6f9d -AAD = e84c355a609b9c190766dfc68e3dcd8377d85132c0e2f607ec06960a5e73972e25ff84a4f3e63ad4c946fb8c0d08da7e -Tag = 6dfe7f81209b1f059aafd8f36e929388 -PT = 6423fd59407650c305d92ecaa3dbc84e - -Count = 12 -Key = 1eb5022fa84cb4ff4354c4282ff205c0 -IV = 6334cc3d0b4ee7e575cd90c8 -CT = 436ba45e2bfd1119485d68f6d96b9c77 -AAD = d2caa4cbae3e26277c5ae361aa76a5c465845997acc37e6a3a1a09ab99342e698b6dd09bf5465adad1d54904bdcb4e77 -Tag = 16cb48152bc8778b4bbc9cf18e27908b -FAIL - -Count = 13 -Key = 5962ce9c4a12c457e5a2165639f93fbe -IV = c5cb3a2a1f4bbf7b64bfb211 -CT = 3a16961039ed49d930277c323d9d8be3 -AAD = ac9f9916f0b24b78de67f70446bdc85cb122f40e133fc5a30fee77539929009f2f97dcf5e5af0528f5378747d2c5cff6 -Tag = 9e6b8ecfb015309088b1375cde530608 -PT = 49f3ab3a9fc7b4283cea9abeb9edcc07 - -Count = 14 -Key = 745eb79bec8d94f90ed9e580067c9452 -IV = ea47877e5e6730dff90821a7 -CT = 90f1885812b17d7991c8053b003cfb47 -AAD = 68bcc1c94d821b864c2effd8ae24e2201dafeef48c15d82a5afb830e220e4740eaebf6f03c562a564c2521191ed84461 -Tag = dde6f55bbb9de66223027a61ba050e2d -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 99a9bddbb68be243759bc01c882c4ce7 -IV = 6d78e303d165a42082abf5a2 -CT = 1e3a3fdb540717afe12651d3a51b4340 -AAD = 80a8d9fdefb4b114f12208b0a79299ab5e2c8524d2991617f29b23b31cedef24226fadc72b3475c0f201ea0648aa4936ffff9c80f08a329e042cc23728e0b1569357bfd08e9af1b77369bce491b995f7393903c3eceb3fe0c0e4 -Tag = 66dbb3bd4b766df31d37a0282876276c -FAIL - -Count = 1 -Key = 300b8ffab4368cc90f6d4063e4279f2a -IV = 8e69fa64e871d0e98a183a49 -CT = 2d2292da61c280aff86767d25b75e814 -AAD = 5166309e153447b27c67051453abf441de3f4a7f6b633ec6122ff82dc132cfb422d36c5ec6e7cc90a9ad55caa1ccdcb82dc5022a20062a9c6e9238f34d085b1f554b5eac05eff25b5a5cb6e18e7827d70175dc0662d77033d118 -Tag = 633ee657a8981a7682f87505594c95ad -PT = 4953b54859870631e818da71fc69c981 - -Count = 2 -Key = 5061b1c9af824d400a4097353c8b324d -IV = f9c6575be814e22ec28bc6db -CT = b1d0976677a3e53777223dae0e65fc7e -AAD = 325408a19d85c17ab70b827a72259f13e45ca7173c392fbc985ed5d30a20fc19d231e1992e1db2c0608db234b7ae87922028226ae66e8fa467f2c2a8e9118139178855bbab89fd6b36c6a1d2e4ef87c65e2d5d80877ae2e31190 -Tag = ca672705ab5a9c257eb79129efa9b3cd -FAIL - -Count = 3 -Key = d27f5053e12dde30561119ad2b9b13be -IV = 5437231a59ac76b2948c48ff -CT = 055835c290211a17f56e019c00082a06 -AAD = da5aad950ec6c7ea6711202256c45590290d0ac427a5121d5cea6e0500dd88098d40b8616bb63a1afb9d3e8e327066b5dbd2ca59c349ba8ebb7bcfe658dcf87e2f74141a786785c41eb1a54118a422e9b9f43a65939f53f6fced -Tag = fe5e67e5433c57eb12773f473e1e2a0a -PT = 07a4b1a3c359dcbb38aa8b81cad572b8 - -Count = 4 -Key = 2ecdf75ea95d3ec8fc527bb831b1aff0 -IV = 17b48a715b5e244908950f1a -CT = 1df681b55e805d2060ab0dee8093153a -AAD = f503d5558f826641c23879c53e1f72cd08d069abe54cb145b592eac8e3014d39178d065f41fbe65047b8501d1b32ad4dea151a152e3166527a6ee81fe7806b52653a00a0296fecd52423bd9e06702aa313e698c7608b24b91dbf -Tag = 67efe1258c07e64d2ed355c0785c7f37 -PT = 549ea7cb568dec75bab8edbbe0cc94e9 - -Count = 5 -Key = d86f80508cf9d7c0d66de0ddf68a3816 -IV = d29ed7cbedb74089f264a6a8 -CT = a764d4398db219f81ce066a02f39c61d -AAD = dd9bce3863b224b22c1b764d24b68f6b8ee15a1a03e3d93cda018af8c548625c21388e11ba974125d85e8d52aeefd4cdd3d91a2fec552242f73d41fe03f8491fae9fdc30f0b042bdde65f2833b58264d493c5bbf8e2e15fa8b82 -Tag = 64671a12b392c68c5ab638e0bb7e29f4 -FAIL - -Count = 6 -Key = 7fa90797f1b6a3e6f121fd5c003270e9 -IV = c7ec4cf096ed56e88a0ee79d -CT = 18f728db6848bdbc6fd8043bcd13738a -AAD = 5764cabe5e95be9600fd1bf9c89e9a3901f621b901c90e34ee4b8c90701aa87065b2beb91ccad38766c31306192bce55ea6b90f1b8373688bf8770b5a6750ab49fa9d2beb3c8958ec2578dcbdd4a0a31b40f74a090c10654350f -Tag = e9328ffb6b84a0dd6576b1f2563a6387 -FAIL - -Count = 7 -Key = 43353c434b11cccd96fbd61dc26575e7 -IV = 407b85a0701da0c3754cf779 -CT = 32bd678f91351a83103bd65a1c4449c1 -AAD = 6e205d8c476b8e6d780819212f32203829da927734188702dff7b0673bb11c96300e2bb5f30951536332859ba7c72bf7669cb8ad27882b75832379aeebb701890aba3253c68a0e3fc99373a2ed2fa3276e829e87c86dc4f579e5 -Tag = a53265e07a9355584369fa4903144014 -PT = de9e002f12acc9e65356eb461a7a037d - -Count = 8 -Key = c2fe55b921f04d9da55341393033cfcb -IV = ec1dc287bb6f927b1e2c3cc4 -CT = 16efd99e3918f14116985d6afbea0f52 -AAD = 7d0e03aa029f663f9a9d38fe784f812310c70ad34af96fb65d54e5bd92ddc9259233cd86ffdfe14e1a6dd37457b4bc6fb3df8a7fa60e010bc3b8f7a80cdf050b94640cb85b83b9c40569bb1e37d47d1441326eff48679e12e1c7 -Tag = 84b2e87e046bc2c4e6dd32e256a19d62 -PT = 294be56c1aa5176df99b282bba8200cc - -Count = 9 -Key = 0268a73a952aa0f177d29fbc52d477c6 -IV = 4d0e4f4160f37b5c172311e2 -CT = 7c399a61f0baa70f0e9a2bae4e2e7610 -AAD = b6c4dc8df3529c453131b85dfc7bf4473fce580d070b7750bd3cbdb51f1b65117b6adb2a57ca925601144293b25b6e6c10c55e51674e197beeba05e65a7fb9bdfae760aa14ae69d07baa0d63e25f4d06e446887a5daa71ead3fd -Tag = 397911c6f3197a19ef663cfad139fc79 -PT = 987ae53894a4fb80ee995c3b9ae1097b - -Count = 10 -Key = f3ef2c78b5d5072d75b8bc638019fbd9 -IV = e744adc2c686c5072353a9e6 -CT = 2d650d6f221e31e8d981c3c3f8d74657 -AAD = 7a78c5b7444a1502383666c0ea0c596246e7e98148178a2ad0f20798ead8b66317a97b8576a6edfcf33ade393474d00f00516fe7fcfb5facd02cbb8161b224e994bde9fc17d60490fe1dfef97bda8aaf563cdcd0d4ec270c63a6 -Tag = 33469c4d2358f9afe5ce066670ed8037 -FAIL - -Count = 11 -Key = 5801f1d0c63b9414c73aefc971a59616 -IV = 391f171f76b85919200ecbb8 -CT = 6ddc6d402a0ba52f5f274ab90231336a -AAD = 9560b3d1f0b5de34b12fbe35bc1ac73ec7f666d58545b088740eb2720b3ac16cccc729307032ef3d465094024dc6c8e87b979b0c69102a857d1385a655ed47c768446b350020a7a11bca17d120295c89c566f712d96093f57852 -Tag = 26d6dbf8ba796693bad2b28e5c10f45a -FAIL - -Count = 12 -Key = 2eca32ca4445bbdff452b9f148475556 -IV = bafa872e73e398bd13684342 -CT = 8507c5f9db2b5ccc3511ff7c536e4fb1 -AAD = 699cdb33c82d8d479986f92c7e09fcadedd0bb16a6714a12ddbc23787a0a6bd9a26b4459dc910270d0bd5f2174c9428b8657eea47c866b5202170e09c644b0bd1a2571b95ff27eca9111d1e732a235aa9207906de127d339a353 -Tag = 45780dd1107458714eecabfb2fbaddb7 -FAIL - -Count = 13 -Key = 947b7af80ee22df81650b15ca3a9d30e -IV = b08d719c82d666afbb5319fc -CT = 3c0e648800b873a6d313df9819d69c88 -AAD = 14cd58d6304d89fc3aec5bb6736c4e9ef02db97969bc169a4f8c88c36adfd3a9b24da276533fb90c3930feb8b972b0e2eae2c80714536b6b68f3d2ea3328a359dbc1eae607eeb832ac7134d488712610ce4290bb03bdd12f48a2 -Tag = 52a69091a51a33e59b0bfd45a89f0a2c -PT = 97abeb8f5a115d2a978a31ffd3ab87bf - -Count = 14 -Key = 08d287011268b575c5e0117bb02eaa4a -IV = 1bdfc9f621afe6d47ca6a82e -CT = 952e3bec22baef1417bb32ff7217b509 -AAD = e33c9f5b0bc4f32f7f56b517c7aacc23451ba85bf10a70da5ed25765fc87add73cd29a7eb0cacb64e88142aafa5835cf161b9d3c6fd7cc9d91feb7d937e06acfc5d4c49e8ad617e5667a9b62aad09b492df9c66dad1136c341cf -Tag = 11e971c6f777ebcd738a541081d7559a -PT = 571b35d67615967d9d08858722fb1b8a - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 387218b246c1a8257748b56980e50c94 -IV = dd7e014198672be39f95b69d -CT = cdba9e73eaf3d38eceb2b04a8d -AAD = -Tag = ecf90f4a47c9c626d6fb2c765d201556 -PT = 48f5b426baca03064554cc2b30 - -Count = 1 -Key = 294de463721e359863887c820524b3d4 -IV = 3338b35c9d57a5d28190e8c9 -CT = 2f46634e74b8e4c89812ac83b9 -AAD = -Tag = dabd506764e68b82a7e720aa18da0abe -PT = 46a2e55c8e264df211bd112685 - -Count = 2 -Key = 28ead7fd2179e0d12aa6d5d88c58c2dc -IV = 5055347f18b4d5add0ae5c41 -CT = 142d8210c3fb84774cdbd0447a -AAD = -Tag = 5fd321d9cdb01952dc85f034736c2a7d -PT = 3b95b981086ee73cc4d0cc1422 - -Count = 3 -Key = 7d7b6c988137b8d470c57bf674a09c87 -IV = 9edf2aa970d016ac962e1fd8 -CT = a85b66c3cb5eab91d5bdc8bc0e -AAD = -Tag = dc054efc01f3afd21d9c2484819f569a -FAIL - -Count = 4 -Key = 1694029fc6c85dad8709fd4568ebf99c -IV = d2c27040b28a9c31af6dad0a -CT = e17df7ed1b0c36c6bab1c21dc1 -AAD = -Tag = 08644413f80753a66d27cc37d9903abf -PT = 51756d23ab2b2c4d4609e3133a - -Count = 5 -Key = e46eb11faa5c3f6e37ee510544514409 -IV = 31ece7b92df31eb13783b23e -CT = bf77690a555c368878f5929e39 -AAD = -Tag = 971a1f31d5838d444f329ff47bdae20d -FAIL - -Count = 6 -Key = 678840abd719f5588e103a9ce1895670 -IV = 2247ca0bfb937d7091c49940 -CT = f5f7190e3b85aea4faa57b52e8 -AAD = -Tag = b4d15142a68ab5258c3d20621f4706ea -PT = b4263d709f816288ece00bbfae - -Count = 7 -Key = 8dcd045f5685cf072f1a9571fd933cf1 -IV = 500ba0a66f3b919b0cc43d5d -CT = 38ec62147b601d1b84e628c60e -AAD = -Tag = d5a8456335aacb0db452f4c460edefa6 -FAIL - -Count = 8 -Key = ab42c0bb775a58e0c5aa81b2dc3e220d -IV = 4cd9049e3b3f48c848a21b3c -CT = 344df70485c8ac2fdcf69190f3 -AAD = -Tag = 4cdb58ad32123be431ef50613c9f886f -PT = 9fa3afe7d21dfe004b558ff940 - -Count = 9 -Key = 4e3e7322fe0baeaeca2afa6f10fc09a7 -IV = 8a9ea19485204cb1c671818b -CT = 66881a96b2c0e9c81d3270e285 -AAD = -Tag = 8b4b35abb0d8a498b75920adcf411ea8 -FAIL - -Count = 10 -Key = c63119ae857dbac28e1f9d254589c258 -IV = 4696e3963d8105483849c132 -CT = fb3b925ac70ee8fcc653344cfc -AAD = -Tag = 964a03393b541319996dfb9db8259d48 -FAIL - -Count = 11 -Key = 03c6071bd6363596161f34a039567fbb -IV = b6b6213e219034d5e1a86f65 -CT = 9234874c82e77eb464abebcfce -AAD = -Tag = 5e1513c241485b5d6dc0d4c852f9d39d -FAIL - -Count = 12 -Key = 1ff11c32fc837d9f2d0809ab65b530e0 -IV = f4cb53c43d206349b0333ea8 -CT = 4aa200287cd30147c3fc6f87e0 -AAD = -Tag = 2f12e3827848b21f141e5a9a0919e6b0 -FAIL - -Count = 13 -Key = 3de290481b59cdc48d328cb3ac39cd96 -IV = d1792633ed4d573a16b63feb -CT = 0bdc54d226fcd3c5a9b03fa960 -AAD = -Tag = 1a68657749ea7adb860f87b915e58659 -PT = 116d9d634bf9e746db89aab0c6 - -Count = 14 -Key = 61858ec104419274ee0e24871cdff474 -IV = 257de891935cc301aff3824a -CT = 918b9f4a5f59d5a9325d994c16 -AAD = -Tag = 0dd768a4f8d0252e943c9d6cc9e28664 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 660eb76f3d8b6ec54e01b8a36263124b -IV = 3d8cf16e262880ddfe0c86eb -CT = b1ee05f1415a61d7637e97c5f3 -AAD = 8560b10c011a1d4190eb46a3692daa17 -Tag = 761cb84a963e1db1a4ab2c5f904c09db -PT = 2efbaedfec3cfe4ac32f201fa5 - -Count = 1 -Key = 2aa3dfcef68c333d0f03cbbb60a2dac8 -IV = 667a61d732780f5694128daf -CT = 9fade7c433cb44d5ebec14095d -AAD = 227f0dddc71aa2cc20c901fcb8db0e15 -Tag = 85f30c02962900f8891a9b6987172256 -FAIL - -Count = 2 -Key = e8f077635e558cc41a435d5d364e61c7 -IV = 98c0d229fe5e8b2ddee347f9 -CT = 435a85887ef52372259cd7235d -AAD = 473a81d1517f963c9d207b92a37ceecd -Tag = 74c7f8c7075a334c01c6c2084289f6de -PT = 4dc63e19811baff628f24c1627 - -Count = 3 -Key = 295eecd883ba179e13336c75b0da31cc -IV = 0491d91c05bb855ae8218b31 -CT = 2c6e3497d217fcb9854e8db4a0 -AAD = fef3a54930a41bd68178515f447e6cbd -Tag = f58b48f4578dcd69caae8ecb60743d05 -PT = a506ed7636902fc2c74a5ea53a - -Count = 4 -Key = 53e2b200f322383f8c4f66e1f33582c4 -IV = 74651a12fb87d4159cad0176 -CT = fd3e45cc7c27808e81519ac1db -AAD = 62cf41c5adf2cfa83d955cc610448f86 -Tag = e0eab2047eaf4efa600a4082552a4a39 -PT = a7f37fb6f57464dbf469ff7840 - -Count = 5 -Key = 3abcdd36dd0b65bae484cb7654efbd1b -IV = a051edbee68546a493999904 -CT = 9ecf73e3140adf2b7d17eaaec6 -AAD = 0ce7963d31c11fbcbbcfc2f6bfa90b68 -Tag = 71b8ba81028215dc8f3de37b034bbaf8 -FAIL - -Count = 6 -Key = 82f67ccc7e7ff0734f61bbc1a3fb0b72 -IV = 7ed71d35a94a9a8f7d1c0deb -CT = 88fc46298c64dfcfdb5ea172ad -AAD = d11cfe752b544b5e86cd40739783a25d -Tag = 28a573b0acb4c6befd3eb761dcf41c8e -PT = 254dd9845aabf9c049cce9ee68 - -Count = 7 -Key = ad38e96dcb23e04de04b9c28fb4b8e33 -IV = c4646fa77cb05843dd33b549 -CT = eb1d781d8eba29f254d2d4b747 -AAD = 151bf8dee8e89f94dbcd210626c0c4ff -Tag = f080a110a2c28706bf8705788e647743 -FAIL - -Count = 8 -Key = e8d3bbd86c3825692761e507674ca8ab -IV = dae0eed624e1b4840206ecab -CT = 5f43e50829be1f6c1db21768dd -AAD = c5069684d531b4bf159f0d2800cb970c -Tag = bfa9cc78ad67d1bb8c58b8c27ed79439 -PT = 104bc5cd1f4c0bd0b1d7c60f0f - -Count = 9 -Key = 8dc2982890e5015b008508178e60805b -IV = 190f64a03e93a35be00f2c8b -CT = 624bbbdb5fc182ec68a7536c7a -AAD = d23828f4e380386dbe64117733496c27 -Tag = cf001db85c6318b346b27965f74b588e -PT = 690d473959e2bb9ee135098ad2 - -Count = 10 -Key = 6270f8d879f483c8da47c7a1ac841069 -IV = bf241ebbb53da9266feb80ec -CT = 4af8df0b28f8169d4ebdfd87af -AAD = 753738f9f9abe9e09d95e9094df917b7 -Tag = cfaf36396156d570a2d16d5d9309a20c -FAIL - -Count = 11 -Key = 41a7e25635ef6d9f41d5e47134224db9 -IV = 06196d4aca076d87307d25fa -CT = 8019af5fc9a6139dd70c3ce530 -AAD = fa9bc9d9f62c0b6ebaa9a78ae877f10d -Tag = 22c816aeaa81b29bbac65a7977fbeabb -FAIL - -Count = 12 -Key = ce4a52d8d9b7ea1a6b0582d515a76ef0 -IV = 9b917ed9844bf241e8e342ff -CT = 4c2787d382182ce0984ad73f75 -AAD = fd6de547fee72ad03c937dce02c1965f -Tag = 853a648db898f922295ec78e6d26193f -FAIL - -Count = 13 -Key = 6bdd0f5fac673ed0e5035704e0b81859 -IV = 89bc74857b39b5b3b6e119a3 -CT = 7285eb5e7380e62e8db412f141 -AAD = c76b9c59f5cc4d02c35c4e3250bf2a6c -Tag = 5d92968cb34561ef8bc81b6aafbd3ac3 -FAIL - -Count = 14 -Key = b69ee30195aff4034d692b619d000408 -IV = 8b509ffd89c70c5d74dc975d -CT = b011b1a89b8309c084660dc77d -AAD = 886aea7c2d67c0c64038bbbe93a3534f -Tag = 4b12ec1f7943ffff88f1e64ee090d781 -PT = 8d511f8e02961544754f36e937 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = c62dc36b9230e739179f3c58e7270ff9 -IV = 196a0572d8ff2fbd3522b6a5 -CT = 958062b331f05b3acaa1836fc2 -AAD = 4d10536cbdbd6f1d38b2bd10ab8c1c29ae68138e -Tag = dc65a20d9a9aec2e7699eaead47afb42 -PT = 6d8abcee45667e7a9443896cbf - -Count = 1 -Key = 0c966ae197bd94cdabcab5f9c4da02cb -IV = c5bcc7e7044169fa01519ab7 -CT = 49c9a9b0c3980e443cd5195a16 -AAD = 5feaf91a64887463a0b3299da6c87cf2874ebf0b -Tag = 9843f2181d3db30d1c7694c511a85440 -FAIL - -Count = 2 -Key = 913d0833618d0cac6cf1aa7879ff71df -IV = 64082c05f8f3661d0909c5b0 -CT = b4f1efce82f907c0fcc1ba0777 -AAD = 429e3b1b13f9772e9c77a1a4af3d42e8e0e4d86a -Tag = 452b7b777968c18128ade293fd7ca3cd -PT = 8c4c5d3af3ec87bdf8021bf01b - -Count = 3 -Key = 32c251cf7948c7da54a89c109cd10efc -IV = a12c50265a0f59f0d796185f -CT = 66f5786452f19af24a80ce87dc -AAD = 28d5ece6295b14a98f3d67fa3b7153791f4e34bf -Tag = cb176553e01e5991d5dcb6796c33336c -FAIL - -Count = 4 -Key = 977b05392cb87f18f8da6c6273846e84 -IV = 3d75233ecc9431a09605494f -CT = 67897c7de75d0a877545fac9ff -AAD = 803b6b7a7c15f5c9cc1de5166d68c53aef7697a9 -Tag = 3abd3c4653fccc758116beb653809a2e -FAIL - -Count = 5 -Key = 8bfca06dbb9be36fc52406628ce79afd -IV = faedb8fb599ecb05843c783c -CT = 755ceee1b887595011a848b3fe -AAD = 63bb624283314d67d9dfac0a01257f41dffdfebd -Tag = 8d22fcc810d50af86131d571aeab6c27 -FAIL - -Count = 6 -Key = ea55ab4c4a6e8dc4ecca42d4874cacc4 -IV = f5c77f9fb2c33639f35d8f0d -CT = a153dd682c7170a5757d3f0e5c -AAD = 37138bcc4cae4d9327ee8d7c533c2b3dcdd4232d -Tag = 0617b3f0b8f69365ac5c6eb8b3a0dbf6 -FAIL - -Count = 7 -Key = 9b0339dfc4843a419872a285254cdf86 -IV = 9173bb06344a171f7a045ca9 -CT = d1ee33e7dfa59bf1d684894a39 -AAD = b9626d0970d0a5902a3f7a5c7b43e875dcc50835 -Tag = fd7ccf008845d5ddf164e109ccb4e5be -FAIL - -Count = 8 -Key = b8ee3c155ccbb0f3887634fe96e2a1d5 -IV = d8b44efb1a3332501ee6afdd -CT = a5607fd03c0742fa7abae960ab -AAD = 151653716d50a72423ba17957b8ad24c7c4db5e6 -Tag = baeb1468e24c252684c14142b519be3f -PT = e390151ab9d399d534e0119767 - -Count = 9 -Key = 710218a79797b3cff3a20e9a60810475 -IV = f51da8e5a361aad6087af342 -CT = e55e14ff01fdd224fa809229ac -AAD = 455a908aec7d7ad9d644b5305d138b78258c2c8e -Tag = 7040bfcfa78be2bc0a624ba06cc562a2 -PT = de233903ba85973c9cdb15ad40 - -Count = 10 -Key = bf9a6f66977ab3a8d37b32e1f24111fe -IV = 5b9779c050a41b6f4053233d -CT = 27b30f458daccd4481408a3f5a -AAD = 9561c95310b0f882e0f7c2967d04ae9444e5794e -Tag = 9f5f1a41c4fa3e551330c5d91db4fa54 -FAIL - -Count = 11 -Key = abf42662668c5b8d5604a8fe6d73a2c3 -IV = d4d68ce645b95ea61addbd0e -CT = 29c718ab498e792ac1bb8c7c2f -AAD = 6362394c4e9acd3c9888d3c93f39a29dd02078db -Tag = 2b416d7723aee1935233c04ed2fea876 -FAIL - -Count = 12 -Key = b9eddaba6602cc32f33782b18e2aecd0 -IV = 86eef884baa60ed42b086eed -CT = e3a735e097fe667708996ff18f -AAD = b877b290962dd14bd1d622b975eed04113ed105b -Tag = 54395a31d93ea9625d644be8013d018b -FAIL - -Count = 13 -Key = 4598e0e4821db7dd6ed2ce09cdee6cdf -IV = 8e89130fbe0d9b66d5742aba -CT = 9edd822968b68f2173188ae6b7 -AAD = 04c1089bb4abb82ab55ea18eb2ad2fd5bca1a086 -Tag = 7c34c3941fbf51bd33e339b6390babc5 -FAIL - -Count = 14 -Key = 47e0fb871a560d92949d84f557ef2247 -IV = dc65e2cdbeb6601dfd684fee -CT = 6e2b2ed107490d306a2b5451f9 -AAD = 17a7966987c7ac3bb4e455e69f0e6035e7d0d3be -Tag = de38af58ff256e130d84edaaeb00d878 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = ef1da9dd794219ebf8f717d5a98ab0af -IV = 3f3983dc63986e33d1b6bffc -CT = 95ea05701481e915c72446c876 -AAD = 5abd0c1c52b687e9a1673b69137895e5025c2bd18cbeacdb9472e918fe1587da558c492cc708d270fd10572eea83d2de -Tag = 5c866992662005ca8886810e278c8ab4 -PT = 5511872905436c7de38e9501e7 - -Count = 1 -Key = 2e3968148b973cb79f275676367cd799 -IV = b055618bdaf94170080346ae -CT = 0117a142931082ff569aa58ea1 -AAD = 72c50abc8c10b7a83b755ac26b7a86afb37d2310e832a8982c70ea8950f8c1a0c0b01fee79644753f87a553868dcc719 -Tag = db9143f6cdb3aa57c2aab1bab89e6c26 -FAIL - -Count = 2 -Key = 7dabba053c8c682b65c8ac9059d20793 -IV = 109c8ff05626ed7329a7d68f -CT = 158b708fdbf206999c6d5dba50 -AAD = 041c26f5c77092c475ae6fd6f9c8c3c8c42d40f8bffa4c28c2f40146c1dfaed0313f109b0d918f7d72fb87fd20d7fe96 -Tag = 0b4680a9f3b9f745bb87c3620ecdd956 -FAIL - -Count = 3 -Key = e03c73bfd5dd3aadba727bb3f99e6237 -IV = 150fbaae76a2da0b84e42959 -CT = b6b4ab1cea7044abf6f6f7dbfc -AAD = 80d1ce195cf77fc3143a37b8546d2d415241d17ffc1d35fa0613f407f7c7cf4f9fe219fd32eb2a95442f5417bf0f7277 -Tag = 03ac1333e300e1845c12f150568ed37f -FAIL - -Count = 4 -Key = 01534e2afc3d9ccc30b826ba91bb8f4f -IV = 6caaaf9daa38e571537ad189 -CT = 1ad10d1f8aaf7c540755b26bf8 -AAD = 1dd85b293539f175f51d1eea58ec78b813b16933d3ebe883cae4340bdaa52a93504c43185bb12a82a93309f04b3fea2c -Tag = d92c12bcfd2dfb213537c796a37eb631 -FAIL - -Count = 5 -Key = 1cf382d72ce0cde089348ec997d7cb4e -IV = a6db73904471cb27d6ea87bc -CT = 69bcb6c8e85d70cfb6b9138a19 -AAD = 98fd3d310e72bbf08837b1f498de66a55f2cba0c6083f335751e59547151802e3e7dc41e1149362c2a938e10bab13a0f -Tag = 770c7c19ef48baa7f2c7a8528558465e -FAIL - -Count = 6 -Key = 2eb413374f602f6598ed463a102fb1f3 -IV = c115adfba0d9edc7d6ca92a8 -CT = f1d5ff51c84b884351038a6722 -AAD = db3206a7eaed7c7b1f17ba5c18fbec7e92ab259a237473f7a7242d1825fd49f167d7f838c1eb65e99b5eafa9c8c11d2a -Tag = d3a3f5e0659898b30e27720ed3e63e56 -FAIL - -Count = 7 -Key = 284b0739877c18921007c888b283f9f7 -IV = 6ae3a281a95760fee1c2a07c -CT = 5d76f5fa13c2f6d638145a029b -AAD = 771307fe6809cd1f5380e5e19299c5dd86d36a6f664e2226b1a42666374e154957035a538b311d73eaebcfe504cba2d8 -Tag = 6327aa1b885337285bc1f6367136b028 -PT = 8e460f57a808d4ef7d3e2cc4fe - -Count = 8 -Key = 698634972384bf4338da7a7a78b1dc45 -IV = e3776042ce8f196d87512ed0 -CT = 75379c28898c4a25c7f8b46b69 -AAD = 75ed47a6454f5a46cf06519dd5cab36f5c98845df604abe02eefa96f803bc9e43fb1d163453138f54b815de0ac77247c -Tag = d63164ca86592eb82c95df8bdac250bf -FAIL - -Count = 9 -Key = 0da45731532c21aa9be95c6b97fd88fa -IV = fcc4a45c9f30b75ce84b1963 -CT = 00846b8e389b4d51b8be03a9ab -AAD = cceb765bf43d0059c046334e001b2008083383e8a766def6e00a047d5ba34af9f459b626fe229e91ce44f2d4922053ae -Tag = e5de395dd1a944c82b1293e2f0a07610 -PT = 648a178a884cb9dcace3797bc7 - -Count = 10 -Key = 4b1e637ddd889ec3de9687e1d00efbf1 -IV = eeb95865db33cc0576e8c007 -CT = 12f4cff0564fbd78a30f6e5b94 -AAD = 36066a37b9fe24218dc09b7cb3fdbaa2d516106f4f87e1a207b4c9b70242f18dd755dc5e82d1684edf2f06d1fd167f3c -Tag = d53a1c8cb52a80367a6847e3733de17e -PT = c5694b0bce9ba2918cf689ff4b - -Count = 11 -Key = 15987b4622213f19f48e7f49a8c96cef -IV = 7d757f1143d4e158729ba484 -CT = a9c2336451553ead58c3324ccf -AAD = 1b65f7f64e6cfc6d3b6d133e33b8d1a8c4e1aa37e513c2d8a4f1d682fcd8acb512738e90186e6026c248bea612ea7589 -Tag = 507c941649fb802a230ef2e61e2f8c75 -PT = 24fd6844aca0ab5070ce41b4b5 - -Count = 12 -Key = e44bdfe6ebe04374145b7e5b20e080fd -IV = 87ab6a85d5bb3789fb70f8e0 -CT = 1ab5e65019f20c1e5548c4e6c3 -AAD = 619385644ec99fcb51fb5491ff6ab69538d7e4932bf07e20d8fc7bd4881c1391f45eff2372e175f1fd872c7149fc858c -Tag = f6565275180ca7ae363d82890f3aa59a -FAIL - -Count = 13 -Key = 863550a2fb509e6418e342a4bddeb219 -IV = dbfb5238ed3d1c1a2af4653e -CT = 2c91779a07504c069a790c7d35 -AAD = ddbb12ba633a780487e71216549f29ad7d52cb59aff1bcb8889abd894b3edfa4e75d661ce793286238e30d434d80ff18 -Tag = a88559f82c6eebada6dc45153ac944e5 -PT = 4ed8fb109e9dd47b4895ab8c85 - -Count = 14 -Key = 40100fbf5c359c60c7a01c95b4ad9d63 -IV = 0559e0d7372f935fc01b1d1a -CT = 8c1bbbe67d0fc9355d3d1d498f -AAD = e46fa70761a4480eda444c81263fd62ca12a720b2f40d17e572f2f387a07fc6473d82ab607d558cf08429557011a949b -Tag = 4a44b7d7eafaefe4407a9ae992de3d57 -PT = a0dabff03e4ad138e0e3eabc53 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 3eeaa3b5aa99f6902d1d58421b53ddb1 -IV = 71240c996af69d590ccc8e8d -CT = 9a50a33a9438f485e7c89caba7 -AAD = b1176b9e28794cb627c5cb3743846e6d11339ce6d0ce69789833b9f344e92e5360a0eb61b173687f74eae3184ef641f1c42c5b180014ca7e6b0edb00fbc35f2efa7aac7111dd8ec70e851a3ef2e2436ee07e4fba213425b1a8e4 -Tag = e2865b861f8d5e0af25757905dd0653d -FAIL - -Count = 1 -Key = 9dbb962de535a9e77108cd049dea0481 -IV = 72d607c6dbc4fbbfeacb042a -CT = 3c8ebab6a3c4ecdb1ed807c962 -AAD = 9127cb0deed0e5b43ea153b1c17b484225a49c13a5f5995f86ef28a65f9f82397dffb34d4191c3db60492473d5df839e234a537b5a1cce9dcba1b1d205c92c4b4daea01186737cef6d42829ef07f0b6b2920baf998f6ad0d384c -Tag = 9f8dc7e66cea95d7915281301913d3d5 -FAIL - -Count = 2 -Key = 77b55a5b37690c9b1b01a05820838e3e -IV = 7a8e0d881f023a9954941037 -CT = e0eb3359e443e1108ed4068969 -AAD = 0bb1ad1d294b927c24ee097d0a9afbaa6a62c8923627b50bd96e5ba852509a2e76f7a10ee3987e37a55b92d08531897e6cd76462403b39fb31508cc9fc7684ab5ec2ccc73e8a7f4104a277319bf207fcf263eceed13a76ca177f -Tag = ea6383077d15d7d0a97220848a7616a9 -PT = d164aeccec7dbcadee4f41b6a9 - -Count = 3 -Key = d5cc39db2b34cee01345dc52be7d5103 -IV = f662499e42f14bea6977174a -CT = 9a84bdd3ac1724216772349f59 -AAD = 32d9b18f80e4502ce6fe80fcb58cfa233dbc03d342277a5f381b075a386553895a722392c50ae74bcef5266bbbdecc838048924af36418fcb61d94094c86f702677e454c972affab146d629aabde3680bd7d2a669dd4d9e630fc -Tag = c15dd85c92bf94b4b901a771629f4600 -PT = ea48032834d9969e6c9f040957 - -Count = 4 -Key = 64eb561f7f132cf5a6eb6314360a6c10 -IV = c7604206c6e9800dcc4b29f4 -CT = df392736cbe2067acfbb675e37 -AAD = 79970cbf48f78920de1583f777d0d5a8d146ab16a86f2148a6134b5dd55c51c7ab1d0f9219dee77d618ce018f014ebe985c527d0641ac991eda2d48135dd8c552e496e33a65a5e5804546570b53dde4ba860d5f61505dcda77ab -Tag = c382e9854234cff3512ea17a8a8092b4 -PT = dc1fae5f1f0778d378c781dbea - -Count = 5 -Key = f27057cbcccc9cf163abd867fc891486 -IV = b224fea2ecb2b3a5c8fe5596 -CT = e9fc65eacd5be8b6865f853fbb -AAD = 50567ac439f395f3724b14882896f76832d2d464b95d5712b6f8664489d6751ec001140fe47acf75d893590ae22ce10fae18cf97d1c16cfbe52885cbdb7f1d1258adc49204aee73c7cf63a45e70196571cee496c3935f3a142f4 -Tag = 03e3dc31120402ba3a615ec0fa33173b -PT = 7c17f64a8e1c6072c83f8bc8db - -Count = 6 -Key = e9b652cbeeb2a556ac1826b19cc15958 -IV = d21da8693af1613c72bdf1c4 -CT = f7c92206909abf170063b7d6b6 -AAD = 9bbec67884adb146cfcc1456467ec75a37d3623d4a4a396276778151d591e839b4f8e8d96a3d1821c7590b3fd5c3afda9f70709d30903b978d2e6b166b72bf68dd48277929cc77ef45b67c8440e98c5cd89c02077f35e7a55a83 -Tag = 263367dceed0ae0ebdf33bcd43f3cc56 -PT = f12db98355e4a37eb8128c5ef1 - -Count = 7 -Key = d9aadddaf333bb0f78aaf5cdfe0029b1 -IV = c003a76eccd9bbc3ec85dc2c -CT = 091df0d0b2aae56a00eb252509 -AAD = 49c3351f3b103d29fbe6cb6c38a7afd2a06e42409372b04cf1a9741fdf86af62c57afc203d607b384c87fb9d174a1c9e1debca7a084775d2611de22f17e64b1ba9e286699f3276c08d05aaf0dcaec773f33c43d7de294a7915b0 -Tag = 8b041e3c4387fa45afb43ec83d2d11f4 -FAIL - -Count = 8 -Key = 2dcaea867bf72bcd91caff043cf08007 -IV = 07a1a531fa30bc77510d0453 -CT = b4fa6436b16942d3f539f47cb3 -AAD = a757ffcb0d6387b870dde672e863da43f8e71a8a5ecc2af9414dbc99f17a0ce3632472d2b75fa1cb3a6978af9813c1e779891837e6088b24c10622deb4f2461335dfedbe71576f721a070aea32be8229e2c9db109988f61eddd1 -Tag = 4e3868460ed3a64c2f9216f254949ea2 -FAIL - -Count = 9 -Key = eebb7f4031121fbbe400bd449a7ccc8b -IV = 412eeb64a9df2ea98e8b1dbb -CT = 3fe649156931273eb3ac9db896 -AAD = 054b1dee5ff5310db9451f8de5cc8a17bf5ea315a13a3d3ad921f64eefd634e0ad8cc0debd61bf5c089beed9cfdc3a62c4f867c1a385a38a95be4dfc226c91ae1e43e66c204f84e112687b194d202ee5aa2135132b9d5e4ee91d -Tag = e1867166f788de432f90b5c2a21b4cea -PT = 13ad6e1ea7fed171acaa9a5c7a - -Count = 10 -Key = 6ca30f76a5bd8db10f369d492076d5eb -IV = 32ba3341d212d8e5e021f2dc -CT = f9eb93d2dd2014736b64795166 -AAD = cd5c5ba9269fd8a4b355f7a72ddccadf2d7248e93e27af3d17ac7a25caa5c1931cdc0ab8f19ef94b3d9edfb249ba701a0cce9d0bb9fd3650040342b988d9f7305f8819ba84c679093e04a67c5554ca37d6d10234594a66bc261d -Tag = 94f18a542f3b55881365392a743fc4ea -PT = 2ce2935dc618a081100af7c61e - -Count = 11 -Key = 5173cbc7d19b39fceef0ae6efed41ad3 -IV = 7c0a8ebe0006db0d8d3325b1 -CT = 0d01b48b52b1e11d7457bc3f0b -AAD = 2272b3fb6735c466666d7590e989c47537182bcc85f3ff1c3e7b0618ab125f15d163d6d1868ee82c88df740fefac22538ddd65c532af37f5e90ec5c953b88da3806322e28c3505f9bcd57d3eaffece4170b5baa1a5b928bf3c07 -Tag = d568c0e4a644381dea718c2b7e1e1024 -PT = e7a3941472ee04ae90d34e6da6 - -Count = 12 -Key = ac45fccfc2f37966fb18eabc75ca7f13 -IV = f6437d540571986c8a9deffe -CT = d2fd74d90a2aaef2bfdd88638f -AAD = 999446c6391c45f6abc1094402da2d602fbeb973b15a33df30fd4493c0e217fa610fea050706808310663af2fbd66b3a5485f082aa75c824c684fbec62b7cc9ef16ec43c71442c891bc4b47daec6b927532fee5bfda611ea4d56 -Tag = 63d7efdb868b83704980b2dd7ab72a95 -PT = 9e0d96b80bfb65551dee91d828 - -Count = 13 -Key = b45d5a5c1238c6ff6452fbd605b9d60c -IV = 60dc1c9970bc7242385b15c9 -CT = 200be21ae091ef2d6915ff00e8 -AAD = d7b7e4cc20125b86815dafde75b07a0af4b16995728bf632500fb3a0edd5b281417f5125abdf4861963f3c93d870e58e6703ca760fa1b8e25d4134a4a7786267de107fa6560fe6a12477c29175eee02b7d9a010f2c0c83fe389e -Tag = f8f393c73dc613981e9d19cc9d273a76 -FAIL - -Count = 14 -Key = a4b4b85fda2776644ad63eb6e1be48b9 -IV = 635d0bb5e2240b195f21a28e -CT = 0cbe3cbb0725cd28d45745ef5f -AAD = 69d1c68e1521d821bc6976884f564f8a9715e76b99d91819eca63b1d3d12923c3fb868edc957d333a5621b6dd1fbbb9dc1b9a1b87faa155a84254cb23519b39796545d85dbf3302aef8225a2236bf64db82dc85683802a0a89c8 -Tag = 6cdd16fc0c83baf439da1e8279acae56 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = bfd414a6212958a607a0f5d3ab48471d -IV = 86d8ea0ab8e40dcc481cd0e2 -CT = 62171db33193292d930bf6647347652c1ef33316d7feca99d54f1db4fcf513f8 -AAD = -Tag = c28280aa5c6c7a8bd366f28c1cfd1f6e -PT = a6b76a066e63392c9443e60272ceaeb9d25c991b0f2e55e2804e168c05ea591a - -Count = 1 -Key = c3aa0400ea3f5107fbe8aa011e1391b3 -IV = 9c22008475e7a907f7abc966 -CT = 96a06e1fdb0082ebc6441312dd9cd6ed6f7fac745facc368b5ab2a3951bd75a6 -AAD = -Tag = 6e84d66448068f67889404263a047a88 -FAIL - -Count = 2 -Key = 0ab76460d1870b6c989383b615f3876a -IV = 32f38776d99843e9d79d6b28 -CT = fb4d7d8e0958ea76d9489f2c6b5308d75cf96c8e1bc6a08a978a65f0c0f510af -AAD = -Tag = b49a4c6af3403dfb57cf1f4bc25b17a8 -FAIL - -Count = 3 -Key = f02f0436322783d369d552f0d6385474 -IV = e029e6acddaf62ea81f7f39f -CT = 14b4e53213de80bd995468df293a6bbf2452846c375a3706738db45e7c5d5ba6 -AAD = -Tag = 8a8a3c4693256f8b50160554824856e6 -PT = 45ee8a0f38f91785bf8cac4bd05284249a8035eaec0e6e1946e0ea83a0ac3271 - -Count = 4 -Key = 693246ac318ccbab8cc852cd28415b75 -IV = 1dfe6aa73ffb680dffc10367 -CT = 73fc0c82a59165f557ac3c9a43a780ef2d7b55d3a269677ad9ad123706b85854 -AAD = -Tag = fbedbf6b9085e06958a50b329f813346 -FAIL - -Count = 5 -Key = 8767a7a8be83374dc75b0891c4fffec7 -IV = 498aecf672c73dd81aa966cf -CT = 032be9ca32e53e130f241d7a27b4959a6e2b71c98899cfdc66806a490c7fafc6 -AAD = -Tag = c3918262698ba9d30e329cad60fb3eb2 -FAIL - -Count = 6 -Key = 7d34065ca9982a64b0603a6c080bcf4f -IV = 888872c261b3596692ab96c3 -CT = 9bba3cc23f91eeae09269f9402967bb8b376552461faa10320741e861d3a2e71 -AAD = -Tag = 954e7fbb62b622216fb7d1d2f367eabe -FAIL - -Count = 7 -Key = 8f76fe87c4ce76ad7f5e5858030ee64e -IV = 0b5c3b98aeab6525f0cbff7b -CT = 37b795a6de594f97cbd51048f958caa56ea04d6ffd42683364857323759d0406 -AAD = -Tag = 1ce35f577b0661dcf1858b92061b4d77 -FAIL - -Count = 8 -Key = 9b8259870255aa4a7ebb0e5ffece4396 -IV = c9258baa6b7720f38d8f5a76 -CT = 46c291e1792486d98d5aef943e11c215ad38030861a14013014b34eadc771296 -AAD = -Tag = ef28e61958d92b8a2c26dfa69a3c3577 -PT = a3432fc525848dad2a4bba5971bb51ba0393ee8dd61989124c6c457b91c25b88 - -Count = 9 -Key = a00e8e77494da619e978a6d05bf86444 -IV = bdee5a78113546f33d1cb13d -CT = 68f25dea2677b57a19814eefb45c88f6f5028c6129a6d6e3f94da50373e9a1ea -AAD = -Tag = 0005f814865e5bd29c310e1b2761066d -PT = ca2c4ba89d911f74c6d89ee4f3a78f3c9a0e00017d262377aa334a782641397d - -Count = 10 -Key = 440d2393c60bbed9e804722d1ecac07f -IV = 578b96349a4c023ce12eab7b -CT = 68399bd1ea4dfbe7a91eadb3d6ee01e9f3267c97de2b6ab855d297918cb70065 -AAD = -Tag = 73650870d30e379d67858df44efa3b3c -PT = 3ac46dbb93f803235a6df55023aca55449764e91f65512bb9ff0b194788f92cf - -Count = 11 -Key = 8a1877e0bc1e79d88a13684abc216539 -IV = ae660679b01bbd1982960ee8 -CT = 3791e561d37ef21ddaf019a116f5609817bafe6c1875572f5dddc7f4e0728acc -AAD = -Tag = 0d31783e7586a137b81b5b41d1ee5896 -PT = 3f6f57db5b4c4ea4e5528bbf4b0a689c0c169a144f8250301ebdce33cb336547 - -Count = 12 -Key = bffdb949412bc1ffd379a8bd5d1c618e -IV = c8c352f9c47471c5ea3607e0 -CT = da123abf79c0f873d2c5eb65f7b9c4753d96788b1ca6ef8ce28a741558ba18b8 -AAD = -Tag = c4f7344b1fcbacb86b540e741d4171b7 -PT = 1d16adf20389315f655c22284a11b4c5f1d1a45bbffa6e47dc37751185df35c0 - -Count = 13 -Key = 28b5097f0f30860b587d5268365cd77d -IV = afe9269bd8e01bc5a8aa6ee5 -CT = b6da1df24fe4a75ed3745bf71fb1b3ba11a3810a083ba6ec1c39f979fba6ffc7 -AAD = -Tag = abea36a6da655e7aa7d7073bf936865d -PT = 276f7984d55a96f3250bb29bd80376ac54b737dffa6c99f06448cac814b6832e - -Count = 14 -Key = c8f7bc883121ccb5ac678a5675234d14 -IV = ff2929fad279c1f216e84ede -CT = 60ce0bd7045e77f84c6582343100fb7e1d299f07aee23189b38f5d4f93dc4519 -AAD = -Tag = b31a35203371f6ae6c1900301aff3932 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 3308bf978dca6bd7f5fe4ccd6d0e7c24 -IV = 85996c785a83493cc7165c11 -CT = 4c8f0c7ad73fc469b4b385f80741f3014ec236e29ca9068b8e55ed6fb2fc9b9b -AAD = b0ebb26b9e27c44c26543e257b7c7eb4 -Tag = 8b5528d6ef87eb0be9b6708fab7d654c -FAIL - -Count = 1 -Key = e60b37678b00cea55f72c593ac38067b -IV = 845de274d5ea7d6e0ce794ba -CT = dbc9fb93ffb1698e5a1c062d391f63884c8d8fd862e07ba51d664bffd22b9faf -AAD = 59c8ef4352877ee249cd11439b445733 -Tag = 08d213989f884aface743fb88f778395 -FAIL - -Count = 2 -Key = 95bcde70c094f04e3dd8259cafd88ce8 -IV = 12cf097ad22380432ff40a5c -CT = 8a023ba477f5b809bddcda8f55e09064d6d88aaec99c1e141212ea5b08503660 -AAD = c783a0cca10a8d9fb8d27d69659463f2 -Tag = 562f500dae635d60a769b466e15acd1e -PT = 32f51e837a9748838925066d69e87180f34a6437e6b396e5643b34cb2ee4f7b1 - -Count = 3 -Key = dd2f191758cdeb480feee0beee689fb7 -IV = 8a1c6f696968d1a77a44ba45 -CT = b43afe82184d077319a9366c1162c5ca4882da0df82207ccdc038125bb338c9b -AAD = ef910ed8c787999640c2bd172e5e686d -Tag = 88521a088f92a1d3ff7ce5364bdc7859 -FAIL - -Count = 4 -Key = b013ddc3c6125a9a8c3a309c6367a076 -IV = 5999d3d65eeec4ac7227146e -CT = f71242febd4826ea95ba8e6a3397f05c1b9dd82671680ecf7ab566f1e9ad787a -AAD = 617d5980203988d4ca779b2f33cb904d -Tag = fb74b36de5e6d43a38849f7f9d1f203c -FAIL - -Count = 5 -Key = afa272c03d0343f882008f6e163d6047 -IV = 271ba21f8fdcac34dc93be54 -CT = 36a4029c9e7d0307d31c29cea885bb6c8022452016a29754ba8a344c5bbfc3e1 -AAD = cdf5496a50214683304aec0a80337f9a -Tag = ed8d916c171f0688d7e7cca547ab3ab2 -PT = f3ee01423f192c36033542221c5545dd939de52ada18b9e8b72ba17d02c5dddd - -Count = 6 -Key = f869ffd231c95cc0822df5372842e755 -IV = 1490881cf72ac7f8e7afd0ab -CT = 816ddffa6114f40cfb5d61f04379111be8e1defd4d9e77c87d6ebb748dc79bff -AAD = 4b2b932803812720f6e044b5a5117612 -Tag = 88657cb7f8ef31e55d276d63648b9f0c -PT = a35a1dfdb624727ec51431a804add8673eaef0398b8a3d2896b2d659a0c5bc1d - -Count = 7 -Key = 98b984a6e61dbf66c9c6641d07e69c40 -IV = bbb54adca294947424c6b646 -CT = fd8f7aec05fec9fbd35b66e191556df6cfafcd3859927ec49b0f6f3031597e9a -AAD = 0edb4d86c33d0098de1a2430f0462a5b -Tag = 4651e0d440d42145d593c8db9291f1e5 -FAIL - -Count = 8 -Key = 88959a3edd76716399c33df453fb84b7 -IV = 324d315e3b18d94a86170500 -CT = 062cce52121a567cae3c78a99a28d87c679e418f32f79af1a8849e6d0e81d25f -AAD = fb760df45a75fbff72106e52d6da864a -Tag = 825cbc27be42143c2461fdc6b404e86e -FAIL - -Count = 9 -Key = 4555765171009f776032ec95f60ffebe -IV = 7595fbc3908df2b038c2298d -CT = 469239be20aec4a000384b8ba7ca8b9c1523acd03eab1ed9487a5a13c03bd62a -AAD = d2921132ebcd1f907e649c675d9dcad5 -Tag = d2e2701f334f28f69f6b2d6a8de20d0b -FAIL - -Count = 10 -Key = 69e8bfb2b7b84897153b431ec29fcb79 -IV = dd56a06a4662e2b692009a06 -CT = e740152f3bdc0a09c22146266bb3161ed1c37338f26fec26cd9d829dd6b96b44 -AAD = 3e465a94a95cc7f87b815afa196911ba -Tag = 2e6c438cc38fa5da375f88e237fed806 -FAIL - -Count = 11 -Key = d13e90072180031aba421d64d474448c -IV = 87cc23d00512a61933d435d9 -CT = cd1653f01d8e468e08131d263a10cd83a5e7ea68ed84225bceb4e0b57320cf83 -AAD = b9ac2c45232f7305fcc6f2424c30b606 -Tag = 7b02db1e0dc0c2010080992ad01a9a6b -PT = f1eedc99565378b3ded6190bbb1c6ca325e9e0dd57fae6a8190ce57ccaa302e3 - -Count = 12 -Key = 724d036af7649a85109ef3a597a9b133 -IV = 33c0c8f3a709fa03e684696c -CT = 49be803ad200608b026138ca62acdca2288e67faddec35254a52e8a531990436 -AAD = 8c1095b33f3c4806fe1872916fb6f5f3 -Tag = 81c0405a283ec84bb2a08867bb9a2433 -PT = b643616673a5eb1985900ccfe8ab47691401242c5ec57ffff23fea10a811fbcb - -Count = 13 -Key = 25aede64de2943c0a2ba83bb28075cf9 -IV = e91e66b0414c5ac32cafa3bf -CT = 54a85000a9a47cab4d20027661ee10940524dc06ac9db4e33bc0dc7e6cb6d20a -AAD = d7adeee427b52220d3305f4cb763ff8d -Tag = 2ebdac7cc27d777e26cf12c73a1623e4 -PT = 4b0dc9628a8deec3888c6e642d6f8d1859860c747439757e2d4006b9dce7d440 - -Count = 14 -Key = 5580619cb4b0820fad559b143ce0cf34 -IV = d1c93408a0ca93e94adff306 -CT = a461d08c458fd1b026839f8cf781f834b3214a31dde0477fa8c9b6e57bad8bd0 -AAD = 318dc3a4bafb2514346b520336bb5fed -Tag = 7fc2d6bdd8326d540c02dd0fdf55e9fb -PT = 9d81e6fb879c506e83e641dcf9015f6994a1417d03c1eacbf6d7cba0c349cbb4 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = f3e60720c7eff3af96a0e7b2a359c322 -IV = 8c9cb6af794f8c0fc4c8c06e -CT = 73e308d968ead96cefc9337dea6952ac3afbe39d7d14d063b9f59ab89c3f6acc -AAD = 5d15b60acc008f9308731ea0a3098644866fa862 -Tag = 658e311f9c9816dbf2567f811e905ab8 -PT = 7e299a25404311ee29eee9349f1e7f876dca42ba81f44295bb9b3a152a27a2af - -Count = 1 -Key = 4ea997187ee51b478f5e1ba48b57f0f8 -IV = bb6fed9776ed61ca321ecdad -CT = d4d67723dc367cb453c5b8ede795ad2b7affcf9f42650c0ea1df91e23175a7cd -AAD = abeeb5850efb796979bb55a1d255350d9faae4d8 -Tag = def8ab2eda15fe03abee6b2dc9f6e805 -PT = 87e9f743a7bdf04a2d97c4a6c5d243666bfb2bc80c9610bdb079792a3f724e04 - -Count = 2 -Key = aa6d3c010d93c6ce4d574b5f4017b8b3 -IV = 9480e879335e1c2f2f0b1201 -CT = 752ffdd7014ef7dbb269b9e43d241ca94b578c1ee2052b26225450ba2dcdd114 -AAD = 5c03cbcbb53d7b44a47e247c0c8b77e5603552c7 -Tag = 63d1a0a5faf1cfa9f72bcec227169fbc -FAIL - -Count = 3 -Key = b77cc41840f9fbff1eae0b9b2fe914c2 -IV = 81fd55366b7903e5c21e96c0 -CT = fe6cd8c592c40acd607fab35272044cf93bf1b64a34ab001564f474990ea851a -AAD = 8c8ec50ddcc4c6526336caa0fd43d4dc6f0b71aa -Tag = f6117a62541d37d32d84e7ea15a709eb -PT = 65453a0933555d1f85d6f7faf9216b4bb5428885b995a27f30dfb2620748fc41 - -Count = 4 -Key = 9133d24420ede755f92b0c1013d794af -IV = 59e1ef4e934d9b730994a58d -CT = b9e3365f552cb261082c9b412568d2beec164c4b9ce078e8fa6f2e43ce661bb4 -AAD = dc27f9206bf8a3969fa6ce3fd3567ed71de9d2c4 -Tag = 01fbf3c551340b041cbaca24abc7f6d0 -FAIL - -Count = 5 -Key = 712768594a8e29c9abe255a8493a086f -IV = c8614fb0a60e377a625b9c2f -CT = eadb515d3167d2809f88bfe5fc2accf74f46f899981f44940192a79c59457ace -AAD = c6435e5cc2a492671bfd4e346df9aa831603d1fb -Tag = 2440a1cee5ecae8681f7c65874bd75ed -PT = 1839ac4e4177fdaa0b7ce3aec45303c9ab44335a1c11569033a4202655c48c3f - -Count = 6 -Key = de0b9fc85fbb73020fc97ddb63241eba -IV = b606b94274c5553a1e9602ba -CT = 155fb5effc689aaafeeccd281b4f9ad8c5188db05e0087150ee273350cf101b7 -AAD = ecdb24c9b274f30a2f6e8f213e08c340b4a70a3d -Tag = 94d02127ade107e784e5ce7957fbaf51 -FAIL - -Count = 7 -Key = de5c1ce56bd1a8f5368c79150f878896 -IV = 6180f7c5ff343b0e472a146f -CT = 93eed51d4f2a18271c9addfc27a607cc0ab083a9019a9bc56e16016c0fb0cf93 -AAD = 8f277e505f58a141c36c149bd21297e57db39368 -Tag = da304087ac5bf7554844c42aa47df060 -PT = bc7e43d5434b4cee596f8466b91ea364274ded8427cb32a769b8c9ef5013b784 - -Count = 8 -Key = d30801f1219679ca8e5c3740fc9921ea -IV = 1d617eed1a5d1b00185e025e -CT = 0016592567d2f1d15de34bcacf362184be63d25de8c6f829bfbaffa817f4ea8e -AAD = ee78be3b42b9d34310c764fd34ce638d7f9eaf4a -Tag = 551f52cdb49eb910bfe8affee48010f3 -FAIL - -Count = 9 -Key = 8716c8d8b1db8c88074fd2b26f8c1147 -IV = 3a267fee424de653482bf9d9 -CT = afd442f001bc4ae06aa10952261b3e91c915da30767d059264c4d8c4a572b5f6 -AAD = 32bd64332598fe7402dc46a90512086259913bb0 -Tag = dae1ab57f4e9bc8e8c1302c5ff47d55e -PT = 557ecae25e16315e3af7e6aed7108a050517fca5025d1cc73922cb3fbe280af4 - -Count = 10 -Key = 689903458e666b9bae962af6216e1c95 -IV = 2a99b776f5ab1381bad64b71 -CT = 2e1124dbe2997d449a297c1393ad349013f043b095573b8e9d4d17ba4d65a9dc -AAD = 065886527d81b4031dae7c34ad4792ed364293d2 -Tag = a985f865faf6bccd511be3d04f5a0129 -PT = 8990e990c2671242d33c19e06841a36b49b83ea94de6d3aa1e29834fda83a602 - -Count = 11 -Key = a1207acba1aa57cfefd920693bd18c56 -IV = 78c3f9e40dbb4feae5ed7f59 -CT = 30387a274a099e22864c8e3e7a0c828406d283b0941f6507a45a459c59e178da -AAD = 10ffa4cc7da0c9c8884cf204e403691f32def692 -Tag = 2a80c2c4a6e843b6d3ef50aebbbde919 -FAIL - -Count = 12 -Key = b0aa82e267ea60febf7220167bf2a3df -IV = 50f86a412cc6c599cc678d24 -CT = 4fd730f52fb80fcf9f1b48239cf0fe1d5a290f682331b01d876204ace098078c -AAD = 552fb2751d6694433850e8fc48b47874db07267b -Tag = 14f41ad80c148007bc596db99214c321 -FAIL - -Count = 13 -Key = b0faaad121fff2d147a4f0b166c41976 -IV = bc081b1f49b62e94b44a4454 -CT = 429ba584c05b6aadf4fe07c468519bb96e0b30c417975b455e2d8c242bae63d4 -AAD = 8930fc9bb08376641c76535bd02ccc71af12dbcb -Tag = 71d8196259ddd346d38bc7ec00b328c0 -FAIL - -Count = 14 -Key = 7f571d7053533f29cec3c08779edc7b0 -IV = 65aba6342903457406b3519b -CT = 9186587933ddc6a83ab8df4bf6ba7c7a584bb5ce19de4fccd0903108f691156a -AAD = b6c4bc5c14ad1344ce2b1483f78b80efded57032 -Tag = 9bb738194012c804160936f013978977 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 8453cf505f22445634b18680c1f6b0f3 -IV = fab8e5ce90102286182ef690 -CT = 5475442af3ba2bd865ae082bc5e92ad7f42cd84b8c64daadcf18f0d4863b6172 -AAD = ff76d2210f2caec37490a19352c3945be1c5facb89cb3e9947754cade47ec932d95c88d7d2299a8b6db76b5144ab9516 -Tag = 972a7e85787ba26c626db1a1e7c13acb -PT = e4abb4773f5cc51c9df6322612d75f70696c17733ce41e22427250ae61fd90d3 - -Count = 1 -Key = 87a0af6da98b86e82098c9a7564554d7 -IV = 1991750a529395fe5b802332 -CT = 9a1e0fb7ec85f1c4d82111c7ad73085cb75f8478f362102cb4c1c27bc38cf4da -AAD = 6253a0d0d54234476bda68f2a4db8fac5c21206f1bb41de2e3c0a06b9d068c4d8cc99de08d0c6720d5f06ee4f981c23e -Tag = 9cd38b99c212342c816263c802656655 -PT = 1734cb85a5df60143786fdba7165f286d44ea0442eee802a36aa241c72725e4c - -Count = 2 -Key = ab124c19896f9a725cd84bc65c0b769d -IV = 8be6b8884adb0acb19776719 -CT = a77bc17b558e829efdf4508c62761520a44920840c4d8e8cad0564931ffb6f0f -AAD = f3f8c4d2edf80986c33940a9dfce5c64ac314d9969bad730bb719a4a39551eda6b771b6941ba301a4bcf2c7e69c8a000 -Tag = 890106f841f36315a7fed2ffb57f2dbb -FAIL - -Count = 3 -Key = 2c691107ac3eeac8507f7275d35daa6f -IV = b1c7fc99d810d00bef25163a -CT = dbb74c34d430d8bbc1a859418f0435c18deab7bca9d2c7ed3e9a1647de0e5f62 -AAD = 78e36ff5b2be643c948c1bec4153b2e9eaf0bb4a4a92079bab1fc42f3f66f25d075ec82998993c95fb8474b8091f4968 -Tag = b6bfa61751a82d581436ea837de8c483 -PT = 42f707406147678db6f51122e58bcbd4b9a8fd25bfad242aef6fa516663fd0d7 - -Count = 4 -Key = 078a2edbd9b6e86fa94a046cb688d6b7 -IV = 26bc3ee0106ee36e8b081fd8 -CT = b8f270f2b8bb2fa214eb35ad946212bd428390ab7ef652fc3e8c2226c3bc3416 -AAD = f93cdfdf0a98cee33f2f1b485c0e7115f7a56c80b0de75d4b7c87a28036f8e1fa916d6cc78f28cb3c19c19cf2173c5e2 -Tag = 0546d0182a212bc2f7ee185c4e33a510 -PT = 2fd09e96f27b31a8a22b778871bf71e9229b18e5ef42e28efbed8899122510ff - -Count = 5 -Key = 82d166bba1e5828f761e4231fbd2c76d -IV = f8b7d0adae5e4412b7287d89 -CT = 15f880e5c31c00240d2ca990495b597706939c9475c14a2a65582e93263d5479 -AAD = c675c578ee2754c12bd5a5c224c76d9aaadd2a1e7b70e51a1d6a13c9b2aea578444dd8b28b457ccf7cb28d4780fc1f86 -Tag = 4ee3f9cc35eb9d4ea65f162e8d6900db -FAIL - -Count = 6 -Key = 7dd5c39e6c6cb282a57930fa453c02d8 -IV = 73d4f1c8f69005370f509513 -CT = 80510c8914046fd36efdc24c3dbc74dc8d1903d7951603175d780cf95a4cd25b -AAD = ffdcf3d0a8ad8259c3f44f4abe72864e2876dd3c988658d78cff9a48fb6f0cff5e8da3fa7473e23e5efa5466fae7c01a -Tag = 456968965fd36c13415a701ebc77720d -PT = 56ef49a830c1b531843ba6a143b5eb7eea88f5f9edf9ef68e1c86ddd8b2ef9b7 - -Count = 7 -Key = 65541c7a7af95c50fcab82c9e8d24be3 -IV = 9e8491154a9fa91e35921039 -CT = 480c33465d805349beafeba53128f5ba234b8353e7f86ecd13992aa9aaa8b933 -AAD = e4f223988ee19c5065680ccad637240eb7bd659feefb0a8db0a5935ea2096cf5e9d89a1204248d00a70e102a9abf398b -Tag = 818f7229a392451112b5ae484c40ebb9 -FAIL - -Count = 8 -Key = a89926044fd23eaf3eaf8c6f05afaf60 -IV = 0506ee0c664394dc6c857d8e -CT = 329468ed34820830fa4657322b909cc6914bf51bea00a74b703394947dc29c2f -AAD = af6ec49868cc4ae5a12e677ecd60679da0844ef8316078ee5ff8faf04de53c9c6bcaddef8b0833155c9579636e82b6e1 -Tag = d5d610ea8810931e7ddf226d8569a54b -PT = a351f1709707501305e57ae767e89a7340f148112c1122734f68946267afff7d - -Count = 9 -Key = 8d36faf9f30ec69b5f8dad1e491f0f3d -IV = bf58466a6c70bbaa39ff7eb2 -CT = ace177fedf749b0312052ab77ef8074ec325ceeee3859177f6c952e7826a661a -AAD = 3535b93a652730ee47bef47650ee4f1f30a6c70491d0d56427caee2c4ee763ddd16575b6a3dee65ee7ab3e508ce6b8c4 -Tag = 324181117f39f500e7cfb6bb851909bb -FAIL - -Count = 10 -Key = ce54095bf5678115a76a89c4130450cb -IV = 788ec8fbd3cc197551739ceb -CT = 088efa30b927a8b21b86fa0bbe4e9ecdbcfcdb0a3379b8e758092fe21b23c99e -AAD = 634e3e6d72a31879f8030736957a9f89896475f915f627e73a32c9333ecaa2aece5e98b90a5668e6ec92913e3d91e570 -Tag = 9cb0e77f5b403ff85152a30a154457b4 -FAIL - -Count = 11 -Key = 99b3c4b8f2329a8eade022b7fb4f26bc -IV = b72d8545efe1ab84f0455e91 -CT = e5a56edcc5679aa2e7301119414656b406ddd7822c2de4772b8898ea0761825d -AAD = 9fb2c737e9c7de8052221ac0b76cd2a2289fc59b4cd646bb9622e30ea227f0cca33981ff51f27afde410f99ff6a810cd -Tag = 43dcad1123d27635015a5c42296199b1 -PT = 6b6403baa0ae0b354eb25641a5e958b5bd3f7108694f3ed019d1dc5ea2695625 - -Count = 12 -Key = 924b27bdcaf559e4a7a7d6c6332904b5 -IV = aeaed2c7b9a78acf83ecdde6 -CT = c190e4798254ce50ecf2fec69a46ee9a6ac9528dcb25ef72a5dc2b91cda0017c -AAD = e6ce29b8810499861fe179d3eee4bfdd2df25de10533e1334ce16d41dab3e8074f91943f2a3bcc7a04f657e84e9bb5b9 -Tag = 0aea374ec34347946cfbc4e251b7ee2c -FAIL - -Count = 13 -Key = b12ac950027bf3ac01df1cb743553a77 -IV = 5bbbb442bbc5114f949a274e -CT = 53738852ee4cf26c4e41675b31aa04d723b314a22924fc3a12d474ddc0771f8e -AAD = 81ca7d80c572abf9f9f3078258370b7763d603380bc536879e81185488bba8d029a18eebccd2eae9812c4af45e8758cd -Tag = 2310aac3905edc0ff5839ecc17fd43bb -FAIL - -Count = 14 -Key = 6598ebb72aeeb3def673f6fbbd9e5a2b -IV = ad29f048ec023dbf4e6b2f48 -CT = 0ce27f78a31a177741922fe99b1f44b7386e4ae5a1a666d6ba23ed76e61d3954 -AAD = 1457f349d36bfa595609ec4c174114264f1a5993264ea51fc2ff4055e132f3062cfa671a16367798f77c9c3146fc3cc0 -Tag = 5ea456be8c8cd7d1f18888ae74e16be5 -PT = 19832fc5a9d40d0cc9c7c2de8009be8323f79346b040b30551006eae72eea264 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 07a6be880a58f572dbc2ad74a56db8b6 -IV = 95fc6654e6dc3a8adf5e7a69 -CT = 095635c7e0eac0fc1059e67e1a936b6f72671121f96699fed520e5f8aff777f0 -AAD = de4269feea1a439d6e8990fd6f9f9d5bc67935294425255ea89b6f6772d680fd656b06581a5d8bc5c017ab532b4a9b83a55fde58cdfb3d2a8fef3aa426bc59d3e32f09d3cc20b1ceb9a9e349d1068a0aa3d39617fae0582ccef0 -Tag = b2235f6d4bdd7b9c0901711048859d47 -PT = 7680b48b5d28f38cdeab2d5851769394a3e141b990ec4bdf79a33e5315ac0338 - -Count = 1 -Key = 46bffe71ac52d4cc327b612469ccfb10 -IV = 78496f5e653ea0111b0ef4c9 -CT = 8c620a9245557459d7631f0df5935a9c4f05ac7f842e31c270264451090c21d3 -AAD = 954dc3942300fbd61bbb7e1c6a00836ec3875e6c12656df3affa4605200e4adf429731f6e7386bf43744cc252db523a322312702af68018853aa39a61ff88ce785ed727e0916057a97fa0c3e6daafba1aa79bf597ccddc4b5b97 -Tag = 20fe30dec5f3a5a8b8117afe65b81ca3 -PT = 59ba37f99a3be7b216f2a70dbc132f4b5839a5a57b51049daf9392afc02d9355 - -Count = 2 -Key = e306843ece9d0e98edf07aa3d1e3b6ed -IV = 9cc69f1c75cf0ee74f3a4ef5 -CT = ef59d545d7e921dcfefbaab0eea561e1c8cb12d27cfae589ddbf9c5271d41453 -AAD = 76f1e842634fc3a22be7b899d5616d125d393432c897f7994012f8c29934ff33ea4fd3495a52a1e3ea587a9116342c3ee304345d5e29102560df81a492799ec689e530dcd3e52711eebb43c66f645e5595abe5eaf8d462049d38 -Tag = c34930f3143b4746e574e653dfcc524d -PT = 0bfe265de63d70091b4f0537ff4153bb1e07502c55486f089873fdf38a9319db - -Count = 3 -Key = d0edd41ab297cb5d5df6b90a3cf1768d -IV = da4ef7e726e3a39d243c8444 -CT = d1c00496494bbcfefb04c5214657e9aa5270cd55e631ea914540312aa58ccd81 -AAD = 7a11df8fdef5aae36cfedd41565bad36fffbd6e6d9668135273e226dd83bd3ce84923a158747ddefefb12d156160d1abf3f35e1e689c40c2c0214ebb436c87528b3699e75817192894b54b47e3f508095230744b1b12f699cee1 -Tag = 7b9c7f4e5f471036ebc16c825f7e8e7f -PT = b9077e1f9787facc6fa5903b03d90af119454f8190f87391cb356e277cd3f06c - -Count = 4 -Key = 291567951e7d6e7442261b66372b3a6c -IV = 5a60ab4b00333bb34e292511 -CT = 0de6fe0eb4d94284388068226a84d6f86f181e320840d3f28a2bf6b92a17f7ea -AAD = 48055efab58264015eb49fe444de55edca701e09b679ec042abcdcff978e2b7eb74d0be0a84c858301cc415f5159f2a531138109fa5c559e770e6040f38ccf9302b790282458bbf99dbb494ae5c348ee4ab0f77d63b9dba6de56 -Tag = 38af26303a1ac4f8a5cb58420fd34803 -FAIL - -Count = 5 -Key = 44a0482a02ecac36d03d074949ca7815 -IV = c408ab22ba66b18947e3559e -CT = dc9d20998356985d299d81e965dd39abe03a1c04eb6829f531bc3d622cdd6e6d -AAD = fde37b7c9af3bbba7501d7b91dc456e32a6af77da2afae3b28c15640f5d99eeda5bde206d54c8def9c60eede741f4e4e50353119bb30e2523f073a7a367972b0c90e96a88a511646cfe24468548e50ff520bd5b8abb2a67d1304 -Tag = e013def1d2c5d1c8cfcf37ff1b99fd6b -PT = 3a995dd4779114839e2df602a4eca9c9e96f774aefdf3a78197e1a724de86cc5 - -Count = 6 -Key = 1edd5afd2b7a09e87528172eba3b4ece -IV = e8cc6fc5863f531860da48f0 -CT = b3d8fb923602f6570dedfd35392a78b3c6a824f6b0cae18f767bf17b51dbace5 -AAD = bb42f41f140f4b02f948e2e8022ecca7d74208171c52792989df161dad0d689d69e1ddcedc2dd910c6cc80f5759233ff9d39a571f48f42db1491b4d388f70925637bb6728cf2d47c2a9ed62240e2c948755750048230995fbae8 -Tag = 18e61e77a0da2f9212e49d9dbf1e4dfc -FAIL - -Count = 7 -Key = 801405876cbb2529d3fbe75ff683ace0 -IV = 70c46c7056213d4451f5e5dc -CT = a24f742c07d0ab8acab04f8fda4da7b5ac05728c0a7d5ad3bad0a0e845702a05 -AAD = 12942eaeca76806a5761cc76423240515f8f5d9b0d97557c5edb56db35dcda8a939b6375bb0b51ea7b9b67129304f82ce18f4a89edc75ce3db06a2e8607305de65349e4a6ba2d7ff8a13642caa59efb2b81cc050809bc52dceb5 -Tag = cc03cdbd5b6bd5b8614a456e2e14c6de -PT = daa772583ff5d445cdff53f0ddfd509ec8f93029ae0809b6ed54a91330ba16c1 - -Count = 8 -Key = 35f32d1f51d7d568ec80ab19555499cf -IV = 4af3095403b32091ca64c69e -CT = 4260444f1fd74ff30b0a8aefdf6b4bb39841678efe2ae7bfefc50d5b763fdf5b -AAD = a85fc884c10eb788e76e31cccf459b48d7e0bfc20f364316ced3ba81557ce3cc954357455e2998f3a9f3fe41694a8042bcc42a35fec042f1c24761b17a972e7d8255d0f1256dc8356e02baeff99e6b35203e71e4a95f61227ef6 -Tag = c659d690592881cce6eea2d6723a63ad -PT = 46eaf310e55f794e5b33429169450590272513b881df740e377c6b2f7744db78 - -Count = 9 -Key = b4aa6cd190092a887d0450302cff4464 -IV = f2dd629677deb47e9f6a87ac -CT = 84b74187e987fd293d743f0a42943ff52b6cff4710ce8adf387d84d9899df368 -AAD = dcd080bbdcbba07f1b9f9daef2cdbc2f9d579adf42b2467454cb2cf5233b753ca3ad04c61fb832e77ade745d600621ddfa4c14601865e013d3eddac8d2ce3733be0e84be1765200d778b9ae1bc087a97e89c9532971ea2177ecd -Tag = 6d89454ba2e6506d2a4a3fa1339af144 -PT = 75f80807a10beb8dace8bd1200bd8c2589abfa789b71257a9c7b15c0c14a89b8 - -Count = 10 -Key = 632072de94a0b3aafc8faad0337c3dd6 -IV = 0fd43cfaa52a7ede50c1fb48 -CT = 1a735b4723ed2eee23a5ec5706e41e7488b7ae34a01e741ba30c851b7a570e9b -AAD = 24e3af0dd3492e86598b8811e03d689b3802c972f081655320418045ceb7390f52592b85fc90acfa4717dad6e05c10957e33dd1cde30d127b759b2a03f3289f49cf3992d2a154f7230d50dafa57b7e78402946f17371661d1945 -Tag = c5e92a4b0ba5729de2c65c4ce33c0e8c -FAIL - -Count = 11 -Key = 7bcaaf0eec55d449c74b1af7311c5347 -IV = beb7a8feae23175e9920b9e2 -CT = e523e45e26e09f82af160d9965973e933ec5416a5af200872f0a3f5ff9121438 -AAD = cee02585c352bfe634591b2160ed76fadc3d35c76ab99687d4f7d1462d05ee25d94ff565ac77e7d12e911b07cda480e8032e48cb274ca96be27e85af6bfc4309b874f567d2c818fc0d0e91ae36c5123772648c73f7ce4c6490a3 -Tag = 3764be1d6efdedb7609fcdfd02c4b012 -PT = 39584163ee47e7bda29badece03463793c3cd6a0afeabd0c45aa6da2000ef275 - -Count = 12 -Key = b7b21207686125ded8a5763c217962dc -IV = ec7be05311b9fa04e4bde222 -CT = 345c41f07f6c6217fc134930ecb9377fa30992d63a0c07148a4fdcfa25484c4b -AAD = 885ed7046e3dba4be59d035a2516e382b07d3d7f3e68d9b654803b1dbd187a14f310209f5b3ffa51dedb59f0afdde54be81c6d8f431e547f8ed205d4c8b8d7d895e5bc49ae7cf304b5944bc01e096e0ab9079c2bbf10b40a6ff0 -Tag = 3b0e0bc5aca7d21285473f5e65c4afbb -FAIL - -Count = 13 -Key = 0dfa4098fb21873ced3cef3e9b5a5d92 -IV = 3a8a1cf096a5292324c3b890 -CT = b865ed2baaaa832320688c9da7854be242aba6f69258953b26730698ff08cd9e -AAD = e4fee49532d867ac44cca79d77c50297f0221d95bb2d668f47a0a49ae0b12bab67332b5380a9914c3952265365b558f94132e6b0586f40778e91cff0d47dad9649f56934934059a82f9fabedab8d27b0be782296d537c2b3a03d -Tag = 6163df5982acc866a8077c82a289fa3e -PT = 6cd946e61a36eb0b6b3ec580b0c463ac56fe8007906167d74685dc7bf69f0c88 - -Count = 14 -Key = 07fbf81cf98e000695b32bc7b0e2925c -IV = 67424e386d0bb45d1a7959f5 -CT = d8f277d9113154b4f54b0d0d717f339c27305254ea3eb87f7cc591a98d48cb31 -AAD = 7b34c644170bebb1e851f45ad7c6fc9a125b159f6bc6377d76daf3a4384447ac6c570919ad7ceac660b692d92624202110f85804399492feb2fc0e889e93eba61c4ee59d478aecfc53a88d163064d8e8fb5caf1d2d26aeb87a46 -Tag = 8e946decababd58afcec508278f6e95d -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = f3c4c058c7f0965a0328f0f011a128e0 -IV = e96098c39d9aa83522119355 -CT = b42c25155820564b41c525c6aa8ff4363c7c511917772b9bcd574b0be1f6b4ca2153869ddf0c4f76dfad3aef0a76ce056582f9 -AAD = -Tag = 44331e39b8a66a81591ed155d7d32372 -FAIL - -Count = 1 -Key = 93ae114052b7985d409a39a40df8c7ee -IV = 8ad733a4a9b8330690238c42 -CT = bbb5b672a479afca2b11adb0a4c762b698dd565908fee1d101f6a01d63332c91b85d7f03ac48a477897d512b4572f9042cb7ea -AAD = -Tag = 4d78bdcb1366fcba02fdccee57e1ff44 -PT = 3f3bb0644eac878b97d990d257f5b36e1793490dbc13fea4efe9822cebba7444cce4dee5a7f5dfdf285f96785792812200c279 - -Count = 2 -Key = 2e6705fc4862967af3aea0785f6da759 -IV = 7d9280f59dc2b98f0195098d -CT = 30980d2634138ead42c3347b9b3af32f78ffec0d7686b9247f8ef7258b72859276d9d33eb670eafb3ea900c32db9befccfc1d6 -AAD = -Tag = cbca49ce70d3ddb752dc3b438f2845ba -PT = fd1b20d58e51fe93d177db518416e632212dd1effb6b5fcf51bd94234ab96a455d8e3c84ca03b26d58c8867b6a1cc390828ffb - -Count = 3 -Key = c36bfc62ae2b4969dbe23b7332eccfe4 -IV = f9651d42ebf8468eb6e45829 -CT = f9296beed3d3b573f72cbde4ad832e34e8ef6cf7178e8d2783fff5ec8359daf67df8a70d8f86d2c339f9e1ec59d234e4f61938 -AAD = -Tag = 46ac46b455e9f483a8eedf6ef4b61be1 -PT = de42199c477b69de2857100395aefb2735c8328331109d647eae535c54200869e7a8bc82f461fc6c474748297c341bd22126fe - -Count = 4 -Key = a02b7907be2c2a5f8c40127c27b609cd -IV = b5ee4456bee99ab857120d1a -CT = 0a14bc62326c9af9960b896018d98c792d6e0456435005d65e60d553b4ea733ace7dcfdcef0c7d86a6f3065cab8012a4cb2cb9 -AAD = -Tag = 8fb36293be18a68ae7160fc848cc9cc9 -FAIL - -Count = 5 -Key = d3c4f95ee0ff93f67dfd7c6b65786a71 -IV = 18be95d32c908294ba908e76 -CT = a18dfc65d0d8e9485776623cd0a3bf77d05482eee64e97cbd0882197800611081198439a11e226c3fb819849230f1fca9a89e3 -AAD = -Tag = 0f528349ecbb4bed97e9fe8ce16161bb -PT = 51727be06b95ed04ec1f411aaf5b214c58f21782cbe9b624cb28229abb8f9d8d673b903c12eb9147c40cc58e81525d86edd6c6 - -Count = 6 -Key = a2526f5350c42e0772063ec155f1e1d5 -IV = b4f8c85c0d743a99a6cc87e3 -CT = 48584a611dfbe46c3a7cbdced160032945193cb8dc0d551080d162b47af7da53ef4cb1896fc01a5dcb8e38dd9784b86e804ee3 -AAD = -Tag = 65e48ba3b15b7478b885f8ccb52392f1 -FAIL - -Count = 7 -Key = d4c653fd951800ebe9c4a43806f294cd -IV = d3f54fcd5d7a85377fff76d5 -CT = a8464c51b538232eeaafb3c28f92773776bc040e9570cb1041ea69a28570f15bd284acdd2bf2e732d5e37fc4f71a9881e95f32 -AAD = -Tag = 88a2ae3bcd70d70c0652b41623287472 -PT = 38e1591924b8c3e3ae70955767bd33525223d3083245d0dab82bf55f2f9a0cf89eb67ac7fff56790c0a1cfd17dcfdab24fa821 - -Count = 8 -Key = d925a80f584eddce723da5e2c6dc2225 -IV = 90fa88a5d494154d71186705 -CT = 484049f8c5d49cee54d7a4f31801bf0b3f7b67c2c18e594117d413238f80e45e6322f389aafe7751abd15bec4ff0f6209add28 -AAD = -Tag = a382b14879dc59d855182f2a324569cf -FAIL - -Count = 9 -Key = dcbb9565d2f07f94a95f7982728f4624 -IV = a3e76752362e13ee7df5a207 -CT = 5e1789e0a24a72bba8c5f775284cc31243d62ef474db73bf73410be4abf80c860e1470aa98247119e558f13bdc4e9cd802aded -AAD = -Tag = 1a7bfc1af64c5e08741f1080064f89d1 -FAIL - -Count = 10 -Key = 838e8ec1da4be60680c2f7a03c050975 -IV = 33a4203c8a85bc83117dbb8a -CT = 19210a21ef00ba0e17ba8e1d23eca7f8f2e4cdb13c2e3f87a9ca0e361736796fd3720598e8283289aab0a4afafc13a7cff0437 -AAD = -Tag = 692270364f737ab2f31f421a48fb6b8a -FAIL - -Count = 11 -Key = c62f464a146cdfde1b23999bfc27715c -IV = 5bac8eb5030a81cf2782974c -CT = f8407943de543fabd5c6d2c217a2567b895847b3031e46fef6a20b9446b395d3a751633ea14dc49c36805a66eb466e028c0eda -AAD = -Tag = 150feaaed2ba2ae459f8f0f28fc2c27a -FAIL - -Count = 12 -Key = 3a2b2a1f2afd731648fc60c2d4775422 -IV = 9fd376abd09e6599986afb96 -CT = 813a8d7c46d0a3504445dbab48a546cbed968c574645fa696ffa9b5d62ce394ee35a204c62edf8d04c7ef621ed519c3b7a7318 -AAD = -Tag = f259e62193f1eefdbc6ec1ace305f78f -FAIL - -Count = 13 -Key = 1a77d432ea3555b56ce73509f90e4e47 -IV = c54136dc1525ed4f6dce4ba0 -CT = 33f094e27be6fdf62b901b980471b5e4d19ed7bd1b8ebf5b3f225f3e0e2669e02c74630f43472515806bd3d37b9b20f21870ae -AAD = -Tag = d480b1ab8a8f661d907c7d45bd8d2883 -FAIL - -Count = 14 -Key = 63193b6e66daedb9d566677ca4d3b129 -IV = 313ba09226bee694217f5cbc -CT = af18be0edfe1b74fc327d447909347c1e8b22f24eed0c545ac76f2d8d48f3c673b300b1c2cd894455c2232e052f078f0af71f4 -AAD = -Tag = 96183cc5e22937c15b78049d7cab2181 -FAIL - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = bc22f3f05cc40db9311e4192966fee92 -IV = 134988e662343c06d3ab83db -CT = 4c0168ab95d3a10ef25e5924108389365c67d97778995892d9fd46897384af61fc559212b3267e90fe4df7bfd1fbed46f4b9ee -AAD = 10087e6ed81049b509c31d12fee88c64 -Tag = 771357958a316f166bd0dacc98ea801a -PT = 337c1bc992386cf0f957617fe4d5ec1218ae1cc40369305518eb177e9b15c1646b142ff71237efaa58790080cd82e8848b295c - -Count = 1 -Key = 4384629e9b1686927e8508243be1d01a -IV = 84ff7f4feddde7d89d370e7d -CT = 8f385490e9622a6c1009900052385c23442890d2af667b210d012781e62d0de311f2149cc377a490afcc686cd92e7c35dc7e5c -AAD = a51cebf08d0f293e3a83bea5a9f1cc6d -Tag = 00097982ccc985671477cb1f1a250bd4 -FAIL - -Count = 2 -Key = aa1b3a94882b9b9dde8c8099a7af1830 -IV = d56abb827acd6388f48f7096 -CT = d145a79b9a97ecf2907ab0372c6eed310cf32e7a269374fba920c99eded54bc03c873fc0acdb895078bb8bb336fcd2662e071f -AAD = 503eb74ed7b0ed14f221d55638fa4fca -Tag = e0861f6a706b56da1b1fa8f04a14eebb -PT = 8b9700bbfec195f96f28093002217703970126e4b209e585719c066e5c7eb8c48e7e8e6b3329cf5980eeca49f80bf121de253f - -Count = 3 -Key = 5a85c2df1f3c0baeba09b8f532cfc8bc -IV = 9e8dfe8d34ef979508c00cda -CT = 9887db619566da9fbfa073a667168a85fcb94700ab267d30e3ddac0f8d1ac0f6f7d63ac02d2c28668f933ba080da521032ebd8 -AAD = 27eafefcad6eb8a410235ec3969ed11d -Tag = c84326d0247aa00ff3ba886da1f2c966 -PT = 63ef1aebf25de0e7e35a602e6d86c95dc9ff46ee0223b09b5332cb28a9b0d94486394cd442c93cd854ac54208fe1e1c64257b0 - -Count = 4 -Key = 9cb63a6932a7e7b210b82e854ed2389b -IV = 7d3498cd4af4387cf747dd50 -CT = d73bfce17382edd23be968d9da3bc772c59378d842183f4d11c028abfc9eca44a416a96a2058152e0ea83f42bd48ee79ed3acb -AAD = 188164c9a24f8965720392177138f354 -Tag = 5ee3c2452ccd78f780b8ffd0329f8df7 -FAIL - -Count = 5 -Key = 8b87af542edb66d468e9eb02f60685b0 -IV = fa7f13984e724612b22f4e5e -CT = 969cd236712e4a06be8c1f1a211f2c8a0a94d8b06bb05c72fbae4ac86ae2afbcb63580bf7261b4fdc829faf97652dbcdf54b3a -AAD = 7e734ddab198244376534bfe5024437f -Tag = 4305efed9cc20237daa32dfb47b1c276 -PT = 1b3898e927cc948ccb340e4ba46ea23095014e055256319ef4d114aa4ae67c520c9da07a0e2152b180505862d4c04eaa67887a - -Count = 6 -Key = 9f49f4aedf07cd2060cf4d12a7f40e34 -IV = a52983ca2faf10514d1369e1 -CT = 8df0217ef038eb6c03f3500833c3ac218dbbfe29100b9f48554333dee461b867dafc16089e6ef0c6c4c8684d307a54f0ccedc5 -AAD = 3ae716e481e36426214ad512fd607121 -Tag = 5bf48a795284ba53f0834940bc155e32 -PT = fecdaeac7f30ec39a6732a7829b7905141aa50f9ec65dd0efc5acea9349f585d61afaa4c0cb55a60e9b12a8a1fad98ea3e6bda - -Count = 7 -Key = c3a4add425cfc13062634ec4926059f0 -IV = 9e79f25c956adfeff8f71ba9 -CT = fc4a252f4179ddabf4c1cf5837526fec3cfeb3134e6d2cd70f1cf5eaf3beaf8ecb364e4256d529b930f524cd264adff3bb0211 -AAD = e36a19bea0f26f7a7117309d48a47cfa -Tag = dcb137bd2c88b60a7ca442ccd042061d -PT = 3c0d5f84159bf11e520b2d1405c5c26fe94a8482da1b420cf6d8df5a536dff7c39cf7bbeffdf60365bf9a1b0bdf35d299d9043 - -Count = 8 -Key = bf156813577aaed10f105662a2564005 -IV = 2dae894ae0848438f6e7f589 -CT = fedfec37d41795795c890472db7aa9cc9b59c5c86d6331466e5e5ac023a6f1e2855777f905794138f9b19a20dd4f9339b3c5c5 -AAD = 8c7ee403c77c861e6b75ad65f70d6cf5 -Tag = 0b50277dd6cb68a185b76d1dc3c0c3ae -PT = 9bee8e3b0daae03815fee8f548d06725261d1c213e7df2b87211655d60f7a122aa094967d54fc02cb2a51f156fba9294876c56 - -Count = 9 -Key = 1cee4f13145b8ee79c33755c4f60c299 -IV = 90115ee9a8c2fea38fd2b2c0 -CT = 7ccfde4eab711372bb28f5474797afc3066cb2befb84e66520526e8142316b986bba83fd928684c3131a866dc95c977f908dcc -AAD = b386ba008df273370459643b05e384f8 -Tag = c64979df36723089cb13bcfb2667c16b -FAIL - -Count = 10 -Key = 6b6b8a1fda71d168071213ed5f16e3a8 -IV = cd5cdb482d8d2a850ac528b7 -CT = cfb2c9aaabf3bcb373104255c6ba7c98bb88e7c446dc5b5caa4118c89c1bcacf1bfc7632d3a59ec954ad1582dc50970a57ea37 -AAD = 6ecfc978c3cf0dc721b868af6dd36588 -Tag = 87d16126f3b440d792cd4e69070e218a -FAIL - -Count = 11 -Key = aeb9f141348237ab152e0fee7765be89 -IV = 645cba3940f7d8e94d6ab775 -CT = 1db852ce89b10b3ee6dee42b492960be1838ae08e84dc00a70e217a9e83a436c849e7921e76af967e3574d65a915c854fb10ff -AAD = d3f8f031c70d75e26eb56c3fad82d49d -Tag = 69adcb30c4e12ff4eaf6e8e5ee8123c4 -FAIL - -Count = 12 -Key = 65dbce79d38150831274a718933b1207 -IV = f4f72eb6f3195327089dc7bd -CT = 70f31d645fc671cb4b79ab6ecf265f4ee9cba5febd2f73ceb44a7fe2f028efc8ee30b9eedac5bb7ccc11906e111029ddb3c545 -AAD = 6adcab836f1ef8ba1a9a089c5a6f5da3 -Tag = aec413c1e013af99cf8189da009adf63 -FAIL - -Count = 13 -Key = d6eccbc171f2b412acaed30238715f60 -IV = 90d0754b0ddf108afe8d199a -CT = 7c89057bf0c94527b3a63be13a963f76022896f0c98fa364934f71e997dddc09e778b71d009d12df611df0a9ef3cfb944fb86b -AAD = 217f2aedd907a8f86cbcce8d16a13744 -Tag = 9e045825b670b964a263c73c9a636427 -PT = 9da6e3f91d5f0ed62e1487bf9bf62ea8dbcfc56827731450a43f347882daa97cfb9ffdc79500bcf1601b397da076218b36cc9f - -Count = 14 -Key = 89b512544b5f39266fbbc0a770770d7a -IV = 97748e40699bf90abc46276e -CT = e0816c13ef928eb00f07444864fc7279b617543282a7e7c8873fdd352411afe457fbb4ec41e68685742948dda2cd8e09104110 -AAD = 1192973746283ab4657e19cd63284dcd -Tag = 136835fd131d43836ff2de3efabef747 -PT = 213f23341507ed5a2c93c1ef2007bee82786ab109f8d04e6cfeaade1bd895499f0661ae095132037200278a9bc3460a0716cff - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = af57f42c60c0fc5a09adb81ab86ca1c3 -IV = a2dc01871f37025dc0fc9a79 -CT = b9a535864f48ea7b6b1367914978f9bfa087d854bb0e269bed8d279d2eea1210e48947338b22f9bad09093276a331e9c79c7f4 -AAD = 41dc38988945fcb44faf2ef72d0061289ef8efd8 -Tag = 4f71e72bde0018f555c5adcce062e005 -PT = 3803a0727eeb0ade441e0ec107161ded2d425ec0d102f21f51bf2cf9947c7ec4aa72795b2f69b041596e8817d0a3c16f8fadeb - -Count = 1 -Key = ebc753e5422b377d3cb64b58ffa41b61 -IV = 2e1821efaced9acf1f241c9b -CT = 069567190554e9ab2b50a4e1fbf9c147340a5025fdbd201929834eaf6532325899ccb9f401823e04b05817243d2142a3589878 -AAD = b9673412fd4f88ba0e920f46dd6438ff791d8eef -Tag = 534d9234d2351cf30e565de47baece0b -PT = 39077edb35e9c5a4b1e4c2a6b9bb1fce77f00f5023af40333d6d699014c2bcf4209c18353a18017f5b36bfc00b1f6dcb7ed485 - -Count = 2 -Key = 52bdbbf9cf477f187ec010589cb39d58 -IV = d3be36d3393134951d324b31 -CT = 700188da144fa692cf46e4a8499510a53d90903c967f7f13e8a1bd8151a74adc4fe63e32b992760b3a5f99e9a47838867000a9 -AAD = 93c4fc6a4135f54d640b0c976bf755a06a292c33 -Tag = 8ca4e38aa3dfa6b1d0297021ccf3ea5f -FAIL - -Count = 3 -Key = 231025c304c626f119964a708328d25a -IV = 9f60d5a70a0a1452c50d756f -CT = 0dfe5a02709ec9fc6515501f16df29c512832f4f3da7491a8c1f1e149d131bd5ca05b803c8ad15bca743cb2c6308281857b8bf -AAD = 7e2b3efd33751fb7df561fee3f5f141433ed3b19 -Tag = 42ef3d08f38e9825b8800e56f1194ee9 -FAIL - -Count = 4 -Key = cb3354e8dd509bfeffcd8b7da33885d7 -IV = d794deec5973503dda19646d -CT = 20e1eb1572308afca40316934df2bd1d55131aa5f9abc06ebeddcf20ab66a6dfb562f54b7490fcb9d7d9bcd52f142edfa3f676 -AAD = 0d785ef9026b7e6a109adbaa7842a4bdc5461875 -Tag = ae92113005dddaf3e80ea809bd8fe899 -PT = c727894b7a507d5ab124a9fb14495c1d5842772e0d339ace3463a481967b0d7bfc16756ed18ac873d9119eedaa20bdea170dc8 - -Count = 5 -Key = 5a577dcb0d6929718fbdace24c03fb2e -IV = 54e4b51f37adb3d6696c58b3 -CT = 1712451494cc4dd30f779bc11f20c71683354235c69a1e3985e4492ec3c692781c5939f8bb73f14dbba37ce0ee640e24aa8a4a -AAD = c019aae892687a88946ed08115681ec79764369a -Tag = 9e201c975e3a938074a35c7e51a0d38a -PT = a457674bb83b3210e738c169b412f9a76ce77927265b1cb4f80fd336603a8363f3a287403969871c0d4085eb39a045e2b961c8 - -Count = 6 -Key = 04cbdcca86b9353d25c3d3c2b340453f -IV = fb594bde6c7da88bb4268c6b -CT = 22a7e51fc2b61ccd6367b3f4d519c725012db48834ba5e4ac89f7a27238eda54086cda0238de9abdab8231013e6692c17bd2d3 -AAD = 39b9ab5ac29002de6c6f48fb744a14b957e618d3 -Tag = f870268f770a3bbe7c3347b9f9b08f1e -PT = 0f8527090a793da125cc3a4aed04b5a1abeb0d09da7602982c686936734f874888b2f4b8c37c526b0b2005a2dc78dba7c8c47d - -Count = 7 -Key = 4d2fc6325a7beda38f12f9c4dae62e15 -IV = 774d52fd076c1d1707e024b0 -CT = 67a43f43fce9fb7303b0ec4544887d70c811c0b1dfc923ab567bccea494d0913ff40b7cb70d89e7b5096fa942d5747f8c245dc -AAD = 225e4c071fb10cf62d8529b5af30c29e29fafd30 -Tag = 97f586f1c395bbb05be58b891c48fc43 -PT = 13ab3fb2eb0d6d37637a0a1761911addde76f9b451d16c8e0dd562b5c4ffd8e59e5ac08d9321b9660605cbfb06f33ccaaeabc1 - -Count = 8 -Key = 53a2ed1d225b63d4bb45b5225d8fa21e -IV = daacea4f24319dee2afd9cec -CT = d58eaaf85adccb60a952dca9b72d8144eeac455ad9c3d558e64220669e6333d3e01d8d7f74cfca6d15480d564d2acf6110dbaf -AAD = ac25e4ada8fb3160b2bb5b445f35b885ab0b42de -Tag = dad2f9fae9071ae8fb21f3f2d7bf4ee1 -PT = 1f6666966c94ed3f2c4586ea8f6b9bfede55a396c6e4cdc014ba93b272d52c42081aa8272552d4a6862a1543439042e3656312 - -Count = 9 -Key = 441e2093780b7466a736cf9fd56f505e -IV = 29852c4f9e8e560bebda507f -CT = 3f86e4663af1108480e9ebfb1c4ff8cbbf2f340658b91953fa51bad044b3e900e38e66475115c203f9aab0553efbe7c8d3488d -AAD = cb79774fe3859d571750a721da0d0d4cde40a703 -Tag = 35d94561193fed46b6468672ed06f848 -FAIL - -Count = 10 -Key = 72e26b401f5edbab8d52d85b953c9740 -IV = 7bdee59ca460dcd9a9026c00 -CT = 326d6aa5c731fe350872edd4851cef3f52d8b23e8d21eadd6cde94266644393a033b8188f8d4991e6af8896cc90dfb14133ffa -AAD = c87e5464decf9e311e1a53fc7c2e58ce3c2cdfd5 -Tag = cc72145ec7d743669f82ffcff4477431 -FAIL - -Count = 11 -Key = 8b7e68eb7c5af5667e107b15b024c6dd -IV = 3032706bb97a57db2c12f516 -CT = 7e51f0246c2141d3056e029f010f137d962db5f2b75cea3025641b9f257b0cf368ac5af5386a652e4a344ce87a3ed7ea13f4b1 -AAD = 8e7443bd5391b0d794ca731faf0693b5c1bd322e -Tag = bd958335e45dfe08a14ad3493fcf684f -PT = 104d820cd5bb4ef3d6c8da38aaf87e918319bb9c6855141a5d347f34fc99f17d9099d75a55a9af4d91c3b606d5d681906fa645 - -Count = 12 -Key = 6be475335ebfac4a8153e2933df64728 -IV = 2ce9f60a87700b3cc2aa4bd6 -CT = 94450c6fcbc69723e5099e8f4d1687ef30d22b53e75dfb1d64a66b5a714c38841bc02e4d1a1d543a29d4421622605be9898c35 -AAD = 4a47b8de3f900d31b02c341fa6e93bf7d7fed8b6 -Tag = 0e2a619de3645b78f8d88b4d41bb7fee -FAIL - -Count = 13 -Key = 1e47d62f60c4f817e60b4daff62ff0bf -IV = ac749f9ae55bc1fbc8d18f8d -CT = 81aeac511f589d5f7b9a63c98188faa88e013fb2efea246627386f6124285fc9f5af0fc9a7dd66dcbfa72a08e0dd205a4f54e0 -AAD = 1dbe80d44a17dd3c9717436485e946edf10f5a94 -Tag = 3eb79932f3c5c81fe7a0b25f9a862820 -FAIL - -Count = 14 -Key = 94e5bfcb62bf58e4d22fa7e111f36ded -IV = a1440994c67b449ab1185996 -CT = a33bff622bd29e2d32b0860c6bef2fa7b0d9a108d06af8b41de8467ab063ab0363c576ec8b085b8ff04eafd997607d651e607b -AAD = d56056f606021bda6c9d3e47114650f08c4326a7 -Tag = 69ccda69723a8e596e0ed6db65f19257 -PT = e376d7e1466e559a8e535c06a8cd609a8075c373b7b2eda79396c9b7a7a2fd55b5d0d3c7fbca64f5e40c553865d697a52a242d - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = e7c650a8f64a900857eaf8d95c49a807 -IV = 961a0b83a36b79acc1494da5 -CT = 70954661360ee1dcc5ea22918fa89bbcf56aa6ded04b22fccff799d773833617c9aa7ddb0ab9c170d6a44769bce9f7fe287c68 -AAD = da9ff7c1529f9cb75c88cd890c9a1af493db5fe8148c4687984c070442c5d501434bbaab1dae06cec6de0606d59da3d0 -Tag = a0962c9259e7d4a9a21e9328e93c754c -FAIL - -Count = 1 -Key = f0305c7b513960533519473976f02beb -IV = 1a7f6ea0e6c9aa5cf8b78b09 -CT = 30043bcbe2177ab25e4b00a92ee1cd80e9daaea0bc0a827fc5fcb84e7b07be6395582a5a14e768dde80a20dae0a8b1d8d1d29b -AAD = 7e2071cc1c70719143981de543cd28dbceb92de0d6021bda4417e7b6417938b126632ecff6e00766e5d0aad3d6f06811 -Tag = 796c41624f6c3cab762380d21ab6130b -PT = e5fc990c0739e05bd4655871c7401128117737a11d520372239ab723f7fde78dc4212ac565ee5ee100a014dbb71ea13cdb08eb - -Count = 2 -Key = adbe83a792ac133ff5088b49dc8fc54c -IV = d9ff7ed76c6c34d956917a8e -CT = e12d324af2e723722fb5ace9da7c3dc0e673d2ee294e414b5abbbdd2dd4fc688e5dd6d2e961533e9083b6ae8e712b7b23339a4 -AAD = a81f2b8c138d3e629b6e06a9563e75ac5bf024fc53556dbb9e008d9fa551835566d72b15b39f1ea0d9d6a53ddbd488c8 -Tag = 6fe3139f1f75228545db7fee6965fb17 -PT = e76f356343be3e1fc9e2bd0f9dd770c876122ddf1d6270128a74ca8394ba47531e82e13b0c9f028fae18110f2ac673de832085 - -Count = 3 -Key = 32406fc5ecd36e327c45c9e783870b54 -IV = 22e95c98f482982ea0f189c8 -CT = e8396f91e757cc47385e2d45a0dd8a3fa34350a9d1e0cabadbe73ea2b17b866c7cce8df163a802a7e207e80fe6f11d15f2e483 -AAD = 635ba2c5301e218182da81805de97b2aab5f163397d319c4548dee5ca7fb4a6c601f667da3c542347890e267f94d613e -Tag = 630431ebd61f8f2e01639d2e6cf3acc8 -PT = 3d49646a76dafcb7ff78aca9415207b107afe751b2cebc1757cfc74402f15f89c36ebad397fa033d21c26ece33533c4d80897b - -Count = 4 -Key = 8e184c0f49d263a9cacdb83821a33c98 -IV = 06d8f6969a2e0569ee0f7872 -CT = 4b8497667cca8784a01300f2869aceeb6161f60f6073f11470a14b4b2f905cd9705ea3938fcaff3f2308d5e9f3aa7f88bdb808 -AAD = 655730e35b8f91ec3d6c083baab2751c7dabc0a4d29d0bed6453b2ce8a468cc0f0bac9000f8a86e468fdd1623901994d -Tag = 9d919fa4c13f38c9134d7893d832fd30 -FAIL - -Count = 5 -Key = 5d697b8c61784d02cda780887e57fca0 -IV = 6a7aa3548a1a23c91b8785c5 -CT = 654855265d5b61777a7c0a8b8239c74cc9af1aefbe80e76b415a17e148aae92ee3c9fdf391dc22fe1d77805cf18faf0be54823 -AAD = 57add18eadebfe0651f90699e1eebf168447a6d61db412f72acadf77f8dc5f27e0ca9bb5e5a8d02ad572782684647e23 -Tag = 813db300a2a25fc1791e98e7d8852ee6 -FAIL - -Count = 6 -Key = d7fbc15e1a47d60e64a15933eab1af36 -IV = b02845c45a33f58c5c33e729 -CT = 259f6299e382bfcbd8b217c2fed076799deb9abf3eb59b58f07f92121b7dfaf9d37130ae708898c281ffb1b22d8ea08c16c674 -AAD = ecbbe60c54a60414cc5f6da3634d03c0b78ad70dcb9902edb4285ccc148f7d30bcd14a1d8a8dd643b50cde910fde964a -Tag = c23e799000d36b0456c7ec1cf6b28285 -PT = 465a3617259fc4fce31df80aa4f7254065cb7c9e1b61692c42c3ec5bb8c13852c9b826ac886d86802d92bb63d5a0a3ad60c6a8 - -Count = 7 -Key = 3a90b1433b1c18f9e2d284ac1022add8 -IV = 99c814d63bb4835663fe8b0a -CT = 5fa507b9a068a16dd098223db38600ee3e2a4cfe7ed0d484fc24602062fe3118b112a0cb7d960616d4954f0f1b6bba6bdaf0d6 -AAD = 7e61eaa0442e1ac7fe336036ebab57140f5648f44a11968d63ee287de2cb01c5b1c808a20690ce0406104859a3ea462b -Tag = eb35c593e4641aa9f075e380645940d6 -FAIL - -Count = 8 -Key = 0e5d672e3e3abae3efccdd6302b63075 -IV = 41ce593eec39b3360741f5a7 -CT = f15d84949a7a6233ea7c6389c60c3be39e727c58fe86b63aa5101385bba8dd152ebeddcaccb8fda44e9923c4a27ab63700d60a -AAD = 12791dfc8a7fbfcef959cc1105e7017c837da1cca1dd8499ede10fad46323f752203c5e3213818ba751a5fb7a33d24ff -Tag = cef08ec966cee8be9904fb0f7014e455 -PT = 3bec21655c5b7727e82b9c14e495002fee0d0abcece86da9e5ed9361ab4e1b52db04630b3e2d2317f117712a213df4a2766b70 - -Count = 9 -Key = 5b4309a19a3ff4f5a2f3f50ff173553d -IV = 24732b76850d64df84b0b543 -CT = fcfd435b25812031ce0a2b1114083fd5d0e642ed9472f9794c65dc2e1ec2b69dfaede399041c895a150fa02794b307b1113f67 -AAD = e19620455af6630e2cdc16a184c6418dff96372fb31b5bad6c4c40e824a8a0f9ffcb9557269d3bd808582f99765997af -Tag = 1b1ff7b4ff45ab1c318371f860c21ee2 -FAIL - -Count = 10 -Key = 012e3a4a112fec5b012a8a740d528859 -IV = 7cb272d50f410acb61b0460b -CT = df42e49d5e42488b28ec32a1e2c13f49b018b94e268b8529d2db0cdddf7064674fcd347a6ad4ae6bc0b935d6820dafe1a1e037 -AAD = 27d30a53a8c009f01cc7eeacd5a2bd479280cf31a2c0e6c854b5bcbc0517cad3f135bb4799c9e2e1e99905bd649b251f -Tag = c62506c34f7ccfa41a50a389a7b57fe2 -FAIL - -Count = 11 -Key = d1a132ef84f48fea7f106e6d444ca25e -IV = 9c9725e2bab366dd9004338a -CT = 8ac638ccd1b4e074957e08fbc4f89a703b44c204ac15c0a8380c72536e62a7056e47f3e2096ccecd837c55e00e84e1ea31323d -AAD = d6a4c524d726502c3e726d6c8aaf373b390e4300a3e7ea74c21bedd9e5731575060e8a85922ae3c7b317a18f1a6331b7 -Tag = b03a4e723b8ecc24422ed39e0d7cbfc8 -PT = 9eb690978cf06c5df315e63633be02f8d9539bc4aaa98e7e9b6dde4cc4fecde3f53b82d7b614a2e03e1df21e887cabca843175 - -Count = 12 -Key = d85c71da4700d540319eb4f19bbe7654 -IV = 18aaf265066ade903c82dcee -CT = e97090cca858cdaae5d746dfbe947f16fb963beb1bd85aa1006a848e5020ef70de4f3af85c044423cade8f70cbe3d5131f607d -AAD = 15459e364082ffde14c08f91a7b42d39f1b075622f8ec0c7f0773b973990af721cd907bd7fd6c7f0f1aefc05a7aec27c -Tag = f5955ad7b20b9648218c71acf9a074cb -PT = 148b067d82552d721bd77765710d62749c5bc7c079360c051bc9be9ae49e26ff98fa9aa39e585843ce06208ff630d139972bfb - -Count = 13 -Key = ec3bf7626ac29db644ddc20ca1a40ebf -IV = daae780f721d7bcecf1f2cb4 -CT = 75ba0d138246649194d30e868f72680eeecf4b825b40e977f8cd9e38437f8e59900323a07a7f363470d3f77f0938481e856d6b -AAD = 50f2ab57728b146eb972d2fbe76d6d404a43aa990d10192820c4aa871e78ecd1cebc16700f2416c0512cbdda16642c32 -Tag = b4137053c3913db5e0ff7bbb00cb9fd5 -PT = 092d254107607fbd8bc2e23035d77ebc144bbd52758c1a691951420a10f07cb00566d2f6b72f022cf83b30645aff957aeca8b2 - -Count = 14 -Key = 36a23edc0f006933c99cc124e530dc7f -IV = f13bb10b0da13f7e9d32f585 -CT = 32f1b95f21c42dc13dad69ff061a6fc809809f91ac11d484f309553a6692107eb8982d0e48f2726c1c96ecdd2f1579e9bafa62 -AAD = 02c06615358ca90d1585333e35504b2fc5370d2bf4a5797a2c1f991fda06135cb13e71e647abb4def56036de838ebc96 -Tag = 8703b4a4fa637b16d1a36cc5028716fe -PT = 9da63166b633b5c9f31f5d0869594960de63570170e83530d796e78f81ed579a74d28d3cb9726f6c6037548f3924bc778c7f2f - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = da2bb7d581493d692380c77105590201 -IV = 44aa3e7856ca279d2eb020c6 -CT = 9290d430c9e89c37f0446dbd620c9a6b34b1274aeb6f911f75867efcf95b6feda69f1af4ee16c761b3c9aeac3da03aa9889c88 -AAD = 4cd171b23bddb3a53cdf959d5c1710b481eb3785a90eb20a2345ee00d0bb7868c367ab12e6f4dd1dee72af4eee1d197777d1d6499cc541f34edbf45cda6ef90b3c024f9272d72ec1909fb8fba7db88a4d6f7d3d925980f9f9f72 -Tag = 9e3ac938d3eb0cadd6f5c9e35d22ba38 -PT = 9bbf4c1a2742f6ac80cb4e8a052e4a8f4f07c43602361355b717381edf9fabd4cb7e3ad65dbd1378b196ac270588dd0621f642 - -Count = 1 -Key = d74e4958717a9d5c0e235b76a926cae8 -IV = 0b7471141e0c70b1995fd7b1 -CT = e701c57d2330bf066f9ff8cf3ca4343cafe4894651cd199bdaaa681ba486b4a65c5a22b0f1420be29ea547d42c713bc6af66aa -AAD = 4a42b7aae8c245c6f1598a395316e4b8484dbd6e64648d5e302021b1d3fa0a38f46e22bd9c8080b863dc0016482538a8562a4bd0ba84edbe2697c76fd039527ac179ec5506cf34a6039312774cedebf4961f3978b14a26509f96 -Tag = e192c23cb036f0b31592989119eed55d -PT = 840d9fb95e32559fb3602e48590280a172ca36d9b49ab69510f5bd552bfab7a306f85ff0a34bc305b88b804c60b90add594a17 - -Count = 2 -Key = 1986310c725ac94ecfe6422e75fc3ee7 -IV = 93ec4214fa8e6dc4e3afc775 -CT = b178ec72f85a311ac4168f42a4b2c23113fbea4b85f4b9dabb74e143eb1b8b0a361e0243edfd365b90d5b325950df0ada058f9 -AAD = e80b88e62c49c958b5e0b8b54f532d9ff6aa84c8a40132e93e55b59fc24e8decf28463139f155d1e8ce4ee76aaeefcd245baa0fc519f83a5fb9ad9aa40c4b21126013f576c4272c2cb136c8fd091cc4539877a5d1e72d607f960 -Tag = 8b347853f11d75e81e8a95010be81f17 -FAIL - -Count = 3 -Key = e765831739df79cad4271c8b97012b87 -IV = e02b84f657f30fcef55db39c -CT = c22a920729745e6033fb0a139fb84549125701d90ac568dfb1117461380959be61949a2ff8ab5044c448c5fe081253e639528e -AAD = 3b6a16b461a8aa599ea02a63ac7e57ef9acfed69dc75ec7886e902d4b8dc39913f5ef645e1c46251b144b5d6024c6a1a3c330aa7f57b8a1c55bcd918661583d970c33733ddde3ef1c5ea7ac8eeb67021ba47a904d11308824832 -Tag = aa49deb346952540a11b5af0d8ae2bd4 -FAIL - -Count = 4 -Key = 0f7cd5df675edaf66c8b7b0ac3d2798c -IV = 4085ea5c6359da0cda2e6028 -CT = 19bf82169fee58fd9054b4729835f5d6141a39819e9ab6f050335dc6af662842b2a990b12a2f75546b56bf578832b0236a2313 -AAD = bf65373999ed6576780dabef2361be4713486358ffc9ae08ef91b517b02cfc9fd71a57eb49a02fb209726a21e5a2ec02c976a96e60f795559225b1515876400650d504dc6013aef6a92b41f952c88fc8aa0746cb0e3852f5a00e -Tag = 0ff48571e381418cfcaa0cc13cc178bc -FAIL - -Count = 5 -Key = 7046ce2cfad031f8564d7060f7b9fcbe -IV = be584d2d74c2734ee05dde5d -CT = 7652219e8315b2914c3cddabf28810169ab64d552da2553edad00d016e03d5ea1a540605c1b5d15f0f533fdf8a67a8233c65b7 -AAD = b9856b2c5b261037bf8629688f06a415a162ba27c44976256d87d61a965bfd94b4a29b2b553abb5fca0a93739f84a60149cf1cf3db63fe043e1e292b1834cc48c47e816fd8fb059f909d17769f316388528b1f8246e3708c1c1f -Tag = 3f72b336ae622971c66ec23999dee1bb -PT = cbf47b4cf3602ee4718806d92d79d550cc58108fc6e7384fd607eb2839f1510856314bef516101c1ba0bf9013c3223a40c7566 - -Count = 6 -Key = 11338a7a431e3c16f0e5d265ca619735 -IV = 3b355d853a4fee0690be45e9 -CT = ff4d5100b25581129f8d50bbdb8e84ab08b52c87d71019d552ba6cda7c80da584f2d5a7e17ca0667dd578e099852389241d5c8 -AAD = e417b81988f7e2f3d2efffeca7e061fb865526a8067e8253851ae8828f9f027fb380a711d1db671bda7266fe779394ba0eb1d02d1f99bd0eacdddab57d9d29c4db5e863fd53b000a11b3fc7c1497fe9cc63a94d5e3c3a3856721 -Tag = 42939c00e6b469db15b9fd47e9153005 -PT = 8a6a9fbf3e72b1390d665424d1d2e706384ff1db8c5e309b69a27448bd1750a038c2c25acda988ec1dbed5f24fa8c44199146f - -Count = 7 -Key = 172dfc179211c31e055c149c8c23ec9e -IV = 6f32ba04972c3570b11d1a1b -CT = eda182e3eb20281807e041f14cb7e26e933b9691db457a3239213b3fcd885d421a737207a20ae3c30bd9fbfd9bf85f2bf93cfb -AAD = 6b9656e6c07bca3540eb334703a3b110447e55a9f47b3513e00e029aec6245a7a55e51b28d9afa27b1ac2c5639f02c64810a5212a71582438f691653356c3caedc9efe29db375af29d15eb473786b2afca37b3400734d9d103fa -Tag = 8e404527995c65f9936efad88fee1b4e -FAIL - -Count = 8 -Key = c74c96c514b09cf729cd0bb21c4eb0c6 -IV = 45b1d4a0e56d7e24e91b84e0 -CT = ad3a0d8bccb0f2fd773a67b4cbd7b4f8ca523191d5a93aabb8f62be100701febc66cd2adf162d4d8cd9abf5ee2f03cbcbeef30 -AAD = 58ea828b2ab805b1d262772161c26c452b545ae75335fb0dcd904ec1f1f7125984d9c59c03b1ae30dd7910b0ea4e1a5383fea414111154d916f4766d0cd8542d3ee0fbf55398fcaf0a8858a542b12feeb277651d019ceeae6eaf -Tag = da9dc47d559516d2ba43cb78eb218d29 -FAIL - -Count = 9 -Key = e45d100fe08f2df7106fb7f5a69ab9fd -IV = 89cb5592e015c15268fa6c74 -CT = a3e6d97d398b6f8d1acb9d45c0fb66b89cc8f8c034fb77b4cf50da3fd8b7521a6eb5f7bf4a6df703a125a43a95f7d6679cc2b5 -AAD = 1c9293292c44aa0535d7e3cf55345272c994d1c7e4af05b666ab80dae87d831685ebf706900efa1662bed1deca81ae2ab1aeb58f40030eca375ef1765d7fa196a2ba72d1d7dfb751f48e00d8b607ba1ea900f7fd4d1dd6169235 -Tag = 1d61d7db1d37bceb7de98bd76a736d45 -PT = ea9b8523fd5ba55c93ff32347d491220b3984cff39d145ca6625f4cc7b01b417776a2e7c4216b1385f8191667a333efaf00343 - -Count = 10 -Key = 2d0b0ccf8f6e955a49a8a6e525c6841d -IV = 086d5a3f6590e8f7696e6ca3 -CT = f4c9c513a49a7a98fcde6c2f380bac70158a5c772cb334c0defb10399c2741b3be0fb06242808b1c4d3941dd0f0c6337fe5183 -AAD = 2f697a4535c68faccddc970f403103d69590661bdc196e064542fb1d6663d47a55f8b25c71dd16ea36c53a8caa8d2ed30b49efdf1794c2f13e6e5cc3ab81832c6b63c1862bcb589a7af0bca5f6647521556fa104713c7b0f4237 -Tag = 9deb38ad834d4e0788a113f01163a2c1 -FAIL - -Count = 11 -Key = 842f74526892dbea464884041fd1176f -IV = 8b2c836bb2306aeaff793bfe -CT = 79c1ab6299d187b7513b996807b6484817d39899eb9c87845b2c7b13edca01a8f5ab96f6546b6f921a89ab5624cab507b10f35 -AAD = 78aa908eef930e05c8491dbc093ad689ccbdf6cdb0321ee0beb7e73dd199f6db81b5ceb26bad8bf0015c05543ca3dba582fbb8a816430397159491c20c17dbf303c3981275eea91be0f8d0cffe7be53418802ce35bc6ebdf190a -Tag = 1b1b94ad78dbe7c286f87f80394a519b -FAIL - -Count = 12 -Key = f2dc68a0aaef843b142d1ea02a83ddb9 -IV = 6e8045bb7cddcde4945723ed -CT = 47b824727193d179b279e7ff90c1848f721d5ddee2e7b9c680e24a9f8b284ddc702bc4b3d7951a6574b000bb725ba34c444259 -AAD = a50e9bed28509b594943c6dda18abf26e21e1b43b7b3377d00dcdc27fe5d9af001d63df3dc177b86c41601b982cf5bb064e5b1383d4bb3a1891b418fc665ab7c165d3033af0c971fc368f3f40b3b3de35377b1945fa582b85c70 -Tag = a6ec986694fed00ff3fa689487158ce2 -PT = eddb4801aa6fbdaae5dd436a958e5771f850f81f1435cb6d41a22bf0b0a2a3b453874145861d3d1e65bb2d1d3b2b7a458b8c6e - -Count = 13 -Key = be23a5fcec16a1ab734e914d52a38918 -IV = 0ca9634183e4f07b46b6cfb4 -CT = 9256f9cac94ed76011454a96f91deb5c75516b3778e66a948618cdacab369303ddbc5e159b7eaa669ed436aa9931bc1462d754 -AAD = e2cabc6ccf6b078b370aaae412ba9ac810246938a4ed0e8d4aa9f05347095650abbf773efa42a2447886620e31982ec9aa0ec24152f3d551c6b66759742f7abc5c01325bfeecc8473bde40969fb0c82949393fa232a9c82ebb72 -Tag = 91d35d8f10a9b02a710d142ea695363d -PT = b04e7595841a8fc99d19a7bdb7e08d687fa9b3475132a79d3441a228d129ccf2d3068c47173775b696f61d9040acbbd72927d3 - -Count = 14 -Key = 0658fca0a449d0b2bd1a56a0bb582f81 -IV = 12731761ca8bb0f266d66354 -CT = a26a3749820ab45b0e254a9de5e7863b6bf45139c4b981b57c14db59d1affd838e2ac4ce397145fae610a10ab1a0fa62d2fba7 -AAD = 67128c67b6ef6f8245fcd3e191ee9e37072252fec8e4dcc385fdca7bf19835f5c1f43058830ace68af6bead5090b647b727a3fb6806266df6070133ecf96b1cafed543d3c9e9aea6f82ffa3539e5105abe3a8fe8bf184ae6398d -Tag = 64ecdd3e2b77a5eef9444bdfb5a8e7df -FAIL - diff --git a/unit_test/ciphers/gcmtestvectors/gcmEncryptExtIV128_stripped.rsp b/unit_test/ciphers/gcmtestvectors/gcmEncryptExtIV128_stripped.rsp deleted file mode 100644 index 4ff64c39..00000000 --- a/unit_test/ciphers/gcmtestvectors/gcmEncryptExtIV128_stripped.rsp +++ /dev/null @@ -1,3150 +0,0 @@ -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 11754cd72aec309bf52f7687212e8957 -IV = 3c819d9a9bed087615030b65 -PT = -AAD = -CT = -Tag = 250327c674aaf477aef2675748cf6971 - -Count = 1 -Key = ca47248ac0b6f8372a97ac43508308ed -IV = ffd2b598feabc9019262d2be -PT = -AAD = -CT = -Tag = 60d20404af527d248d893ae495707d1a - -Count = 2 -Key = db1ad0bd1cf6db0b5d86efdd8914b218 -IV = 36fad6acb3c98e0138aeb9b1 -PT = -AAD = -CT = -Tag = 5ee2ba737d3f2a944b335a81f6653cce - -Count = 3 -Key = 1c7135af627c04c32957f33f9ac08590 -IV = 355c094fa09c8e9281178d34 -PT = -AAD = -CT = -Tag = b6ab2c7d906c9d9ec4c1498d2cbb5029 - -Count = 4 -Key = 6ca2c11205a6e55ab504dbf3491f8bdc -IV = b1008b650a2fee642175c60d -PT = -AAD = -CT = -Tag = 7a9a225d5f9a0ebfe0e69f371871a672 - -Count = 5 -Key = 69f2ca78bb5690acc6587302628828d5 -IV = 701da282cb6b6018dabd00d3 -PT = -AAD = -CT = -Tag = ab1d40dda1798d56687892e2159decfd - -Count = 6 -Key = dcf4e339c487b6797aaca931725f7bbd -IV = 2c1d955e35366760ead8817c -PT = -AAD = -CT = -Tag = 32b542c5f344cceceb460a02938d6b0c - -Count = 7 -Key = 7658cdbb81572a23a78ee4596f844ee9 -IV = 1c3baae9b9065961842cbe52 -PT = -AAD = -CT = -Tag = 70c7123fc819aa060ed2d3c159b6ea41 - -Count = 8 -Key = 281a570b1e8f265ee09303ecae0cc46d -IV = 8c2941f73cf8713ad5bc13df -PT = -AAD = -CT = -Tag = a42e5e5f6fb00a9f1206b302edbfd87c - -Count = 9 -Key = cd332a986f82d98c215278131ad387b7 -IV = 1d12b259f44b873d3942bc11 -PT = -AAD = -CT = -Tag = 34238023648185d7ef0cfcf5836e93cc - -Count = 10 -Key = 80e1d98d10b27237386f029189ec0448 -IV = 239ebab2f524fd62c554a190 -PT = -AAD = -CT = -Tag = 4c0f29d963f0ed68dccf34496cf43d00 - -Count = 11 -Key = 40650cdb61e3e19a1a98fb4e05377d35 -IV = 69f0a81aaf6bb8486282f1b9 -PT = -AAD = -CT = -Tag = 2657e12dec21c3ecf071af6179529fb4 - -Count = 12 -Key = 1e89a6cd7528cce1e2b2b5f7fd2b6b52 -IV = e11fd427a782d543f78efc60 -PT = -AAD = -CT = -Tag = eeedff874c8edeea53e8be2a13afd81b - -Count = 13 -Key = 2a7ad6146676057db777dea4683d0d45 -IV = ed721ea67456d4594aafbd51 -PT = -AAD = -CT = -Tag = ee3cab5778888439d90fa718b75738ad - -Count = 14 -Key = a364f494a4cd0147c34731074dc1a85b -IV = 4aa8470dd404e4054b30093a -PT = -AAD = -CT = -Tag = d8a7bba3a451902e3adc01060c3c91a7 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 77be63708971c4e240d1cb79e8d77feb -IV = e0e00f19fed7ba0136a797f3 -PT = -AAD = 7a43ec1d9c0a5a78a0b16533a6213cab -CT = -Tag = 209fcc8d3675ed938e9c7166709dd946 - -Count = 1 -Key = 7680c5d3ca6154758e510f4d25b98820 -IV = f8f105f9c3df4965780321f8 -PT = -AAD = c94c410194c765e3dcc7964379758ed3 -CT = -Tag = 94dca8edfcf90bb74b153c8d48a17930 - -Count = 2 -Key = a82bb1edc7c01a3689006f34bfed783e -IV = 963836b67b188becf9ba1411 -PT = -AAD = 9d115bb9bbd119fb777b6316065a9ac8 -CT = -Tag = c491889fa3eca4544ba0d51b8e0f3837 - -Count = 3 -Key = b9782d0a5986c63f352d3bc4c7ecc96d -IV = 4541e15b92edea44eceb1f2a -PT = -AAD = f1a9f0723429c5b26185ac3ea7e13d7a -CT = -Tag = 74d0d36949f0276670f9ddc579e94f3a - -Count = 4 -Key = 59b95785b30f205679fc4f3f9a90102f -IV = 1908787cc1e1880a6ef5dd17 -PT = -AAD = 39852d3182944a5177db277b63910702 -CT = -Tag = 8f9a96c013992485b43e2b62745ad173 - -Count = 5 -Key = 34dd7926ab13d4078160d87de2e3c724 -IV = c11ccdaf798ab03af2d97ef9 -PT = -AAD = af698717a6d790b3bfc39195857bb5ff -CT = -Tag = 48116050bbd9118270d0be252d29d5d4 - -Count = 6 -Key = 8ec86fab55aaab0e77455e9cd3dbc78e -IV = 15fd90a9867e14f0d63b53b9 -PT = -AAD = e7509e276209a6d3ecfabb53ccdcd236 -CT = -Tag = d96d6ac0d309cebedeba2af9f262132f - -Count = 7 -Key = 66b2473d9e0121666d47633f7008eb1c -IV = c1716c68a24d57770b867e51 -PT = -AAD = c20f686317d67e53dd79bae5c46dc111 -CT = -Tag = 9a08616809cf15247dfeb9756ba4f609 - -Count = 8 -Key = 5b262a9d00904d30a2587caade091381 -IV = f7bc154ca562e8f2c1845598 -PT = -AAD = 23112d078c9914fa3dfe5218cd191016 -CT = -Tag = 98854d193a06dbe32ce4497eec5c9a8b - -Count = 9 -Key = 2e4fb9cc320188a6f1fa89a7a252273a -IV = 7a6d4ee69c7256c14fba8f5e -PT = -AAD = 80ba4a202a68c3590d6557912c6f878e -CT = -Tag = 9280313273befb8afa0bceca5a966d85 - -Count = 10 -Key = 5ea94973d8616dafa7f31db0716d1729 -IV = a05b62669d250e61b077d28a -PT = -AAD = 9620baf2f58d013f8a4c4871989c1b17 -CT = -Tag = 7e550398dee728256d6928cdaac43b73 - -Count = 11 -Key = 910385f6f07f9e57e483c47dd5206bcc -IV = 518f56e33658df311d42d9fe -PT = -AAD = 5d157909a2a4607117e77da0e4493b88 -CT = -Tag = a7041ea4a1d74d9e66b9571b59b6a1d8 - -Count = 12 -Key = cab3af7a15b430e034e793bb30db8ab2 -IV = 963a56e2e12f387062e18498 -PT = -AAD = a094a1dd1121d3aa52c81e8f10bf9f0c -CT = -Tag = 1a31d295601eb3c82a54b234984ffdf5 - -Count = 13 -Key = 89c949e9c804af014d5604b39459f2c8 -IV = d1b104c815bf1e94e28c8f16 -PT = -AAD = 82adcd638d3fa9d9f3e84100d61e0777 -CT = -Tag = 88db9d62172ed043aa10f16d227dc41b - -Count = 14 -Key = a4d994c4ac5ac0f02913245714fbe235 -IV = a9472dadcca8d7e0e3b8084d -PT = -AAD = eb318b9e17575203dd29ebed20ec82f9 -CT = -Tag = 323df7f33694106f56739de0973216a3 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = 2fb45e5b8f993a2bfebc4b15b533e0b4 -IV = 5b05755f984d2b90f94b8027 -PT = -AAD = e85491b2202caf1d7dce03b97e09331c32473941 -CT = -Tag = c75b7832b2a2d9bd827412b6ef5769db - -Count = 1 -Key = 952117048f77e276c2ef6580537c1403 -IV = 070b8fb46a7ad52885be1b26 -PT = -AAD = 34b088f982818b5f07dabe2b62f9547f4ed09912 -CT = -Tag = bedd4cf30fd7a4abc49bdcc3f3b248b1 - -Count = 2 -Key = 7f6453b39bde018560a16a2704217543 -IV = 0f3eecf48d68353226a77fe4 -PT = -AAD = 11e4ecb256ebff56453fa2e75e43eb9d641049e6 -CT = -Tag = b512623a12d5492b7d76d39be0df5777 - -Count = 3 -Key = 9332e433bf6100c6cc23b08710627c40 -IV = aab3db3015b29d24f329beb4 -PT = -AAD = bd843a08f0a822f8f4f76c3648380aab7622e719 -CT = -Tag = e54f1d18c61d8be15484727605b5a5dc - -Count = 4 -Key = 5773750a493096a99d84c0563fc293e9 -IV = c390ed70dc9497234413ad52 -PT = -AAD = 6012517258716c1f0035efa60a0f36b5c65e7379 -CT = -Tag = b011b264610e58082705476f040b8c86 - -Count = 5 -Key = 41b0d0fce5d31359cfd5db4064e2d46b -IV = b903e9d0cea25795a82e73e3 -PT = -AAD = 4cba501876f33e1fda9cd456e3180683e3863bd9 -CT = -Tag = 18bc39d0b95cf059cd8c25004f5e507c - -Count = 6 -Key = 4748b782e3fe5e4effeb7c67232d2b07 -IV = c5e4dcf18f86076b88a5d5e9 -PT = -AAD = 3b2fcad8739ed87e1d02e80845f120e249ea92b1 -CT = -Tag = b8ae718e2879c9cb658d5d1122e69bb7 - -Count = 7 -Key = e30cc22077d5951216d07f37c51b58f9 -IV = fc583ad159b52e0b6378157e -PT = -AAD = c3cb7be8888ef44ca5aa93dde26d2751288e1f5a -CT = -Tag = a8ce25b5dc8f84e2f5dae5f085aaccd4 - -Count = 8 -Key = 7c8b10ba75ee6ab4a997d3f598b79d40 -IV = 6fb55188ddf00dde09596587 -PT = -AAD = 2ddc0acf9705f8d18f905b8f9d472e7dbf6b91e3 -CT = -Tag = 5791d3805109c5e18adff4e80906a018 - -Count = 9 -Key = 72c7db6ca29f83641c3fff5b71c4bc30 -IV = f2000742e249ac56d5b2f65f -PT = -AAD = cd994d2d08232770927d854ef2b6ca2f087370cf -CT = -Tag = a5966df39feeba0336f0b9a3f4ffe6c3 - -Count = 10 -Key = 2833cc10195030e4a1155532666cb049 -IV = ad802b9a5c9409fa3e7dcfcc -PT = -AAD = b3ecbea2797d006c07b8ce621be3b0eccd37c3ec -CT = -Tag = 81deab8bdee0d391495eed4029a6d205 - -Count = 11 -Key = d8985bb5ac0258adad86660ebbc6d19f -IV = b5ee26f8c463bbfc27115b0a -PT = -AAD = 613f51f832fbf434b8e3fe9454ae46a862d831f0 -CT = -Tag = fe9f0b1bdc68dee6e8dc2ce12665d336 - -Count = 12 -Key = 9b8f6924dc22f1073c1a38448a2f0447 -IV = 09cdabf87d82828eca1c0c7f -PT = -AAD = 69210e4e0a1cfd5038756652790b9a8cfbbd943d -CT = -Tag = a60c104a6fb4638427a88a86c04923bd - -Count = 13 -Key = 72132213d5d95309bf7e10f8318d7c20 -IV = fb90bf283c5411230355d7a1 -PT = -AAD = a30bb17c8089c6f5f61b250a94cbbbfdf5f2a3e6 -CT = -Tag = 09191af418949fe6be8dbf13e006527a - -Count = 14 -Key = 652ffbad4e1fcbe75564395e6c1c3924 -IV = 111349636d106fd5f6a1e088 -PT = -AAD = 5f52aa85dc3ac042647e32ada050d67e59b519aa -CT = -Tag = 28d980d7bfd878c227c140de3482765b - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 99e3e8793e686e571d8285c564f75e2b -IV = c2dd0ab868da6aa8ad9c0d23 -PT = -AAD = b668e42d4e444ca8b23cfdd95a9fedd5178aa521144890b093733cf5cf22526c5917ee476541809ac6867a8c399309fc -CT = -Tag = 3f4fba100eaf1f34b0baadaae9995d85 - -Count = 1 -Key = f8e29efd00a423c4ea9456863f83c54f -IV = 2d3cf67cbce69d639bd1c092 -PT = -AAD = 02c70fc8a2544619c1c3e9fce6b3c6c3bc24643e0f140e6b48ac505ea666cd9a2010c3a8e2f5f10437887fe803b54db3 -CT = -Tag = 963cb50aca3e09dd0d9a013c8734155f - -Count = 2 -Key = 00e3491dfcf3bec39c89ccfd80a5a896 -IV = 29f6ff4edc4ac3e97ffb1680 -PT = -AAD = 73813351b39f5e4000a9ee8d2b85f131634acaede0dd25d691a2b829ad4fe9ea699f12242519847cb083b0b4d3d8b3bc -CT = -Tag = 01b2e9ba719ad77c753b364ecc5aabeb - -Count = 3 -Key = 0ad06f4c19af1d5f602b38f86e56291c -IV = 0b235c6a75cecdfcba9001ce -PT = -AAD = 7d4f26f7895b2ef3da2e4f93e411cdb74025c7759c038d872344a45ce56d92a581862c3bace039090a2ccfa43b623dcb -CT = -Tag = b4bc9ce1475d0c93dfd5a5d8d45bd8e5 - -Count = 4 -Key = eeeb33e0c8a406ea236a075cdbe9d6f9 -IV = b935e8eed66227836ede189a -PT = -AAD = 9a4291acb9924bba4241b0c9c3c2e1262b25a7c7f02c92adeadf92254d618ab59388aa30b47eafa58899c357cf281e31 -CT = -Tag = 143d6954eb6fe70aff70da978ccd4509 - -Count = 5 -Key = 600b5442a0b550a38f85d2fb0acc9c96 -IV = 5e65dd6e8b20d6b2931fe6c2 -PT = -AAD = 461e54a092f8392466849fb0370ae30c14c1bf3987ab2ebbe98e18d13f041d09d043f7aea78bfcc42f864a9fb40f0031 -CT = -Tag = 2cd626f9a0686300cf23c0bc597c63b4 - -Count = 6 -Key = ce8d1103100fa290f953fbb439efdee4 -IV = 4874c6f8082366fc7e49b933 -PT = -AAD = d69d033c32029789263c689e11ff7e9e8eefc48ddbc4e10eeae1c9edbb44f04e7cc6471501eadda3940ab433d0a8c210 -CT = -Tag = a5964b77af0b8aecd844d6adec8b7b1c - -Count = 7 -Key = ae7114c09ffa04298834412f6a8de453 -IV = f380c2d860be2af41e1be5c6 -PT = -AAD = 7e16082f689c63e8adddd5cb2da610bbfb88d073cf8b204384a937aab0376523a50d3d5f1392978f79609f12df8fc288 -CT = -Tag = 40d3a36358a6f6caaa6af92cfd874a22 - -Count = 8 -Key = d8f520b6f3cf6b835ce4cce48f4cb033 -IV = 019a55c98615c022afff9644 -PT = -AAD = c3fb518ddb2d73417e243359a0ed8c126750eb163e7bd845637159397075e3db1db72fe2f0e13b599c333c473feb2245 -CT = -Tag = 467cfad5af11852d6eca289c86f967ad - -Count = 9 -Key = 13ba95606b01af035bf961e39852e34b -IV = 9ec9cf3b002cfed9e761934f -PT = -AAD = bb9de563836d1f1b1de964514ecebb8ad10501db562280b7bd98804814735817908b2856cafadecd40b04832fbde2bfb -CT = -Tag = 172a3bcbc5001dfd3815175a88f7056c - -Count = 10 -Key = 1c97da5fc5a9640f289622842408cba2 -IV = 6d765a988e934588163e29b7 -PT = -AAD = 1026a590816d2e1aa67aa0d13d50a8413af4d8ee9b1fa5ceb8deacc9f41e8e764b3ac15f98295e8800adf6a7175448cd -CT = -Tag = 4945a79d5edbb934c5cf94395c359deb - -Count = 11 -Key = 8dd46f271a201cc21ca0823248157e6b -IV = 1821b310ce2dba999cdf7576 -PT = -AAD = 34ba409997ceba065f4a5457078a9e232a84f594011aecfdbfbd24a802ca129e01cb1327e265b4a9004fb4c5003fffd3 -CT = -Tag = 304cc2cd2fcdd4abc844bc9c1cbe0241 - -Count = 12 -Key = 0c545d95333b6acf8b2928f3efd083de -IV = 31de89d07e7577956fa95ef3 -PT = -AAD = 5574d65f5afffb2d31cca8f58cf5945b83553cd45d2dba0e05fa54e42aa3f5a051e1624de16d4b93cbab7988c6d95f8c -CT = -Tag = 4ed91cfe90a49900e0565697bc82b659 - -Count = 13 -Key = 790b39f301383a82b377f585d3bf0f26 -IV = 2fd9c142b5fc62e87efff1fd -PT = -AAD = 45634e0afc59ae9f6e30f7f5fe43cf5a4e1f78d0aebb9e5a7ad9d86f25278e521f4845d49d6cb533cac6439839647fd0 -CT = -Tag = 69637c3f9233da23f8df7b09e8cfb252 - -Count = 14 -Key = 8f63652632d07b2a4a83c26dedd32657 -IV = 747bee0e1d462a9016f1468d -PT = -AAD = 9c00ff969b55a497dc523fa0cedaa339dc3c6ce18e61c7bf800c361201351bc49728c3bb15067e906162ee791b8d333a -CT = -Tag = bd5a0cbf859a6133a7f2d504d97cae05 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 0] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 20b5b6b854e187b058a84d57bc1538b6 -IV = 94c1935afc061cbf254b936f -PT = -AAD = ca418e71dbf810038174eaa3719b3fcb80531c7110ad9192d105eeaafa15b819ac005668752b344ed1b22faf77048baf03dbddb3b47d6b00e95c4f005e0cc9b7627ccafd3f21b3312aa8d91d3fa0893fe5bff7d44ca46f23afe0 -CT = -Tag = b37286ebaf4a54e0ffc2a1deafc9f6db - -Count = 1 -Key = 7aa53188a9c597126a10d248603ebb62 -IV = aa45ca5dac41a825c45d36bf -PT = -AAD = 417fd5147d56de0c74329597824ec2788a344fb60b403edf0187afa12e72a05009bb70f83ccad11efa487c1965cf84feac067c1ffdbf531fca97c554f875c4a1a1d3ab3c53c8a74ef3ee9415a87e231699c82d764debeda18132 -CT = -Tag = 997bf84654bb9616c0cc9b45f82c7673 - -Count = 2 -Key = 72b5848ed1d2badbd427e16fc3b3e44d -IV = a84c7e928dc6e6379a513a20 -PT = -AAD = 1c0dfcecbd7bb0e680ce042d08b2d9a741267bd1da768df2ba08379233a9973f14928e9da6353768b9b2601c033fd964b16a16daaa3ea35ad7cef7e31eb1f7340aa34e8bfc08b0a6e6205292570ced43316876d0d499d9192e6b -CT = -Tag = 270cd786b95e6820cdb65a231b7530ed - -Count = 3 -Key = 6d0512ebf2e73d63f42849c57f073fd0 -IV = c1c46927c74c03f19342c33a -PT = -AAD = 28bf8903b2dfb7e69f1a735121c7efe9a4c42b6a295327bceb0246c85d782ce62bf075dbdf6e8ec6589c26d30696ccceef03870bd0abfd26d30600eafc65613740b54d777d379e8aacf241ecfba11b060186ac065db171aab099 -CT = -Tag = a686f5941ceb510e126a6316e3404dc0 - -Count = 4 -Key = 6438bc79520def5db58e49639774687a -IV = d682b47418ceb5bc09c713c2 -PT = -AAD = d252b164ae559ed155c8417b96652529df151f24ccf1ce98d0c7ddf293f4f1236630a19b24dc23978d3377a099065d0ba71d4bb8a7dc0cb76760ca7c4a0e12c8cb56c6102646323c08c4f4f56226fd5b71a84590913ad20da287 -CT = -Tag = 04e78796dbf42e9ffa6bb9e346581f13 - -Count = 5 -Key = 117a0aa592fff17ae36c94917db16c65 -IV = c3537be6029d54ffefab2730 -PT = -AAD = 29e959b96817547ae06bf85fe164e82a2693f82a7aeb66d535f0d2c3bffd1ba18e94ef457939f0c0733eda4738d136380fc876075c4943220237a5929b01b32da2bc2a6afd6ae1d89fd470093835962ff6708bb39ba365202f56 -CT = -Tag = b87fcc4d5c484e68ea52c01b55ffa438 - -Count = 6 -Key = 5d995a338ed60f8ab0b59da6c9a40c52 -IV = 2723c54e31c5c57f0236e816 -PT = -AAD = 239c80683feb6afd38f8759a27cb5f350fbc2f757838c40858c9d08f699cc56c4236f4a77bd80df0e8e41d5f9ba732db2e0a3a5e952ede7bfdd5fcbebd23d07271134db5b82461537c47e2ca51b348b0830f5ee575ad4b4414dc -CT = -Tag = 94356a3bfaf07f2ef0ebe3a507076b16 - -Count = 7 -Key = c8a863a1ebaf10c0fc0e80df12444e6e -IV = c3e8cdf086827fee7095d0ea -PT = -AAD = 9927da88c5d336256699c76845e946dc53c87bf0e11e4bec9450981602b32010d2b52bfc91283a6329d455598998ede2e61e352e553110154b4da5ce668d664b83f671c010bf220b7d32b34f4ca69b66cc87233d792337cb2bff -CT = -Tag = 098837de27707ea3593e31ceb8276732 - -Count = 8 -Key = 69cc28b161f214a580e6ba4bc2e3de9d -IV = f2a566f9cf83fd280c8fe08e -PT = -AAD = f8c5263a4e06b49e184589a1e071978643c353aa27b4817fe39e45abc442e22ab5d683bcee5dbbd589fa583f171bb59536addd2b6cefd49823413005efb2a665e26a6029c927d3891cb0d4f23e8ccc60cfd02ce8978c451ddc11 -CT = -Tag = c9c806cb8b1a889809695c2ec5a7a86e - -Count = 9 -Key = bbf35920fcab2cedaafdf3f00321f544 -IV = 2c7ee3ff1df84f3650bc9298 -PT = -AAD = a75f50ba9a50f48799594b6195b3125ed92df73144bfcb624ce67323d834ba1afaf0df4c6c022c11d48bd75c86675a5927ac1250030f720f97498d4fe0787bae655dc5537ac1bcac198a893f9af7c2ef9b971dd64f7e7b62603e -CT = -Tag = c7cd3f938f4ab18642d86234edfc17ed - -Count = 10 -Key = 9690de669702ba72aeb934f5ac50e03c -IV = da8713fe2b2058c438aff260 -PT = -AAD = f30ee950da37c7224b5c93e9a29cafdbf8e2070f65c226244b1a683459e0c5c11c9b77c8fc286d4298a5b9cd1fee3e13d4690a88780d35b558b5d9e52b1a67fc8857076691dca7f5fe8ef22065cc5d9c003ffd25ebe23e61440e -CT = -Tag = 7f92914518ddbe842b06771f64c40f59 - -Count = 11 -Key = e5d8c6e2ac6935c85e81ee0ef723eacf -IV = c73140ee90cc1dcf88457da2 -PT = -AAD = f6c267a6ae5ce3cf4bcdf59cfd1f777c66133e0ec4772785f33e5fa800d310b24b5773bc603a76b30fc32328a8e40f02f823a813a9e4b4fac726e992c183bd0815111c1d3a35884a4eff32027ba60dba679b469af31bc50c0591 -CT = -Tag = f938fd0d8c148d81765109df66dac9aa - -Count = 12 -Key = e23458f6b304c2d8feb3dedd3741bc24 -IV = 4619036b50ba012fe50be1d7 -PT = -AAD = 74bfdc6bc4bfc38d666b985cfe043c67798b2db98f149268dba24436cab83e9a91f244ffc5748c93f8df339ae24ba4318c50da011ab368d3167c16e503309b01351a11f14d067cc6769b9989c7d952e3315011ee2ea034db8cb8 -CT = -Tag = 6053ab80c746821ec50c97e5a1424a85 - -Count = 13 -Key = 5372ac5d3b08d860919110bdeb7f31df -IV = 06ca979d8c250d9b7be45573 -PT = -AAD = e1f958834e63c75c8c758bafaa2f257ea5689d0d55b877b4d67b8b73c25ce24e9b094b976db920a159968da9d33c511aa8999aba42b8bb886e6545dd108693150af357496bb5898b4e8f725d50ef474afb836a3358da2217bb93 -CT = -Tag = 9338e14fe0b08a969a104c828528a6a4 - -Count = 14 -Key = bf1cb49e980cec0b153fe3573875ac6c -IV = 5426669d25524036fbe81e89 -PT = -AAD = b336949766e9948a7e6f36a2d377b84a25c4b4988794f3deab7af4b14a12dac641e25fe2ae9ff53450ace1513acd0b284a490b455f04f40af94418c8792ec1a0983fb1d9a31d93dc3ed2c75e6a6ce092111eabad039bac2a49f6 -CT = -Tag = e2996a2b3b6bf52217cfc4d0f5bb351b - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 7fddb57453c241d03efbed3ac44e371c -IV = ee283a3fc75575e33efd4887 -PT = d5de42b461646c255c87bd2962d3b9a2 -AAD = -CT = 2ccda4a5415cb91e135c2a0f78c9b2fd -Tag = b36d1df9b9d5e596f83e8b7f52971cb3 - -Count = 1 -Key = ab72c77b97cb5fe9a382d9fe81ffdbed -IV = 54cc7dc2c37ec006bcc6d1da -PT = 007c5e5b3e59df24a7c355584fc1518d -AAD = -CT = 0e1bde206a07a9c2c1b65300f8c64997 -Tag = 2b4401346697138c7a4891ee59867d0c - -Count = 2 -Key = 77b0a58a1e60541e5ea3d4d42007940e -IV = ae7a27904d95fe800e83b345 -PT = 6931a3ea07a9e95207334f0274a454dd -AAD = -CT = 76e39fad4000a07d35d879b785bd7fca -Tag = 5cb3724712f129f86b7927f13b45c835 - -Count = 3 -Key = caaa3f6fd31822ed2d2125f225b0169f -IV = 7f6d9041483e8c1412fa552a -PT = 84c907b11ae3b79fc4451d1bf17f4a99 -AAD = -CT = fdb4aafa3519d3c055be8b347764ea33 -Tag = 89e43bfead01692c4ebe656586e3fbe3 - -Count = 4 -Key = 02c8e81debc563e99cd262bfc64b0e11 -IV = b49057c9778d8c02fe00d029 -PT = ca2a51e9d05e96e6f1d14ced36811c5c -AAD = -CT = 5db602fb31bb9268d233bee0dd6b87ae -Tag = 789d2be2cc70b7c389b31912e1c0a041 - -Count = 5 -Key = 4e625a3edc61f0cb2f002da8f8a70245 -IV = 66d632dd5ca10b08d4d8f97b -PT = 0b76d498add6e09c96d7694e5d620bd5 -AAD = -CT = 17bdc7ef5649bec9cf6c565ce33cf889 -Tag = 3f7944bad062605f937ff6d6598a7651 - -Count = 6 -Key = 41ab3fc488f8d4a820e65b9d41a87de3 -IV = 9b5d27d75a0571e93f581885 -PT = 5ed0836e0a52777599800d4fe754ccbe -AAD = -CT = 88c0eb8c33a10a22e7561866566b191f -Tag = 83e885802a594a8b008a94aa7ef06907 - -Count = 7 -Key = 0047184240a5948ed55701eac2c4c26c -IV = a3ab8da22648c2453cdef55b -PT = 89ee9502871be15ee4a8c47ab123bfc9 -AAD = -CT = 8b5cb59e7ad2e15c40d5fbcde28a0d17 -Tag = 538e79f880e2f65c72148f5ade4080a1 - -Count = 8 -Key = 735c5a4ff2438852df3530c23590ac28 -IV = 7bee7c6938f1ae59671e2ddb -PT = 479e8d3bf0de4ce7cd4377d2ed3925cd -AAD = -CT = 2ca09b58178fbbfb82556599b92329a3 -Tag = 2e3cf2895f111ec2a86508c36a24e45d - -Count = 9 -Key = 016dbb38daa76dfe7da384ebf1240364 -IV = 0793ef3ada782f78c98affe3 -PT = 4b34a9ec5763524b191d5616c547f6b7 -AAD = -CT = 609aa3f4541bc0fe9931daad2ee15d0c -Tag = 33afec59c45baf689a5e1b13ae423619 - -Count = 10 -Key = 2d176607883aface75011d14818f1be6 -IV = 02162c3635bf6d543e1cc148 -PT = 71905ad5df601d056effd80dd7333662 -AAD = -CT = 1b68598e1676d2cfd37aa00396fa9676 -Tag = 5d060aa8a729774da001aa9fdef2b3d2 - -Count = 11 -Key = 94fd0269a0ce813133626f93c4af7e6f -IV = 11fc3928028dfa34db06a1bc -PT = a1aefec976cd87cf8a4c21bbe902f7b4 -AAD = -CT = b1baf8c58cdec88238b1b0ab0b40337d -Tag = 882f865df7da529f768d4944e8387f69 - -Count = 12 -Key = a7bec5e24f0db2629a257d02fdfaea02 -IV = 9d2ec94b927327793583b818 -PT = a17bc5d428700f94c641e74aaacf2c5d -AAD = -CT = d460fda5b24425b5caa8176c8c67b3a9 -Tag = 0df724340b8ca56e8dea6bbeb4b55c35 - -Count = 13 -Key = 39d945a00e05d70a16e61334d2010209 -IV = 1f931448e9013ec4ec61af0c -PT = 9dd90ebfc054da214cbb30db7f75c692 -AAD = -CT = e4cb765408697cf85917a7a9264086e4 -Tag = fe9a1fe7a58d66e3b922693a163c1ff4 - -Count = 14 -Key = 6620ca65f72de7b865de731928a4723e -IV = e6428b6b77e9b6993b809aef -PT = 7044f7c27d776f6a7d43abea35908de4 -AAD = -CT = a1c5634a07d05ca909dba87bf02228e4 -Tag = d8b40a60a65237337db05b045de8074c - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = c939cc13397c1d37de6ae0e1cb7c423c -IV = b3d8cc017cbb89b39e0f67e2 -PT = c3b3c41f113a31b73d9a5cd432103069 -AAD = 24825602bd12a984e0092d3e448eda5f -CT = 93fe7d9e9bfd10348a5606e5cafa7354 -Tag = 0032a1dc85f1c9786925a2e71d8272dd - -Count = 1 -Key = 599eb65e6b2a2a7fcc40e51c4f6e3257 -IV = d407301cfa29af8525981c17 -PT = a6c9e0f248f07a3046ece12125666921 -AAD = 10e72efe048648d40139477a2016f8ce -CT = 1be9359a543fd7ec3c4bc6f3c9395e89 -Tag = e2e9c07d4c3c10a6137ca433da42f9a8 - -Count = 2 -Key = 2d265491712fe6d7087a5545852f4f44 -IV = c59868b8701fbf88e6343262 -PT = 301873be69f05a84f22408aa0862d19a -AAD = 67105634ac9fbf849970dc416de7ad30 -CT = 98b03c77a67831bcf16b1dd96c324e1c -Tag = 39152e26bdc4d17e8c00493fa0be92f2 - -Count = 3 -Key = 1fd1e536a1c39c75fd583bc8e3372029 -IV = 281f2552f8c34fb9b3ec85aa -PT = f801e0839619d2c1465f0245869360da -AAD = bf12a140d86727f67b860bcf6f34e55f -CT = 35371f2779f4140dfdb1afe79d563ed9 -Tag = cc2b0b0f1f8b3db5dc1b41ce73f5c221 - -Count = 4 -Key = 7b0345f6dcf469ecf9b17efa39de5359 -IV = b15d6fcde5e6cf1fa99ba145 -PT = 822ae01a0372b6aa46c2e5bf19db92f2 -AAD = 72e9cb26885154d4629e7bc91279bb19 -CT = 382e440694b0c93be8dd438e37635194 -Tag = 2fa042bff9a9cd35e343b520017841bb - -Count = 5 -Key = 9db91a40020cdb07f88769309a6ac40b -IV = f89e1b7e598cc2535a5c8659 -PT = f4a5003db4a4ebbc2fdb8c6756830391 -AAD = 70910598e7abd4f0503ecd9e21bdafb5 -CT = 40d7fc4ccc8147581f40655a07f23ee9 -Tag = 243331b48404859c66af4d7b2ee44109 - -Count = 6 -Key = e2f483989b349efb59ae0a7cadc74b7a -IV = 3338343f9b97ebb784e75027 -PT = 14d80ad66e8f5f2e6c43c3109e023a93 -AAD = 8b12987e600ff58df54f1f5e62e59e61 -CT = 43c2d68384d486e9788950bbb8cd8fd1 -Tag = 47d7e9144ff0ed4aa3300a944a007882 - -Count = 7 -Key = 5c1155084cc0ede76b3bc22e9f7574ef -IV = 9549e4ba69a61cad7856efc1 -PT = d1448fa852b84408e2dad8381f363de7 -AAD = e98e9d9c618e46fef32660976f854ee3 -CT = f78b60ca125218493bea1c50a2e12ef4 -Tag = d72da7f5c6cf0bca7242c71835809449 - -Count = 8 -Key = 2352503740a4e1b22dcc9c002f53bd11 -IV = 474ecccc3182e03c80a7be74 -PT = dc1c35bc78b985f2d2b1a13ce635dd69 -AAD = a1bc98dacec4b6aa7fee6dfa0802f21a -CT = 3f6f4daf6d07743b9bd2a069d3710834 -Tag = b9c2b319adbd743f5e4ffd44304a1b5f - -Count = 9 -Key = fc1f971b514a167865341b828a4295d6 -IV = 8851ea68d20ce0beff1e3a98 -PT = 2fec17b1a9570f6651bbe9a657d82bce -AAD = ece8d5f63aebda80ebde4b750637f654 -CT = 2d27e5fa08e218f02b2e36dfad87a50e -Tag = eb9966774c588a31b71c4d8daa495e9e - -Count = 10 -Key = 00ef3c6762be3fbab38154d902ff43b5 -IV = c3c1c3079cda49a75a53b3cc -PT = be425e008e9b0c083b19a2d945c2ede9 -AAD = 714fa1d6904187b3c5c08a30dffc86e8 -CT = c961a1758dcf91e539658372db18968e -Tag = eaf9bda9b3322f501f7329cb61c1c428 - -Count = 11 -Key = 2d70b9569943cc49cdef8495bdb6f0e6 -IV = b401d0f50880a6211fde9d9c -PT = 47a87a387944f739bd3cb03e0e8be499 -AAD = 592e7276bda066327f2b3cd8cc39f571 -CT = c1b2af4d273231e71e7e066c206bf567 -Tag = c68d8d3cf8b89e6b15f623d60fef60bd - -Count = 12 -Key = 775cb7f8dc73f04fe4f9d22126bb7b57 -IV = 81ceb17deee19b8153ff927c -PT = 8242c6c0eed6d5d1ab69cd11dbe361d0 -AAD = 97e07cd65065d1edc863192de98bc62c -CT = 580f063ab1a4801d279e4ee773200abe -Tag = 29e4d7e054a6b0a4e01133573fbe632b - -Count = 13 -Key = 58ba3cb7c0a0cf5775002bf3b112d051 -IV = bb923c93ddca303ab131238d -PT = 6b93d2d92de05b53769ec398ab8097dc -AAD = 0898ea55c0ca0594806e2dc78be15c27 -CT = d0564006b1897bf21922fef4f6386fd4 -Tag = 3a92f3c9e3ae6b0c69dcb8868d4de27c - -Count = 14 -Key = 955b761de8e98f37acb41259fa308442 -IV = a103db8a0825e606b70427fc -PT = d18344c86caffc4237d2daae47817b13 -AAD = c2d0d8b77a6fd03ced080e0f89de8a4b -CT = 065d228c1289007a682aa847a36b6f30 -Tag = fb367f47922d67c84bf47aabb2b98421 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = d4a22488f8dd1d5c6c19a7d6ca17964c -IV = f3d5837f22ac1a0425e0d1d5 -PT = 7b43016a16896497fb457be6d2a54122 -AAD = f1c5d424b83f96c6ad8cb28ca0d20e475e023b5a -CT = c2bd67eef5e95cac27e3b06e3031d0a8 -Tag = f23eacf9d1cdf8737726c58648826e9c - -Count = 1 -Key = e8899345e4d89b76f7695ddf2a24bb3c -IV = 9dfaeb5d73372ceb06ca7bbe -PT = c2807e403e9babf645268c92bc9d1de6 -AAD = fed0b45a9a7b07c6da5474907f5890e317e74a42 -CT = 8e44bf07454255aa9e36eb34cdfd0036 -Tag = 2f501e5249aa595a53e1985e90346a22 - -Count = 2 -Key = c1629d6320b9da80a23c81be53f0ef57 -IV = b8615f6ffa30668947556cd8 -PT = 65771ab52532c9cdfcb3a9eb7b8193df -AAD = 5f2955e4301852a70684f978f89e7a61531f0861 -CT = c2a72d693181c819f69b42b52088d3a2 -Tag = cadaee305d8bb6d70259a6503280d99a - -Count = 3 -Key = 196ed78281bb7543d60e68cca2aaa941 -IV = 6e7d2c8f135715532a075c50 -PT = 15b42e7ea21a8ad5dcd7a9bba0253d44 -AAD = d6fc98c632d2e2641041ff7384d92a8358ae9abe -CT = 06e5cc81c2d022cb2b5de5a881c62d09 -Tag = 28e8cad3346ce583d5eebaa796e50974 - -Count = 4 -Key = 55fe8a1bdc6806ed2f4a84891db943a0 -IV = af4d0ba0a90f1e713d71ae94 -PT = 81315972f0b1aeaa005363e9eca09d7a -AAD = 677cd4e6c0a67913085dba4cc2a778b894e174ad -CT = c47bcb27c5a8d9beb19fee38b90861b7 -Tag = e061ee4868edf2d969e875b8685ca8a9 - -Count = 5 -Key = 6d86a855508657f804091be2290a17e0 -IV = 65dce18a4461afd83f1480f5 -PT = 0423bd1c8aea943637c7c3b0ca61d54b -AAD = e0ef8f0e1f442a2c090568d2af336ec59f57c896 -CT = 53505d449369c9bcd8a138740ea6602e -Tag = 86f928b4532825af9cac3820234afe73 - -Count = 6 -Key = 66bd7b5dfd0aaaed8bb8890eee9b9c9a -IV = 6e92bf7e8fd0fb932451fdf2 -PT = 8005865c8794b79612447f5ef33397d0 -AAD = 60459c681bda631ece1aacca4a7b1b369c56d2bb -CT = 83b99253de05625aa8e68490bb368bb9 -Tag = 65d444b02a23e854a85423217562d07f - -Count = 7 -Key = e7e825707c5b7ccf6cfc009dd134f166 -IV = dd0c7a9c68d14e073f16a7a0 -PT = 88b1b11e47dfe2f81096c360cf1e30e7 -AAD = 11c69ed187f165160683e7f0103038b77512460b -CT = 550fa499a7cb4783c1957288a5cc557f -Tag = 5d2c2f71a2e6ad9b3001bdbf04690093 - -Count = 8 -Key = 92591b15e28ce471316c575f3963103a -IV = 2c30d215e5c950f1fe9184f6 -PT = dc8842b3c146678627600742126ea714 -AAD = 46e1bd5fa646e4605e2fbec700fa592a714bc7ef -CT = a541d3d8f079bfe053ba8835e02b349d -Tag = d322a924bf44809cb8cfe8c4b972a307 - -Count = 9 -Key = 74f08353d4139ddad46691da888ee897 -IV = e2619217dc8b093e2c7c5b78 -PT = 1690d6c8f95ef5ac35c56e3129717b44 -AAD = 92277cf78abe24720ce219bba3a7a339a2e011b2 -CT = b413557c0df29e3072bb1b326e2002dc -Tag = 3bb6273687ec6a3f4a0366f1b54bd318 - -Count = 10 -Key = 5c951cd038a3c65cd65325bfdde86964 -IV = 3bf5623fd1155f1036ea893f -PT = b609ec6673e394176dd982b981a5436b -AAD = dc34014513fd0eede8e9ca44a16e400a5f89cdd0 -CT = 009cf623e57a3129626a30489b730607 -Tag = 1d202825db813c0fc521c284dd543fff - -Count = 11 -Key = 72301c093ba804671c44a6bf52839d9c -IV = 87cc7e6579cc92822f5744f6 -PT = d59bbae4ff3e3755c0a61a9b6d3e234c -AAD = f461946c4feba79c18366555d85311248d269c87 -CT = ee743d29dcbaa084fda91eb48b3be961 -Tag = 07934a5372d41928f2ee7d4bb8c18982 - -Count = 12 -Key = 39b4f826b520830941b3b1bcd57e41d5 -IV = ca32ac523fe7dfefe415cba1 -PT = aa2b7a6c918ed6715441d046858b525f -AAD = c586cd939b27821695b4ee4dd799fb0e3449a80e -CT = 8b64f5ea9a8cb521c66df9c74d4b7ecd -Tag = 3db56a792b67ac6d0c4001e17f446111 - -Count = 13 -Key = 79449e5f670d55ee2d91ca994a267a8c -IV = c779da00d672811d8a5124f1 -PT = 767e120debd8a1dc8d2db8b7f4750741 -AAD = 54780846dc3df77c8d90c9f2decb0738da36fbda -CT = eb864412add08abb4f89d72d412d0085 -Tag = 494a547f617840267d3fed5280e3eb30 - -Count = 14 -Key = cc90c2f37f970f97ac97e3e3b88e8ae3 -IV = 67bcc08f223f12107e4d9122 -PT = b0fe0dcdcd526017f551da1f73ef9fe1 -AAD = 065acdc19233af4be7c067744aabab024c677c5e -CT = 501cda2c954f830e8922c3d7405b5ee1 -Tag = 9deee5d0e4778a9f770367f19c74daef - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 89850dd398e1f1e28443a33d40162664 -IV = e462c58482fe8264aeeb7231 -PT = 2805cdefb3ef6cc35cd1f169f98da81a -AAD = d74e99d1bdaa712864eec422ac507bddbe2b0d4633cd3dff29ce5059b49fe868526c59a2a3a604457bc2afea866e7606 -CT = ba80e244b7fc9025cd031d0f63677e06 -Tag = d84a8c3eac57d1bb0e890a8f461d1065 - -Count = 1 -Key = cdb850da94d3b56563897c5961ef3ad8 -IV = 841587b7174fb38fb7b3626e -PT = c16837cb486c04bd30dcae4bcd0bc098 -AAD = de33e6d20c14796484293dff48caffc784367f4bd7b957512ec026c0abc4a39217af0db35be154c45833b97a0b6454df -CT = f41a9ba9ff296ebdbe3fdd8b1c27dcdb -Tag = 506cc2136c15238b0f24f61b520fb5e6 - -Count = 2 -Key = 45551710464a9ea105a30e056167cfb0 -IV = 5727688c9e74bcd23c14a345 -PT = 6adeaaa151b58c337471653c99affbdc -AAD = 3eebcdc5c5e9970b3fca94bd0d28ead70d1f36a94f27780472bc3cc9ff39dd7b7e3a76ebce967d6ae5724ad904dc5548 -CT = ec18f1d675dd056baeb374829ce45a33 -Tag = 378bdc4c34753a1284b654af049b853a - -Count = 3 -Key = c8650e8695396b84a3fdeea8f95c8215 -IV = 5a1c26d3848910137df9f76c -PT = 88aecd97435d97e2dff8763f640a5640 -AAD = 3dace39b7284ea2786a6bc670ced1c7cc0c28c4ae4e7494a6d834eb09260b68898b914d5a6b0b5334eff9669f233aeb8 -CT = 49a9398c70a89c0e43ce7a7bd7a90c58 -Tag = 8509ef5fa8046a48a5f081e5215db2eb - -Count = 4 -Key = 76470ff92aaeeeb24172b823fce630b1 -IV = c70088e92633688bebe3265b -PT = ff4f74af151c292a0b35ba7049c9a5ad -AAD = a262fc02a3d0db113493d4179cc9ec806825f20f5864bb105c6116ea72f0284950ecc8a05dc548023853a657b67ce01e -CT = 2404868e6bfee5ffe6ec851785618aab -Tag = b338a9ccf10d45dfd4e0ccb8a87b3c1a - -Count = 5 -Key = 247b0330aa35a8a855142f933d182581 -IV = 6df7990b60e41f1fac5f283f -PT = fa979c20be9f7f7e802fd5ca55c14618 -AAD = 0cec69d6f6532bf781f5b0fe70e33e1cd68f8b2019aa73951baf978bc1141b51083a8e5c785c994b12ffeca01b6c94f4 -CT = ca4b66a09606caae8a100ce994da9452 -Tag = 534188f439b929183d21109d962145ea - -Count = 6 -Key = 1ea5cdfe206130596b655bc6fb935fad -IV = 0ec93072e726ec58352d5a90 -PT = 1ac044b5f8b693fa236986ad1621edd8 -AAD = d9da4741fda4821eb391a23f7f6b377bed923260b6f8c8ac9bbca4edef1bc2a48a45c8676cb598a668e28fe1103efa23 -CT = 33d387a3b73a590bfd78320ddad8c169 -Tag = ef36d6c01b5a54bf06ba218aa237fa54 - -Count = 7 -Key = d5a707d2e3163fbd9fba2f12e8dd980c -IV = 4a4ed3d33e5a1dd6befdb382 -PT = 639331ff4efaadc93e92e58de9e886ee -AAD = f5392e014cbe2d33cd0a0497cf0398883338748491a8543991990f9958e4a827e190e6f5ce89baac5f3bef91dcb5858b -CT = c986c4c805092a51103176b56507dd95 -Tag = 5da4fe4e281e995d0c75587b4945ca85 - -Count = 8 -Key = 3d2c604398c247e3ae7d90cc1e11f6cf -IV = 5dfafa52cbb52f57ac304381 -PT = 9c12cb73902608e7b2ea30da7397b66a -AAD = 53e050b559308705376a23ee2b22b7642f06ab77a00259bf7bf28cf6665912af4b8901f8af76e982a8bcbafe5ea1aaf6 -CT = 7fe6b5a881c8a6b8e3e29f1a3819383b -Tag = c528fddf8166a5c0ec3f0295b2c3d7a6 - -Count = 9 -Key = a335f0577c876e61d94522d526159f57 -IV = 6ea85a74513f664a907fef80 -PT = db38cf3bb14825a6c11ac978fb516647 -AAD = 038af270aece9687e34c55ec30494e9f72b6a90ac43280a9b8e958353d8c02a83ed163c6924b7201759615779cd5661e -CT = 7e81df8bf0b671e89a639d6432d44952 -Tag = 2180e6c8fe8fbb3394f9dfdc1c439d80 - -Count = 10 -Key = afb3ab51cf05e0cfa2ccc2c3c8f4b67f -IV = 26a5d1667feae062c14663bc -PT = 26821b2fe21c26d20843af266fce1f16 -AAD = 130b15bde79749d0577bff6c98ab50f035abae041b0d5f666db27c262c0ed2a801c24feffcfe248cf3af5afcb6b0dd1a -CT = c5317ad695606124662453dbfb96a26d -Tag = 2ace2fa75daa31fe4f2020cea9e71ec6 - -Count = 11 -Key = 0b4d033bf0182bb06f8b9714d525ee74 -IV = f0807dcca355aa339febada2 -PT = 7c90709d6ea3e586bbf11913bb2b5261 -AAD = 9cb373a8b7cc61eb382dfe1ea17d78877e9366207c3a5161a1f34b75ac503dc20e4af9d9962b7d4fb0f39ac9666c660c -CT = bfdde06e311240348f04277504fd75fb -Tag = 1dc5898c49e2dab4ae1a599547a76ab1 - -Count = 12 -Key = d32b7c3cb327780d1422116c40470ab0 -IV = fcc79573051011685ee0d9e1 -PT = f015f4ab3bc159db9cf6b4bb6750db46 -AAD = cdaae988d8bf01e24a4baf489893ee329b7d0dcfdef684fe3e382b200cbd5a7ea3e46be281b0c6cc00417d67f4d3db02 -CT = 48bec210f66942f877993e9486a678e7 -Tag = e4a3821709626cc3006c805a75f067cc - -Count = 13 -Key = 086a0cdd8d520a8a695d17e869e03efc -IV = f0a463c0d1e28633da98b1e2 -PT = ad6fbcf714ab893455eddb3c5fb406dc -AAD = aa7ebac61f7e0b9da0d941e801730a393b2728476dfd065e2f6ef4b343bc2ba6e17c59a2e5381597948a73ff25493f8e -CT = f0b1a368b832ed35d54c80067a06a2ae -Tag = e3c80910db9ce1f3ad2519fe1ee2dfd7 - -Count = 14 -Key = e47e1e3a95627418ed659452a3c92d45 -IV = 78adcf3f732dd3787cb5490b -PT = 801efcab1e329a536a7b506c4a7509ec -AAD = 41913a6c5c4dddae06f3c0f68e8ece139ca902fe340a820e7c40d895b35e8f4cba7809c7eed0b2b7ad45c6d152ec3053 -CT = 6751a4a5e0cc3c0f46cb5540937efde8 -Tag = 7b07d21a4cbadeedcadce817d9ab81be - -[Keylen = 128] -[IVlen = 96] -[PTlen = 128] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = bd7c5c63b7542b56a00ebe71336a1588 -IV = 87721f23ba9c3c8ea5571abc -PT = de15ddbb1e202161e8a79af6a55ac6f3 -AAD = a6ec8075a0d3370eb7598918f3b93e48444751624997b899a87fa6a9939f844e008aa8b70e9f4c3b1a19d3286bf543e7127bfecba1ad17a5ec53fccc26faecacc4c75369498eaa7d706aef634d0009279b11e4ba6c993e5e9ed9 -CT = 41eb28c0fee4d762de972361c863bc80 -Tag = 9cb567220d0b252eb97bff46e4b00ff8 - -Count = 1 -Key = 11f47551416154006bf89e7594ea2082 -IV = d546fcd3ff2a6a17461e9e94 -PT = d3783a3d7a1e091f9cb647bf45604457 -AAD = 49efdce48e821eb14eca5f1dd661f8b6b9a5a6917b08ec9486c29124ef1e7a9af2217494eecad3d8eef9fc22d29ce18d92006de1588c3b06f8db9fe809bede40908cef4f46d2c4b6f92ff5a8304362749143dab266de45bf5b4a -CT = e97988a6645b93a32e8296bb1dbcb8f9 -Tag = 399345f974a82a2a75007c84aa08dc1a - -Count = 2 -Key = 0736a1f074919dfe23bf2a828eac2b26 -IV = 5b2105166bcb15efc07f1c03 -PT = 402b5b45dbbef7f1d955423e95cda404 -AAD = f331a6f6d31de69f116b27fcd7f914aa0b2c3a09490360e7863417a2346030cc99b6ba389e65e0f10fe0815d383e6f98dd8bb97d29908560ce98e4bf177e42e14a7137cfd30b7dcb4d8655b3c03514e95adf698645584475865a -CT = 6e9e79e29f3085183e0a7ac7f6ba1d67 -Tag = 84434e0c82b858ec27e61c54ecf6cd94 - -Count = 3 -Key = a3929d753fe45a6f326a85bb9f1e777f -IV = aed85f89844f061113004d2c -PT = f024e796f449712b70d5c7fe5be5fe14 -AAD = ecef72a7ae9e6bd15e63c8e9fb2a3a7c53eb9a88bc05296ff6f25544f681fff5289a099d38abb68316eed8215ead9ca0462065bee79fdb63b4405384053fdc68fe4124a883f50a2b4bc4df6e29383c2ceea424e4ac539b26c9ce -CT = 349e770a7f7dc2fb41fa089bf723f6b6 -Tag = 26f12bc8777d724fe59ad4fe2b9757f4 - -Count = 4 -Key = 85abd6c7b90314b29bbd293ff113637e -IV = f48f4ed2eb7b7aaeb017ee72 -PT = 542c6fa7e7cdaf21e6f6b34517f26ab5 -AAD = 2b825d477eb96e0d8d787ee4f284eca567fb5214b47e26705389cf9fce4b8dbc49a152df5e4accb0adaa19b37c90fe7d6eb456a067f1c2b63b61f6d596209f7ee96c85aa48f1870e9338743edff1d8ffb61dbdab88b6755fa135 -CT = 8374f96f03780724a8e8d1f11768d44f -Tag = b41b53c46ae76eff505cfee47a8daaa3 - -Count = 5 -Key = 0a2f29710feb7c86175a37c41e32fadd -IV = b190fdb91061a08ef82100b8 -PT = dfb6284ffd6cc195ed75db0c9faf5559 -AAD = 0af4d5c1ec517a1fc104aea7d513b591b603634fc558007e06d6cd22997407eb8281a742aef6e88ba08f10c64b423121d898bcd04c1f1d6c7c12d673aa1abb004a8525f1d7abc23c8724885179e292c0565a39d9f5c6d2369e37 -CT = fb6cb6527b92dc2ef6a227e8067879aa -Tag = e01037f6e9d62c18b163a714f85a92cc - -Count = 6 -Key = 470d577137c5014b78137dc6b24efa6d -IV = 4afa7f5766f8345a1b12042b -PT = 4745cb9a3ee3a76ae166dad5a1b62b1c -AAD = cfdd5d42e0d0127a1c0d3c4bad302ef23ab63d879fad71109f4792e5b21156dafdcec022fc323028a9fbcafe0c3606ed61b582bfa00ba6e5c9a1b13b976d67c14c79905a769399d967b0dd45f0e74967b67d7bb67d9466618fa1 -CT = ca58ced863696bf80ae0191de1252333 -Tag = 246d451faab88511467e38b60c5b46c7 - -Count = 7 -Key = 5cf9cfa4d367752f1354037e132bc948 -IV = 13e6a286a6c7b189974d7ea3 -PT = c7ef33e7abc8f298b2f224cf5218661d -AAD = 65da4dbd6cef7fc8a09a766a6f5b474e9711a2d40faf841c467a8838e5c8cada3f1cca74ed3b4cdda6d5d334c91763e798b9c7891b291dbf46d89ddc728d72f93c95e081bc340448519aeccc6d105bf1696b7ff9c0b7c006444c -CT = ad88f4e7b980be05b3df0fc05a49d1eb -Tag = 0ad15378f18f4338966e8e17951d8dad - -Count = 8 -Key = d1dafd9e07ab0f903a9b00d6e353d67f -IV = 8a96a0fe88f0c7e3077c38f4 -PT = bbe4ccbd26522d35ca0d483341385e2b -AAD = d3e1ecd06f79e6839767d957c4d715b4228f4cbca7afa429d860c5db2a6bf4a3ade2d00b91875fedbf9b09e9ee5e69182f326fb36fcc35475efb32e5eada3a6fa6046c8d0c0ee933b0e7f37c87b3eb8b9c0c2b457f8695d25875 -CT = 9d016cd94933c07c10b92af40eafac7d -Tag = 022e2dd58ac862962e7fa0536bad87cb - -Count = 9 -Key = da5236b254ee2ff5d7e73d7a09574177 -IV = d2d91f5c302212557fd62bce -PT = 3aaa2a7b2605686c3444bb16df8c57a5 -AAD = 9ddfa05290e228e5eceb7e96de3a097afaa96d8d3e0d5ffc0e0116f43814f5b0947919267c2dbf0e5f52a97296e7826f2891dd4a043c845046c9ab9ae8327346c7695a72875b9062dd5578be8985edf9faa4917981aacc6f112f -CT = 202a8e67d7f22ff83757fc9ef9b20a0f -Tag = a55bab242a4ebe73b52cc7202f5cdd57 - -Count = 10 -Key = c3e577da2a2b7fdd05c99dc6fc81ccdd -IV = dfa747b08f536915345766f0 -PT = b863120426d4cbd5c73124c7b0342fa7 -AAD = 872a6d0e3a0a3b32f4c92a4e5baf7efb7270a9ab9cfcd3c1173a2fcb2c155a923f9d8b8e35a965b11d15e2e0cc591e953da81c172b8882344cff7b40eeaa30d4793900dd85cb65fbeae9d1d3b2a62c66cb932dac1e6806ab6150 -CT = 43da888047cb1cfc7dd42329310c8234 -Tag = f8267635aa7b51b89c80fa979861eb3f - -Count = 11 -Key = 69e1c0917ca8d49aa69f38cf9c66eb4d -IV = 0c55672336d219e64c60e15d -PT = 7dac3e31269dd79399c94798f4bbc640 -AAD = c1b423f27d794e947bc56aace3995065279221f5b8bef6568b5b2882209bf0dd7776e9ae6eb1a1eda0b768aeaaed9e3884cc3968b6d179e9e5abf08df8261c3ee54f8b0eaf2646cb221288a879c5ea4e9183805dc1da8a636a58 -CT = 37d215a13362bf087bcba8f95901eb05 -Tag = 1b3eecb7ae9386dbc1409e70f5827f58 - -Count = 12 -Key = 08818d516558631161e49eebd621f78d -IV = f1f855eb8aeccc9ddf7aa80e -PT = 1a89c9c9623a26b7c8062c5f6a5f7f98 -AAD = 68fedf6a42b780eeb011aa0b242636668e5c8941d6045b05c948f82c5db3977831435ab4049895b607e854f710e3d8b7a26afaa2e7913093313e93c3e106a8356d6c44579398ce4341aacb3b726e7f42fab75934920df230cb4b -CT = 9e12e3842ff7f5c25a171cc4c5a3dfa8 -Tag = 01cd4980d92df6739bedf22201a2cc12 - -Count = 13 -Key = bfa4a12b357605b11e65fa92b90d22fc -IV = 9aeb721b698db40dc9080e23 -PT = 9383358a4065f3e365924f7fa664012b -AAD = 53bc66164811866e12ebcd64447c999777378119a257fe00d45b5c9392d5618f2c2c784696f5a9fea85d0f8c9cb5438b15b3f5661d49e0b0980ff61aeee0cdf650ab4fa82bcb0d0390f99daf02d8561bf5bca5627e3b194951ae -CT = df469d986744c33244682184912cdd68 -Tag = 8c12f8338ffb7840e085fdedaa6ab3cc - -Count = 14 -Key = e16a57c83f230c368a0f599a7ebf3f5e -IV = 2631b811ea57cb7d58fa232a -PT = 2a37e380f575e4365116fe89a58ee8dc -AAD = d5bc101ad26f7d03999eac122f4e060f20a402ff8a2a0324a77754e1eb8b7a65f78743ac2ee34b5429ec9fd6120fe6d17e71f738cebf0ae39a5be5a4dde85384d98cd90d218785b08daa662f24187156118fba981b9691cf12f8 -CT = 9278d1eab07dc7fa68742059d9fdbe60 -Tag = 27a474294ff811db4f6e0c88b1a86b0c - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = fe9bb47deb3a61e423c2231841cfd1fb -IV = 4d328eb776f500a2f7fb47aa -PT = f1cc3818e421876bb6b8bbd6c9 -AAD = -CT = b88c5c1977b35b517b0aeae967 -Tag = 43fd4727fe5cdb4b5b42818dea7ef8c9 - -Count = 1 -Key = 6703df3701a7f54911ca72e24dca046a -IV = 12823ab601c350ea4bc2488c -PT = 793cd125b0b84a043e3ac67717 -AAD = -CT = b2051c80014f42f08735a7b0cd -Tag = 38e6bcd29962e5f2c13626b85a877101 - -Count = 2 -Key = 5bd7362f38bafd33ff4068860eb35c27 -IV = 6064368166c48633b090cb9a -PT = 634852a6b68543ead889aa19ef -AAD = -CT = 3a44f911376c371e6d597539d3 -Tag = 452b67e9d36a9ec5a893272b4d2f2103 - -Count = 3 -Key = 2591360228dd945aae8fba95dc2725c5 -IV = 2adabc15c16e5c5954c8ab01 -PT = c580b051600dd902b273e26677 -AAD = -CT = 9ac66aa93d7547bc0a45baf5ac -Tag = a609413c9c13817287f39cfcf4da2e6e - -Count = 4 -Key = 3c85f64e35953f2caded63f987592611 -IV = 7ad13cb40e21ee633251968f -PT = 7bddb4037c2be00f4ef6f85ccd -AAD = -CT = 9c2030e3e19e490c309610d889 -Tag = b0e4080a8dae54a6770f4e21d5324e90 - -Count = 5 -Key = 7b8d32382d29c00198f1d41fc6b52b8c -IV = bd65d7281a9a6aa9fc268f61 -PT = 10f27dabb9c9e9facbd21b13cd -AAD = -CT = 707efbd54aabbecc22ee6b5304 -Tag = ca35f5dea869508653ce556c9c05d32e - -Count = 6 -Key = dd95a8ca25883353aff5c414ad9ac5c0 -IV = be2ed3a4d38fa65cf341e5ee -PT = 5b0c29c8bef219d52932b33041 -AAD = -CT = 4918ace25961fae06dbd891d16 -Tag = ae6f069accfacba61a38323dd65f4c02 - -Count = 7 -Key = 4db01983f6ad9e39385070b810c26c80 -IV = 2342dc3fb660e3925509b6ed -PT = 5cef6c4f05073ae39e05356dc5 -AAD = -CT = 12e41f4373f1e5dcfcf758e2c8 -Tag = 36fe1b8981946fd16cf12ad80f04d59e - -Count = 8 -Key = 8d59f931d4cf8a2683e269008ee86062 -IV = 7ac862a09c3408b667e8cd38 -PT = 2c47413a8256f25677b1de8ef1 -AAD = -CT = 284ff4dfe4255f56b4a56585a7 -Tag = 16c0a4a5826e291d4b3f7ead6892c392 - -Count = 9 -Key = 01c681e2cf1d7c8484c3811201376187 -IV = 56a8f48a3198b977f5064d02 -PT = 37dc0f572c9e51c6fc18642d7f -AAD = -CT = 54922c65023605c1eba146d448 -Tag = dddbf654030e73be0dd6d26b67efd0e6 - -Count = 10 -Key = dae6cfda8979801d9399006797a2366b -IV = 1cb41dac13ffa72e72a405d0 -PT = 9f43ac53d4cec80dd29a902d86 -AAD = -CT = e156a5f0711096cadd489937a7 -Tag = dfa2d2a342b78ac6e7276365f2fa6dc0 - -Count = 11 -Key = 5146ebe3d1fdf166ffa4099b638c5b64 -IV = 10014449817d881328c2b882 -PT = 700af6989527eb16ffab6634d2 -AAD = -CT = 8ab35c288f09084da3c0cbd240 -Tag = eec8232f2907b2e1cb2c940622530d25 - -Count = 12 -Key = cd70f86fc0a1780740fefef5742e4398 -IV = c2abd119f22d310b34f41c5c -PT = 39fb497a2691264f02fcba4887 -AAD = -CT = 01339a3a9119836f6b038a1a50 -Tag = e45a0a12c84ebaaf1885f457507b9a5e - -Count = 13 -Key = 8828454ceefd9004e30ae8a03d71f9d1 -IV = 8d9e3c61aa687a8f2b9ee30a -PT = a94b020f4724178a3f4f9137c5 -AAD = -CT = c4a94f89e03305aa415c7b350c -Tag = 1acc1c75b9fc826af2e950cc7be6cf64 - -Count = 14 -Key = 47982f133cb72342dd642f3475bde634 -IV = 8304304acea2def778f2bf9e -PT = 2c97a5fb6df85153a5c3bf414c -AAD = -CT = 37e0962960edcf0a09a8538cac -Tag = 07459fa438e1f159a6649a8ed6f934b8 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = dfefde23c6122bf0370ab5890e804b73 -IV = 92d6a8029990670f16de79e2 -PT = 64260a8c287de978e96c7521d0 -AAD = a2b16d78251de6c191ce350e5c5ef242 -CT = bf78de948a847c173649d4b4d0 -Tag = 9da3829968cdc50794d1c30d41cd4515 - -Count = 1 -Key = 3016620015db1d85eef09bbce50ae294 -IV = eb481db3a52201173e2d4ad7 -PT = 38b57c0d4151d7ee57e032829f -AAD = fa3d95b81a619638cea3f68dfbc02133 -CT = 7738601ab14748223164d1f69d -Tag = 63ca9e8c27d9fa837ca4a0bb7039e390 - -Count = 2 -Key = b3ba382909e94ef5d318ee32cb54a33e -IV = 3cf10b1700711486119cfd9e -PT = 4a90ad3f97c9c7e82efcbb318b -AAD = d1e17c0189b04561699bd2f791d69491 -CT = bdf6a8a11288e83126932cd946 -Tag = ca7ff7458c3adf388eef7e0e32d6b2c4 - -Count = 3 -Key = 0a8fc9e07eb50b092cd9fccb3db2373e -IV = 371d0af80bb20f2ead09dc22 -PT = 7826bf01e962a201f5c8e7f742 -AAD = 9f42976847531ddfe428694f61260b2a -CT = 665cdb3e2568ee1157d877dd25 -Tag = c66fc129ecb30ea0d54b6d6932d9d7a8 - -Count = 4 -Key = 3d1fc93233e86cb882e4cd754df63754 -IV = 1ede8cadc78bb4733c341bac -PT = 74232bfedc377efd5a63ab77cc -AAD = 5807c856944fee1e6c2e70ad9a08de00 -CT = ff3e09311d59bf1f3dff474fd4 -Tag = 7dbaf75ab6084504e080460ebfd255af - -Count = 5 -Key = 936ba9fc715c6e2d70a7986b14b82ce6 -IV = 45b3239d045bd56ea5a0e77f -PT = 941255369704ec192bab1cf039 -AAD = a2570d9548bd6c05f824577871784ee4 -CT = b3ead079446053a8206f4a37a6 -Tag = fa5d98f053e8520f45e1597ee38b3751 - -Count = 6 -Key = 96a05889a7591c1918472fd26977451a -IV = 7d80492afefce80da6689ffc -PT = b09b2dc5c5463a03dd5c9b0ecf -AAD = f4ffa36a478c795e0d28d37fa9e6fcc2 -CT = f7cb053d447dddcb6e3a2d891f -Tag = 2a38f63a1b7cdccec426683b34a44ff5 - -Count = 7 -Key = 7c98567fb5ae9601fca412e72dc9fe2f -IV = 1218ce69073eefd25a7944e6 -PT = 0df75d39d8facc3accbdefc87c -AAD = df4203c3402d2b328bcb44e7683e08ab -CT = 7e5ca0d1c1ff83bc3633f2301c -Tag = 7ea717458ca93d8844da5df7ef74005a - -Count = 8 -Key = 4e1b199c12f12b591c051c7edc608d11 -IV = a4bd3af7f35d0fa21f73641e -PT = 051ed5d700a7e59990f0358928 -AAD = dae2cd749195bcfb67a663789e85995e -CT = ae50359f104ba2089ae98eb45a -Tag = c08a7cce7c38626604032d2be9bd519c - -Count = 9 -Key = 9491cb5d4f2b94cc5a50dc67bfedd074 -IV = 8377399607418e8d51dac5ea -PT = 2a1e50ccb5a52be3d338e8f0a6 -AAD = 972d9c486961334afc104765c2863253 -CT = afe759b51318f67d872a1dfdae -Tag = 77a4493aed7e3a6e014d0a1a314c3f86 - -Count = 10 -Key = 0993571183089c4a7bd8e8789854c265 -IV = d72ce6db33b33e2a2d430d2e -PT = daf7f3ec2e2592c65847734f40 -AAD = e47252d2a8ef5190faf328176588609b -CT = c6fadec0c7520f717144f0104a -Tag = 6670c8cbf7e9eb431e899f61acccf456 - -Count = 11 -Key = d45b6c85293d609310eb3179cfbac4fb -IV = b02328302cc469cda1c7eb48 -PT = 70f5af8c1da987f6ab5dea31de -AAD = 74ca5b46ab31a11b4b4c253666844b32 -CT = da6b359072accf5f036c85600d -Tag = d8e496c53797b124e356967ee525c0ca - -Count = 12 -Key = 9326155a9b81013c1edb143f9f5ae9d2 -IV = c95383eb3050ebea4deb80e9 -PT = aa80cbebfb01b035a4e1e50e35 -AAD = 64a73f0497746436ac94c3c18e1ef6e1 -CT = 45ec8de633c7bb585c0a7fea1f -Tag = 537b6103b0f7c5dce82bfa37c2734877 - -Count = 13 -Key = 9192ce4d383752e9d9c66b93ef7f05ab -IV = adabd3baa4374697c53b4289 -PT = c55b5d16e3cee22bad1f5420ba -AAD = 14cad0cb1736ccde73f86897ea017570 -CT = 3aa22a57646229fd33bbfae6ce -Tag = 5ce7cd439823538fbc194886348ff029 - -Count = 14 -Key = 3dd104297e803dc22b8f11f1951c8508 -IV = 8abd1fd8cd88ef848e8ce082 -PT = e1eb53704ccd5d7992f1c91097 -AAD = 96f6c82aa93ccca47056efc3ac971613 -CT = 8e4125514870003f0b0e8044a8 -Tag = d951047cd8d50ca5f7ffdebf78725c56 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = fe0121f42e599f88ff02a985403e19bb -IV = 3bb9eb7724cbe1943d43de21 -PT = fd331ca8646091c29f21e5f0a1 -AAD = 2662d895035b6519f3510eae0faa3900ad23cfdf -CT = 59fe29b07b0de8d869efbbd9b4 -Tag = d24c3e9c1c73c0af1097e26061c857de - -Count = 1 -Key = 544ec82f837fbe561f371b266cc52ed5 -IV = b756952a0e98cf4cb024a499 -PT = a2e81f78b8e3e39e6cdf2f2982 -AAD = cd0a24fd0f6a693a1578b9dfd2a212e990aa662b -CT = a4f08997e2d93c3c622137f9a8 -Tag = 059cf266240236fd3f41a3f4fabb36bf - -Count = 2 -Key = 91b73e2061b02b1e5e4c150ce1df4d27 -IV = 8b15597c84db62e2d8b03857 -PT = 21e1b4b405050408b08e5e2a97 -AAD = eba7f1a060e81f4ae7a77346d74dae9263ec284c -CT = 0f819b25fc683c182533503ad8 -Tag = 5a1da6290fef801f2131614f7cd2d0bf - -Count = 3 -Key = e6a1e4260efb2bb3073a1ab475e901b9 -IV = be445fbabc3866d702965b08 -PT = 2897d77c7f20679cbf27181aca -AAD = 9452137225de644f94556b382ac13915e8261913 -CT = d56e2d6d52923205291fffa50a -Tag = a6acf19c5434f95e333827ed9c7b88ec - -Count = 4 -Key = 49c18bed9412346a8ef02351cd4680d6 -IV = 7b5a7e9beec5b627f78bfd1d -PT = bafe851c800f6df67e941fb496 -AAD = 251b9e935d72c1ed05795c74c88b6d4a03bd729b -CT = 6f0c2eeb0a37d51d78314c3414 -Tag = 1a75d962d34205d60f79e4de87381046 - -Count = 5 -Key = ed0334239eb6f1ee1d686df163d219b7 -IV = 6146338e40fcd8bf264bc83b -PT = 954ddf553bf66473657110a028 -AAD = cdba8eb5713075497eb5abf1434045a010f81832 -CT = 3eb76dfd40c5ebc840951d1b28 -Tag = 5d5aa1dc4a663eeb847e540f9a468155 - -Count = 6 -Key = 14ab4d3a91e8f8320edba5b045b9474a -IV = 83c6ac97704afdd24fbe3eba -PT = de5f1521ce9423526932917863 -AAD = e3981ea2e7468973a6a998deb7676d06630bad47 -CT = 19936ae7d6620899649a5c7887 -Tag = 66a805353bde0b1315f772d49eeaf8f2 - -Count = 7 -Key = f822c39eaba3ebb3d8b58cff3845ac59 -IV = 1f5d11c469e9fb74f19d8581 -PT = c0fac87ca518ab22853c8fa02b -AAD = b33871f65233bb2ba773cd8fedb517179a2a24a5 -CT = a072381956210925148e3bc55d -Tag = f716ec012f7f9be988a9e450da7aa2fe - -Count = 8 -Key = c566e9995c03a777f9999446382ef2fc -IV = 4f343477387f48b9c6d15e69 -PT = a9eafd8903c71862c7c99cf068 -AAD = c2b73bf0d1abd6d484df725a760f184bc315e0ba -CT = 9f9551a3ad017c3fa518964704 -Tag = 15383fb8ace2e001c194474031c14e87 - -Count = 9 -Key = fa2fe01b7cb4ca24aba5880da268398a -IV = 93f19d0a8edf1f29364743f2 -PT = 006c3b0681f21ad705cf94d070 -AAD = e80f337eb56c336d1e928db3b7eeee968e2f75bd -CT = a73b314c7f0bbd79ee56bd77bb -Tag = d2f9ecc80a5ae2e1d2735b9fbf01be25 - -Count = 10 -Key = 77b34970d4300069e0092cd64ad17305 -IV = d88e76814f3cf7a2f887e371 -PT = 4e65a46a4579f08130272e5c83 -AAD = 7c772010e83befec22f6aebe8e18a0437f50a573 -CT = d2d8ffd3f841e6039f1d551905 -Tag = ee2c73c455081d84a631b18a7fe5f789 - -Count = 11 -Key = 3c1c2aae3954d6f645ce2a697a4f3af8 -IV = 04b54f6447ebbcfbda57445a -PT = f73e226b50a75558a389ccd738 -AAD = e7a9d5c8328278311dca3e84da2bf0f573198d4f -CT = 770e4b798b91850ec4e90136ca -Tag = 8cb9ce2c90417f1c49a235de9b2ada2d - -Count = 12 -Key = 15ca2910df4e43c44a7c01d485b99157 -IV = 4a65ca77dde14bbf131dd597 -PT = 786744b394e40bfe5db938c0ad -AAD = f9011e2cfb9c82d37f6b3f2af730a2e28c036f2c -CT = 43c00fac7c11c3273078f09fe2 -Tag = 955beaa87737d3094bacc42a15986d83 - -Count = 13 -Key = 998990fe4a9a6c56efdf1deac41a1ef5 -IV = 1b7a766436f4a674b5ed86ab -PT = e53a9954c3943691dee5b17991 -AAD = 2eba6f2c61704917434507f4a2db16c4906bb4e5 -CT = e5682045f438f4a96ac870690b -Tag = 1afddc03809e565321ea66d8c83a324a - -Count = 14 -Key = 268ba76816d00e20997da268bd8faa18 -IV = 21cd5d21ed193612fd6db854 -PT = 16339986d092027e7cbece0fb6 -AAD = 1971b90da0554ee7b6b0a5e9a782f05d511c1b99 -CT = 7cfd53b8c3c834c213d9860499 -Tag = 1f8522bfab97bec436d768332ae37c20 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = cbd3b8dbfcfb11ce345706e6cd73881a -IV = dc62bb68d0ec9a5d759d6741 -PT = 85f83bf598dfd55bc8bfde2a64 -AAD = 0944b661fe6294f3c92abb087ec1b259b032dc4e0c5f28681cbe6e63c2178f474326f35ad3ca80c28e3485e7e5b252c8 -CT = 206f6b3bb032dfecd39f8340b1 -Tag = 425a21b2ea90580c889134032b914bb5 - -Count = 1 -Key = a78f34cd0cac70aab64acae18e3cbeee -IV = 3c88570498da96e7b52c7929 -PT = bf61b1fb3b24506cc8c730d399 -AAD = 36b66ff81ec23a28944c98d2834cc764bb70703f0b26e079b6eb008ec11ccfb54a189ad393878f0824436ae69e7e2d8c -CT = f72057f873ad12b5e19ce433e0 -Tag = 1fea5b4176464b1f5dce11558a75ec21 - -Count = 2 -Key = 0e038a1368999e2e70b6e350e01684bd -IV = a58952b8135420cd0f61be18 -PT = 801bbabf908ff04d5856cadc2b -AAD = 765203b3d61537be2883fba9899c3f3eff60cb9714e54de3a78a96dbf29cf53d82112e19b10141f13b11627a8fa55026 -CT = 7f0f35cb15fb4e7e3820d9ab1f -Tag = 8dce643720d9d6f90f13a155e0be5936 - -Count = 3 -Key = b69d82e78b22a473af6234066b891778 -IV = 0415ab2f32d2a15006c3bdd5 -PT = d4ab346edaca5c84d45b45c6fe -AAD = f0be65105e1cd4fd1a272f7f6db958040b44edd0608b2225789cf34217cfcd6a5879b8e79dfa7d24345ad20f0c4f9a1c -CT = ad77c91c6ba6cb29eb5e4f6071 -Tag = f67061dbded1a8df55fe9fcd68f61168 - -Count = 4 -Key = 78faf937758f34b6d314e2fa30f60c2e -IV = 85c9ef0e17ebcbb7227ba4c1 -PT = 0ad91a8be4ccd6ee0ce75413a3 -AAD = 70fec6e608b6264228b822e7490e5e76398494c6489de5e839fb80513442cd0dfcf883000995185213e283f49234280b -CT = 4298d0a1ea4c54950021d91921 -Tag = 19893b83fd24a8c21bb4ff14612cdb27 - -Count = 5 -Key = f812627cb6dc5921d3567dd17f1f3b9a -IV = 37beb9c060f240d9ff78c844 -PT = dbce5235bccd0bc6249b30e9b1 -AAD = a27fd811330efa672bbfa1cb2a221fa45bab88c5183eed6383e34c7e7450fd577f6c783c75d9ecaf74bb2ad2b2e8c143 -CT = 100ab04960a762db73174666b4 -Tag = 122172ee3093b8cb238a7c991da3b94f - -Count = 6 -Key = a495f82751bf7781fee36d265607aa6b -IV = 729a513baf1ccd1c97311700 -PT = 0ac413fa533b01be459e95d784 -AAD = 3a44a7ea6d3ed13005d46c19f5ec7d2f7e50e8a268fc49e3c6fe15b41b6f6ea7245d88cb358e53cdba82cf297ea0ea97 -CT = d05f52a875f56d3a6971495b7b -Tag = 14ae378a5f75b386202194c677377803 - -Count = 7 -Key = 63eed2623c80ea1c5d06a0003c4b3065 -IV = 3a276f4361cc6d7bdb340986 -PT = 65067b281d5aafc0146d206fe2 -AAD = d484646fdca9f5d3d4fa2c85ed145f99e3c73f4d81f6c08eadf318694bd7cc94382cc73a5610f9cbfd9987dc167d670c -CT = 4cf2ff71e44a39eb6a9611e150 -Tag = 113e7d239946d784c331bccd5e098194 - -Count = 8 -Key = 3ad85304b4267dd603070c1a999eb658 -IV = 2a02a6220d395dc91fa0d220 -PT = e0620a9e28ad8dba32b601c662 -AAD = 7a1511cab8aa9f7277f7b26cdee602e4a608b5565a20eedd66d70507a90e79da6521cae1e2ca810771392567af51d883 -CT = cf38f7abaf4f92414ecb7021a8 -Tag = 8bebb0b62c81a4a3ae765dbc7c8747a8 - -Count = 9 -Key = 63010b75ada3ccd0c1338613d57e3f53 -IV = 9898b912da0a2f169c3bf907 -PT = fc10d85cb5485be263374aaadf -AAD = 565e1e581089098451ccaf1d594d1b4edbdcd5cb00ba4b2e08e4db780ce8258df41d01dbdd50521b75a72a8259f70321 -CT = 8f2390e88bc6f18ecdc1a1b9d2 -Tag = 15c40e98b6bd5b07d4757727ad6b7b71 - -Count = 10 -Key = d2a18188bb88312ec18916431b6dd880 -IV = aedf2efb80b633d7afbe5a51 -PT = 343f8363662077fb0ab50ba284 -AAD = 52492921f6b76e888baa5a4cb391af04faeb31bf00e8ed4363482fa95148f573b9adbebabf48d3ad33cb5ed3c0d6df61 -CT = 97a6f44a04055850779bc70842 -Tag = 5ffb75b58b4572366fb006455f692f93 - -Count = 11 -Key = 7b3b81fa87f6fc20795e5fe33fe0d1e8 -IV = b858127e11ea0d5ba523f7ce -PT = e574920cdba3524bac8c2294bf -AAD = c23d4cf74bd76adee0973e4b3ac31a96fdeb0f2455e044d2d1b82ebd1937e09623921c81b6a1b9698b5b097b7c5c483d -CT = 016a7b57db778fd019628016f6 -Tag = e8035022b05e4c10792321d195b75854 - -Count = 12 -Key = 852c34591e7ffef09259a9edf25020e1 -IV = 9e4243f5356d48f853cc3acb -PT = c991389c242c48e31a9ae00d59 -AAD = 8a4514a5e7d4e2e036490b541206bfe6471c14bb50af6fc869048bae954b5dd813429359ee5eef23ee42ea35e0c36bb8 -CT = 5c319983e5e276658f10a58edb -Tag = 5343086d4ac0e45e4adc6dc27d566296 - -Count = 13 -Key = b9840f1c04f7c9e9b2c9bec0c6176738 -IV = 7af462cc891270fe78566890 -PT = c9171685284b205bf4fd9d3f45 -AAD = 493ef83c18389c1e52050d2569f0d6f955cf8e76cf0a1697ffcb1665e285fe6e3595f456cff7f32feb7bde4cc82d4ebb -CT = 988c2c3df37c68fc8bc7a29b11 -Tag = d81b0bc3543fef4a929867bff63a1c17 - -Count = 14 -Key = 9449043071de904f5e6e7922b263f122 -IV = 39f0713e60cbc8e41e4d7328 -PT = 869a917e056f4460d6c2076d10 -AAD = 0b7a25e3e3027095772f3f8b8336813b607031eddd6f354a171e4b585504952cb51326c3edf4c48e41498da441cc090f -CT = cc878c8f760961e4ad08ad09a5 -Tag = c303c9680b673c049e9b7bec8c28428b - -[Keylen = 128] -[IVlen = 96] -[PTlen = 104] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = e5b1e7a94e9e1fda0873571eec713429 -IV = 5ddde829a81713346af8e5b7 -PT = 850069e5ed768b5dc9ed7ad485 -AAD = b0ce75da427fba93da6d3455b2b440a877599a6d8d6d2d66ee90b5cf9a33baaa8329a9ffaac290e8e33f2af2548c2a8a181b3d4d9f8fac860cc26b0d26b9cc53bc9f405afa73605ebeb376f2d1d7fcb065bab92f20f295556ade -CT = c211d9079d5562659db01e17d1 -Tag = 884893fb035d3d7237d47c363de62bb3 - -Count = 1 -Key = 1b96a8699f84058591f28590a5e63c0e -IV = d437b28673240ddc63d22d2b -PT = 802192b9c2d78e1df9ac223598 -AAD = 0f985a66d350c153a4882d0a4fc6e1b8b8450cd0825182358521b1be5fc734338af72a48170fde7512a8a92ac81d12e3a7fdcf7d98933732a9893d92d9435fcaee6033b726d28f73c5f76fd6b93d13bc8904d11cd4a713cd353f -CT = 8c13cded61d08c1f2db878378e -Tag = 43ee877c121d4a329e81e51d68a9d845 - -Count = 2 -Key = 94874b6f3738d963577553a19155f4fa -IV = 8e9f61edc853db24fb162062 -PT = ab5fa8933bf8b4b6eb8fd4a0f6 -AAD = d30b11456b68d89dfecc00930c5102cabdb207abadfc7e26286e822a14c6e723ea5492ef53cc2206dbe9860583e2fd2a8ed26fcf5dba8914cae4829ff83745bcf203c2c9729ec5f635d368f8697139b18f1c39ea4e3e849f4b3f -CT = e359459af9418493dd8af46d27 -Tag = 4dd94f3b128f34ddd4036886fa084506 - -Count = 3 -Key = 7434e4ec0aa26aa89f7a025b7cabee6b -IV = ed9fa99d2a22cb4fcb2d25ee -PT = fd53183688a51d4bcbe52f6d37 -AAD = ec9bad331852febf4ee1928c65d57df5eea95caf852fbb821c022978d33d07fec1ced606caed13624bb6d08a22da7e23e39298e10395b29d91a46220f64ca4d7d333d93ddec412322b67d5e101784e0a65088779b8c44f7cd05d -CT = 97f74cd6ff2ea7d43262fe6f19 -Tag = 7ed5bcf0ce0448fa661d0c0fbcd36578 - -Count = 4 -Key = 72a565d3b3b6814bea37db7f659ba1d2 -IV = 6f975cfb8f0973eba7cff602 -PT = 46a9956585a9c06507ec073e2c -AAD = bac017084cdd4c035a1917de4abc453e875d1ec9f7d603683cccdd64e6273eaf11619acbef407fed03ff3e76373132c5bd680f7645e4fcdb09ccc60ce65584f607a090426f660df5bf4daba95e7cfb3f30e4197218f8decf0dca -CT = a657482d12377846ebe3ca6f66 -Tag = 0f10964e776b25ae079b357e199c8cd0 - -Count = 5 -Key = a85a8e0f16c7af9e7f32c817611a0249 -IV = 12b4a1c1bed206c426c1d977 -PT = 4544079578dc90631c616a89cb -AAD = 40741eac93ba6f3b60fdf1ac1b17fa3dd70d1ad4755f5a6bbd59c9c5aa99bb65bf7e077e5863b1d0b93104dea7b8e455d7bc149668822dc788b46980b2b439c33e10cc7c17415529c942e9eaf33eaeb627bc4cffc35cae4d37c9 -CT = b0be95166bf557bae6152b360b -Tag = 46391f35d73901732a7b9c7eb976aed9 - -Count = 6 -Key = 96c837ca5294446d389a6f06cb42e737 -IV = b37ce0928e17982ef783b2b8 -PT = 8b77fe7aac6a70fcae1ee74157 -AAD = 8f67abbb7a9394821c7196349262c589d5e1c156d6126fb3da0562bf403e733508f1f1926d6c9045350cad3d1243504dc70aa17a4de748e4a1fd804ae262c8ad557adaf799466434266b91d2c083f96218473adfc9dd2e8c3700 -CT = d950ab8631a66c313d6801977d -Tag = 31e109753cbb651ed194369f00840323 - -Count = 7 -Key = fad699fe2dfb8a2b955708ff97b15892 -IV = 61d9979bb5dd655e826abf68 -PT = ca88d99b2c88b078a9878fcfde -AAD = 7c02b7f2e7be357843a86596d7ba3a87e922bb0a982c32a20e809491c6343cfee2ee92fa2b6f898ee5b77a9ec5719de356c5e7507b1cac49b06e6fd5311eb9cf7a0c42b5252ca90632296d12ff5316a56253cc6666fb4d0a38f2 -CT = bfa286323d4904de8cd21389c0 -Tag = cf3af80df6bde595d6b5a28d6b7112f1 - -Count = 8 -Key = ca83a1109cf5bfb7d24d6ba72c6c1a74 -IV = ee40762d9a5fcdb41438ce05 -PT = 53c7fa9eba69541113c1998c46 -AAD = f54c4418df498c782ed61ccba4e657c8de9032231fd6a98c718063600d96f0e5f17fa73b9492faa264b5b9706e0d096386983694fb41b904c109b32b67c4e472e2a416fdd8f2a41fbfb1c5ecdf5be97fcd347c2541c1e50cfe18 -CT = 8cedd6149a203beb47d78489ff -Tag = 00906817785539306d07775e215bfb4b - -Count = 9 -Key = 65a467d5e8d503a0916e5ccaaf240b20 -IV = 0cc6f2f2a5cf96ce6adc2c5e -PT = b619af43215d41b1b0650bbe0d -AAD = ae98d8e675bca2cd4bf8f0860d46bd2c18f2d15dd431c51fe63c878cc9b1cf47a3b84cf1e9a02a4f0a8940008b72f4f1ed9cb5aae670899705573a8045008cad1284cddd1532791d38c8067694669d8b7d06a46969c413e6e35c -CT = 6c24bd0ecc97873f0f7c8802c5 -Tag = 03168a06b495f3f31d46f0de87d5471a - -Count = 10 -Key = 4cf328e1f2f180c2dd9e6d703cae188f -IV = 35b7cfe65331e520265d6657 -PT = 9c1a195735a84e6491a8ac07ff -AAD = 72a6a4f43598b91169a834d906cbe4cb40da1a41502a7f4bc80265a239330a9102de94a7fe8d57d28dc125aa5e6d061e7d2a90cdad8406ee899687d02f780f0c1ae8e944b300b61cd3489852d61eb2349a447be85d25d3cdde0e -CT = eb4d38c23be97445c25e8bf2f4 -Tag = b005f424f77a81f4a965aa7a1bf8cfe5 - -Count = 11 -Key = 7d62b16a551c12ac2102472492a4d3af -IV = d464c988013cfee4bafd7a9b -PT = 6de52d4b0878c26b0d8a6ff127 -AAD = 12a9155e72f6c19a9f00a651fe52d6dac331cac06b3ba594e24021900cdaa7d73a75a0968dd5d7d2f16ebab2197c620a1768bbc0839e21c8a37203af4c2ba146fdcac2b48701cc4bb5863f514c6562e01e807cd5308c9274ad9e -CT = a6dd42b752cacb47f1de9adaa1 -Tag = c6472e722a39ae44be5e4242cc58e046 - -Count = 12 -Key = ef6c85fa490919d342734357fe3656bd -IV = 7790d3a8deb8712c68ddae80 -PT = bf45d58e3cf0cd47bfe90814ea -AAD = fb04ccc1d78523c9aef6e8285fa991026c5aa4cbc8c37f9e0969d74c571e2409775d116c4a55b03f029842d7e3a53df8f7ceb9469b4461649dfb4183e57ebea8971bd967ee95d5f656873368a83313fa31cf6ab11d7b2c77d20d -CT = 7cf1afa60d3428c8fd25d9479b -Tag = 63e3a5eebcd72468e8ffab55e3caefe7 - -Count = 13 -Key = ac5b4ad09c73ed0b80931b920ceb0fad -IV = 1c0ab2941025ce7f084b8509 -PT = bf64de420133b29d1d50f4757d -AAD = e8cb8547ac67dccb3cb88e0443f9566944a79adaed7680b9e174080751d91e4d83357f28802a576e0fb53fb32e8d4d879d55aa9e79e201be363f4ddb16dad35e058a7d69e262c359c036f0d72151aa0bf04fbef5c4c3f7e91d05 -CT = 3761f611ec3ff853c915e61ef6 -Tag = bf906c3dabd785968ba5c7abd4a1eceb - -Count = 14 -Key = 35818c93c54a321f2ccc28e967d22ce1 -IV = 18dfcc73829a3c13287a6112 -PT = 6f32f25bfc511e8a7c60854944 -AAD = 09be731cd52fe4f7c6dd9aef978f8f117c358997842ffbb2df96727625669b58513e2bc97ef9c7119afa6b088a4f9312bebebfa6e71080a6e7f369207f3396f9c240a13143d7bfc5cad5049cb067ce4f57876d883bc8283fed87 -CT = 9553eb0378229fdb213fd46002 -Tag = ec228ec0fc273b67d922c2ba3dde5bdf - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 9971071059abc009e4f2bd69869db338 -IV = 07a9a95ea3821e9c13c63251 -PT = f54bc3501fed4f6f6dfb5ea80106df0bd836e6826225b75c0222f6e859b35983 -AAD = -CT = 0556c159f84ef36cb1602b4526b12009c775611bffb64dc0d9ca9297cd2c6a01 -Tag = 7870d9117f54811a346970f1de090c41 - -Count = 1 -Key = f0a551c56973e1cfdfe2d353aad66c2a -IV = 94e95e0544ab0b0b9997aee3 -PT = 734c0907ef49a1d86bc665bb9da9cedeeecd2abfed7f591c201ac360ca42f941 -AAD = -CT = f2c2f0c35e0bf6c5f5c24d8aadba19ed35848959b9c586604c396428493418d0 -Tag = 8855aecbe9604a839fa5d481f8760ffc - -Count = 2 -Key = c635775fa1416abe375c792ea7a486ac -IV = 5b9f038596f55115986a3109 -PT = 54172156fcb2c40392009807bd3ec4a11c2c1b6d69ad20c773df3d9e7cf35e3d -AAD = -CT = 73a9d9de0a3dcdc52dd9745fdf12353f4d63d0c7646443f5206883f6b7da2b94 -Tag = 11970a60855b0fe890d4f5988f6cafae - -Count = 3 -Key = 43d0651aa5d06f2846fed833fbb72241 -IV = 2ae626772b73c7cd25dab014 -PT = cec1607ccdc6332e5371766190cc7b03a09fb814b3d2afc52edc747d70b7fff4 -AAD = -CT = ea742cc41afac5ffbfa81e89bad82f1f8a07eca281fc253b533cc157eceec4e0 -Tag = db1e19fb545ae218f4ad3c9a6da64997 - -Count = 4 -Key = defa2f0eba651799c6041e6f28a0db3b -IV = 102158d6ed54ecc7efdeba7a -PT = 67844577a198b456fa410afcede8fc24fb970459096ebae03bfe1dd32a6b9665 -AAD = -CT = 4d87782c99ea2b18c58393eef975007b9019f42667b98098404137dc085d631b -Tag = fbdf857c1bff89bd725b8ca90d643e5b - -Count = 5 -Key = f098deb1e8149b3c88320efbfea087e2 -IV = 8146393ed0dd09d89d1ae7e5 -PT = 8ee6f4c01e98b501a9914f57239bda7d5831ac147c320651863e06db60c1a02d -AAD = -CT = 122309ab94c98901104bda0488efb563959da64979653ee4f8e658a3ea8a3c9c -Tag = 93e3d93d0580c5567ecfac274da211e2 - -Count = 6 -Key = 63b28aec8f7dd44af269e48e35294a34 -IV = 4c3d88500f6a483b63ba1139 -PT = 5b86eb718b3917537d4ef51b6c74a85cc9a90002410d8f346cbe56c86ac72d4d -AAD = -CT = d0281117e29fbf9676f7887811b010a19a34475ad9e4516cd8424d0b9e5a2c3c -Tag = 904ba928205fdda9e2674805be07e93e - -Count = 7 -Key = 765ed884a7554c792cc671e93c02433f -IV = 667467b168db56adf48a26e2 -PT = b941bb1f73980b0d76324a49a6c33623d4a1063b05c82cb43e4b0cdd4f913860 -AAD = -CT = 84906e78ac79df67a0fb4ccf4c8da439094339adc92d98abbe032cdf4f5d92ec -Tag = 750a89a842a6dd7d1317f561b9038402 - -Count = 8 -Key = 816ed7edadca9e8fa2b2b9f9ebd14d51 -IV = 7da514e274b5b812722b5c3f -PT = c76908234954ff939ba2293fa1ac654a4bee41a574f2694d090980481a08083f -AAD = -CT = b59a50e4414b4903c195ff47e8f9028d77b7e73a9a54e1ced9ebb1636b123864 -Tag = 007af223e7ac139eafd78d0a2c87ca25 - -Count = 9 -Key = f7b38d0d340373b98b89725fd889be49 -IV = bc2b87a883af1c0bff8388fb -PT = 0a8de4df6e01bc7b2a36e4a123af8ce6240bec42cd4e4f09aa92520c1658103c -AAD = -CT = 65ee08ab751bef3720db313491fca20a87cdfd6b8b028f53bf352304da504911 -Tag = abbc81ca718fcbc6a75c85ada74e466f - -Count = 10 -Key = dc662c77a2d520a067cbd6bd7e119696 -IV = 23aa76d1e8c3a72be862a5eb -PT = 5fb66e144d2564e096832065647dae768659d6dcd10a1dbe00858ce4f5148912 -AAD = -CT = 612713f9e6bd8017f61410c10ba1bd21adc87565bafbd1839d9572e270e94210 -Tag = 9d7616c3b486107cc74a8a2aa9c65209 - -Count = 11 -Key = 5c5b3799a19098b9c5737783ef0c80e9 -IV = 34fb9e101915639def30f40e -PT = 05f15cd45a82f36bc4e5e3d6db7a60640faa0e929c00f0354e913bcb02d83118 -AAD = -CT = ad60f53d51b6b00fc3366a4b4bc16b678ecd12473e8bd55c363bc0d94a844b70 -Tag = 1a528398ee2c9f436743d1a08602c5b4 - -Count = 12 -Key = 3a541317198a2fb1b90470e90d6d7f38 -IV = dfa6eb2b53177ff5d0924295 -PT = 3ac18af46d3fb15d477b849fe1ead087840742cbd8b2ec31b45b8ac2e4a53975 -AAD = -CT = 66755e7ec710a8ed7c776521f214ceb54e550220177eb89fe3949c9e74e2e108 -Tag = 20425ac5f07868b49edf9896af64396a - -Count = 13 -Key = 8f85d36616a95fc10586c316b3053770 -IV = d320b500269609ace1be67ce -PT = 3a758ee072fc70a64275b56e72cb23a15904589cefbeeb5848ec53ffc06c7a5d -AAD = -CT = fb2fe3eb40edfbd22a516bec359d4bb4238a0700a46fee1136a0618540229c41 -Tag = 42269316cece7d882cc68c3ed9d2f0ae - -Count = 14 -Key = 5fe2650c0598d918e49bb33e3c31d5b4 -IV = dd9501aa9c0e452f6786ebef -PT = 5a6b60ec0ac23f6d63ff2b1919ba6382927ef6de693a855f3e3efd49bd4453d8 -AAD = -CT = f0ac2d9153f00be3fce82d24fd3df3ea49f8265137417468724ae1342c6d9f00 -Tag = 6bab3332c8d370fa31634c6908a4b080 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = 298efa1ccf29cf62ae6824bfc19557fc -IV = 6f58a93fe1d207fae4ed2f6d -PT = cc38bccd6bc536ad919b1395f5d63801f99f8068d65ca5ac63872daf16b93901 -AAD = 021fafd238463973ffe80256e5b1c6b1 -CT = dfce4e9cd291103d7fe4e63351d9e79d3dfd391e3267104658212da96521b7db -Tag = 542465ef599316f73a7a560509a2d9f2 - -Count = 1 -Key = 9b2ddd1af666b91e052d624b04e6b042 -IV = 4ee12e62899c61f9520a13c1 -PT = 01e5dc87a242782ca3156a27446f386bd9a060ffef1f63c3bc11a93ce305175d -AAD = e591e6ee094981b0e383429a31cceaaa -CT = 87b976488ac07750aa529e1602290db36f4d38d5c5ccb41292b66c3139617ebe -Tag = c4e7ea53efd59354ec6b4b8d9f8b237c - -Count = 2 -Key = 8737490bdc02e3543c312e081e2785cd -IV = cf3460b8010d410fd5524720 -PT = aa0acbbf2b847910d56ee4da8a9f40973f85d6cce1d6326a777eff01173e66d0 -AAD = eba8c1ca49e977cf26eb52325e59afa8 -CT = 893902594834c3a72da17bd73ccd53238a581a3e33edf8b9b901662b5f7e1d3a -Tag = 36a3a106d3c10a65da7d81942c98b349 - -Count = 3 -Key = f7fc73fc1c428e56af92e6b2870845e3 -IV = 375b1a84fefaaa807ffeba18 -PT = f871a9a695b74f9501942f99a3489d4befec6768d7c17d1c38f51fd6cd16adc4 -AAD = 0d668901163a08a338c427342d31e799 -CT = ef65290d220227147154f66a12004ce292507527f17c5119c69fa4f81e56d0a1 -Tag = 2d48c8b198610cdea73965f6ab1d9a12 - -Count = 4 -Key = e522d6715bb408401c5a7af3ef190caa -IV = 1a3b2a313418ed26de8ddf57 -PT = d3f10233505f524ffb8d961d8321be88c975704bdd9df958f3795adf0085aaa7 -AAD = b993eb193e9d59382919ebbc9e3ad829 -CT = e1519156cc27905b8da24d29fb502d54042eb6fab10c5f6a99d1ef54c92c555d -Tag = 7fd04f637b748db17da7ee34099a112a - -Count = 5 -Key = 55190de13cfbbedf4a0787f9ecc34e45 -IV = 87803bcf6a69962abae929e5 -PT = ee5da0026ce103140873226149b75fa734888b00518aeac0224466bbb0d23d0c -AAD = 067c3857cc240c6bb5f628bcc7cf5559 -CT = 06362d236e9618037d31d4f1ea0df6064e0bf06b6c5904530e1002e8479c16fb -Tag = 342a27aea0ef0aa26ad92ea3a92afa37 - -Count = 6 -Key = 65f7a5ff7feaa8d50736dce3c8524cf9 -IV = dfa0822065b1ed4987685217 -PT = a32d3aed1371cfcddf5e735a9d95b96d1ac59c3ab784be8364cc1cf3b71bf70e -AAD = cc4fd4d82584059b5a165d632d56fe1e -CT = bdf356a54a5cfa281edbe7e35966b5b8a68894f282cd7a734d502dfee6dcb1f5 -Tag = 4ff05b2898df6edc27574a2eb395ffc8 - -Count = 7 -Key = df0ceb73dfbd06782f69cd51cc4fc1fb -IV = c5fb4bf0b40477e10e5d15d4 -PT = fa9da35d8d812585322fa1c0cf4633b06424272cfac1c5a51138b0b9b91d443d -AAD = f292c4c2a2356e70feb0003a28708ed8 -CT = e81cd00a96dcb719fc2c3af7b5420cb5667fed53af8f561dc216fc7215ab16a1 -Tag = 60848116706be55b4ea939ba899eb2b7 - -Count = 8 -Key = 72205e651f03e2c16eea7689af43bc4a -IV = 42c47b2f95b0ec02652f1fff -PT = 7fbe781650c396ca8cdc6b2efddae0007cb008c4fc7310fa17ec5ae060171391 -AAD = 7f978fc1f1b2f9f37b88b96b8c14ebec -CT = b3f3a8bfe2906ac1bbc93ddc701a5529c2cb156354cedf85928f605ed6005bdc -Tag = 9151c8000dc25eba4a57908b238afb21 - -Count = 9 -Key = a2c96c0b051c633ec10b2fccb43f4517 -IV = c4c13fc9f15f482bf6bd8d0b -PT = 5f0a50d976eb2048bc481d7bca9b3e7367c3b12c9e98ac8521f45c715ae3bfff -AAD = 94afc74a7040c47705722627e05f159c -CT = 2bde225ca63b40ce64500c40c00fa5c50086c431e95d1f99678cb9a90bda2502 -Tag = 6a296aa47e52737304eaafec0c3d0c65 - -Count = 10 -Key = 108146de148bd4dba69c4ad2c11a35c0 -IV = 9dfbe2fa46a46c3ebaf31c48 -PT = 0104c3da4cbe50f31ccfcc426d634d8d39686444a3b75bfb54d67349fb7e7017 -AAD = bc83808f9e884967c84d28ce981dfd1b -CT = 3f4424912dfaafd8f8b08ba7baea95effb3e4571720a2626b92ad8f7a69d4477 -Tag = eedec85ed9e14a5fcc2cd0ce50ff00a4 - -Count = 11 -Key = 37b9352444bcaa9624b267566a59095a -IV = d7a72473b99b2890ef7c4928 -PT = 93037b2b4814541f425ea0bcc88ce1486632919cef443a5374d9944edc7e42ed -AAD = f7751af2dcbf5a7eb81d6bd73ced1220 -CT = 491e0893a652a5975d3db72868b5619311a9cddad11c5522e95893c42e3b63a9 -Tag = fcd8120512eb3f14295efd3b045b0868 - -Count = 12 -Key = dd1332f17e62b2be889e9a399fb0d3fe -IV = 3f0028cb7cb8f1091a4e2f4a -PT = 9c2e07683c6ca06d012708ad6dae95082eebd36261ccc874226ad354cc8ba82e -AAD = 2f33c5f85f976811ef67533f488917fa -CT = a4fa9311e3c02c3b068a3f11ae7657efc3a3e69991251280503940ac4a7e8950 -Tag = 0e5e77baa0f36db11cc5bfc27ffc7a49 - -Count = 13 -Key = 39e215f1a2572257efd939ac0365ec97 -IV = e1f4da712c4c1eb31027352c -PT = 21f7d62bb2918dde6acf9b6c9b7afed4be7d623c3e2070444b087fb40de7e6f1 -AAD = 9368e8d525e77707d316542dcd735c6e -CT = 3c93eb8df00556e3f42d54acfd635fbffc0f77f868a68f738ec2918213ba9a22 -Tag = 0dd8352d507e5253ee0849688d2ee86d - -Count = 14 -Key = 06f36f4939473b540e71db35f398a53d -IV = 13efe211cb6ef3a374f4da85 -PT = a5aafedc4c1ddb7f6b38f7974d16a1c88cf7ef1ebe5027ea4fb55db16101fc20 -AAD = 8cbe3e3eb19818db197901bd4ee42de2 -CT = 7d21fb06002d19f40741b275b72cdbabbe032460ecf13d98f1cafcb30f704af0 -Tag = dd4beca1670cf437372aba77bc3e9261 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = fedc7155192d00b23cdd98750db9ebba -IV = a76b74f55c1a1756a08338b1 -PT = 6831435b8857daf1c513b148820d13b5a72cc490bda79a98a6f520d8763c39d1 -AAD = 2ad206c4176e7e552aa08836886816fafa77e759 -CT = 15823805da89a1923bfc1d6f87784d56bad1128b4dffdbdeefbb2fa562c35e68 -Tag = d23dc455ced49887c717e8eabeec2984 - -Count = 1 -Key = 8bdec458a733c52cd994b7c2a37947d9 -IV = bf8d954df5f1ee51fc3f1890 -PT = 9d5f1c905df900111f2052a60913d8a9d83cd40e43ba88203b05e3dbf0e37fbe -AAD = ffe26874a54bd38a026c5c729e2852a748457412 -CT = f056cf8ea6c4f353f08d54c27a8ef3324ab927a641563f9f5dc5f02c3b2204b1 -Tag = 2f8b9351426363f09f5d17f634a381a9 - -Count = 2 -Key = 0a651f95b6fe5d9442fd311cee245229 -IV = b7b2349b60ac5cf09885ef4e -PT = 1cd7be7611d8f7c9d75fdf3f53d28172ae4d462c06da56cb386687f2c098e28b -AAD = 725a089a37ba50e53143722140ce5c37bc0a48e7 -CT = e2926f34c30883a3b7eb0dc47627aad090111654a4980fc4fc952fe7a7b6b60a -Tag = 617345dab8973c21ad711c2a51885f83 - -Count = 3 -Key = fec2452d0883a54c0e33fccc092ddcf6 -IV = 9e3e354d30c2c77cd0d9a0fe -PT = 95b9c5e6adb7fcce212abf535095bd955c3aa0f7ac2428841f4de9035263446a -AAD = 6c12b112110ebf36930910f1bfc9ed49e14440b1 -CT = a85754f451b40f3ab576327b4b99fa09adc95380299f61c5c7a8e28188d2a40b -Tag = 94b979f7718ec13412e03f3461440100 - -Count = 4 -Key = e5f6d9f2c8ad08a1500157e027b92219 -IV = 94358eeb6829f1be4de3abfc -PT = 3204856040edd9401a890769875cc252e5dcb4a77e951e6eaef6d7318a06bcf4 -AAD = b3b860929cdc3fb0e393f21287f3dddc4a1c927a -CT = b1ba514ae4c41270d7beafaa1bac2fa993cf5af3607a008c6bb4aee2a1212dd4 -Tag = 7e0f5aa40553128f2c15cb9567c950e1 - -Count = 5 -Key = aeccfc65063c3fccfc5a0b29193d1ef4 -IV = 70649c9d2848d21c575d6914 -PT = 46ac375da56527c3c6fd5f28f33c63b1ffaf06c33b8f329eae37f8579a62291b -AAD = 637dc392cfe3a8e2fe5e871799a46dbe38f59610 -CT = 7f8841d3c82907596c4aa6ed433b9eb33b24d66f0a0cdd846d5ea51668975d9d -Tag = dfbab7a42d60cda73b03189034e44ff5 - -Count = 6 -Key = 1dbaf0bdd974b48ae373f686a961aeba -IV = a3a6454d17ac622248ae9857 -PT = 83a131f7737b4e881fb255ab9225f7faba96476626ed27168d6342ccca8d3e75 -AAD = 393843360c388a6e2f83c7202e8da6fa7041a6be -CT = 2471d23957d6305a86520b757c54890a57f665a44a19af2f8d55e6833659e730 -Tag = 4693b10c8998580e986be0bb26a22e3f - -Count = 7 -Key = 540f40fe8ac2e506b69bb2ba356ff8db -IV = 0502e51ac42f641d7a0176b0 -PT = 910a000c5e99245870f08dd658b648f944d04426a70d6d46d8e88ec8eddfb324 -AAD = 9b1f2b2fd7265792852628df926abc5609aaa762 -CT = 9381d4b72d740b58c3f27f8dff01d8bef45e769b834539a439173c88a6d18e62 -Tag = 7c678893a122a50f777dfcebf514f81d - -Count = 8 -Key = 55d0e0560a2027bb873d84a39ff87046 -IV = 616d61ba94216c9c7c0903b0 -PT = 1610431777c01136c0a0073f5c114c357f0216d5eaa31cd40b8cd605ac56dfab -AAD = a0203e1f31f66bfdc819d086a48b705d1eb7721b -CT = 5d846a8dfe02cf2454e11075a236b2a6acc59819e9ca6af580690664c195edd3 -Tag = 24cd0dd950859ab9d1ae654ef7174f98 - -Count = 9 -Key = b7ff8402f1325d945c98662003323db7 -IV = 6b6163fb2d1641bce33459e6 -PT = a2a653ee98df41fe873bc036a5fa7ddfea8d63ff0949ae8e1489cdb0c3a80c7f -AAD = 50a7649f5ac25f110f9408ecf3289d978a55620a -CT = 820a373f446a8341c8d928d223a5aea854b643ff07902b0c5bd0c6319b42d855 -Tag = 764c69deed533ab29bd85dd35d4dcf9a - -Count = 10 -Key = 48c901ba4e905bd68afdaec739ae00c2 -IV = 5bbe3dede5ebbd8cb845a9b6 -PT = 80b845888bd2f25defcd62b72b6bdeebd6152b3aa6b006891b0d69769fcc06d3 -AAD = 0c0cbcdcdbb35a35116b12b62715df4b647d78c5 -CT = 512779582d1fe1831f333bb563634acef8021c3c76b06beb6c7da98daac4c229 -Tag = 15fd32f96a4b9505bc1373525d40eeb7 - -Count = 11 -Key = c82cc4d9ff0681968839991afd0dfc2a -IV = 26a95931946fd2118ccd01cb -PT = 7516c4a781be02cafc36df4a07d2c9ffb978fdecf5217240097d5c26ff1e77bd -AAD = 8bbe80d4f4cd6c61b4fe3d24e98853acd4dd83fc -CT = f98436fe4bf6e5993adab0f0001bebfb449735eb365b9e7ce4b151f82005c5c7 -Tag = c83be461e1fedbb4ddf3ee72b9debe20 - -Count = 12 -Key = 748a88bf4e264a1180bfd665072aba65 -IV = b0a768b62de3cbbc1bcfe93f -PT = 1e1df61a9f10c7b4057d684ccef74e09f2a87f7e4aed393a451461d574c8ddbc -AAD = f4b102d885495fb893189aa216d8ab653bb97b99 -CT = 5e1af9511989069a615a6850402547ef4788197452461f1241e24be674c60074 -Tag = 734e1cc937ca384e282410fd9fc4bff2 - -Count = 13 -Key = 2393180bb81320965a58424b287c9b3e -IV = 480053c69ac54b93f5e81338 -PT = d46fcbf950bfcfca3906769f922821473d3005d5a1d81278622d4d3cd9721a33 -AAD = f6a2a3ac8e462fb01bbedcc9b0f8686ad4477929 -CT = 125874ff5a7f8936a76b11587bbebd461e27638bff5a1e993465c9cde82f2bd4 -Tag = 9b625b4c2f66cf2fc88043b9b4c6f2fa - -Count = 14 -Key = d651166baf42b75adb26e370b76016e5 -IV = 4af70e3be1357501cbb16bca -PT = 21d76d04488d4c33a7e8822797f785b43540bd374206966c9ef7832c51cc009f -AAD = 2c1072d5df5306e20d323a9897abac120bfb4d04 -CT = bc557572490f4d63811f8d83e58214ba4d8d24290264381838328a2962f010b2 -Tag = 8bd1f65c551c4affa517a8b03b6337e2 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 48b7f337cdf9252687ecc760bd8ec184 -IV = 3e894ebb16ce82a53c3e05b2 -PT = bb2bac67a4709430c39c2eb9acfabc0d456c80d30aa1734e57997d548a8f0603 -AAD = 7d924cfd37b3d046a96eb5e132042405c8731e06509787bbeb41f258275746495e884d69871f77634c584bb007312234 -CT = d263228b8ce051f67e9baf1ce7df97d10cd5f3bc972362055130c7d13c3ab2e7 -Tag = 71446737ca1fa92e6d026d7d2ed1aa9c - -Count = 1 -Key = 35a7eabe7de2d176e97cdb905c0b7f17 -IV = 2fa0cfef89fd9849df559c98 -PT = 08f23fc6fde45fe044cc2c397390bb362524bb16cfab7c548de89faf3ad98947 -AAD = 314e0423ac429f43ed90d731fcb5bdc7849595ee16553a1b7f91412bf98ac4cb052ca91c62a33b3928ee2887ebc273b7 -CT = cf040174f8e280d10aa65eb59db8bf3e4e2a8aa01b1f320564314946b3749af2 -Tag = 94f78c8ab96107437826050e1a89b9e2 - -Count = 2 -Key = 23c31e0e50ed44fae7e6df38abf0b16a -IV = 779034aee3e3b1942ef3e713 -PT = 681d498d7e85684c5996ce27270fe8065089e58617cc6deae49cceb27dc1e967 -AAD = 6a7877001fb018519c7f660d77cae7bd892af075ae2d68940071f9156bda7010eb25d57885913544d4922a21347c808e -CT = 7b14a15674755b66af08d581ee6f8b98691927cb1f5c43e5589de61c1b3883c9 -Tag = 2fa40d9c65eed28a99f95af468293006 - -Count = 3 -Key = 4b4f9155d8db85e0e2b36bf3aa981e6c -IV = 7c8d933778e1414e7338d934 -PT = f8a26c7a9a614a17151fcd54406891adf34e31a0d55046e1b413195b44113bb7 -AAD = 43b6c54526318efaa8f0a4979ccfa0f299f5d9889433b19971f60a663e359d1f2c1af393928c9b4165c07d7536c910de -CT = 3f9bdea3c3561ad417c205887aea6ca1ee070057388dc80226f331ffb0017de5 -Tag = e8ea1d3077df2c3d20f02a5046fdae73 - -Count = 4 -Key = 4148dd87bc6aaa908a0dbe1e5d2f6cc7 -IV = d01ffa7787117f8cb0b4014b -PT = bf1968a91d5da5c9e42ffb5cdf11e0d31b69935b22958c149c005d52576b262b -AAD = fdeceb385ed6de0d2d15453f022dd455b8db3bd9f13e44f085722a6935ea6631058e0cb5fcbd3b9e97db339b529de123 -CT = bfc9ecbbaf49371107cec37f80171f94141e25a486e1b42d8258208a6038fa34 -Tag = f2dad0b16bb728cb957ad9ab0716d195 - -Count = 5 -Key = 5d50961aa7fad7cae9a8d043e191c9c6 -IV = 263f4dc6464e89110a77f24f -PT = 0fed89fa86e5fbc4bf2e352caf8e1e8910f106db7b5092feec9fff5f4f768ae4 -AAD = e74cd8621c2db03d6b47cda4ae0671dfe8bb62f26715bd4397adc679c987016bf305a1e555ebc91a048e2a7bdc7cb8b9 -CT = 2190380bee10ade973aea0db269835649f4e53e4724598e1a935704a40411b16 -Tag = 0aa3d68d90ef3d329ff394451db0a2c2 - -Count = 6 -Key = c2428b54a781242f896bbc8816e8176b -IV = 715d8c8397ee55eb53f86a2a -PT = 0088129bb514a66d5a208838e20c7978ea6389cbd56e85de87e0db0608d8c1a4 -AAD = 435bb2a96fae0ab64c0a499d6e50bf2e5560643338aadabaa795f82d6503588d6522a70e4e475297aa9c5bbca7138b05 -CT = a9fb750c009ffd7fe76703e3588f747fa58cef68b1d9dd2f953bbf3ab6da2b59 -Tag = 613bb91239aafdced8fb87b6ba0f9e5d - -Count = 7 -Key = 6a3408481a54a1d9231142ffb9fd354f -IV = bb2fdedd1a33321ace0a5c66 -PT = 63c934eeea0dca9732734d800034e57616f4d339aedefd515a829300937e6d5f -AAD = 448f17c604cb976cb527b3b1f8d40350420c94545d73ab72a3dc10a32cec537d78a17d32fe073b329e25bb2d538b5bc1 -CT = b413a9c842fa51001b8949aa81dfc10408391892eda84785e725745378536d24 -Tag = 1e323d12856a644a86f394f96185a07a - -Count = 8 -Key = c5a7ef970a7f42b83194bfaa62dc092c -IV = 9505924d0b11200db3c40529 -PT = 84ba18d1e1503d1c512e0956380811bc70f2d97f65269712431a3720ddac91b3 -AAD = c2b989d3d56d6dc0c3e846631e11f096a1c3f016984a2a60f593f5b45acd28319ac9828773c6d1e043c6213ce970e749 -CT = b07c02dabffaa8f7b11f644e547f887f78bdc9babbaa0ca66e350e2b5a293b35 -Tag = 11393df432636dc7d7a3f183f531166a - -Count = 9 -Key = 3f45c5c7d042ee34e8257bf83a46144e -IV = 0c732f208ec1f8e0e0de0eb0 -PT = d46fafdf04468e91b9b87a84f71261bcd44b438e3a943590c6d1990786909ec1 -AAD = 991c82c9e48dc887f054bc0b45979dd8d244954ea910e30139da9dad476843691f32c7b494114e058d2b27284ea13a62 -CT = 54cbb18328682037bdddb8c585b731b18b5cfc495d9b899c9b8db8a11d9e46e9 -Tag = 289349ea094839dc6e9570c1d7d62a91 - -Count = 10 -Key = 10f0569b4e6c441858f8053a646b775f -IV = 863dbdc9eb8a9c1ac1af6ac9 -PT = f99eead51bb2a17f370a50079d93167179af5c49965af2d3f06d211fd96d6ba0 -AAD = 41d372deba9b25bb982d8c4662f063f95d1859640550ee6177862644b028f42c435636cdc0cdc57509a5fcb75657e581 -CT = 566f59cf4fe7b14dca35575743867351f18b1fa7e39417f8e7fe4e8bf1052ca4 -Tag = df39c291b26f8ca2557abc6074694070 - -Count = 11 -Key = 66f958e09896ab2b21eb36fc36fbfcad -IV = 371a4dbdf80e6d46508a9621 -PT = c0458f59bac039a4349e39c259edf6cf62fbd87910064409c64d8f6ef55d96ef -AAD = 19f19eafb6191fb0452807ba2ba6ae4ac36b37138f092cba1a63be58e4f8b994f2f6958799446b5d226fd23a95fe793b -CT = 192474ad795e3e3e36abcef2d42c038d39ece8119fb058a752b7959fe46703f5 -Tag = d17dc61d1513fc1cc2df45283afeb556 - -Count = 12 -Key = 0f46ef6999a3cbcc2e539a8952a7fbcc -IV = ff8829c2fb56cdf74914ad2d -PT = 37401d56052412f91aa9398f3ab3afe68ae500aaf40f7941c8a82ae56379fd5d -AAD = fc9a1c16b0f4cf133843a7664a17e97c02e7aa360153f5b4b881ed3825f7b2a414adae94c9a6479a9eeaaa206f99c3db -CT = 6866aa7699a8ce2c747880001987c28393fea80acb7b24a9e6e61086df68f5b6 -Tag = c996fc3e44887ad4d703b72dc2ecb1b8 - -Count = 13 -Key = 90838209bbc8d07846127667564dd696 -IV = febfb4dd04eb313933b9c278 -PT = cec0527329847a7eece6afa65c7f50ff2d7df4bc4e8d2990c41bf42aa9bda615 -AAD = 01cbb3a7a70001027b064c337260ddde8cd07fc786d71e293fe0bd44c794dbf7b054114bcd259e115e3acc98cd2ed7b1 -CT = e6275470454a9e0b6f6ea2a4d64cb93462a6cddc69e80f338098fe8b1d4bc364 -Tag = 50ddc254d7504590c938a503048cc8fe - -Count = 14 -Key = f94e9d80b48dc5bdca82f14daa46be16 -IV = 29bf1931f0dc4fe3c807e234 -PT = 64971fdf74f93f8aae32a998e5acf2b09623795a77cb9ad888abe6c7756b0a9d -AAD = 449e68d78fcaa2e0f2811a87a9c48a3cd18e4d644eb88ef05b91f4528e35c713f4df2ff97de251bc5b04a177d2e29299 -CT = f317607d97ed51fcc2f6ff7b394470758df772abb33b7ba049c6748b39fc4005 -Tag = 6c473bbc8881239f85eddc79f5daa0b9 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 256] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 8fbf7ca12fd525dde91e625873fe51c2 -IV = 200bea517b9790a1cfadaf5e -PT = 39d3e6277c4b4963840d1642e6faae0a5be2da97f61c4e55bb57ce021903d4c4 -AAD = a414c07fe2e60bec9ccc409e9e899c6fe60580bb2607c861f7f08523e69cda1b9c3a711d1d9c35091771e4c950b9996d0ad04f2e00d1b3105853542a96e09ffffc2ec80f8cf88728f594f0aeb14f98a688234e8bfbf70327b364 -CT = fe678ef76f69ac95db553b6dadd5a07a9dc8e151fe6a9fa3a1cd621636b87868 -Tag = 7c860774f88332b9a7ce6bbd0272a727 - -Count = 1 -Key = 93a45b16f2c06a487218d761eabf1873 -IV = f658ed7ce508e710d5815f18 -PT = b6a2afb916a235c7fac5cd6a8e9057c2fff437b7544532a296a3c80c35f47c99 -AAD = 33156a775586e8c92c7e99c467a840281abc19483b9a320e707bf1ffe856ff1c473bb52f5b940e44df2c2f766cbe9ed360d844283f8daa3ef68def4bf5f2c3aae3028c2d348ca1963e9227cdfa6f6205dbd9f3832e46a4f552ec -CT = 6564e15287e995886395353c65c830e6fdd295c7ec2633c7f8d280f2340cdd15 -Tag = e4f4dfef764270a068a9095b9618ffef - -Count = 2 -Key = 5015f6b267f7ba8f83b46ef9440a0083 -IV = b66dd42e69f8a614516ab6cf -PT = d1207549cc831a4afc7e82415776a5a42664bc33833d061da409fbe1fb1e84df -AAD = f06fe187ad55df4c1575043afb490c117c66e631b6a026ac8b3663d65f4e605b57f467ed6c0a3fde03db61f82d98a238955a3e0f51bac78d14b94a0b75057a432ff375a09b0a41def3c887fcb103ee99f4b9f4474a64600b87eb -CT = 9600b7aa6f5d8e30d3bbca6800643ee764b59bcb83de3dfd03364bbc9a48252e -Tag = 49a0ad2dfbb49e8acc6ad1de4d9311d7 - -Count = 3 -Key = 408722e80d9cae213180efc0f2675f32 -IV = e9ed15b1942f1ab5e9cf9421 -PT = 39ed45bdd73f72aa16ae833d05c6d9ab1fca2b5ea478db553027787857fc9fcd -AAD = 19fb7034ac4f57035cf19f68d76c4581054edbabe884e076a0498542d42f0412f5eb87c2cafbe13b9936c6fcee4c7bb46df2274306fb1a86bae4660290c13eddeb8cfe8de585e415563bc1a6ca9823b66c8f2da5da5df8f41677 -CT = 9241526c638c2f0a2d1e52bb049f71039565bba5c59876eb136f92ac68ac7f6c -Tag = a6a9b62c36b156ad4024e705c1d78360 - -Count = 4 -Key = 678c4bf414452f1c5a659669646d4161 -IV = 295d2762261d1a536e1c057c -PT = 53f4ab78c16a20c07095afa50f7e96d66bdb5da90e7e3a8a49fac34652726edd -AAD = bc84743a0c42bb3423032a89857de5a9355ed7821980bf18379ae503b69da35601608f62bbfcb2e2ad9eff7e03fcb4b6d1768ad3a4d92831c5b2e3fc0eea3ab7b874f64e84c376a8f9e15b9aeb5392de10122605699f7d03a999 -CT = 2c821a0eb61cbdb09f84f086f69652b38ac9d07a90985f3ef36482a9ef8edbb2 -Tag = e6e042fe0894df45b7d9898e96e9b906 - -Count = 5 -Key = 8df843ad9376d7326114143899b4ca6f -IV = cdf3b88613e485fe6886e720 -PT = c1fcfda327533d17e1a6ac7e25cca02546c66635a115cf3f6d008eba55947d60 -AAD = e5bd7fa8a56f3c155120f3bccb0fa557063e7bb9517cd04d9996533ef3924ee6197ee7512c6ef09d2177e75b4909c6cff0e86cdadce20e279a0503956f4c2196391a8ffec2d17a1d6614be7847cd114df70b93959f1765826592 -CT = 71b822b6d39c9a801a4c2a2c9173b0f3d9b50cf18e8e95291136527a9778edc2 -Tag = b584a7e51d40ab28732c11ed602730a5 - -Count = 6 -Key = 64b43dfcdcf30dfb97373d75d09ab733 -IV = 9359d85361a3e4c110d715f4 -PT = 7c5c94ac7b138273de768d2bda16bef0774799df333fdd1a756e344ec35f2844 -AAD = 01acee6296478134999280ed47a5bc65dd5122c5d35092df54718900d04cfb81457ba9ec9d01e55dd8a65d6b3865fa0e7a45382f287c688c51ffcc951945e3e9c87b03c5545cec0d966926b8ee0453b69f25ce9fdf0a3065c81e -CT = 5f9aa615e13b7b585bdc2d4c3a83d1304d6f78ebba0d5b329d86ca730a515702 -Tag = 3cbf9fa530b049e067868433307425db - -Count = 7 -Key = 93a951295d4428902a5cce8fe2068763 -IV = 8aed35ae4ae714cf756e686b -PT = 0029b749b4db477dcf47d0296eb88806ef0b56060d598e48c9b5a6f9d046404d -AAD = 8186788a93a764a866944a2056279ad7f1d2083a96ce224fe6de60e70b17db18022a1504e1bf45c326c6d6992d8c005b675715016e00ec965b398b2ea4ab09cca2ac4ac312e6840ce00a36f6467028328fa30d4086e5bcb677ba -CT = 792cd1a143304fc737d0739be52b2e61841a908963832cff06ab6ec585be6467 -Tag = e1bb3eac7f570055fc2d2f0588c4935e - -Count = 8 -Key = 4f3114710c0e7f393b91c982beb3cfcc -IV = 03994d0b244f94d13cedce90 -PT = 36831744fd1c17a5df65a63d6642502075a0109f0f0c093ff33505140371136c -AAD = d294f939361af1bff5674a5235ba3e79bf30a5341b8634b5dac613e9a567ccce01b0596282ea584e579719206b2313f6675e7834f8a6d941e164169e97648ce77968ab4ecdfb3d639898468a1e8d285a9327dc958093eb33f8b1 -CT = 557e78350ebe53d1b7c1652669621db7a71a8fe2c0a84e61badf2dd9f034b91b -Tag = bc6c1f1322064eab75737067973d56a7 - -Count = 9 -Key = f00a034ea2f732863f9030257c8dcbf9 -IV = 2bd288fc2fabba6c44a04705 -PT = 85472091a37ec5f37d50fc09fb6b9d803577227b4c079ae64a9264e7a784c4fc -AAD = 312de02725a53b8a3dca7f02876dd9a4665de7a3f3dab7e4ac37b71d9d02478829ca38d3ec76d7792eb32478b92552e90154cf5608dcad4f33496061161af933d066e146888d1b7fa9b0c5255d59a8fdd88da638d06ee6d16d93 -CT = 9aa27810c3761ae175560340144610c7d263ad35234ecc55feed1c5dd3a4dadf -Tag = 02724d14a7dcb5ef81ce8aa937f1419d - -Count = 10 -Key = 49dfbd368a541721d6cd5b2513ec6087 -IV = 8b0214ec3a6a6af65be84ceb -PT = ef6cff08cbcb63a72e841340513f4e289ad34e89733731456cbfbc9a87b20f9b -AAD = 6d3dc86af4bb9e92af0dec8cea981481341f37be457093d98a818d8cb4b68b9f7197b1fa310147701f047949af41d0b226af4a3b0b92e5342224766dab7830e1687aa3918a89d4d3b50d69595944f492d3d68b3609ca594e7f26 -CT = e0802e60f73aa2fd669cf5870e963b1f33707ad4cc551f658b18bb72fd7cd9e3 -Tag = cd6d9a33458ac709385acfbcffa457e5 - -Count = 11 -Key = 3c0f57982449fad339c7ac5f6501b9ec -IV = 4db6301b638bab6a833001eb -PT = d1d5e1f3d8b491b2345d4a020add93e31596a5a204045f75fad53305d6b5aab5 -AAD = ea3872b0d48dad649a876a6b3672e9c7ffcd69695a4d2eb1853ed5c26eca0e8f21385563d42dfef2e1430e06561b8e0b73b5f62ba51a4aca78c56c06c479961c3d21c1fa3823cf80145f7b24e4740127e9e9960fa2480e36e4c4 -CT = 32c508251494d05ed9413b0011a028a1bb9bf7e18f72de4b750cc7ab96ec034d -Tag = 27c994680810f7b538c37b551b2f17df - -Count = 12 -Key = 8bb2aa3219c604544b4187d491586d9f -IV = 341d76da6e3094fc3570ae78 -PT = 274a2097708c53fd2a81444e13285691eec192c223b84dc9824c67ed3a050ba9 -AAD = 69c5e98cad9aa3327444b9625eabcd086367e64170d35c4586fa385a396b159425f8dd3969446529d651ce5a3b6432529487f91d193d05d2e345a28b50dffccc0396f76e418086e1fe2768e340c1fcffdb29e9514829548823f3 -CT = ed8775001f33bafdb1ef577698116e9ae656085fca8b969740c7c697450f9879 -Tag = 6c8936c42dc46321695d3af2a33ada14 - -Count = 13 -Key = 4d8154426d1b12eaf98d09ac05b1f9e4 -IV = 23e3916b9d64f98d122e6be6 -PT = d8a69c57969c6551c328675f7d772faad6c2c6843bf4b209e483fbdfc5efcaa4 -AAD = 2355631b9d487f4a7ec98d497f251cb79acfc58c0517d5e7b92a1abbae6ae7353b874d02faaf6410438539e02710e4d7cdada686871fef7582d562f384a571ce1edc68effdb932462e648c712b4e1d4e2e46718abd3cc5973aa0 -CT = 2fa53c6fd1846db81002e9c14da634480b352225e9190ab03d2598ef49a3b2b8 -Tag = a4023fd8d0f076eed5992f680b154433 - -Count = 14 -Key = 2c14b55dc1f8e3acf85258a12360053f -IV = 5b5930a7f63b1a8ec445dfa0 -PT = 41a7569d5f3f39ae06547d0ed681e8922382cfc940bc7e55da200ebf905bf476 -AAD = dc8fb70d3afd3c67c9a86b3467ddfa23298c6523ebe7ef17b7bcdb2ef130c61bd5adca2eebc897fd4126470e0a9088e8ee4a60939024b9abc7ed551d0e79214edea566ca4d970198f9b3a20b6822f4e30fc2cbe76596a01817ff -CT = f64364ee15acf049d8bf90aaa914bffae9ac6073b8d56122276efe04b202d0f9 -Tag = fa09390c1ce9ec97fc10c55ef2da2425 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 0] -[Taglen = 128] - -Count = 0 -Key = 594157ec4693202b030f33798b07176d -IV = 49b12054082660803a1df3df -PT = 3feef98a976a1bd634f364ac428bb59cd51fb159ec1789946918dbd50ea6c9d594a3a31a5269b0da6936c29d063a5fa2cc8a1c -AAD = -CT = c1b7a46a335f23d65b8db4008a49796906e225474f4fe7d39e55bf2efd97fd82d4167de082ae30fa01e465a601235d8d68bc69 -Tag = ba92d3661ce8b04687e8788d55417dc2 - -Count = 1 -Key = 7e6a5b6d296ac7a7494b72c93bad15ce -IV = 5225c255bc82949a1cdb86c8 -PT = 8bd452633f9dae0639fe0e67e36401adf65b3edf6799ff9eec80d85c13c85e0ee09491d4f5acaf8ae920281801a2f5d12c9370 -AAD = -CT = 2348f512a3a8501be9eaa41d8a127fcd8f0368d5053981a5626f85405363d218af7ba52a2bdb87a1ff07329f21792f4c64fc39 -Tag = 8753cee020ac668e9e1a37f63231543e - -Count = 2 -Key = 0d54e78be0eba65446682721368567f2 -IV = aefce9f80307fbff0965881b -PT = 5b335be97a86c8c1a29b7408833f752c8c5d4c912e7f26c73b909239e1222fc851b4e3c0accc5148cc60af2f019f9ee0060131 -AAD = -CT = 7277aebd1beb239a3a610587b0d7cd71640291a4e4d6dca73a5d0e05f058e7a0e151a0d087ff256d08876e1fc3e0e5e69c72b0 -Tag = bda879404fc226cfad834a3e85e04415 - -Count = 3 -Key = 0bdbb7986a6026d17a9ded7700831f59 -IV = e3bdba2fe3b5cad727071202 -PT = 77ec68b51f5eb0f2d80d3af696627f365b6e83e69f105c7bad8e4869b228a0c496aa05c96e97a6bfcb33aa172f22c6bf3d5116 -AAD = -CT = e7a5a701e950ca26987e1c40c889b475dba50cea13f09e9d3bc3cf4c84382c15bde4c34ff05eb278b4b745e51cbf4f12c12689 -Tag = b794991a8a4a9f3d59d9987e9fb7ac30 - -Count = 4 -Key = 823e852ef0b9551b2700bed65edcc808 -IV = 85798ee5fd33ef752a363d85 -PT = c1ebd968d861fddffab41857de7049bdee73acfea5564cf44ce40d75b960ca5453cda093a55c5527687f25433bd6dcde443030 -AAD = -CT = e8e976e8175a41ec6a629a225cf277a1a7e2b839b2f581c88698a39300e4a54ef381f7b433e0ea9acffe59801d516cd4c61135 -Tag = ccfdc010bd16ddd651d0a189255a7035 - -Count = 5 -Key = 99c0001a7c12f331e7b3b164daf4616f -IV = 383e8df9db398c5e9842257c -PT = 9d8ab6774cbf486fc4378a05a7aabba7ba7ff4a0f5eeb51c54c2ae9a5dd829d2735089955d5ae240d28da8b79994cd72234ee6 -AAD = -CT = 23c5e30b40b0946cf5b4df15407ff2d973397a10e94a303b71a4a5de074644006a10fcab198f86c4156c59e28900b958efcb8a -Tag = 8ecd6196137905263729dafc06860720 - -Count = 6 -Key = 6fa5f5b79f6f2fa7c1051d2a374db822 -IV = d466bfcf72789143eade1e84 -PT = d9528856db087849264ac811689420ef2beea9c6767644f3ca8bfc6345a3e2e5c49e7e0fd9b1c2e1671bd1b6275b0bd43306c5 -AAD = -CT = 1128b1da86b71d3c0cb9904f2513d2329c033754fc0d40f87cdfc7ee53dbe3ab565719c8d1dc5d3314123bc9e096fc8509b85d -Tag = 19092b9776c4a1f6e30354fa5115dc04 - -Count = 7 -Key = bce7d033f24ba8fbc237f06f40c6ae25 -IV = c0d68906e987fe22344cae52 -PT = e533180c0c73d75799025303d660e43d5795ad46b84a05741b441f855eeea299a6484c17f39e884aee28b7d384afb49c134c73 -AAD = -CT = 4723daa516b920ec039dd8c0704a37f0bbad9340a7e987888db120459c39cc069554638ab6b32cff585ed58e2d7c1808229776 -Tag = 1ae612e476f5beb99f65aa9b5f02b3db - -Count = 8 -Key = f78a05cd2621e9385ca111f3a168fdab -IV = a16aef83dbbd5f69c2569103 -PT = 9e761d4b7bdce2b851e508f77faf447ff83505755494f1bb5169dc23bb02d9ba8fb8b4878c8a47dfd14ea0dcef3e83c688e597 -AAD = -CT = 7ead6bde964c35fcf5de23f19725387601f705ac11c5fe1fc531746bf2d871fda54264a623c70e72b5b5ecadc4434f9e696ffc -Tag = 2f13e4bd9883c747f0c79c91e661aa8f - -Count = 9 -Key = dc1b8569a8046e3f294c3cca018f6613 -IV = 5b3cbbe0e948db8efe42062e -PT = 6a3a1a9815690106d1908bc7e63e25bfd801900e94a9fbc28b6d52b8f9b4de7003b066bbb18bba33da83c67809e3bcf98b5cbc -AAD = -CT = b02a253a17fb9248277cae0305473870c19e70b7930a0be9be905423479413dbe3702f42024d69476415290b1422f2c030e99e -Tag = f0fb85e3d6b3a5ddc5da3ec797f758dd - -Count = 10 -Key = cebef154b3ca2167230daf3b8205f11e -IV = e0dc23aa50a52cae644874b0 -PT = b8cb070ebf5b27a51f14f22c6b38fc29d04c431c484c117ad250ec4f97fc4df44b0ec847b69a363963d419ce9ad11a321686b0 -AAD = -CT = 4c0918e86b152be2c4dfe36c78b8a559c2c7f83fa7776d0341318a065c2a2f1b2678aaaff76cad30ccaa1dcd03a5bb16d00f3f -Tag = 79267bdf70e74eaa011e889369f5831d - -Count = 11 -Key = d7e95109127e83b4d43c81d7ef6d5972 -IV = 43ac0d8895ed785e2cb69d48 -PT = b2601f216b5e6f60c518dc817c38be940ac03babf2e6f5ddca0874e819f9aabe046460e3ccf6511566bbde2d9b191fc16ac4b6 -AAD = -CT = 957e712dc34ad891cdb3adcce62b0454eae9c792e64eb4e08624de103089cc19499749e8ae6d8c92e2c04c5cb36ef097bb00dd -Tag = f569562cb94828fe71fbddcfd984bae5 - -Count = 12 -Key = 39ab7819dbf944cccd2648445337158f -IV = 4594840e05c33bdbc0187174 -PT = 834cb05681e9a7876bca891eb7824392c7ac29d4ff4c9a8ad96447d2cc5f0ff218043d3510201452ba5c789ba2a667bcf79b9c -AAD = -CT = 362acf79df28c3c858e92c0c5f0a323b3ea2e81be67cfd903a627ed163c06393287b73fe33a435b96672b9bf1a5a2c2cff4a15 -Tag = e58a30e2c91e6d25f423abde987cf2f7 - -Count = 13 -Key = 73388f83e409ea236129e46dc9a9b20b -IV = a9069b00e1cd29a2b07b8db6 -PT = a2e138d5611c5043214f7d9f9c87aab94e0b8e99b311d0cae90829078c3898c8fffa7de9789af0a6c05f375b2f710dd4ba2610 -AAD = -CT = 77e0fa6b2765428ae418b57ecf5a392230fa2a9bd1686b91df69845cfa0a2dd9add219229e65ff6a2f887b78ebe8c0c5d1be21 -Tag = 32385ced195a16dad5eea5a19fd0fa43 - -Count = 14 -Key = d590e53b695315cc0b917d9fa0aac643 -IV = 102de7df461a5578e75c4975 -PT = 7ee631fb685d4a94563e01480ec5526d04a4035d1f615fdbad6656e2495fe5d7f0d6c40dff659fc85f4ccd78433a192313c3d4 -AAD = -CT = e1322d0c9265cd774d2e9d9b6771799600b79ba38374ee1756aa6871e204e5f6871cd50db15225ded64a9c8899bab37288a792 -Tag = 13e606a9a4c786b65e2260cdda4b1843 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 128] -[Taglen = 128] - -Count = 0 -Key = b61553bb854895b929751cd0c5f80384 -IV = 8863f999ae64e55d0bbd7457 -PT = 9b1b113217d0c4ea7943cf123c69c6ad2e3c97368c51c9754145d155dde1ee8640c8cafff17a5c9737d26a137eee4bf369096d -AAD = d914b5f2d1b08ce53ea59cb310587245 -CT = acfab4632b8a25805112f13d85e082bc89dc49bd92164fa8a2dad242c3a1b2f2696f2fdff579025f3f146ea97da3e47dc34b65 -Tag = 5d9b5f4a9868c1c69cbd6fd851f01340 - -Count = 1 -Key = 4324c97ba8c9f2a1bd447bde5e75938d -IV = bcac68106a3fc22048462bc9 -PT = 789fc14b7d4ec83ec783c0ef38faa6706031ade4e65ae91f0e1c579b8c8652e94e04c4ee5d85d23d0525c133a93a9539448ca1 -AAD = 2a893eec2eeef4c2e9c305428b9e3293 -CT = 2ba721de1aa7afba69cd0fa492fcad5fe639d855c1f280802b9cd5dff37f4bf54a117b8f400cb63906a3c78cdc1ae98b0c30d1 -Tag = 171df263a72252f2c44f5a63f089adb1 - -Count = 2 -Key = 51e42ceb83175d1df09b8385a84fbdef -IV = ec6b7f21db6eb16ce87f89b0 -PT = 4c5a34b0acc8745f45c04d6c82716b83ec6be5146d1272835ea642b49f55353fbc72a3acd16624e5377cbab54e356e3af6be01 -AAD = 3a081b5734537305222f314ef39a8d20 -CT = 1b4bb70f3ed38f378e29edb7e65081f794725a0340daec5708a163a3a81272ac2bd4b3e3db8f8ad57d571b5eb24af652e3c87e -Tag = 6a9f2a4b73290fc566f37c286887eded - -Count = 3 -Key = 9280e05a614d452f407aab696afad52f -IV = 099ef02922592254e44517cd -PT = db91108d47f266dd9371698b194b3a183f2936782be417cf1a048c6504162d37e11a41e3bbfeb98f995ec8e35de94bffe0a363 -AAD = 12dc4da623d082c767a3f7efe9a6ebc9 -CT = 8ac070ab975218af0c22435174abcab01af5db9917095e67140b31feeb78b7d5be3186b4fc41f106303a519b5a32399d2de77b -Tag = 7811b48513d9bcf1999b52304492b0ad - -Count = 4 -Key = 89be3c09ae7e2eff5b63f913aa8b575c -IV = 449d852d65585185bc4298f2 -PT = 93ccf5d907dea9b0fed5507f8a26400d0a568c0ef53b9fa6bf9d6802b20fe672c9a9536fc75b85f08e4d2c45cf032422f30ea9 -AAD = d232713c2b024b5affd4a15050dcba41 -CT = 5b38069d695b76a609318e93cde6e239465ac52264017c3e5169bddbda0d2ac76ef0451a3a39d07e8e8da3b0cd2ee808912b4c -Tag = e316e6032fff56e5242caa1b4ef2bb6e - -Count = 5 -Key = 04cbf7dbeba906e1d0e8a98d796e8613 -IV = b58059139429a6a6a38ccb07 -PT = 8890c63ab730d9135e19ca3ada35b34a2d5bd9f4968d60e8c65bf43f0d6def7de472c26b89af9e5d6e48c125d84b0fef7d194e -AAD = 7532c6237ba1da8b99c4a091c5159eb4 -CT = 52bc0be1920a4f1fb3ba3f9fc3e7969c75e40fade163897428f49fc52b6feffb61b65344ab3ac995e07dd5f615c24b447df9a7 -Tag = 239b60518f3c35b24c2557549179fd36 - -Count = 6 -Key = 8f1c70136852dc27ae5162b8743c90ea -IV = d372f92b0cf030aab042a6fa -PT = 0b6446af88c455d7f1ff5116c7af949803cc50bcf1ecfc81c6627141a42b363f7eb7fc628503bb6f037dae843fd2d319b61118 -AAD = 7eeff5d17e79f00d68e26cb7e6bee76c -CT = 4f235f6cc2c0474ab50557e2cf612ab09ffc85975de082b9cb9649a522b8a47f24e1b2c48f3cd57dce49542bd3560fe5e44bca -Tag = c541b78244efd2b9e61e75296f164aad - -Count = 7 -Key = 1ac69a35f749c65d5d27ec109b58f336 -IV = f0b9c6e8cfc7ba4c880d99a8 -PT = 9695507b944865587f27395c74468af6a845716b34db61e437b77d0107387b3fda581c466b6df40948da35906b77ff8ed09402 -AAD = 251d75d69ab64f1363efeaa771f3dc01 -CT = f41dc7402768705dbe3bf7cdbeb4fc672d3a6c3d65520dab3082727dff084b6e0bab17f96c2b137a4bd564a13f77ee37347383 -Tag = 022edf7437b41653db3bf2479a9e74a1 - -Count = 8 -Key = 16cbfdc8f9900f6702a430b0d8b624cf -IV = 28dd5c46e03680f2c01a7bba -PT = e1562d6e6a469cfd9f0a6a15be9a033cd454959ef8b37b2da58164fff1d8dbd3fac2b97bf1b503046fd9cc68bc942d0f727a3c -AAD = b1bcbdd27c0ef4de462fce0be8855a36 -CT = 10915ff87b80e42d548950e53ff6642ad44afa695175d24c9b5197f64c15570ebe0bc969c0251be940b42889464cf562c3e1a4 -Tag = f9606f7a0e41153a1b45c25f1784cace - -Count = 9 -Key = 4c12a54aa7bb7a0c0c798834f39b3fa8 -IV = e5854fac9adca3bb1bc549b7 -PT = 7e7fe58f9f13907a694b47f053c9270c2e4d73b52642a71446943a5c5f3e2fcd554b376dd2f549aa7e0737b62c6414f542bba2 -AAD = 7f42a7791e705345888f00573be98980 -CT = df46d7519910899b7c3d9e7d0dab82c93b7d8ee03f4f5aa82ecf64cacf3c9fb58f17a021536028744e412770e57562249e5f09 -Tag = 2823d4b59cf8f8837bebd5efdfb92929 - -Count = 10 -Key = 32aced5414e267cf77844c0acbb8872c -IV = 3d108e912d53b88e0dff9d6c -PT = c7fcf53c93a521c6e244f203cfc40b80bd8ab1e4e54cdb581fc14c31dc6a93805edbba32a729acf1a7c04c8b0366c2035c65b3 -AAD = 7be4c5df7935453d50f1c6c79ae6c13a -CT = 80beec8c20c7e9514c38ac6e3775de206754433cb1d7c89bbefb33b1b41245e0d1baf7cc870b1f1ec387f2dded3e0f479ef160 -Tag = d97f7d82b3ff97f2f6c652194c004748 - -Count = 11 -Key = 6275270952263f5f008b16f2456c7ddc -IV = 1d1837ea4cb3732a6ea6487d -PT = fd4de28a18a3de3b9660acf08eeac40e192b77c5264c80651c28628e61c3916f7ac03d849ae39c981a2808866a8292746a4793 -AAD = 6ee8ed2ed241f1d7cee55ca67001729b -CT = d69490708893f1638ad594c3a0ad8eb4f17da3203b18aced930976ee1abf4df1ae8a768ddc9df6ccdca2d579165023e52bb9d7 -Tag = aa47cda3928f7a2ea42feae4dfb0800f - -Count = 12 -Key = 7796d479bcb213f19e2ed73ef1069fe6 -IV = f0ebb6fb1df60069b00a34c7 -PT = f72603b6e74bafc20f423bea2a1036ab44461b5e5a5631b013573d953e1fb073b855511860d1782c1f3b146b5c41eb946e2fca -AAD = 87563b4d72e2f2c0094bff678e3b7975 -CT = 44c4d7ba2af1be22daa6352b58bf8cda28999bc33c420f8881001719fe639a9e9e5c48df120f7cbe73af4c1513a637b9de33e8 -Tag = 8b7002219f586318150132e0e5cbf2e9 - -Count = 13 -Key = f7c50f29479ff0f9945ab9df56872eaa -IV = 1bb94d7b399eb7a9a0efaf6e -PT = fa86691b746424b3426dd9ce8cf0f132de5c575e001701324ca7ce474d5813a19904591055fc7f343e20d0f4c92118b14ce774 -AAD = 88a9f81078d6a0820c56c582a30333b9 -CT = 55024fc5e95e5f7c33bf948c167b13382236b2cf187cc09e37dce043f6293fe457a1dde728cf407c702d75a670397ffe28e8ba -Tag = 645ca60cfc8046a0253f438e69b8e47c - -Count = 14 -Key = f3e302a1568a5340b5745ae87f5a5bea -IV = ce41f436f2e84643f673603e -PT = e4abaa66875bd8d45b6ed5e7671b03e09423ea41b7d89039da92728151bd690ccdef4fa16392a7f85efc0bc2b1664bd3f15e77 -AAD = 87ba36d234ec508b308ff258c6bd427b -CT = 123b69b2d0f10934da3fdb5c1b96b4ffc8ffc1446088b634b38e145e6dd98e8fea17214b5c9136f039577d4493b8bcf935ae19 -Tag = 97ca8cf064a408c7b764cf32d3b79c0a - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 160] -[Taglen = 128] - -Count = 0 -Key = fe47fcce5fc32665d2ae399e4eec72ba -IV = 5adb9609dbaeb58cbd6e7275 -PT = 7c0e88c88899a779228465074797cd4c2e1498d259b54390b85e3eef1c02df60e743f1b840382c4bccaf3bafb4ca8429bea063 -AAD = 88319d6e1d3ffa5f987199166c8a9b56c2aeba5a -CT = 98f4826f05a265e6dd2be82db241c0fbbbf9ffb1c173aa83964b7cf5393043736365253ddbc5db8778371495da76d269e5db3e -Tag = 291ef1982e4defedaa2249f898556b47 - -Count = 1 -Key = ec0c2ba17aa95cd6afffe949da9cc3a8 -IV = 296bce5b50b7d66096d627ef -PT = b85b3753535b825cbe5f632c0b843c741351f18aa484281aebec2f45bb9eea2d79d987b764b9611f6c0f8641843d5d58f3a242 -AAD = f8d00f05d22bf68599bcdeb131292ad6e2df5d14 -CT = a7443d31c26bdf2a1c945e29ee4bd344a99cfaf3aa71f8b3f191f83c2adfc7a07162995506fde6309ffc19e716eddf1a828c5a -Tag = 890147971946b627c40016da1ecf3e77 - -Count = 2 -Key = d441280905a33bcf02ac16f8cabe97cc -IV = 53294f8b440c82dbd9bd7543 -PT = 5cd42b150db7d0bd6556e37e386dfafafabe2aefed2823be932f9daf1234aa0402bead485ebda3a0a6e392d5b0e603ae2dfca5 -AAD = aecd49cb8890806d47a950c8e92ab294f325961d -CT = 3ae74193c94ebb96fbb1bc5ecd180b2c0efa1ef4a9ecb6959631f8554f0eb237893476cc0d4fb55fa1880989c1616dd32b964f -Tag = 0eae01a8473a8f603c6ae6b637e4aeba - -Count = 3 -Key = 4f66f21817d1865c2fb62d4de344e085 -IV = 4c780a2707f56747b24a4aa0 -PT = 04eade2d68dc3c5d83f2d3f1c44240bf86127c9f6b3966085ef41ef50107d042b18bbe80bd43cdd1585fc5a99df8271b9b8767 -AAD = 4c0ec2531542bc801b3ddf593c2e1ba4afeb603e -CT = dcdf8d2b0d388072ce273ad3502dea5122bac0020a7ae3b97705d3a2bb49a5cb4f95e6cbd74183758c2eabc9ea38155c7ef647 -Tag = 2558c59cc7d71a2fcedd13f1c6659a63 - -Count = 4 -Key = 638276070f70a48dfdd3074905f4dd8b -IV = 08aa05eee9be39f28f61299c -PT = bca63b1fd480b7c682f992b3ac40712cd412e5bd5141126311ea3c5cd91ff8d75b7ad7be0ac7f61d41292e673177e55e148b8c -AAD = 7e3ef6f9d9d33a6bc5904b1317d235ce1a99ffb3 -CT = fab16aaf8cce26586b50e794e889839e0edb63f14f927f353569cac1694604de593d72c52977bf7fe2b6fcecb2d8918d0de8e9 -Tag = bd97aacdb02b80a01487d690b5e905bb - -Count = 5 -Key = dc7fa9348b7fe1b3befa5a09b2dc0f7a -IV = 51e208cfa9b9d990013f50f3 -PT = 0b65800b4dc2aaafbc837f9ece7a9111f3ba0309196babaa6b63ef0fedab779e0d352933536520e4ff1c7f079505ead882adf0 -AAD = b7219b5b1801457d71cfbe342148849622592c40 -CT = 2caae5923cad79802d682172f58191349240a24e25891461ae65394b95413b34e03f3551baf1a055d22a53a8a38f8ef78f6d40 -Tag = 10769ae854f8298cd94c28c3e28e94e3 - -Count = 6 -Key = eaf1659e08d0f22a7042358ab0ee0f0d -IV = d6911b68856038ef9dec1215 -PT = 0e71b3765f17e016c3024be23d0af6cf50ce98d86943b38cbbe8f3dcb540dda64b77bf73c7cda108e1a5c4bdb590a7f747ecfd -AAD = 433ae638214c48207fe9cdc76ef99e28913d6a8c -CT = bf4aff65fb7df0858962474bee9fbf95b0f06637c7d72bb1cbabe46662f455d3813665477b4badfb206a4d8f01346119e559ec -Tag = 866f204b04a309d45e65ea890a17ed0d - -Count = 7 -Key = 382697fc2ca220a5d6a700f7fadbaae5 -IV = 3fe9d400d10dc33545d6cc5c -PT = 7d187a1fd4d518197c1e843d613797d4a9fa9da6fe9f773b947dcc0023c43e917df575baadea90237d95f88c54692ef8be672e -AAD = a3cd4b0216378918a46252ca16f2ac9775e993f9 -CT = 8e640b879d473d7ce6689175808b925b6ba1177ad8b0c53208e1b7c6303844f52c8cae5791d0aeceea028dac107fad5e80866c -Tag = 3849e4fefcecb108f83ddc039a21dd91 - -Count = 8 -Key = 186f6a73ac82e33f69c5b158c7ee1cbe -IV = bad41bfe8b67151131e85b2b -PT = cc4d9dc2df86165343aada60cb5c1d9f991331d530d860dbf9166907d394721b2a22b53a6b070c5cb32ba3788ff55bc6a0d5f3 -AAD = dab496ae14125af2fef47ee3b226a6c92e99b9e0 -CT = 41a17c3b18e67d84bfab344bff1429a87c3076879ea42383d1e622e710a60612eecf2fae8a56a95a08c958a52f873ecb303785 -Tag = 335015e14d2cd8eb9813799c5c703a89 - -Count = 9 -Key = 14ba3901daf9db40d5dfbd828a361ab8 -IV = af37192707a3804beb57c836 -PT = 85f016f83ceba76a068e5def3ed5ebac85e203c69e32676550c6ed864edfd2ccb2c8da415a42cc6ead791e869296091efe7ca0 -AAD = 1ac4a38e83649004727d2b2b71075264cfcade09 -CT = 2a682e5579d7f801fdbdddb2b5f8564c9e91c39cde47c48ac1dffdf7ef1674ed937e77215691110ab730af97349f84128eed56 -Tag = b1b50298f48b96e679c3d71f3d17d623 - -Count = 10 -Key = c0552b2f54f4e8292119dbf61285fecd -IV = b5a580ec23753690d6c7392f -PT = 88c04f3421de415f9ee9b47e033666c0d182d04f38e6faff5fee5ec89d1bd391079e90fb22c537efe4561718588eab313cfd5c -AAD = 46cad83fbea4c47b9374bacb072472edcece9acf -CT = 2ca83a4a63de404ad2306a4918420fe3105cf7f9a52d16aa610e3b69a0fed246da41768c801c19d7502ccccd5ba0a1bc0b50f6 -Tag = 8c03304e8a74dd52d4e3baec89cd397d - -Count = 11 -Key = c6efbeedca979cb2c4fa5d6454a77dc1 -IV = 4e57df4988d93d13dc512487 -PT = a52077491b20ac65eff89bd0bdb6150ca755cf469c42ebbc5c95bbcf3aba91a9002bf386fc9a126fae73dbb2daa7ceb79d0b5f -AAD = 9e65d0542711fe57abfda27587ef4161eb3fe32e -CT = 4dd803cf6c99d2ce3ee8a1996f52837e52c3bb386cfc2792318e1ba64c35b638c9508b2e21d1da6e635e59e37c02c0b0a2529d -Tag = af847ce419fa54045a8bf31062f6d349 - -Count = 12 -Key = 3d68401d7c5f5c0a2529ede00724be14 -IV = 3f3eaf76e786e8af54baa56f -PT = 8bfeae1dadfc55baca191a6a3f54ab721862c51ce684e4aea6e9a3e2f3d2aac14af1cb0252f29a4c8c0984ce867acebc7596c7 -AAD = 6a6e3ea815e01cda78a76b0fb8bdafb8a25a6b7e -CT = 8a62b81a69e6e104dc075cc32730ffcb419b9f41711e06d7c2d9e891a88dc6e88817cf5bc2b87e95c4678daf0ca4b8f1e03927 -Tag = 9eebbcee46565fd4c34b8f47bcd94b31 - -Count = 13 -Key = 0657bb596cc28eafd51cc09a3e6ec1f6 -IV = 8e11a0625fba51698614f8f9 -PT = 435f16f56aa71734dc6571e2714207f7ff85c7eeaa1879901f2ffa00ea45038db54329f0a2e78ac58a5d76314788d8351777fa -AAD = cf73715474e49d71f4f5ad08e209ff9774ae9639 -CT = d876339f0db3bff022cb4504fe0a8ae26040102f575ecd4e4583b04959976254d07384141ba5748d3579815e3b5e1d1e8fddaa -Tag = 7e6f7096e425911fe739ac90cca05fda - -Count = 14 -Key = b2c645e0f2dd0d21e9511364f9355919 -IV = 91f6f089f5e828d6fdf12510 -PT = 3c01159e4787a74a707b4ead3be126b819831296821f1add394762ac97599cc810bd97205d0743548e7150bfbe6d9c1ba5d581 -AAD = e6781ff89032df5e5398108f1d569d7f8327b25c -CT = 1a06dec18eb4c9b361f1f2ec6391daf275f15d97a7f1a73fbe1d144bc1e1018200f725d52400c693a438edb595fd4558c4227a -Tag = 451783874f9d925328208bc4c56eed33 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 384] -[Taglen = 128] - -Count = 0 -Key = 3c50622868f450aa0928990c15e1eb36 -IV = 811d5290768d57e7d87bb6c7 -PT = edd0a8f82833e919740fe2bf9edecf4ac86c72dc89490cef7b6983aaaf99fc856c5cc87d63f98a7c861bf3271fea6da86a15ab -AAD = dae2c7e0a3d3fd2bc04eca19b15178a003b5cf84890c28c2a615f20f8adb427f70698c12b2ef87780c1193fbb8cd1674 -CT = a51425b0608d3b4b46d4ec05ca1ddaf02bdd2089ae0554ecfb2a1c84c63d82dc71ddb9ab1b1f0b49de2ad27c2b5173e7000aa6 -Tag = bd9b5efca48008cd973a4f7d2c723844 - -Count = 1 -Key = a7268c7ef7bbc2be4a3ffc282019fba6 -IV = df2c5bd03f2cc45a07173144 -PT = f88beae931a68ed813a35bef54bd9999fd23ce4a1d258e34fac184ba799132a408bde4ced23748db5b35ea9692f4e1561d4cdc -AAD = 445b4ec6c505f132d3b012df624fe8f6e9cda0d8ec5e1ef7cde8b89259e167d68c1fb4dc4a78e5c59377f32ef5cea4b9 -CT = ea53e264e1b0f67ee37c81234d3b9c253ab1a94a4ad17779efcbeef0526129b0fd224b5884eb8b38e35ce0bdda222e30f576f3 -Tag = 38b5ef8d660f856d495db50f702bb462 - -Count = 2 -Key = 183dc6bc9a497304011e5aa41dc575b4 -IV = 0f4e2961d8ac4f81f559de7c -PT = aaad38b847c7a6fce801ff4ba62639592c487382e7e3ab0f29d0dde432f31028c0b14c67c15cc3664c660c197b4792433924d4 -AAD = 8ade36c0d68fa431838beb9f1d6a422365024bd5019979fa9b09b7c44b785e051dded5c9e21f342cf376e72cdae95207 -CT = 38e09d7612a536a80d2e32a46b0e1e4ab1e1022e854461aa7e695d7aa4a003e379c0e270face29e19d74d40a60fb2e8c726aca -Tag = 4004e9763f4a7d0fcb0ba57c7611f281 - -Count = 3 -Key = 047dcb88c16bd0d32d9a6272b079e379 -IV = d174ed8d60c0d5c814dad4f6 -PT = f957104f1fd87e9e1d6d35171a1cbe8fb22cb4ea7aba31e763e77c6f291db81c63c910cf9b8d37bf93fa28fd4e2808480b5836 -AAD = c6567022bdb5f2f3a1e3d78e0202a5f6b457c0ebf46a4b0620afa2b5ba706f1a37f932058afdb8cf4eb9a3815ecad445 -CT = b7f83cb77ef93895a6721dfafde8930090d2a9f39a1d605bbb8d7fe0f0fa838fc6d1f0e5e532592d0c688231e24139e635b502 -Tag = 452368d42f8a1211b4a018ad1acf837d - -Count = 4 -Key = 7286fe98ac0c03252f3ab7eabb8988eb -IV = e32e708c6302ce26902bd599 -PT = 58fad037e6efa65630ca14698725538c686ced497c584afad218fa3b753beaa7a72fab9c4c108ad14bf5f024613f91a1155679 -AAD = 4b9003a0259ed70aebfabc90abe750b888e9db453d9f95790d752d4ab9f208ee478046abaa9b2bf24564216071613297 -CT = ead0bc4e5902600598f9ca9e91cf4543420cd64e281a710fe890e0cffefa803d8c046390da6f50fd44b7e87861ac4088b5266d -Tag = 970659d5170d654b55ca5f79a9e06957 - -Count = 5 -Key = 0dc3090d2786eff167b291e895ac2261 -IV = 6ac8f3a8a61448e1fec06d6d -PT = 3017261d20002fafdae4252dcc9b1214e9a9ee959533d34aab136249ca4ef52ab205ea69efe6fd21ed3c90f8933593fc63454c -AAD = a85588d465b1ec2d935ce1ba5d6397bd57055915329830b1aa4a934f2080ecf48ab5f6269ccaaed8a10f398be64cdb8b -CT = 1fd7efc41a54374048e5d2a196bbb5b78452639db232c4c106fa8da6b1471ac14aaf2328e959a9c55f201d7271451151bfb48d -Tag = be7ff0322d4d42009dadf48e5aa939d5 - -Count = 6 -Key = d169282809ddae3384a10b908b8526c3 -IV = c9448a902e05f8ab10ad92e8 -PT = 490b469f84939d62e00fdef53430232e5b0ef130d586bbfa8a3d3ba30d91614b64e0da092f16b83a46c9386ebed0bf9e863950 -AAD = 71b1efec4e50041d0446e03b07ffdff05c6259d90aa7b33189e95360bfeba23afe914d0f17db6ba47ea165cc06d501e7 -CT = ca693b2350d23808840870c2371f49eda453f2e189c70b975af2531b9e8b0d8c262829e61f8990804844ac941b2fe47399a88d -Tag = 8bc9e25a568987b427cfc5b42e412d7a - -Count = 7 -Key = 93814839da20b560268ad8fe257a9372 -IV = f157ac4a83a7b73b8085085d -PT = bbad922de6dea7153724a333554e1aaf2e37aecd182b45885d04f3d11c3763fe59c26828d30c9da95adb75fbd5fbd2e6ece12c -AAD = 9b422e74f2109925264c1c0dda2b68c979afdac110e42b81afd2c59e2df3ff3f93832552b626b3821212a3e20c401949 -CT = be069b414d93d4f641b053f1ee7a61e23bf287a63b1d06c05393e8faa5856d22724bfc511a306ae4ba12c0a051b479e35c229a -Tag = 53a62f9431b8e6124c9bf6298f1b2880 - -Count = 8 -Key = 3262f2442b89a3641456cfa3d4d186fc -IV = d0fc4f8f7bb74a1763862407 -PT = fcdd7cd83a366f94289d8b470345fccea2aff778edd9f60c6d8273b3277a843965f0d4ff8be1e61ee82caae8754b87e747b2d5 -AAD = bee1c8ed52bf347431babccac2a64275224045d5c1122eb8c2ac3d8791a5a9c37abf050c406ebeb947428bb60d58d062 -CT = d0e5cecf32ef65035546cf8a99dc7e6f4320376f8e16a51958dc796c9b9a37a0d74e7b9979a0ab5b88ad92988dc184b964a11f -Tag = 37c52cd41ee2d519aa8363b186aadcc4 - -Count = 9 -Key = fc937348a4468afaa629f158dcff5a6e -IV = 783aa881ba0938ed8fe8ea30 -PT = 0db6285ed23143762d6e9b708f0c84ed3f48d51e8b3da549f1ce130bd434d0c38238d0e2c6e2b7f6a35eba2cd84d28781dff19 -AAD = 31b2892a669cce974c2b467d84c45189b335a5943d43b2f158d5c173be4fe31f8142f1b697c772f175a65dd87ae5fb52 -CT = 29d665791fac09a72dd2178d69de16a5ea3432bf70acfaa174ec4cc93df7efff5f3c057c1ffacc80eb2991b1c79ab565c1f97a -Tag = 113a2dd0be60dd45ea4f3d8b90c1122c - -Count = 10 -Key = a9a33b71eb81d091ac1d15e48a19a067 -IV = bb86b999753142de6573e863 -PT = 910246d2435786fdc8f950a0e3a79d081ea1c41eebb875de2eee9daaa8250850f636522cc953419767ad24982bf14427243971 -AAD = 7a4ba8b30eeee2f457b74699d2ff77d8f9912f09757972bf8e5e8ec37684a8e1523b0afec0aeb5fababdd945fb55eac4 -CT = a4cb039956e398846bac343db72b72ded486f64fc58c8b3c3d8fbf1f91b00f4c7c2a560f88f73b7eda4bf2bcc9d4f7a6c62f9f -Tag = dd594f34a29fa02af3accf567d7c5206 - -Count = 11 -Key = 7cb2f97b5609e76040712a95bfe84fad -IV = 1c2398ea67c1246540c469ab -PT = ede4b5732c8fa7bebc87f72da2e243dd4173ddad700bef65adeeaa0c570392fc477b3d2b7d404bea40074a6d58a00f2466c1bc -AAD = add3e89872e09f64d828463d5df7519de1a9db7639229b67901bd27ac3c3ea61ac1612067d72037adadd2e14475584a8 -CT = 6c6dd8a691eb22294818e61e33afea9e49353d1bb6f645e821d7c4c31fb440dd8cc2651450a764a22038978651ffd33d4be108 -Tag = ea246bb5e2ab3282c27927cd983a7297 - -Count = 12 -Key = 402fc879126ff144792af40975f0a24c -IV = bdbf6e81feff5a11df17e205 -PT = 8c60dce80b0a5ef578d680d1c811967265cc7664c751faf4d1472dac5b96e26e3be439b19e3da83b1a19dc82ba00d435e03342 -AAD = de8443df44d93b3734d8820b9a26010d6ce09c1bb9a02260235a40299d38330f67792d0f54c0c0fb35ef9febcbccd02b -CT = 8753e01ee5c088bcae1309b2e4269d9fb15491831a1e17140808f30aee4fa528020a7fc7df8627cda9b7401c44b15aa1e7c644 -Tag = 0f457c92a99ac1eba1b6105d6d23ce53 - -Count = 13 -Key = ca5549614dc0324564002139fd6a360e -IV = 8a4de31b0ddc6d2a3570fac0 -PT = 37610c187d287982e9afc15a9250aeb91933369dedc5910e4de584d70c27b7e4e0a7b02869299100fd8ef75bc66ae4bed2a853 -AAD = 6b88709627c28825569d60772b6642a9dadbf3ea9904b290dc632a837d579d2e81284bf4350923c1863e0e8d5894a34b -CT = 29505af512768c89d84054cce8f8889e9b4a095098b9cec7e26a6afcf7aee5132fb43caf7edc068fb6aea3570ad9310a5c3329 -Tag = d0918033b6db5f999f26bed94d352af6 - -Count = 14 -Key = a68b64267d0d1bc2d94b9f691ff8e9e4 -IV = a27706bd8eae8bb3dc95a1b9 -PT = 4a99ab41c604d7210069d9228dd3223b6f7da215ddda16cf93bf6658784cbbfe08ef6a0152cef368415dff9f8d1d05ead043f9 -AAD = 8734fa3cecb5793b2b7bcb4fcde7808303c27c2c002a27e0dbaa378b3df4909e37c238a24faf49b6cd134419948bdec6 -CT = 43aa0432a1b468bec64de45b66b5fb3e8b2bd9277801ef53a1cd6757bfd45aab9c6b23f0a1f4b30fa33fe52fabe7bb86281964 -Tag = fd39ef2e94707a1aba57ff2de7c17927 - -[Keylen = 128] -[IVlen = 96] -[PTlen = 408] -[AADlen = 720] -[Taglen = 128] - -Count = 0 -Key = 2c1f21cf0f6fb3661943155c3e3d8492 -IV = 23cb5ff362e22426984d1907 -PT = 42f758836986954db44bf37c6ef5e4ac0adaf38f27252a1b82d02ea949c8a1a2dbc0d68b5615ba7c1220ff6510e259f06655d8 -AAD = 5d3624879d35e46849953e45a32a624d6a6c536ed9857c613b572b0333e701557a713e3f010ecdf9a6bd6c9e3e44b065208645aff4aabee611b391528514170084ccf587177f4488f33cfb5e979e42b6e1cfc0a60238982a7aec -CT = 81824f0e0d523db30d3da369fdc0d60894c7a0a20646dd015073ad2732bd989b14a222b6ad57af43e1895df9dca2a5344a62cc -Tag = 57a3ee28136e94c74838997ae9823f3a - -Count = 1 -Key = d9f7d2411091f947b4d6f1e2d1f0fb2e -IV = e1934f5db57cc983e6b180e7 -PT = 73ed042327f70fe9c572a61545eda8b2a0c6e1d6c291ef19248e973aee6c312012f490c2c6f6166f4a59431e182663fcaea05a -AAD = 0a8a18a7150e940c3d87b38e73baee9a5c049ee21795663e264b694a949822b639092d0e67015e86363583fcf0ca645af9f43375f05fdb4ce84f411dcbca73c2220dea03a20115d2e51398344b16bee1ed7c499b353d6c597af8 -CT = aaadbd5c92e9151ce3db7210b8714126b73e43436d242677afa50384f2149b831f1d573c7891c2a91fbc48db29967ec9542b23 -Tag = 21b51ca862cb637cdd03b99a0f93b134 - -Count = 2 -Key = b818752aa4452120808c3d211d57c224 -IV = d679a0be22c2daf619b11463 -PT = 7ccdecf13130c20f67dd6f47adec33dfb52bc84a7700431b7fd398d652a123f086ae197328cfaed127a91866c95bdfdb4849ce -AAD = bb853b60b5fd8bd24acc9db9dd3de48b775d4a5cb2a879c1dd78bde94cafee06db12a1574eade205dfd3a8c6f68599e120ec73b6b4559cd03d3118b2b1bbe340bb15320c6bf8d8a1c3c1247b4023ba2949ba6a5ab13f2d85b93b -CT = bc1a886c9e5accc34f0c237f7ed996e940e4b0ec882638e69866ed24d86467f5433aee23448df39565a0ecfff2c40e6857f725 -Tag = 5ff9c449d0bfa870ebefe78d519a8d12 - -Count = 3 -Key = 528b8948b534d5f780ae3f1e23a47a25 -IV = fec5eaf0a6d6f5c4adec9618 -PT = 9c5280591311dc212d6ee2ad8b83dedf03b91e244d8a42690c9a5821ab971453c8b4f63e15bb8af96aeb4a3e35515b651bc68d -AAD = d5134d84a96921537a17869c3ed08c55c29e0a67a30943cb248849843794c1c6fefc98659da9b0f505bdefc2e4ebe9523d2a165b63b5e3b2ba9535821d62aaf95b9c7e6ff1f8807a13e79b9fe589c0d9febbabf9372b01ac2051 -CT = bdf0b752160e64b626d5c543954570169e28b033f77b6ef8a37bcbae2a294a9e7060c3235b290f79c69c39a66b0d5ecc81d02a -Tag = f93768c97781ad0486f2f9e8210f2a22 - -Count = 4 -Key = 824ca85e2e4b2a6c6e6a65ef8616c57b -IV = d2bf92e7dc53676aac4e6d1d -PT = cd4828e5977d7fc5bbf7f6d1870bf6333c204087639a3b494a4037170b73fc6b32c4555d1a02a8837441734d6835a54bf35a44 -AAD = 465afd08d7260308d8d21025f31570e5dcd6bcbd6520ecb6ff85de58378d5af6eaf7cb2f1242c0c47b759c58dbc6e4b45c8b993514f14b82eda3fcb6a0df2075a0ab76fa0c5b6cb37d1d28f773dac591790887d2d72f03bcc5ae -CT = 4da02474ef189de863d53323ff6737c12efb3d60a890a8d53991de57ffc6cafd44c429a762a2154c5a937120db2161f2cf2ea1 -Tag = 949d399a7e2567b275c6f842de602605 - -Count = 5 -Key = 4f60b753a36b4b1f2e4d8300ddc667a5 -IV = 35fa2551581f8592134bba45 -PT = 83807c042900611f50fd42557b7cf66315872225143d2cdf8c05ccf688ff21da8f6a2556b0051285b8e7cb8aee05b72816abd5 -AAD = 9a006b7cea27f3b4a305ffb0c5bec7e3582c6a3be028ebf44bb2496dae1f492f765cc66c82d3a2212abd6142524e0727dab8ae506e6d5b9dd361e3a37df3bec95b14f1174e7f25c656aabb42981b91950755281c5ef8f52e57bf -CT = cd2291ac182ab6d0f7b6b93e67abc4228ab63a4c1b214caa11698d40d2a8aa10164b48624d39dd967f4c35eebf09acdfe59f45 -Tag = b231bb4e63dda90a11700f204dc2b175 - -Count = 6 -Key = 07b122a618bb54b8c39d579fe5518a5c -IV = 26fa33d4c5b37f0c5d07e2d0 -PT = 06cf2fa1c9057d4974ae9048b4878d75b0b4720ed2d7c340e6d983a7cf08d20013abeef881cc3213fe25b3f6ac1e17fe1c2e11 -AAD = 20966308f57d3a3e7a4ea149cc1f3edeaef11e8af780a16534472d8df7f706152ee376614426094fd745d77cdca28682d0d2e689d28a50610168d638b23cb4dffa95dd260bc72e0098722cd00126a07fd23ffba1d10a3ce46b85 -CT = 61a69d35967c85dd5e0741a9b88152c3b04b1824930cf6c03f1cb44c1258b71fa3f5233d2f4ee256353c0b8f6d470b53d7811a -Tag = e98a7a33748de95e22b520ba2254bce3 - -Count = 7 -Key = 288e7efe62b93b990f2398c2460e415d -IV = c7ebc0cd756d9501faf71a7d -PT = 5fafe873b9d30771f2ef8dad397a8b42af3fc8f7ebbea80d0132e1af14269a463dbd87e3e01a58c2d991eb3badcf156fe8260d -AAD = fcb20124c58b29ef7e39800d1e11c4063774dd2c462dd9e07d140d9f4b5ebe4cba7bb8cc03bf357b22096c9897cdcdf112b7a5f7d1e38d5c74c16924522cbe2443c157cc93146c12bae4da2b2f1df07f334aa1cc99fd7f7e2899 -CT = e5e69100c77d57e05a41b28be74b1c8542fd1f15e73fc589535ea1fac2d263fd92cdaa9908eab6ffd9194586aa3fed5fcd109f -Tag = 537516fb827cbf6ce0500c6feff4db34 - -Count = 8 -Key = f66c5b44e7a9dade5765c3f64fb2bab9 -IV = 3482a46c8d4f173e62ce1dc5 -PT = 80501408e23e2a656720b32b9f41f542fc64e9e8d824af115ece88d551a5f5d5f7fdb67e2339fc263dfdb18a78d423fd868caf -AAD = 1e77645efa4419b2c9696b8f989051929ad6a01fe2223ae68325f8176cc467fffbd198e008904b82af6469a3bbb095c4d00cfed143723ed6cf6ba4198c40eabd05c03e0260f8b2f55038e5c382690886280f6989357c50f74fe5 -CT = e778a946529444e2656505e4f5f6519d3ecad5458f8f1a04f31a8af97ca185ff717764bca6e99258a24dc97c322ac1c7f54fba -Tag = c5b2cb532cd05b162b47e94f6d79cb8e - -Count = 9 -Key = 41e8af55426edbe8f0339d0fba400497 -IV = 07eb87d42e90a075d4b34911 -PT = adc5504d0a9735d7b73fc53bd0ff60f2c881394fdecfcce3483efe126bf148e48db9c0fd356f82e62d743ec09f8906431eb5e0 -AAD = bb2e5c52f2eacc9b7706a2efe4b607858922fd6914a1e22dfbecab2a06464942f769a9c544f046b88a7570e2cf6fd8146c86b2b4decb934f04a81e6d48affbce1f5381ab31a9736b63f5a4e744731726a36357e858c0980d3732 -CT = 040d99698b2a5e0169f6f94e61159c135fb19c5917c015aaf8ebb4a451ffd8347428ebfdd80c83841d299318084c779dc91b0c -Tag = a16d6267efaeec13d6bc281316ab8be7 - -Count = 10 -Key = bbf947c0e805ac0641d540b471eb9d26 -IV = b57daf0004f43821f1ba86de -PT = 1211e9224ebb862f2d27de692362324942da12da441176c4742a228d7928d3c1fb3e83c66d68c619a10911fc2ed90226d4ae48 -AAD = e18d861dc9bb35a9efa63c7c1deaf53910256809a477f1c3db893b2389f1d137659033a5841b888cd6491bb574b782dec2c840f6350825406387d71340d275e62af3cc070c1389375d81ce98ad37c7afcadcd79f1c520a462e7d -CT = a6f6aa1750118b402ee1b5f025d29007e3cb162ad9e363efb9ef2d24c850f62db925bbb7e9a83ca6cd6f74251db72622857b29 -Tag = a72dcc29d358f794361f84202c9832f9 - -Count = 11 -Key = a56f4de6772b1242f1dff344ec9b512d -IV = 94d228087e821e301409f305 -PT = af537682c419eb7ca3fed65bcc364b01efc2455ff65128dedc88f2224603ef3d7246622269a12b269bbf6ac9d2d3b81abd366f -AAD = 6a9c61dbbfaa20a13320a5f1dead28bfbe5dcbe84fe0a3617c348bd702fbe746f439dfcabdad22ac2fa629793f545bc68459f1c0462453b5b31b747c3d29614f0ccd0745fbaa4b204d47d5cc7db35d6bc44bfcecdfae910faa72 -CT = 55b60587eb879105ce4a36555d8f799618238bf1f7fd4df622662bd07f450a18375ab7eef02a8036470428c4834f881bf05cd4 -Tag = 8cbe48d46b5c1296b05b2b6f4b24f7c6 - -Count = 12 -Key = 766067fa8f0dc348b77d55ab5317a609 -IV = 8716219953becc2d8918f3aa -PT = ab910f7300ec6bf57d7baf2b4474a26a7d7dfcd6b1044cd0b0b32995029a70627f8d2554429e13d14d78950fb1c79ed1f48c32 -AAD = 8106f9cacb894dc2f0c93c67cc06cd54af6c6d94193bd0bd9673fc702fc6b995941476f2dc584ff753cdf24517c2153f1e1c6e37fe6d86c1e4fc63bceb25749f9372d62a1932749dd21ef6010b2942bd0464bd64171063a778a0 -CT = 8bc822183f9e42f05429e064934d9f84dfe1713d71690e68981f94256fa4a60736607c5864e3b05e3730caed80004a9bb3adb6 -Tag = 439b0bcdd24a87429a4098fd8a05514c - -Count = 13 -Key = 557ef21e91f108f6ab451980837cf029 -IV = ac1010f6dcec713cba17cb13 -PT = a2ae838532cebfc9ff8fb62242b84df706ad1777a62f54c64d9b1777bdc0819438d34aa4c1906e0fae1e845b32d8fb65763dc6 -AAD = 5d09aa2a302e3ec2bd71b25d52053463c9c38a3b460f7b980aad6c91d5011570be8c23b4db518701f4c5a157882695ba4ac140f94bda13d9824a8976d436492baaae6c4f8367683199695a1f6bcda2f645b188aa5c286fb91c8a -CT = 94c1941887ff94f34cb96cff2b6a25f660ce9b3ac54963960e70ee49500dae6a20d3307393f37d3a4a35c13b58f7bff0f5de7b -Tag = 95e574f70f5efa14b8ee21961972ee3c - -Count = 14 -Key = 55c8bcb0021090e4b2c785c79cb966b8 -IV = 5e9f1313282f73d7ffb92837 -PT = 2d7c1b689189bbfa2be26ad5c1f296dee4c0f61456ffc94cf8e70aad0f09d0608c4115aa6ed5eba93ed5820b3f3426bbf4d64a -AAD = f7e14a57e3bb6b99866b90573d7bc355baeb7ac347e43d0b65d97ecc2eb9c772401a8e3c7e9e2871c2b79579d44c139e62c33b42a9e0c87686960009d659d5e3874e168c334b6650c6d36168633757a7c20764232ce94a0de1a5 -CT = ba59002df3394c5b80983519dc163eca5c44df80f8c4c4e15d3ff73f13c170c80a59d87a2165a7b450be01031a8e41c505c89f -Tag = 28418c564731bddf3d504d8ed32e66ee - diff --git a/unit_test/ciphers/itc_aes128_test b/unit_test/ciphers/itc_aes128_test deleted file mode 100644 index 648bdd19c903ea24ebdcbb4db6f5e88914709d7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18032 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 -#include "itc_aes128.h" - -//represents a test vector for AES 128-bit encryption: -// - the 128-bit key -// - the input plaintext -// - the expected ciphertext -struct aes128_test_vector -{ - unsigned char key[16]; - unsigned char plaintext[16]; - unsigned char ciphertext[16]; -}; - -#define NUM_TESTS 4 - -static const struct aes128_test_vector test_vector_1 = -{ - { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }, // key - { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a }, // plaintext - { 0x3a, 0xd7, 0x7b, 0xb4, 0x0d, 0x7a, 0x36, 0x60, 0xa8, 0x9e, 0xca, 0xf3, 0x24, 0x66, 0xef, 0x97 } // ciphertext -}; - -static const struct aes128_test_vector test_vector_2 = -{ - { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }, // key - { 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51 }, // plaintext - { 0xf5, 0xd3, 0xd5, 0x85, 0x03, 0xb9, 0x69, 0x9d, 0xe7, 0x85, 0x89, 0x5a, 0x96, 0xfd, 0xba, 0xaf } // ciphertext -}; - -static const struct aes128_test_vector test_vector_3 = -{ - { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }, // key - { 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef }, // plaintext - { 0x43, 0xb1, 0xcd, 0x7f, 0x59, 0x8e, 0xce, 0x23, 0x88, 0x1b, 0x00, 0xe3, 0xed, 0x03, 0x06, 0x88 } // ciphertext -}; - -static const struct aes128_test_vector test_vector_4 = -{ - { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }, // key - { 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 }, // plaintext - { 0x7b, 0x0c, 0x78, 0x5e, 0x27, 0xe8, 0xad, 0x3f, 0x82, 0x23, 0x20, 0x71, 0x04, 0x72, 0x5d, 0xd4 } // ciphertext -}; - - -void print128(const unsigned char * block); //prints 128-bit key/block & a newline -//returns 0 if equal; non-zero if different -int compare128(const unsigned char * a, const unsigned char * b); - -int main(void) -{ - //array of test vectors - const struct aes128_test_vector* test_vectors[NUM_TESTS]; - test_vectors[0] = &test_vector_1; - test_vectors[1] = &test_vector_2; - test_vectors[2] = &test_vector_3; - test_vectors[3] = &test_vector_4; - - int i; - int pass_count = 0; - int fail_count = 0; - - printf("********************************************************************************\n"); - printf(" Validating Encryption\n"); - printf("********************************************************************************\n"); - for(i = 0; i < NUM_TESTS; ++i) - { - unsigned char output[16]; - struct itc_aes128_context ctx; - int pass = 0; - - printf("Checking Test Vector %d:\n", i+1); - - itc_aes128_init(&ctx, test_vectors[i]->key); - itc_aes128_encrypt(&ctx, test_vectors[i]->plaintext, output); - pass = !compare128(test_vectors[i]->ciphertext, output); - if(pass) - ++pass_count; - else - ++fail_count; - - printf(" Key: "); - print128(test_vectors[i]->key); - printf(" Plaintext: "); - print128(test_vectors[i]->plaintext); - printf(" Output: "); - print128(output); - printf(" Expected Ciphertext: "); - print128(test_vectors[i]->ciphertext); - printf( pass ? "[PASSED]" : "[FAILED]"); - printf("\n\n"); - } - - printf("********************************************************************************\n"); - printf(" Validating Decryption\n"); - printf("********************************************************************************\n"); - for(i = 0; i < NUM_TESTS; ++i) - { - unsigned char output[16]; - struct itc_aes128_context ctx; - int pass = 0; - - printf("Checking Test Vector %d:\n", i+1); - - itc_aes128_init(&ctx, test_vectors[i]->key); - itc_aes128_decrypt(&ctx, test_vectors[i]->ciphertext, output); - pass = !compare128(test_vectors[i]->plaintext, output); - - if(pass) - ++pass_count; - else - ++fail_count; - - printf(" Key: "); - print128(test_vectors[i]->key); - printf(" Ciphertext: "); - print128(test_vectors[i]->ciphertext); - printf(" Output: "); - print128(output); - printf(" Expected Plaintext: "); - print128(test_vectors[i]->plaintext); - printf( pass ? "[PASSED]" : "[FAILED]"); - printf("\n\n"); - } - - printf("Testing finished. Passed %d/%d cases.\n", pass_count, pass_count + fail_count); - - //TOOD: performance testing -} - -void print128(const unsigned char * block) -{ - int i; - for(i = 0; i < 16; ++i) - { - printf("%02x ", block[i]); - } - printf("\n"); -} - -int compare128(const unsigned char * a, const unsigned char * b) -{ - int i; - for(i = 0; i < 16; ++i) - { - if(a[i] != b[i]) - return -1; - } - return 0; -} \ No newline at end of file diff --git a/unit_test/ciphers/itc_cmac128_test b/unit_test/ciphers/itc_cmac128_test deleted file mode 100644 index 07d6f03be6fd9056b66ccbaefb6bb8338bb63921..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27536 zcmeHw3wTt;+5hY&;Tp0*P$F1e6%?(+B;4_~fgD^gfe4Ak7F;&F8xl;i>0Sa@5p+Sb zhA3JuRP9&V+KP&r`dJ#Sl5i=BiZxobSkXqgxFJykc!`MY_j~8eoIQK8+po{_f4=|o ze9y;d&dmJY%e?c>J9Fk-_OM1NoNYFlm`rANHKW?v!8Q)5N5(SUyehD1Y%sI2bJ-X+ z07x4CY@9;5T9SF6P%ZO8f-ePmD*mRKRbZOg#tSk(M}?WprG=DJd$D8_MK#}gwOW-q zV^$839NC&Vk5`c|Ecp)eA4q=$gW&fye^j9MEm6&a)QQbxv zE8xdiPP~+g4+Y#*E||`%$ZfnJ^K{Xk%%$A*kRv<)-IOU97l`(f`K4F1Cv#C{mseGm zO__9gm3u-}WleD9gq72#Oqen$+waZJc_jWQ28bT)IB~&e z?=CsI;z`r^5jQpl|M|paT_h|2Q2e*kQ{X%!0r%`A`0ylnP7?g?BzQ0hJ~;`#I0;T+ zmdO51NpNoxe0dW5Ip9|O8Iub@qIN?`@cWYB)+G4QB>34$@LQAM3~}e8Fq^{4y|tbi z<`4L4T-CL#*5mVeeazvg^m|>?r#t+9m$Rmv)dmB8fc}8fb+f}&akHb`Sy@G>tHMd# zPQTyd3kcL#SraHHjR9{JEBAQIS@|*#?q>w+dS zjM{;=YG-8)EBARkfR|N!YXt0I*A~v1Im?lkJyk2^PST38QeHNN4KwThOVO2yl8V1H zff26>2+bEcuSZo@4x^QFyTBf}?;$J?sjOYpM{;@!`2UozZ`0xWb6q9C}R~moMKp}S{ zT{3Of;re;JMTd`&%*dN`IIYDp*+V^p>`Xf}Qq3){X_4}z#L)^8L*YBn}4Q*F3uirs+8qzKsuirv-8p^I5 zUiVR*hOo=Z>&vN5L)Vqb>t$4@A?sqi{$r}sP<8d50x)g?)oF;jI(dCA)oEzDI(U61 z)oDn&T6uj2)oCcYno!UEY)<&Co9y9F?4g6b#U*pvTG!^-n7wUBCePYlzTCzl7o(jo z%Pr>>FxLDg2CmdTp&gk$)R$ooAF3PE3~hY4hA(L$LbMai>j-2^cF`!6XUqC_qL