193e3b716SJung-uk Kim /*- 213e21a9dSJoerg Wunsch * "enigma.c" is in file cbw.tar from 313e21a9dSJoerg Wunsch * anonymous FTP host watmsg.waterloo.edu: pub/crypt/cbw.tar.Z 413e21a9dSJoerg Wunsch * 513e21a9dSJoerg Wunsch * A one-rotor machine designed along the lines of Enigma 613e21a9dSJoerg Wunsch * but considerably trivialized. 713e21a9dSJoerg Wunsch * 813e21a9dSJoerg Wunsch * A public-domain replacement for the UNIX "crypt" command. 913e21a9dSJoerg Wunsch * 1013e21a9dSJoerg Wunsch * Upgraded to function properly on 64-bit machines. 1113e21a9dSJoerg Wunsch */ 1213e21a9dSJoerg Wunsch 13e026a48cSDavid E. O'Brien #include <sys/cdefs.h> 14e026a48cSDavid E. O'Brien __FBSDID("$FreeBSD$"); 15a70bac9dSEric Melville 165dc67cd7SJoerg Wunsch #include <sys/types.h> 175dc67cd7SJoerg Wunsch 1813e21a9dSJoerg Wunsch #include <stdio.h> 195dc67cd7SJoerg Wunsch #include <stdlib.h> 205dc67cd7SJoerg Wunsch #include <string.h> 215dc67cd7SJoerg Wunsch #include <unistd.h> 225dc67cd7SJoerg Wunsch 235dc67cd7SJoerg Wunsch #define MINUSKVAR "CrYpTkEy" 245dc67cd7SJoerg Wunsch 255dc67cd7SJoerg Wunsch #define ECHO 010 2613e21a9dSJoerg Wunsch #define ROTORSZ 256 2713e21a9dSJoerg Wunsch #define MASK 0377 2843ad4b45SEd Schouten static char t1[ROTORSZ]; 2943ad4b45SEd Schouten static char t2[ROTORSZ]; 3043ad4b45SEd Schouten static char t3[ROTORSZ]; 3143ad4b45SEd Schouten static char deck[ROTORSZ]; 3243ad4b45SEd Schouten static char buf[13]; 3313e21a9dSJoerg Wunsch 3443ad4b45SEd Schouten static void shuffle(char *); 3543ad4b45SEd Schouten static void setup(char *); 3613e21a9dSJoerg Wunsch 3743ad4b45SEd Schouten static void 38f4ac32deSDavid Malone setup(char *pw) 3913e21a9dSJoerg Wunsch { 40d684457fSTim J. Robbins int ic, i, k, temp; 41d684457fSTim J. Robbins char salt[3]; 42461ce74aSDima Dorfman unsigned rnd; 4393e3b716SJung-uk Kim int32_t seed; 4429dcf726SKevin Lo char *cryptpw; 4513e21a9dSJoerg Wunsch 46*3b557094SXin LI if (crypt_set_format("des") == 0) { 47*3b557094SXin LI fprintf(stderr, "crypt_set_format(\"des\") failed.\n"); 48*3b557094SXin LI exit(1); 49*3b557094SXin LI } 50*3b557094SXin LI 51d684457fSTim J. Robbins strlcpy(salt, pw, sizeof(salt)); 5229dcf726SKevin Lo cryptpw = crypt(pw, salt); 5329dcf726SKevin Lo if (cryptpw == NULL) { 5429dcf726SKevin Lo fprintf(stderr, "crypt(3) failure\n"); 5529dcf726SKevin Lo exit(1); 5629dcf726SKevin Lo } 5729dcf726SKevin Lo memcpy(buf, cryptpw, sizeof(buf)); 5813e21a9dSJoerg Wunsch seed = 123; 5913e21a9dSJoerg Wunsch for (i=0; i<13; i++) 6013e21a9dSJoerg Wunsch seed = seed*buf[i] + i; 6113e21a9dSJoerg Wunsch for(i=0;i<ROTORSZ;i++) { 6213e21a9dSJoerg Wunsch t1[i] = i; 6313e21a9dSJoerg Wunsch deck[i] = i; 6413e21a9dSJoerg Wunsch } 6513e21a9dSJoerg Wunsch for(i=0;i<ROTORSZ;i++) { 6613e21a9dSJoerg Wunsch seed = 5*seed + buf[i%13]; 67461ce74aSDima Dorfman rnd = seed % 65521; 6813e21a9dSJoerg Wunsch k = ROTORSZ-1 - i; 69461ce74aSDima Dorfman ic = (rnd&MASK)%(k+1); 70461ce74aSDima Dorfman rnd >>= 8; 7113e21a9dSJoerg Wunsch temp = t1[k]; 7213e21a9dSJoerg Wunsch t1[k] = t1[ic]; 7313e21a9dSJoerg Wunsch t1[ic] = temp; 7413e21a9dSJoerg Wunsch if(t3[k]!=0) continue; 75461ce74aSDima Dorfman ic = (rnd&MASK) % k; 7613e21a9dSJoerg Wunsch while(t3[ic]!=0) ic = (ic+1) % k; 7713e21a9dSJoerg Wunsch t3[k] = ic; 7813e21a9dSJoerg Wunsch t3[ic] = k; 7913e21a9dSJoerg Wunsch } 8013e21a9dSJoerg Wunsch for(i=0;i<ROTORSZ;i++) 8113e21a9dSJoerg Wunsch t2[t1[i]&MASK] = i; 8213e21a9dSJoerg Wunsch } 8313e21a9dSJoerg Wunsch 845dc67cd7SJoerg Wunsch int 85f4ac32deSDavid Malone main(int argc, char *argv[]) 8613e21a9dSJoerg Wunsch { 87f4ac32deSDavid Malone int i, n1, n2, nr1, nr2; 885dc67cd7SJoerg Wunsch int secureflg = 0, kflag = 0; 895dc67cd7SJoerg Wunsch char *cp; 9013e21a9dSJoerg Wunsch 915dc67cd7SJoerg Wunsch if (argc > 1 && argv[1][0] == '-') { 925dc67cd7SJoerg Wunsch if (argv[1][1] == 's') { 9313e21a9dSJoerg Wunsch argc--; 9413e21a9dSJoerg Wunsch argv++; 9513e21a9dSJoerg Wunsch secureflg = 1; 965dc67cd7SJoerg Wunsch } else if (argv[1][1] == 'k') { 975dc67cd7SJoerg Wunsch argc--; 985dc67cd7SJoerg Wunsch argv++; 995dc67cd7SJoerg Wunsch kflag = 1; 10013e21a9dSJoerg Wunsch } 1015dc67cd7SJoerg Wunsch } 1025dc67cd7SJoerg Wunsch if (kflag) { 1035dc67cd7SJoerg Wunsch if ((cp = getenv(MINUSKVAR)) == NULL) { 1045dc67cd7SJoerg Wunsch fprintf(stderr, "%s not set\n", MINUSKVAR); 1055dc67cd7SJoerg Wunsch exit(1); 1065dc67cd7SJoerg Wunsch } 1075dc67cd7SJoerg Wunsch setup(cp); 1085dc67cd7SJoerg Wunsch } else if (argc != 2) { 10913e21a9dSJoerg Wunsch setup(getpass("Enter key:")); 11013e21a9dSJoerg Wunsch } 11113e21a9dSJoerg Wunsch else 11213e21a9dSJoerg Wunsch setup(argv[1]); 11313e21a9dSJoerg Wunsch n1 = 0; 11413e21a9dSJoerg Wunsch n2 = 0; 11513e21a9dSJoerg Wunsch nr2 = 0; 11613e21a9dSJoerg Wunsch 1175dc67cd7SJoerg Wunsch while((i=getchar()) != -1) { 11813e21a9dSJoerg Wunsch if (secureflg) { 11913e21a9dSJoerg Wunsch nr1 = deck[n1]&MASK; 12013e21a9dSJoerg Wunsch nr2 = deck[nr1]&MASK; 12113e21a9dSJoerg Wunsch } else { 12213e21a9dSJoerg Wunsch nr1 = n1; 12313e21a9dSJoerg Wunsch } 12413e21a9dSJoerg Wunsch i = t2[(t3[(t1[(i+nr1)&MASK]+nr2)&MASK]-nr2)&MASK]-nr1; 12513e21a9dSJoerg Wunsch putchar(i); 12613e21a9dSJoerg Wunsch n1++; 12713e21a9dSJoerg Wunsch if(n1==ROTORSZ) { 12813e21a9dSJoerg Wunsch n1 = 0; 12913e21a9dSJoerg Wunsch n2++; 13013e21a9dSJoerg Wunsch if(n2==ROTORSZ) n2 = 0; 13113e21a9dSJoerg Wunsch if (secureflg) { 13213e21a9dSJoerg Wunsch shuffle(deck); 13313e21a9dSJoerg Wunsch } else { 13413e21a9dSJoerg Wunsch nr2 = n2; 13513e21a9dSJoerg Wunsch } 13613e21a9dSJoerg Wunsch } 13713e21a9dSJoerg Wunsch } 1385dc67cd7SJoerg Wunsch 1395dc67cd7SJoerg Wunsch return 0; 14013e21a9dSJoerg Wunsch } 14113e21a9dSJoerg Wunsch 14243ad4b45SEd Schouten static void 143f4ac32deSDavid Malone shuffle(char deckary[]) 14413e21a9dSJoerg Wunsch { 14513e21a9dSJoerg Wunsch int i, ic, k, temp; 146461ce74aSDima Dorfman unsigned rnd; 14793e3b716SJung-uk Kim static int32_t seed = 123; 14813e21a9dSJoerg Wunsch 14913e21a9dSJoerg Wunsch for(i=0;i<ROTORSZ;i++) { 15013e21a9dSJoerg Wunsch seed = 5*seed + buf[i%13]; 151461ce74aSDima Dorfman rnd = seed % 65521; 15213e21a9dSJoerg Wunsch k = ROTORSZ-1 - i; 153461ce74aSDima Dorfman ic = (rnd&MASK)%(k+1); 154461ce74aSDima Dorfman temp = deckary[k]; 155461ce74aSDima Dorfman deckary[k] = deckary[ic]; 156461ce74aSDima Dorfman deckary[ic] = temp; 15713e21a9dSJoerg Wunsch } 15813e21a9dSJoerg Wunsch } 159