int main(){ int i, j; pthread_t *threads; int *thread_index; char dummy; // Checking CPU support if (!Check_CPU_support_AES()){ verbose("Cpu does not support AES instruction set. Bailing out."); return 1; } verbose("CPU support AES instruction set."); // Reading input cipher_text = talloc(uint8_t, LENGTH); for(i=0; i<LENGTH; i++) fscanf(stdin, "%02x", &cipher_text[i]); // Printing input printf(" - Input: "); for(i=0; i< LENGTH; i++) printf("%02x", cipher_text[i]); printf("\n"); // Allocating thread indexes threads = talloc(pthread_t, NTHREADS); thread_index = talloc(int, NTHREADS); // Creating threads for(i=0; i< NTHREADS; i++){ thread_index[i] = i; if(pthread_create(&threads[i], NULL, &thread_function, &thread_index[i])) error("Creation of thread #%d failed.", i); else verbose("Thread #%d created successfully.", i); } // Waiting for threads for(i=0; i< NTHREADS; i++) pthread_join(threads[i], NULL); verbose("All threads are done."); return 1; }
void main(void) { printf("CPU supports AES: %s\n", Check_CPU_support_AES() ? "true":"false"); }
int main(){ AES_KEY key; AES_KEY decrypt_key; uint8_t *PLAINTEXT; uint8_t *CIPHERTEXT; uint8_t *DECRYPTEDTEXT; uint8_t *EXPECTED_CIPHERTEXT; uint8_t *CIPHER_KEY; int i,j; int key_length; if (!Check_CPU_support_AES()){ printf("Cpu does not support AES instruction set. Bailing out.\n"); return 1; } printf("CPU support AES instruction set.\n\n"); #ifdef AES128 #define STR "Performing AES128 ECB.\n" CIPHER_KEY = AES128_TEST_KEY; EXPECTED_CIPHERTEXT = ECB128_EXPECTED; key_length = 128; #elif defined AES192 #define STR "Performing AES192 ECB.\n" CIPHER_KEY = AES192_TEST_KEY; EXPECTED_CIPHERTEXT = ECB192_EXPECTED; key_length = 192; #elif defined AES256 #define STR "Performing AES256 ECB.\n" CIPHER_KEY = AES256_TEST_KEY; EXPECTED_CIPHERTEXT = ECB256_EXPECTED; key_length = 256; #endif PLAINTEXT = (uint8_t*)malloc(LENGTH); CIPHERTEXT = (uint8_t*)malloc(LENGTH); DECRYPTEDTEXT = (uint8_t*)malloc(LENGTH); for(i=0 ;i<LENGTH/16/4; i++){ for(j=0; j<4; j++){ _mm_storeu_si128(&((__m128i*)PLAINTEXT)[i*4+j], ((__m128i*)AES_TEST_VECTOR)[j]); } } for(j=i*4 ; j<LENGTH/16; j++){ _mm_storeu_si128(&((__m128i*)PLAINTEXT)[j], ((__m128i*)AES_TEST_VECTOR)[j%4]); } if (LENGTH%16){ _mm_storeu_si128(&((__m128i*)PLAINTEXT)[j], ((__m128i*)AES_TEST_VECTOR)[j%4]); } AES_set_encrypt_key(CIPHER_KEY, key_length, &key); AES_set_decrypt_key(CIPHER_KEY, key_length, &decrypt_key); AES_ECB_encrypt(PLAINTEXT, CIPHERTEXT, LENGTH, key.KEY, key.nr); AES_ECB_decrypt(CIPHERTEXT, DECRYPTEDTEXT, LENGTH, decrypt_key.KEY, decrypt_key.nr); printf("%s\n",STR); printf("The Cipher Key:\n"); print_m128i_with_string("",((__m128i*)CIPHER_KEY)[0]); if (key_length > 128) print_m128i_with_string_short("",((__m128i*)CIPHER_KEY)[1],(key_length/8) -16); printf("The Key Schedule:\n"); for (i=0; i< key.nr; i++) print_m128i_with_string("",((__m128i*)key.KEY)[i]); printf("The PLAINTEXT:\n"); for (i=0; i< LENGTH/16; i++) print_m128i_with_string("",((__m128i*)PLAINTEXT)[i]); if (LENGTH%16) print_m128i_with_string_short("",((__m128i*)PLAINTEXT)[i],LENGTH%16); printf("\n\nThe CIPHERTEXT:\n"); for (i=0; i< LENGTH/16; i++) print_m128i_with_string("",((__m128i*)CIPHERTEXT)[i]); if (LENGTH%16) print_m128i_with_string_short("",((__m128i*)CIPHERTEXT)[i],LENGTH%16); for(i=0; i<LENGTH; i++){ if (CIPHERTEXT[i] != EXPECTED_CIPHERTEXT[i%(16*4)]){ printf("The CIPHERTEXT is not equal to the EXPECTED CIHERTEXT.\n\n"); return 1; } } printf("The CIPHERTEXT equals to the EXPECTED CIHERTEXT.\n\n"); for(i=0; i<LENGTH; i++){ if (DECRYPTEDTEXT[i] != PLAINTEXT[i%(16*4)]){ printf("The DECRYPTED TEXT isn't equal to the original PLAINTEXT!"); printf("\n\n"); return 1; } } printf("The DECRYPTED TEXT equals to the original PLAINTEXT.\n\n"); }