[BACK]Return to cipher.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Annotation of src/usr.bin/ssh/cipher.c, Revision 1.24

1.1       deraadt     1: /*
1.17      deraadt     2:  *
                      3:  * cipher.c
                      4:  *
                      5:  * Author: Tatu Ylonen <ylo@cs.hut.fi>
                      6:  *
                      7:  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
                      8:  *                    All rights reserved
                      9:  *
                     10:  * Created: Wed Apr 19 17:41:39 1995 ylo
                     11:  *
                     12:  */
1.1       deraadt    13:
                     14: #include "includes.h"
1.24    ! markus     15: RCSID("$Id: cipher.c,v 1.23 2000/04/12 00:18:20 deraadt Exp $");
1.1       deraadt    16:
                     17: #include "ssh.h"
                     18: #include "cipher.h"
1.24    ! markus     19: #include "xmalloc.h"
1.8       deraadt    20:
1.12      deraadt    21: #include <ssl/md5.h>
1.1       deraadt    22:
                     23: /*
1.24    ! markus     24:  * This is used by SSH1:
        !            25:  *
1.23      deraadt    26:  * What kind of triple DES are these 2 routines?
1.1       deraadt    27:  *
                     28:  * Why is there a redundant initialization vector?
                     29:  *
                     30:  * If only iv3 was used, then, this would till effect have been
                     31:  * outer-cbc. However, there is also a private iv1 == iv2 which
                     32:  * perhaps makes differential analysis easier. On the other hand, the
                     33:  * private iv1 probably makes the CRC-32 attack ineffective. This is a
                     34:  * result of that there is no longer any known iv1 to use when
                     35:  * choosing the X block.
                     36:  */
                     37: void
                     38: SSH_3CBC_ENCRYPT(des_key_schedule ks1,
1.16      markus     39:                 des_key_schedule ks2, des_cblock * iv2,
                     40:                 des_key_schedule ks3, des_cblock * iv3,
1.19      markus     41:                 unsigned char *dest, unsigned char *src,
1.1       deraadt    42:                 unsigned int len)
                     43: {
1.16      markus     44:        des_cblock iv1;
1.1       deraadt    45:
1.16      markus     46:        memcpy(&iv1, iv2, 8);
1.1       deraadt    47:
1.16      markus     48:        des_cbc_encrypt(src, dest, len, ks1, &iv1, DES_ENCRYPT);
                     49:        memcpy(&iv1, dest + len - 8, 8);
1.1       deraadt    50:
1.16      markus     51:        des_cbc_encrypt(dest, dest, len, ks2, iv2, DES_DECRYPT);
                     52:        memcpy(iv2, &iv1, 8);   /* Note how iv1 == iv2 on entry and exit. */
1.1       deraadt    53:
1.16      markus     54:        des_cbc_encrypt(dest, dest, len, ks3, iv3, DES_ENCRYPT);
                     55:        memcpy(iv3, dest + len - 8, 8);
1.1       deraadt    56: }
                     57:
                     58: void
                     59: SSH_3CBC_DECRYPT(des_key_schedule ks1,
1.16      markus     60:                 des_key_schedule ks2, des_cblock * iv2,
                     61:                 des_key_schedule ks3, des_cblock * iv3,
1.19      markus     62:                 unsigned char *dest, unsigned char *src,
1.1       deraadt    63:                 unsigned int len)
                     64: {
1.16      markus     65:        des_cblock iv1;
1.1       deraadt    66:
1.16      markus     67:        memcpy(&iv1, iv2, 8);
1.1       deraadt    68:
1.16      markus     69:        des_cbc_encrypt(src, dest, len, ks3, iv3, DES_DECRYPT);
                     70:        memcpy(iv3, src + len - 8, 8);
1.1       deraadt    71:
1.16      markus     72:        des_cbc_encrypt(dest, dest, len, ks2, iv2, DES_ENCRYPT);
                     73:        memcpy(iv2, dest + len - 8, 8);
1.1       deraadt    74:
1.16      markus     75:        des_cbc_encrypt(dest, dest, len, ks1, &iv1, DES_DECRYPT);
                     76:        /* memcpy(&iv1, iv2, 8); */
                     77:        /* Note how iv1 == iv2 on entry and exit. */
1.1       deraadt    78: }
                     79:
                     80: /*
1.24    ! markus     81:  * SSH1 uses a variation on Blowfish, all bytes must be swapped before
1.1       deraadt    82:  * and after encryption/decryption. Thus the swap_bytes stuff (yuk).
                     83:  */
1.16      markus     84: static void
1.1       deraadt    85: swap_bytes(const unsigned char *src, unsigned char *dst_, int n)
                     86: {
1.16      markus     87:        /* dst must be properly aligned. */
                     88:        u_int32_t *dst = (u_int32_t *) dst_;
                     89:        union {
                     90:                u_int32_t i;
                     91:                char c[4];
                     92:        } t;
                     93:
                     94:        /* Process 8 bytes every lap. */
                     95:        for (n = n / 8; n > 0; n--) {
                     96:                t.c[3] = *src++;
                     97:                t.c[2] = *src++;
                     98:                t.c[1] = *src++;
                     99:                t.c[0] = *src++;
                    100:                *dst++ = t.i;
                    101:
                    102:                t.c[3] = *src++;
                    103:                t.c[2] = *src++;
                    104:                t.c[1] = *src++;
                    105:                t.c[0] = *src++;
                    106:                *dst++ = t.i;
                    107:        }
1.1       deraadt   108: }
                    109:
1.18      markus    110: /*
                    111:  * Names of all encryption algorithms.
                    112:  * These must match the numbers defined in cipher.h.
                    113:  */
1.1       deraadt   114: static char *cipher_names[] =
1.4       provos    115: {
1.16      markus    116:        "none",
                    117:        "idea",
                    118:        "des",
                    119:        "3des",
                    120:        "tss",
                    121:        "rc4",
1.21      markus    122:        "blowfish",
                    123:        "reserved",
                    124:        "blowfish-cbc",
                    125:        "3des-cbc",
                    126:        "arcfour",
                    127:        "cast128-cbc"
1.1       deraadt   128: };
                    129:
1.18      markus    130: /*
                    131:  * Returns a bit mask indicating which ciphers are supported by this
                    132:  * implementation.  The bit mask has the corresponding bit set of each
                    133:  * supported cipher.
                    134:  */
1.1       deraadt   135:
1.16      markus    136: unsigned int
1.22      markus    137: cipher_mask1()
1.1       deraadt   138: {
1.16      markus    139:        unsigned int mask = 0;
                    140:        mask |= 1 << SSH_CIPHER_3DES;           /* Mandatory */
                    141:        mask |= 1 << SSH_CIPHER_BLOWFISH;
1.22      markus    142:        return mask;
                    143: }
                    144: unsigned int
                    145: cipher_mask2()
                    146: {
                    147:        unsigned int mask = 0;
1.21      markus    148:        mask |= 1 << SSH_CIPHER_BLOWFISH_CBC;
                    149:        mask |= 1 << SSH_CIPHER_3DES_CBC;
                    150:        mask |= 1 << SSH_CIPHER_ARCFOUR;
                    151:        mask |= 1 << SSH_CIPHER_CAST128_CBC;
1.16      markus    152:        return mask;
1.1       deraadt   153: }
1.22      markus    154: unsigned int
                    155: cipher_mask()
                    156: {
                    157:        return cipher_mask1() | cipher_mask2();
                    158: }
1.1       deraadt   159:
                    160: /* Returns the name of the cipher. */
                    161:
1.16      markus    162: const char *
                    163: cipher_name(int cipher)
1.1       deraadt   164: {
1.16      markus    165:        if (cipher < 0 || cipher >= sizeof(cipher_names) / sizeof(cipher_names[0]) ||
                    166:            cipher_names[cipher] == NULL)
1.24    ! markus    167:                fatal("cipher_name: bad cipher name: %d", cipher);
1.16      markus    168:        return cipher_names[cipher];
1.1       deraadt   169: }
                    170:
1.24    ! markus    171: /* Returns 1 if the name of the ciphers are valid. */
        !           172:
        !           173: #define        CIPHER_SEP      ","
        !           174: int
        !           175: ciphers_valid(const char *names)
        !           176: {
        !           177:        char *ciphers;
        !           178:        char *p;
        !           179:        int i;
        !           180:
        !           181:        if (strcmp(names, "") == 0)
        !           182:                return 0;
        !           183:        ciphers = xstrdup(names);
        !           184:        for ((p = strtok(ciphers, CIPHER_SEP)); p; (p = strtok(NULL, CIPHER_SEP))) {
        !           185:                i = cipher_number(p);
        !           186:                if (i == -1 || !(cipher_mask2() & (1 << i))) {
        !           187:                        xfree(ciphers);
        !           188:                        return 0;
        !           189:                }
        !           190:        }
        !           191:        xfree(ciphers);
        !           192:        return 1;
        !           193: }
        !           194:
1.18      markus    195: /*
                    196:  * Parses the name of the cipher.  Returns the number of the corresponding
                    197:  * cipher, or -1 on error.
                    198:  */
1.1       deraadt   199:
1.4       provos    200: int
                    201: cipher_number(const char *name)
1.1       deraadt   202: {
1.16      markus    203:        int i;
                    204:        for (i = 0; i < sizeof(cipher_names) / sizeof(cipher_names[0]); i++)
                    205:                if (strcmp(cipher_names[i], name) == 0 &&
                    206:                    (cipher_mask() & (1 << i)))
                    207:                        return i;
                    208:        return -1;
1.1       deraadt   209: }
                    210:
1.18      markus    211: /*
                    212:  * Selects the cipher, and keys if by computing the MD5 checksum of the
                    213:  * passphrase and using the resulting 16 bytes as the key.
                    214:  */
1.1       deraadt   215:
1.16      markus    216: void
1.22      markus    217: cipher_set_key_string(CipherContext *context, int cipher, const char *passphrase)
1.1       deraadt   218: {
1.16      markus    219:        MD5_CTX md;
                    220:        unsigned char digest[16];
                    221:
                    222:        MD5_Init(&md);
                    223:        MD5_Update(&md, (const unsigned char *) passphrase, strlen(passphrase));
                    224:        MD5_Final(digest, &md);
                    225:
1.22      markus    226:        cipher_set_key(context, cipher, digest, 16);
1.16      markus    227:
                    228:        memset(digest, 0, sizeof(digest));
                    229:        memset(&md, 0, sizeof(md));
1.1       deraadt   230: }
                    231:
                    232: /* Selects the cipher to use and sets the key. */
                    233:
1.16      markus    234: void
1.22      markus    235: cipher_set_key(CipherContext *context, int cipher, const unsigned char *key,
                    236:     int keylen)
1.16      markus    237: {
                    238:        unsigned char padded[32];
                    239:
                    240:        /* Set cipher type. */
                    241:        context->type = cipher;
                    242:
                    243:        /* Get 32 bytes of key data.  Pad if necessary.  (So that code
                    244:           below does not need to worry about key size). */
                    245:        memset(padded, 0, sizeof(padded));
                    246:        memcpy(padded, key, keylen < sizeof(padded) ? keylen : sizeof(padded));
                    247:
                    248:        /* Initialize the initialization vector. */
                    249:        switch (cipher) {
                    250:        case SSH_CIPHER_NONE:
1.18      markus    251:                /*
                    252:                 * Has to stay for authfile saving of private key with no
                    253:                 * passphrase
                    254:                 */
1.16      markus    255:                break;
                    256:
                    257:        case SSH_CIPHER_3DES:
1.18      markus    258:                /*
                    259:                 * Note: the least significant bit of each byte of key is
                    260:                 * parity, and must be ignored by the implementation.  16
                    261:                 * bytes of key are used (first and last keys are the same).
                    262:                 */
1.16      markus    263:                if (keylen < 16)
                    264:                        error("Key length %d is insufficient for 3DES.", keylen);
                    265:                des_set_key((void *) padded, context->u.des3.key1);
                    266:                des_set_key((void *) (padded + 8), context->u.des3.key2);
                    267:                if (keylen <= 16)
                    268:                        des_set_key((void *) padded, context->u.des3.key3);
                    269:                else
                    270:                        des_set_key((void *) (padded + 16), context->u.des3.key3);
                    271:                memset(context->u.des3.iv2, 0, sizeof(context->u.des3.iv2));
                    272:                memset(context->u.des3.iv3, 0, sizeof(context->u.des3.iv3));
                    273:                break;
                    274:
                    275:        case SSH_CIPHER_BLOWFISH:
1.21      markus    276:                if (keylen < 16)
                    277:                        error("Key length %d is insufficient for blowfish.", keylen);
1.16      markus    278:                BF_set_key(&context->u.bf.key, keylen, padded);
                    279:                memset(context->u.bf.iv, 0, 8);
                    280:                break;
                    281:
1.21      markus    282:        case SSH_CIPHER_3DES_CBC:
                    283:        case SSH_CIPHER_BLOWFISH_CBC:
                    284:        case SSH_CIPHER_ARCFOUR:
                    285:        case SSH_CIPHER_CAST128_CBC:
                    286:                fatal("cipher_set_key: illegal cipher: %s", cipher_name(cipher));
                    287:                break;
                    288:
1.16      markus    289:        default:
                    290:                fatal("cipher_set_key: unknown cipher: %s", cipher_name(cipher));
                    291:        }
                    292:        memset(padded, 0, sizeof(padded));
1.1       deraadt   293: }
1.21      markus    294:
                    295: void
                    296: cipher_set_key_iv(CipherContext * context, int cipher,
                    297:     const unsigned char *key, int keylen,
                    298:     const unsigned char *iv, int ivlen)
                    299: {
                    300:        /* Set cipher type. */
                    301:        context->type = cipher;
                    302:
                    303:        /* Initialize the initialization vector. */
                    304:        switch (cipher) {
                    305:        case SSH_CIPHER_NONE:
                    306:                break;
                    307:
                    308:        case SSH_CIPHER_3DES:
                    309:        case SSH_CIPHER_BLOWFISH:
                    310:                fatal("cipher_set_key_iv: illegal cipher: %s", cipher_name(cipher));
                    311:                break;
                    312:
                    313:        case SSH_CIPHER_3DES_CBC:
                    314:                if (keylen < 24)
                    315:                        error("Key length %d is insufficient for 3des-cbc.", keylen);
                    316:                des_set_key((void *) key, context->u.des3.key1);
                    317:                des_set_key((void *) (key+8), context->u.des3.key2);
                    318:                des_set_key((void *) (key+16), context->u.des3.key3);
                    319:                if (ivlen < 8)
                    320:                        error("IV length %d is insufficient for 3des-cbc.", ivlen);
                    321:                memcpy(context->u.des3.iv3, (char *)iv, 8);
                    322:                break;
                    323:
                    324:        case SSH_CIPHER_BLOWFISH_CBC:
                    325:                if (keylen < 16)
                    326:                        error("Key length %d is insufficient for blowfish.", keylen);
                    327:                if (ivlen < 8)
                    328:                        error("IV length %d is insufficient for blowfish.", ivlen);
                    329:                BF_set_key(&context->u.bf.key, keylen, (unsigned char *)key);
                    330:                memcpy(context->u.bf.iv, (char *)iv, 8);
                    331:                break;
                    332:
                    333:        case SSH_CIPHER_ARCFOUR:
                    334:                if (keylen < 16)
                    335:                        error("Key length %d is insufficient for arcfour.", keylen);
                    336:                RC4_set_key(&context->u.rc4, keylen, (unsigned char *)key);
                    337:                break;
                    338:
                    339:        case SSH_CIPHER_CAST128_CBC:
                    340:                if (keylen < 16)
                    341:                        error("Key length %d is insufficient for cast128.", keylen);
                    342:                if (ivlen < 8)
                    343:                        error("IV length %d is insufficient for cast128.", ivlen);
                    344:                CAST_set_key(&context->u.cast.key, keylen, (unsigned char *) key);
                    345:                memcpy(context->u.cast.iv, (char *)iv, 8);
                    346:                break;
                    347:
                    348:        default:
                    349:                fatal("cipher_set_key: unknown cipher: %s", cipher_name(cipher));
                    350:        }
                    351: }
                    352:
1.1       deraadt   353: /* Encrypts data using the cipher. */
                    354:
