1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* encrypt V1.1 Fri Oct 18 04:28:03 NZDT 2002 */ 2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* File de/encryption, using libtomcrypt */ 3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Written by Daniel Richards <kyhwana@world-net.co.nz> */ 4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Help from Tom St Denis with various bits */ 5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* This code is public domain, no rights reserved. */ 6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Encrypts by default, -d flag enables decryption */ 7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* ie: ./encrypt blowfish story.txt story.ct */ 8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* ./encrypt -d blowfish story.ct story.pt */ 9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <tomcrypt.h> 11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint errno; 13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint usage(char *name) 15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int x; 17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("Usage: %s [-d](ecrypt) cipher infile outfile\nCiphers:\n", name); 19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; cipher_descriptor[x].name != NULL; x++) { 20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("%s\n",cipher_descriptor[x].name); 21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(1); 23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid register_algs(void) 26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int x; 28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RIJNDAEL 30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&aes_desc); 31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef BLOWFISH 33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&blowfish_desc); 34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef XTEA 36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&xtea_desc); 37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RC5 39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&rc5_desc); 40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RC6 42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&rc6_desc); 43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef SAFERP 45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&saferp_desc); 46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef TWOFISH 48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&twofish_desc); 49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef SAFER 51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&safer_k64_desc); 52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&safer_sk64_desc); 53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&safer_k128_desc); 54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&safer_sk128_desc); 55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RC2 57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&rc2_desc); 58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef DES 60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&des_desc); 61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&des3_desc); 62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef CAST5 64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&cast5_desc); 65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef NOEKEON 67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&noekeon_desc); 68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef SKIPJACK 70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&skipjack_desc); 71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef KHAZAD 73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&khazad_desc); 74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef ANUBIS 76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_cipher (&anubis_desc); 77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (register_hash(&sha256_desc) == -1) { 80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("Error registering SHA256\n"); 81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (register_prng(&yarrow_desc) == -1) { 85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("Error registering yarrow PRNG\n"); 86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (register_prng(&sprng_desc) == -1) { 90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("Error registering sprng PRNG\n"); 91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint main(int argc, char *argv[]) 96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char plaintext[512],ciphertext[512]; 98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char tmpkey[512], key[MAXBLOCKSIZE], IV[MAXBLOCKSIZE]; 99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char inbuf[512]; /* i/o block size */ 100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned long outlen, y, ivsize, x, decrypt; 101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project symmetric_CTR ctr; 102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int cipher_idx, hash_idx, ks; 103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project char *infile, *outfile, *cipher; 104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project prng_state prng; 105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project FILE *fdin, *fdout; 106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* register algs, so they can be printed */ 108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project register_algs(); 109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (argc < 4) { 111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return usage(argv[0]); 112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (!strcmp(argv[1], "-d")) { 115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project decrypt = 1; 116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project cipher = argv[2]; 117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project infile = argv[3]; 118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project outfile = argv[4]; 119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project decrypt = 0; 121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project cipher = argv[1]; 122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project infile = argv[2]; 123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project outfile = argv[3]; 124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* file handles setup */ 127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fdin = fopen(infile,"rb"); 128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fdin == NULL) { 129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project perror("Can't open input for reading"); 130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fdout = fopen(outfile,"wb"); 134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fdout == NULL) { 135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project perror("Can't open output for writing"); 136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project cipher_idx = find_cipher(cipher); 140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (cipher_idx == -1) { 141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("Invalid cipher entered on command line.\n"); 142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project hash_idx = find_hash("sha256"); 146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (hash_idx == -1) { 147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("SHA256 not found...?\n"); 148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ivsize = cipher_descriptor[cipher_idx].block_length; 152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ks = hash_descriptor[hash_idx].hashsize; 153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (cipher_descriptor[cipher_idx].keysize(&ks) != CRYPT_OK) { 154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("Invalid keysize???\n"); 155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("\nEnter key: "); 159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fgets((char *)tmpkey,sizeof(tmpkey), stdin); 160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project outlen = sizeof(key); 161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((errno = hash_memory(hash_idx,tmpkey,strlen((char *)tmpkey),key,&outlen)) != CRYPT_OK) { 162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("Error hashing key: %s\n", error_to_string(errno)); 163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (decrypt) { 167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* Need to read in IV */ 168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fread(IV,1,ivsize,fdin) != ivsize) { 169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("Error reading IV from input.\n"); 170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((errno = ctr_start(cipher_idx,IV,key,ks,0,CTR_COUNTER_LITTLE_ENDIAN,&ctr)) != CRYPT_OK) { 174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("ctr_start error: %s\n",error_to_string(errno)); 175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* IV done */ 179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project do { 180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project y = fread(inbuf,1,sizeof(inbuf),fdin); 181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((errno = ctr_decrypt(inbuf,plaintext,y,&ctr)) != CRYPT_OK) { 183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("ctr_decrypt error: %s\n", error_to_string(errno)); 184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fwrite(plaintext,1,y,fdout) != y) { 188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("Error writing to file.\n"); 189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } while (y == sizeof(inbuf)); 192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fclose(fdin); 193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fclose(fdout); 194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { /* encrypt */ 196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* Setup yarrow for random bytes for IV */ 197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((errno = rng_make_prng(128, find_prng("yarrow"), &prng, NULL)) != CRYPT_OK) { 199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("Error setting up PRNG, %s\n", error_to_string(errno)); 200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* You can use rng_get_bytes on platforms that support it */ 203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* x = rng_get_bytes(IV,ivsize,NULL);*/ 204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project x = yarrow_read(IV,ivsize,&prng); 205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (x != ivsize) { 206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("Error reading PRNG for IV required.\n"); 207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fwrite(IV,1,ivsize,fdout) != ivsize) { 211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("Error writing IV to output.\n"); 212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((errno = ctr_start(cipher_idx,IV,key,ks,0,CTR_COUNTER_LITTLE_ENDIAN,&ctr)) != CRYPT_OK) { 216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("ctr_start error: %s\n",error_to_string(errno)); 217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project do { 221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project y = fread(inbuf,1,sizeof(inbuf),fdin); 222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((errno = ctr_encrypt(inbuf,ciphertext,y,&ctr)) != CRYPT_OK) { 224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("ctr_encrypt error: %s\n", error_to_string(errno)); 225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fwrite(ciphertext,1,y,fdout) != y) { 229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project printf("Error writing to output.\n"); 230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project exit(-1); 231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } while (y == sizeof(inbuf)); 233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fclose(fdout); 234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fclose(fdin); 235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return 0; 237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/demos/encrypt.c,v $ */ 240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.3 $ */ 241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2005/08/04 20:43:50 $ */ 242