Index: libsrtp/crypto/test/aes_calc.c |
=================================================================== |
--- libsrtp/crypto/test/aes_calc.c (revision 0) |
+++ libsrtp/crypto/test/aes_calc.c (revision 0) |
@@ -0,0 +1,119 @@ |
+/* |
+ * aes_calc.c |
+ * |
+ * A simple AES calculator for generating AES encryption values |
+ * |
+ * David A. McGrew |
+ * Cisco Systems, Inc. |
+ */ |
+ |
+/* |
+ |
+ Example usage (with first NIST FIPS 197 test case): |
+ |
+[sh]$ test/aes_calc 000102030405060708090a0b0c0d0e0f 00112233445566778899aabbccddeeff -v |
+ plaintext: 00112233445566778899aabbccddeeff |
+ key: 000102030405060708090a0b0c0d0e0f |
+ ciphertext: 69c4e0d86a7b0430d8cdb78070b4c55a |
+ |
+ */ |
+ |
+#include "aes.h" |
+#include <stdio.h> |
+#include <string.h> |
+ |
+void |
+usage(char *prog_name) { |
+ printf("usage: %s <key> <plaintext> [-v]\n", prog_name); |
+ exit(255); |
+} |
+ |
+#define AES_MAX_KEY_LEN 32 |
+ |
+int |
+main (int argc, char *argv[]) { |
+ v128_t data; |
+ uint8_t key[AES_MAX_KEY_LEN]; |
+ aes_expanded_key_t exp_key; |
+ int key_len, len; |
+ int verbose; |
+ err_status_t status; |
+ |
+ if (argc == 3) { |
+ /* we're not in verbose mode */ |
+ verbose = 0; |
+ } else if (argc == 4) { |
+ if (strncmp(argv[3], "-v", 2) == 0) { |
+ /* we're in verbose mode */ |
+ verbose = 1; |
+ } else { |
+ /* unrecognized flag, complain and exit */ |
+ usage(argv[0]); |
+ } |
+ } else { |
+ /* we've been fed the wrong number of arguments - compain and exit */ |
+ usage(argv[0]); |
+ } |
+ |
+ /* read in key, checking length */ |
+ if (strlen(argv[1]) > AES_MAX_KEY_LEN*2) { |
+ fprintf(stderr, |
+ "error: too many digits in key " |
+ "(should be at most %d hexadecimal digits, found %u)\n", |
+ AES_MAX_KEY_LEN*2, (unsigned)strlen(argv[1])); |
+ exit(1); |
+ } |
+ len = hex_string_to_octet_string((char*)key, argv[1], AES_MAX_KEY_LEN*2); |
+ /* check that hex string is the right length */ |
+ if (len != 32 && len != 48 && len != 64) { |
+ fprintf(stderr, |
+ "error: bad number of digits in key " |
+ "(should be 32/48/64 hexadecimal digits, found %d)\n", |
+ len); |
+ exit(1); |
+ } |
+ key_len = len/2; |
+ |
+ /* read in plaintext, checking length */ |
+ if (strlen(argv[2]) > 16*2) { |
+ fprintf(stderr, |
+ "error: too many digits in plaintext " |
+ "(should be %d hexadecimal digits, found %u)\n", |
+ 16*2, (unsigned)strlen(argv[2])); |
+ exit(1); |
+ } |
+ len = hex_string_to_octet_string((char *)(&data), argv[2], 16*2); |
+ /* check that hex string is the right length */ |
+ if (len < 16*2) { |
+ fprintf(stderr, |
+ "error: too few digits in plaintext " |
+ "(should be %d hexadecimal digits, found %d)\n", |
+ 16*2, len); |
+ exit(1); |
+ } |
+ |
+ if (verbose) { |
+ /* print out plaintext */ |
+ printf("plaintext:\t%s\n", octet_string_hex_string((uint8_t *)&data, 16)); |
+ } |
+ |
+ /* encrypt plaintext */ |
+ status = aes_expand_encryption_key(key, key_len, &exp_key); |
+ if (status) { |
+ fprintf(stderr, |
+ "error: AES key expansion failed.\n"); |
+ exit(1); |
+ } |
+ |
+ aes_encrypt(&data, &exp_key); |
+ |
+ /* write ciphertext to output */ |
+ if (verbose) { |
+ printf("key:\t\t%s\n", octet_string_hex_string(key, key_len)); |
+ printf("ciphertext:\t"); |
+ } |
+ printf("%s\n", v128_hex_string(&data)); |
+ |
+ return 0; |
+} |
+ |
Property changes on: libsrtp/crypto/test/aes_calc.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |