2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
11 * Revision 2.2 90/08/20 10:19:23
13 * Remove dependence on auth.h
15 * Revision 2.1 90/08/07 19:33:42
16 * Start with clean version to sync test and dev trees.
19 #include <afs/param.h>
21 #include <sys/types.h>
22 #include <netinet/in.h>
32 struct ktc_encryptionKey {
36 void print_msg (text, msg, length)
41 unsigned char *msgtext = (unsigned char *)msg;
44 if (length % 8 != 0) {
45 printf ("Length of message (%d) incorrect\n", length);
48 printf ("%s\n", text);
49 for (i=0; i<length; i+=8) {
50 unsigned char *m = msgtext+i;
51 printf ("%02x%02x%02x%02x %02x%02x%02x%02x",
52 m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7]);
56 for (i=0; i<length; i++) cksum += *(i + msgtext);
57 printf (" (%4x)\n", cksum&0xffff);
60 static int total_diff, minimum_diff, number_diff;
68 for (temp = orig[0] ^ chgd[0]; temp; temp >>= 1) diff += temp&1;
69 for (temp = orig[1] ^ chgd[1]; temp; temp >>= 1) diff += temp&1;
70 printf ("%.8x %.8x (%d)\n", chgd[0], chgd[1], diff);
73 minimum_diff = (diff<minimum_diff) ? diff : minimum_diff;
76 #include "AFS_component_version_number.c"
82 struct ktc_encryptionKey key;
83 fc_KeySchedule schedule;
89 int for_time = (argc > 1) && (strcmp(argv[1], "time") == 0);
90 int for_time_key = (argc > 1) && (strcmp(argv[1], "time_key") == 0);
91 int for_cbc = (argc > 1) && (strcmp(argv[1], "cbc") == 0);
93 if (for_time || for_time_key) {
94 if (argc == 3) iterations = atoi(argv[2]);
95 else iterations = 10000;
99 for (i=0; i<iterations; i++) fc_ecb_encrypt (e,d,schedule, 1);
100 else if (for_time_key)
101 for (i=0; i<iterations; i++) fc_keysched (&key, schedule);
108 for (i=0; i<10; i++) msg[i]=htonl(i);
109 bcopy ("abcdefgh", &key, sizeof(struct ktc_encryptionKey));
110 fc_keysched (&key, schedule);
111 print_msg ("Starting msg is:", msg, sizeof(msg));
112 bcopy(&key, xor, 2*sizeof(afs_int32));
113 fc_cbc_encrypt (msg, out, sizeof(msg), schedule, &key, ENCRYPT);
114 bcopy(&key, xor, 2*sizeof(afs_int32));
115 fc_cbc_encrypt (out, dec, sizeof(msg), schedule, &key, DECRYPT);
116 if (bcmp (msg, dec, sizeof(msg)) != 0)
117 printf ("Encryption FAILED!\n");
118 print_msg ("Encrypted is:", out, sizeof(out));
119 print_msg ("Decrypted is:", dec, sizeof(dec));
124 printf ("Number of rounds is fixed at %d; try recompiling w/ -DTCRYPT=1\n", ROUNDS);
128 bcopy ("abcdefgh", &key, sizeof(struct ktc_encryptionKey));
129 for (rounds=2; rounds<=MAXROUNDS; rounds +=2) {
133 printf ("\n ROUNDS = %d\n", ROUNDS);
138 fc_keysched (&key, schedule);
139 fc_ecb_encrypt (e, d, schedule, 1);
141 printf ("Checking data bits\n");
142 for (i=1; i; i<<=1) {
144 fc_ecb_encrypt (e, c, schedule, 1);
148 fc_ecb_encrypt (e, c, schedule, 1);
152 printf ("Checking key bits\n");
153 for (i=0; i<56; i++) {
154 unsigned char *keyByte;
155 keyByte = ((unsigned char *)(&key)) + i/7;
156 *keyByte ^= (2 << (i%7));
157 fc_keysched (&key, schedule);
158 fc_ecb_encrypt (e, c, schedule, 1);
160 *keyByte ^= (2 << (i%7));
162 print_msg ("clear: ", e, sizeof(e));
164 print_msg ("Encrypted: ", d, sizeof(d));
166 fc_keysched (&key, schedule);
167 fc_ecb_encrypt (d, e, schedule, 0);
168 print_msg ("De-encrypted: ", e, sizeof(e));
169 printf ("Rounds=%d, average diff = %d bits, minimum diff = %d\n",
170 ROUNDS, total_diff/number_diff, minimum_diff);