Annotation of 43BSDReno/kerberosIV/man/des_crypt.3, revision 1.1

1.1     ! root        1: .\" $Source: /usr/src/kerberosIV/man/RCS/des_crypt.3,v $
        !             2: .\" $Author: kfall $
        !             3: .\" $Header: /usr/src/kerberosIV/man/RCS/des_crypt.3,v 4.4 90/06/25 21:11:49 kfall Exp $
        !             4: .\" Copyright 1989 by the Massachusetts Institute of Technology.
        !             5: .\"
        !             6: .\" For copying and distribution information,
        !             7: .\" please see the file <mit-copyright.h>.
        !             8: .\"
        !             9: .TH DES_CRYPT 3  "Kerberos Version 4.0" "MIT Project Athena"
        !            10: .SH NAME
        !            11: des_read_password, des_string_to_key, des_random_key, des_set_key,
        !            12: des_ecb_encrypt, des_cbc_encrypt, des_pcbc_encrypt, des_cbc_cksum,
        !            13: des_quad_cksum, \- (new) DES encryption
        !            14: .SH SYNOPSIS
        !            15: .nf
        !            16: .nj
        !            17: .ft B
        !            18: #include <kerberosIV/des.h>
        !            19: .PP
        !            20: .ft B
        !            21: .B int des_read_password(key,prompt,verify)
        !            22: des_cblock *key;
        !            23: char *prompt;
        !            24: int verify;
        !            25: .PP
        !            26: .ft B
        !            27: int des_string_to_key(str,key)
        !            28: char *str;
        !            29: des_cblock key;
        !            30: .PP
        !            31: .ft B
        !            32: int des_random_key(key)
        !            33: des_cblock *key;
        !            34: .PP
        !            35: .ft B
        !            36: int des_set_key(key,schedule)
        !            37: des_cblock *key;
        !            38: des_key_schedule schedule;
        !            39: .PP
        !            40: .ft B
        !            41: int des_ecb_encrypt(input,output,schedule,encrypt)
        !            42: des_cblock *input;
        !            43: des_cblock *output;
        !            44: des_key_schedule schedule;
        !            45: int encrypt;
        !            46: .PP
        !            47: .ft B
        !            48: int des_cbc_encrypt(input,output,length,schedule,ivec,encrypt)
        !            49: des_cblock *input;
        !            50: des_cblock *output;
        !            51: long length;
        !            52: des_key_schedule schedule;
        !            53: des_cblock *ivec;
        !            54: int encrypt;
        !            55: .PP
        !            56: .ft B
        !            57: int des_pcbc_encrypt(input,output,length,schedule,ivec,encrypt)
        !            58: des_cblock *input;
        !            59: des_cblock *output;
        !            60: long length;
        !            61: des_key_schedule schedule;
        !            62: des_cblock *ivec;
        !            63: int encrypt;
        !            64: .PP
        !            65: .ft B
        !            66: unsigned long des_cbc_cksum(input,output,length,schedule,ivec)
        !            67: des_cblock *input;
        !            68: des_cblock *output;
        !            69: long length;
        !            70: des_key_schedule schedule;
        !            71: des_cblock *ivec;
        !            72: .PP
        !            73: .ft B
        !            74: unsigned long quad_cksum(input,output,length,out_count,seed)
        !            75: des_cblock *input;
        !            76: des_cblock *output;
        !            77: long length;
        !            78: int out_count;
        !            79: des_cblock *seed;
        !            80: .PP
        !            81: .fi
        !            82: .SH DESCRIPTION
        !            83: This library supports various DES encryption related operations. It differs
        !            84: from the
        !            85: .I crypt, setkey, and encrypt
        !            86: library routines in that it provides
        !            87: a true DES encryption, without modifying the algorithm,
        !            88: and executes much faster.
        !            89: .PP
        !            90: For each key that may be simultaneously active, create a
        !            91: .B des_key_schedule
        !            92: struct,
        !            93: defined in "des.h". Next, create key schedules (from the 8-byte keys) as
        !            94: needed, via
        !            95: .I des_set_key,
        !            96: prior to using the encryption or checksum routines. Then
        !            97: setup the input and output areas.  Make sure to note the restrictions
        !            98: on lengths being multiples of eight bytes. Finally, invoke the
        !            99: encryption/decryption routines,
        !           100: .I des_ecb_encrypt
        !           101: or
        !           102: .I des_cbc_encrypt
        !           103: or
        !           104: .I des_pcbc_encrypt,
        !           105: or, to generate a cryptographic checksum, use
        !           106: .I quad_cksum
        !           107: (fast) or
        !           108: .I des_cbc_cksum
        !           109: (slow).
        !           110: .PP
        !           111: A
        !           112: .I des_cblock
        !           113: struct is an 8 byte block used as the fundamental unit for DES data and
        !           114: keys, and is defined as:
        !           115: .PP
        !           116: .B     typedef unsigned char des_cblock[8];
        !           117: .PP
        !           118: and a
        !           119: .I des_key_schedule,
        !           120: is defined as:
        !           121: .PP
        !           122: .B     typedef struct des_ks_struct {des_cblock _;}  des_key_schedule[16];
        !           123: .PP
        !           124: .I des_read_password
        !           125: writes the string specified by
        !           126: .I prompt
        !           127: to the standard
        !           128: output, turns off echo (if possible)
        !           129: and reads an input string from standard input until terminated with a newline.
        !           130: If
        !           131: .I verify
        !           132: is non-zero, it prompts and reads input again, for use
        !           133: in applications such as changing a password; both
        !           134: versions are compared, and the input is requested repeatedly until they
        !           135: match.  Then
        !           136: .I des_read_password
        !           137: converts the input string into a valid DES key, internally
        !           138: using the
        !           139: .I des_string_to_key
        !           140: routine.  The newly created key is copied to the
        !           141: area pointed to by the
        !           142: .I key
        !           143: argument.
        !           144: .I des_read_password
        !           145: returns a zero if no errors occurred, or a -1
        !           146: indicating that an error
        !           147: occurred trying to manipulate the terminal echo.
        !           148: .PP
        !           149: .PP
        !           150: .I des_string_to_key
        !           151: converts an arbitrary length null-terminated string
        !           152: to an 8 byte DES key, with odd byte parity, per FIPS specification.
        !           153: A one-way function is used to convert the string to a key, making it
        !           154: very difficult to reconstruct the string from the key.
        !           155: The
        !           156: .I str
        !           157: argument is a pointer to the string, and
        !           158: .I key
        !           159: should
        !           160: point to a
        !           161: .I des_cblock
        !           162: supplied by the caller to receive the generated key.
        !           163: No meaningful value is returned. Void is not used for compatibility with
        !           164: other compilers.
        !           165: .PP
        !           166: .PP
        !           167: .I des_random_key
        !           168: generates a random DES encryption key (eight bytes), set to odd parity per
        !           169: FIPS
        !           170: specifications.
        !           171: This routine uses the current time, process id, and a counter
        !           172: as a seed for the random number generator.
        !           173: The caller must        supply space for the output key, pointed to
        !           174: by argument
        !           175: .I key,
        !           176: then after calling
        !           177: .I des_random_key
        !           178: should
        !           179: call the
        !           180: .I des_set_key
        !           181: routine when needed.
        !           182: No meaningful value is returned.  Void is not used for compatibility
        !           183: with other compilers.
        !           184: .PP
        !           185: .PP
        !           186: .I des_set_key
        !           187: calculates a key schedule from all eight bytes of the input key, pointed
        !           188: to by the
        !           189: .I key
        !           190: argument, and outputs the schedule into the
        !           191: .I des_key_schedule
        !           192: indicated by the
        !           193: .I schedule
        !           194: argument. Make sure to pass a valid eight byte
        !           195: key; no padding is done.  The key schedule may then be used in subsequent
        !           196: encryption/decryption/checksum operations.  Many key schedules may be
        !           197: cached for later use.  The user is responsible to clear keys and schedules
        !           198: as soon as no longer needed, to prevent their disclosure.
        !           199: The routine also checks the key
        !           200: parity, and returns a zero if the key parity is correct (odd), a -1
        !           201: indicating a key parity error, or a -2 indicating use of an illegal
        !           202: weak key. If an error is returned, the key schedule was not created.
        !           203: .PP
        !           204: .PP
        !           205: .I des_ecb_encrypt
        !           206: is the basic DES encryption routine that encrypts or decrypts a single 8-byte
        !           207: block in
        !           208: .B electronic code book
        !           209: mode.  It always transforms the input data, pointed to by
        !           210: .I input,
        !           211: into the output data, pointed to by the
        !           212: .I output
        !           213: argument.
        !           214: .PP
        !           215: If the
        !           216: .I encrypt
        !           217: argument is non-zero, the
        !           218: .I input
        !           219: (cleartext) is encrypted into the
        !           220: .I output
        !           221: (ciphertext) using the key_schedule specified by the
        !           222: .I schedule
        !           223: argument, previously set via
        !           224: .I des_set_key
        !           225: .PP
        !           226: If encrypt is zero, the
        !           227: .I input
        !           228: (now ciphertext) is decrypted into the
        !           229: .I output
        !           230: (now cleartext).
        !           231: .PP
        !           232: Input and output may overlap.
        !           233: .PP
        !           234: No meaningful value is returned.  Void is not used for compatibility
        !           235: with other compilers.
        !           236: .PP
        !           237: .PP
        !           238: .I des_cbc_encrypt
        !           239: encrypts/decrypts using the
        !           240: .B cipher-block-chaining mode of DES.
        !           241: If the
        !           242: .I encrypt
        !           243: argument is non-zero, the routine cipher-block-chain encrypts
        !           244: the cleartext data pointed to by the
        !           245: .I input
        !           246: argument into the ciphertext pointed to by the
        !           247: .I output
        !           248: argument, using the key schedule provided by the
        !           249: .I schedule
        !           250: argument, and initialization vector provided by the
        !           251: .I ivec
        !           252: argument.
        !           253: If the
        !           254: .I length
        !           255: argument is not an integral
        !           256: multiple of eight bytes, the last block is copied to a temp and zero
        !           257: filled (highest addresses).  The output is ALWAYS an integral multiple
        !           258: of eight bytes.
        !           259: .PP
        !           260: If
        !           261: .I encrypt
        !           262: is zero, the routine cipher-block chain decrypts the (now) ciphertext
        !           263: data pointed to by the
        !           264: .I input
        !           265: argument into (now) cleartext pointed to by the
        !           266: .I output
        !           267: argument using the key schedule provided by the
        !           268: .I schedule
        !           269: argument, and initialization vector provided by the
        !           270: .I ivec
        !           271: argument. Decryption ALWAYS operates on integral
        !           272: multiples of 8 bytes, so it will round the
        !           273: .I length
        !           274: provided up to the
        !           275: appropriate multiple. Consequently, it will always produce the rounded-up
        !           276: number of bytes of output cleartext. The application must determine if
        !           277: the output cleartext was zero-padded due to original cleartext lengths that
        !           278: were not integral multiples of 8.
        !           279: .PP
        !           280: No errors or meaningful values are returned.  Void is not used for
        !           281: compatibility with other compilers.
        !           282: .PP
        !           283: A characteristic of cbc mode is that changing a single bit of the
        !           284: cleartext, then encrypting using cbc mode,
        !           285: affects ALL the subsequent ciphertext.  This makes cryptanalysis
        !           286: much more difficult. However, modifying a single bit of the ciphertext,
        !           287: then decrypting, only affects the resulting cleartext from
        !           288: the modified block and the succeeding block.  Therefore,
        !           289: .I des_pcbc_encrypt
        !           290: is STRONGLY recommended for applications where
        !           291: indefinite propagation of errors is required in order to detect modifications.
        !           292: .PP
        !           293: .PP
        !           294: .I des_pcbc_encrypt
        !           295: encrypts/decrypts using a modified block chaining mode. Its calling
        !           296: sequence is identical to
        !           297: .I des_cbc_encrypt.
        !           298: It differs in its error propagation characteristics.
        !           299: .PP
        !           300: .I des_pcbc_encrypt
        !           301: is highly recommended for most encryption purposes, in that
        !           302: modification of a single bit of the ciphertext will affect ALL the
        !           303: subsequent (decrypted) cleartext. Similarly, modifying a single bit of
        !           304: the cleartext will affect ALL the subsequent (encrypted) ciphertext.
        !           305: "PCBC" mode, on encryption, "xors" both the
        !           306: cleartext of block N and the ciphertext resulting from block N with the
        !           307: cleartext for block N+1 prior to encrypting block N+1.
        !           308: .PP
        !           309: .I des_cbc_cksum
        !           310: produces an 8 byte cryptographic checksum by cipher-block-chain
        !           311: encrypting the cleartext data pointed to by the
        !           312: .I input
        !           313: argument. All of the ciphertext output is discarded, except the
        !           314: last 8-byte ciphertext block, which is written into the area pointed to by
        !           315: the
        !           316: .I output
        !           317: argument.
        !           318: It uses the key schedule,
        !           319: provided by the
        !           320: .I schedule
        !           321: argument and initialization vector provided by the
        !           322: .I ivec
        !           323: argument.
        !           324: If the
        !           325: .I length
        !           326: argument is not an integral
        !           327: multiple of eight bytes, the last cleartext block is copied to a temp and zero
        !           328: filled (highest addresses).  The output is ALWAYS eight bytes.
        !           329: .PP
        !           330: The routine also returns an unsigned long, which is the last (highest address)
        !           331: half of the 8 byte checksum computed.
        !           332: .PP
        !           333: .PP
        !           334: .I quad_cksum
        !           335: produces a checksum by chaining quadratic operations on the cleartext data
        !           336: pointed to by the
        !           337: .I input
        !           338: argument. The
        !           339: .I length
        !           340: argument specifies the length of the
        !           341: input -- only exactly that many bytes are included for the checksum,
        !           342: without any padding.
        !           343: .PP
        !           344: The algorithm may be iterated over the same input data, if the
        !           345: .I out_count
        !           346: argument is 2, 3 or 4, and the optional
        !           347: .I output
        !           348: argument is a non-null pointer .
        !           349: The default is one iteration, and it will not run
        !           350: more than 4 times. Multiple iterations run slower, but provide
        !           351: a longer checksum if desired. The
        !           352: .I seed
        !           353: argument provides an 8-byte seed for the first iteration. If multiple iterations are
        !           354: requested, the results of one iteration are automatically used as
        !           355: the seed for the next iteration.
        !           356: .PP
        !           357: It returns both an unsigned long checksum value, and
        !           358: if the
        !           359: .I output
        !           360: argument is not a null pointer, up to 16 bytes of
        !           361: the computed checksum are written into the output.
        !           362: .PP
        !           363: .PP
        !           364: .SH FILES
        !           365: /usr/include/kerberosIV/des.h
        !           366: .br
        !           367: /usr/lib/libdes.a
        !           368: .SH "SEE ALSO"
        !           369: .SH DIAGNOSTICS
        !           370: .SH BUGS
        !           371: This software has not yet been compiled or tested on machines other than the
        !           372: VAX and the IBM PC.
        !           373: .SH AUTHORS
        !           374: Steve Miller, MIT Project Athena/Digital Equipment Corporation
        !           375: .SH RESTRICTIONS
        !           376: COPYRIGHT 1985,1986 Massachusetts Institute of Technology
        !           377: .PP
        !           378: This software may not be exported outside of the US without a special
        !           379: license from the US Dept of Commerce. It may be replaced by any secret
        !           380: key block cipher with block length and key length of 8 bytes, as long
        !           381: as the interface is the same as described here.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.