1.16      markus    355: void
                    356: cipher_encrypt(CipherContext *context, unsigned char *dest,
                    357:               const unsigned char *src, unsigned int len)
                    358: {
                    359:        if ((len & 7) != 0)
                    360:                fatal("cipher_encrypt: bad plaintext length %d", len);
                    361:
                    362:        switch (context->type) {
                    363:        case SSH_CIPHER_NONE:
                    364:                memcpy(dest, src, len);
                    365:                break;
                    366:
                    367:        case SSH_CIPHER_3DES:
                    368:                SSH_3CBC_ENCRYPT(context->u.des3.key1,
                    369:                                 context->u.des3.key2, &context->u.des3.iv2,
                    370:                                 context->u.des3.key3, &context->u.des3.iv3,
1.19      markus    371:                                 dest, (unsigned char *) src, len);
1.16      markus    372:                break;
                    373:
                    374:        case SSH_CIPHER_BLOWFISH:
                    375:                swap_bytes(src, dest, len);
                    376:                BF_cbc_encrypt(dest, dest, len,
                    377:                               &context->u.bf.key, context->u.bf.iv,
                    378:                               BF_ENCRYPT);
                    379:                swap_bytes(dest, dest, len);
                    380:                break;
                    381:
1.21      markus    382:        case SSH_CIPHER_BLOWFISH_CBC:
                    383:                BF_cbc_encrypt((void *)src, dest, len,
                    384:                               &context->u.bf.key, context->u.bf.iv,
                    385:                               BF_ENCRYPT);
                    386:                break;
                    387:
                    388:        case SSH_CIPHER_3DES_CBC:
                    389:                des_ede3_cbc_encrypt(src, dest, len,
                    390:                    context->u.des3.key1, context->u.des3.key2,
                    391:                    context->u.des3.key3, &context->u.des3.iv3, DES_ENCRYPT);
                    392:                break;
                    393:
                    394:        case SSH_CIPHER_ARCFOUR:
                    395:                RC4(&context->u.rc4, len, (unsigned char *)src, dest);
                    396:                break;
                    397:
                    398:        case SSH_CIPHER_CAST128_CBC:
                    399:                CAST_cbc_encrypt(src, dest, len,
                    400:                    &context->u.cast.key, context->u.cast.iv, CAST_ENCRYPT);
                    401:                break;
                    402:
1.16      markus    403:        default:
                    404:                fatal("cipher_encrypt: unknown cipher: %s", cipher_name(context->type));
                    405:        }
                    406: }
1.1       deraadt   407:
                    408: /* Decrypts data using the cipher. */
                    409:
1.16      markus    410: void
                    411: cipher_decrypt(CipherContext *context, unsigned char *dest,
                    412:               const unsigned char *src, unsigned int len)
                    413: {
                    414:        if ((len & 7) != 0)
                    415:                fatal("cipher_decrypt: bad ciphertext length %d", len);
                    416:
                    417:        switch (context->type) {
                    418:        case SSH_CIPHER_NONE:
                    419:                memcpy(dest, src, len);
                    420:                break;
                    421:
                    422:        case SSH_CIPHER_3DES:
                    423:                SSH_3CBC_DECRYPT(context->u.des3.key1,
                    424:                                 context->u.des3.key2, &context->u.des3.iv2,
                    425:                                 context->u.des3.key3, &context->u.des3.iv3,
1.19      markus    426:                                 dest, (unsigned char *) src, len);
1.16      markus    427:                break;
                    428:
                    429:        case SSH_CIPHER_BLOWFISH:
                    430:                swap_bytes(src, dest, len);
                    431:                BF_cbc_encrypt((void *) dest, dest, len,
                    432:                               &context->u.bf.key, context->u.bf.iv,
                    433:                               BF_DECRYPT);
                    434:                swap_bytes(dest, dest, len);
1.21      markus    435:                break;
                    436:
                    437:        case SSH_CIPHER_BLOWFISH_CBC:
                    438:                BF_cbc_encrypt((void *) src, dest, len,
                    439:                               &context->u.bf.key, context->u.bf.iv,
                    440:                               BF_DECRYPT);
                    441:                break;
                    442:
                    443:        case SSH_CIPHER_3DES_CBC:
                    444:                des_ede3_cbc_encrypt(src, dest, len,
                    445:                    context->u.des3.key1, context->u.des3.key2,
                    446:                    context->u.des3.key3, &context->u.des3.iv3, DES_DECRYPT);
                    447:                break;
                    448:
                    449:        case SSH_CIPHER_ARCFOUR:
                    450:                RC4(&context->u.rc4, len, (unsigned char *)src, dest);
                    451:                break;
                    452:
                    453:        case SSH_CIPHER_CAST128_CBC:
                    454:                CAST_cbc_encrypt(src, dest, len,
                    455:                    &context->u.cast.key, context->u.cast.iv, CAST_DECRYPT);
1.16      markus    456:                break;
                    457:
                    458:        default:
                    459:                fatal("cipher_decrypt: unknown cipher: %s", cipher_name(context->type));
                    460:        }
1.1       deraadt   461: }