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