1 /* 2 * Author: Tatu Ylonen <ylo@cs.hut.fi> 3 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 4 * All rights reserved 5 * 6 * As far as I am concerned, the code I have written for this software 7 * can be used freely for any purpose. Any derived versions of this 8 * software must be clearly marked as such, and if the derived work is 9 * incompatible with the protocol description in the RFC file, it must be 10 * called by a name other than "ssh" or "Secure Shell". 11 * 12 * Copyright (c) 2000 Markus Friedl. All rights reserved. 13 * 14 * Redistribution and use in source and binary forms, with or without 15 * modification, are permitted provided that the following conditions 16 * are met: 17 * 1. Redistributions of source code must retain the above copyright 18 * notice, this list of conditions and the following disclaimer. 19 * 2. Redistributions in binary form must reproduce the above copyright 20 * notice, this list of conditions and the following disclaimer in the 21 * documentation and/or other materials provided with the distribution. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 /* RCSID("$OpenBSD: cipher.h,v 1.25 2000/12/19 23:17:56 markus Exp $"); */ 36 /* RCSID("$FreeBSD$"); */ 37 38 #ifndef CIPHER_H 39 #define CIPHER_H 40 41 #include <openssl/des.h> 42 #include <openssl/blowfish.h> 43 #include <openssl/rc4.h> 44 #include <openssl/cast.h> 45 #include "rijndael.h" 46 /* 47 * Cipher types for SSH-1. New types can be added, but old types should not 48 * be removed for compatibility. The maximum allowed value is 31. 49 */ 50 #define SSH_CIPHER_SSH2 -3 51 #define SSH_CIPHER_ILLEGAL -2 /* No valid cipher selected. */ 52 #define SSH_CIPHER_NOT_SET -1 /* None selected (invalid number). */ 53 #define SSH_CIPHER_NONE 0 /* no encryption */ 54 #define SSH_CIPHER_IDEA 1 /* IDEA CFB */ 55 #define SSH_CIPHER_DES 2 /* DES CBC */ 56 #define SSH_CIPHER_3DES 3 /* 3DES CBC */ 57 #define SSH_CIPHER_BROKEN_TSS 4 /* TRI's Simple Stream encryption CBC */ 58 #define SSH_CIPHER_BROKEN_RC4 5 /* Alleged RC4 */ 59 #define SSH_CIPHER_BLOWFISH 6 60 #define SSH_CIPHER_RESERVED 7 61 #define SSH_CIPHER_MAX 31 62 63 typedef struct Cipher Cipher; 64 typedef struct CipherContext CipherContext; 65 66 struct CipherContext { 67 union { 68 struct { 69 des_key_schedule key; 70 des_cblock iv; 71 } des; 72 struct { 73 des_key_schedule key1; 74 des_key_schedule key2; 75 des_cblock iv2; 76 des_key_schedule key3; 77 des_cblock iv3; 78 } des3; 79 struct { 80 struct bf_key_st key; 81 u_char iv[8]; 82 } bf; 83 struct { 84 CAST_KEY key; 85 u_char iv[8]; 86 } cast; 87 struct { 88 u4byte iv[4]; 89 rijndael_ctx enc; 90 rijndael_ctx dec; 91 } rijndael; 92 RC4_KEY rc4; 93 } u; 94 Cipher *cipher; 95 }; 96 struct Cipher { 97 char *name; 98 int number; /* for ssh1 only */ 99 u_int block_size; 100 u_int key_len; 101 void (*setkey)(CipherContext *, const u_char *, u_int); 102 void (*setiv)(CipherContext *, const u_char *, u_int); 103 void (*encrypt)(CipherContext *, u_char *, const u_char *, u_int); 104 void (*decrypt)(CipherContext *, u_char *, const u_char *, u_int); 105 }; 106 107 u_int cipher_mask_ssh1(int client); 108 Cipher *cipher_by_name(const char *name); 109 Cipher *cipher_by_number(int id); 110 int cipher_number(const char *name); 111 char *cipher_name(int id); 112 int ciphers_valid(const char *names); 113 void cipher_init(CipherContext *, Cipher *, const u_char *, u_int, const u_char *, u_int); 114 void cipher_encrypt(CipherContext *context, u_char *dest, const u_char *src, u_int len); 115 void cipher_decrypt(CipherContext *context, u_char *dest, const u_char *src, u_int len); 116 void cipher_set_key_string(CipherContext *context, Cipher *cipher, const char *passphrase); 117 118 #endif /* CIPHER_H */ 119