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
10 #include <afsconfig.h>
11 #include <afs/param.h>
15 #include <sys/types.h>
16 #include <netinet/in.h>
26 struct ktc_encryptionKey
{
31 print_msg(text
, msg
, length
)
37 unsigned char *msgtext
= (unsigned char *)msg
;
40 if (length
% 8 != 0) {
41 printf("Length of message (%d) incorrect\n", length
);
45 for (i
= 0; i
< length
; i
+= 8) {
46 unsigned char *m
= msgtext
+ i
;
47 printf("%02x%02x%02x%02x %02x%02x%02x%02x", m
[0], m
[1], m
[2], m
[3],
48 m
[4], m
[5], m
[6], m
[7]);
52 for (i
= 0; i
< length
; i
++)
53 cksum
+= *(i
+ msgtext
);
54 printf(" (%4x)\n", cksum
& 0xffff);
57 static int total_diff
, minimum_diff
, number_diff
;
66 for (temp
= orig
[0] ^ chgd
[0]; temp
; temp
>>= 1)
68 for (temp
= orig
[1] ^ chgd
[1]; temp
; 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"
83 struct ktc_encryptionKey key
;
84 fc_KeySchedule schedule
;
90 int for_time
= (argc
> 1) && (strcmp(argv
[1], "time") == 0);
91 int for_time_key
= (argc
> 1) && (strcmp(argv
[1], "time_key") == 0);
92 int for_cbc
= (argc
> 1) && (strcmp(argv
[1], "cbc") == 0);
94 if (for_time
|| for_time_key
) {
96 iterations
= atoi(argv
[2]);
102 for (i
= 0; i
< iterations
; i
++)
103 fc_ecb_encrypt(e
, d
, schedule
, 1);
104 else if (for_time_key
)
105 for (i
= 0; i
< iterations
; i
++)
106 fc_keysched(&key
, schedule
);
113 for (i
= 0; i
< 10; i
++)
115 memcpy(&key
, "abcdefgh", sizeof(struct ktc_encryptionKey
));
116 fc_keysched(&key
, schedule
);
117 print_msg("Starting msg is:", msg
, sizeof(msg
));
118 memcpy(xor, &key
, 2 * sizeof(afs_int32
));
119 fc_cbc_encrypt(msg
, out
, sizeof(msg
), schedule
, &key
, ENCRYPT
);
120 memcpy(xor, &key
, 2 * sizeof(afs_int32
));
121 fc_cbc_encrypt(out
, dec
, sizeof(msg
), schedule
, &key
, DECRYPT
);
122 if (memcmp(msg
, dec
, sizeof(msg
)) != 0)
123 printf("Encryption FAILED!\n");
124 print_msg("Encrypted is:", out
, sizeof(out
));
125 print_msg("Decrypted is:", dec
, sizeof(dec
));
130 ("Number of rounds is fixed at %d; try recompiling w/ -DTCRYPT=1\n",
135 memcpy(&key
, "abcdefgh", sizeof(struct ktc_encryptionKey
));
136 for (rounds
= 2; rounds
<= MAXROUNDS
; rounds
+= 2) {
140 printf("\n ROUNDS = %d\n", ROUNDS
);
145 fc_keysched(&key
, schedule
);
146 fc_ecb_encrypt(e
, d
, schedule
, 1);
148 printf("Checking data bits\n");
149 for (i
= 1; i
; i
<<= 1) {
151 fc_ecb_encrypt(e
, c
, schedule
, 1);
155 fc_ecb_encrypt(e
, c
, schedule
, 1);
159 printf("Checking key bits\n");
160 for (i
= 0; i
< 56; i
++) {
161 unsigned char *keyByte
;
162 keyByte
= ((unsigned char *)(&key
)) + i
/ 7;
163 *keyByte
^= (2 << (i
% 7));
164 fc_keysched(&key
, schedule
);
165 fc_ecb_encrypt(e
, c
, schedule
, 1);
167 *keyByte
^= (2 << (i
% 7));
169 print_msg("clear: ", e
, sizeof(e
));
171 print_msg("Encrypted: ", d
, sizeof(d
));
173 fc_keysched(&key
, schedule
);
174 fc_ecb_encrypt(d
, e
, schedule
, 0);
175 print_msg("De-encrypted: ", e
, sizeof(e
));
176 printf("Rounds=%d, average diff = %d bits, minimum diff = %d\n",
177 ROUNDS
, total_diff
/ number_diff
, minimum_diff
);