|
|
1.1 ! root 1: ! 2: How to use the Kerberos encryption library. ! 3: ! 4: Revised 10/15/85 spm ! 5: ! 6: 1) The following include file is needed: ! 7: ! 8: /projects/auth/include/des.h (VAX) ! 9: --------------- (PC8086) ! 10: ! 11: 2) The encryption library that should be linked to is: ! 12: ! 13: /projects/auth/lib/libdes.a (VAX) ! 14: | /projects/auth/ibm/lib/libdes.a (PC8086 cross-compilation environment) ! 15: ! 16: 3) For each key that may be simultaneously active, ! 17: allocate (either compile or malloc) a "Key_schedule" struct, ! 18: defined in "des.h" ! 19: ! 20: 4) Create key schedules, as needed, prior to using the encryption ! 21: routines, via "des_set_key()". ! 22: ! 23: 5) Setup the input and output areas. Make sure to note the restrictions ! 24: on lengths being multiples of eight bytes. ! 25: ! 26: 6) Invoke the encryption/decryption routines, "ecb_encrypt()" ! 27: or "cbc_encrypt()" ! 28: ! 29: 7) To generate a cryptographic checksum, use "cbc_cksum()" ! 30: /* ---------------------------------------------------------------- */ ! 31: ! 32: Routine Interfaces-- ! 33: ! 34: /* ----------------------------------------------------------------- */ ! 35: ! 36: int ! 37: des_set_key(k,schedule) ! 38: C_Block *k; ! 39: Key_schedule schedule; ! 40: ! 41: Calculates a key schedule from (all) eight bytes of the input key, and ! 42: puts it into the indicated "Key_schedule" struct; ! 43: ! 44: Make sure to pass valid eight bytes, no padding or other processing ! 45: it done. ! 46: ! 47: The key schedule is then used in subsequent encryption/decryption ! 48: operations. Many key schedules may be created and cached for later ! 49: use. ! 50: ! 51: The user is responsible to clear keys and schedules no longer needed ! 52: to prevent their disclosure. ! 53: ! 54: | Checks the parity of the key provided, to make sure it is odd per ! 55: | FIPS spec. Returns 0 value for key ok, 1 for key_parity error. ! 56: ! 57: /* ---------------------------------------------------------------- */ ! 58: ! 59: int ! 60: ecb_encrypt(input,output,schedule,encrypt) ! 61: C_Block *input; /* ptr to eight byte input value */ ! 62: C_Block *output; /* ptr to eight byte output value */ ! 63: int encrypt; /* 0 ==> decrypt, else encrypt */ ! 64: Key_schedule schedule; /* addr of key schedule */ ! 65: ! 66: This is the low level routine that encrypts or decrypts a single 8-byte ! 67: block in electronic code book mode. Always transforms the input ! 68: data into the output data. ! 69: ! 70: If encrypt is non-zero, the input (cleartext) is encrypted into the ! 71: output (ciphertext) using the specified key_schedule, pre-set via "des_set_key". ! 72: ! 73: If encrypt is zero, the input (now ciphertext) is decrypted into ! 74: the output (now cleartext). ! 75: ! 76: Input and output may be the same space. ! 77: ! 78: Does not return any meaningful value. Void is not used for compatibility ! 79: with other compilers. ! 80: ! 81: /* -------------------------------------------------------------- */ ! 82: ! 83: int ! 84: cbc_encrypt(input,output,length,schedule,ivec,encrypt) ! 85: ! 86: C_Block *input; /* ptr to input data */ ! 87: C_Block *output; /* ptr to output data */ ! 88: int length; /* desired length, in bytes */ ! 89: Key_schedule schedule; /* addr of precomputed schedule */ ! 90: C_Block *ivec; /* pointer to 8 byte initialization ! 91: * vector ! 92: */ ! 93: int encrypt /* 0 ==> decrypt; else encrypt*/ ! 94: ! 95: ! 96: If encrypt is non-zero, the routine cipher-block-chain encrypts ! 97: the INPUT (cleartext) into the OUTPUT (ciphertext) using the provided ! 98: key schedule and initialization vector. If the length is not an integral ! 99: multiple of eight bytes, the last block is copied to a temp and zero ! 100: filled (highest addresses). The output is ALWAYS an integral multiple ! 101: of eight bytes. ! 102: ! 103: If encrypt is zero, the routine cipher-block chain decrypts the INPUT ! 104: (ciphertext) into the OUTPUT (cleartext) using the provided key schedule ! 105: and initialization vector. Decryption ALWAYS operates on integral ! 106: multiples of 8 bytes, so will round the length provided up to the ! 107: appropriate multiple. Consequently, it will always produce the rounded-up ! 108: number of bytes of output cleartext. The application must determine if ! 109: the output cleartext was zero-padded due to cleartext lengths not integral ! 110: multiples of 8. ! 111: ! 112: No errors or meaningful value are returned. Void is not used for ! 113: compatibility with other compilers. ! 114: ! 115: ! 116: /* cbc checksum (MAC) only routine ---------------------------------------- */ ! 117: int ! 118: cbc_cksum(input,output,length,schedule,ivec) ! 119: ! 120: C_Block *input; /* >= length bytes of inputtext */ ! 121: C_Block *output; /* >= length bytes of outputtext */ ! 122: int length; /* in bytes */ ! 123: Key_schedule schedule; /* precomputed key schedule */ ! 124: C_Block *ivec; /* 8 bytes of ivec */ ! 125: ! 126: ! 127: Produces a cryptographic checksum, 8 bytes, by cipher-block-chain ! 128: encrypting the input, discarding the ciphertext output, and only retaining ! 129: the last ciphertext 8-byte block. Uses the provided key schedule and ivec. ! 130: The input is effectively zero-padded to an integral multiple of ! 131: eight bytes, though the original input is not modified. ! 132: ! 133: No meaningful value is returned. Void is not used for compatibility ! 134: with other compilers. ! 135: ! 136: ! 137: /* random_key ----------------------------------------*/ ! 138: int ! 139: random_key(key) ! 140: ! 141: C_Block *key; ! 142: ! 143: The start for the random number generated is set from the current time ! 144: in microseconds, then the random number generator is invoked ! 145: to create an eight byte output key (not a schedule). The key ! 146: generated is set to odd parity per FIPS spec. ! 147: ! 148: The caller must supply space for the output key, pointed to ! 149: by "*key", then after getting a new key, call the des_set_key() ! 150: routine when needed. ! 151: ! 152: No meaningfull value is returned. Void is not used for compatibility ! 153: with other compilers. ! 154: ! 155: ! 156: /* string_to_key --------------------------------------------*/ ! 157: ! 158: int ! 159: string_to_key(str,key) ! 160: register char *str; ! 161: register C_Block *key; ! 162: ! 163: This routines converts an arbitrary length, null terminated string ! 164: to an 8 byte DES key, with each byte parity set to odd, per FIPS spec. ! 165: ! 166: The algorithm is as follows: ! 167: ! 168: | Take the first 8 bytes and remove the parity (leaving 56 bits). ! 169: | Do the same for the second 8 bytes, and the third, etc. Do this for ! 170: | as many sets of 8 bytes as necessary, filling in the remainder of the ! 171: | last set with nulls. Fold the second set back on the first (i.e. bit ! 172: | 0 over bit 55, and bit 55 over bit 0). Fold the third over the second ! 173: | (bit 0 of the third set is now over bit 0 of the first set). Repeat ! 174: | until you have done this to all sets. Xor the folded sets. Break the ! 175: | result into 8 7 bit bytes, and generate odd parity for each byte. You ! 176: | now have 64 bits. Note that DES takes a 64 bit key, and uses only the ! 177: | non parity bits. ! 178: ! 179: ! 180: /* read_password -------------------------------------------*/ ! 181: ! 182: read_password(k,prompt,verify) ! 183: C_Block *k; ! 184: char *prompt; ! 185: int verify; ! 186: ! 187: This routine issues the supplied prompt, turns off echo, if possible, and ! 188: reads an input string. If verify is non-zero, it does it again, for use ! 189: in applications such as changing a password. If verify is non-zero, both ! 190: versions are compared, and the input is requested repeatedly until they ! 191: match. Then, the input string is mapped into a valid DES key, internally ! 192: using the string_to_key routine. The newly created key is copied to the ! 193: area pointed to by parameter "k". ! 194: ! 195: No meaningful value is returned. If an error occurs trying to manipulate ! 196: the terminal echo, the routine forces the process to exit. ! 197: ! 198: /* get_line ------------------------*/ ! 199: long get_line(p,max) ! 200: char *p; ! 201: long max; ! 202: ! 203: Reads input characters from standard input until either a newline appears or ! 204: else the max length is reached. The characters read are stuffed into ! 205: the string pointed to, which will always be null terminated. The newline ! 206: is not inserted in the string. The max parameter includes the byte needed ! 207: for the null terminator, so allocate and pass one more than the maximum ! 208: string length desired.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.