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.28 2001/06/26 17:27:23 markus Exp $"); */ 36 37 #ifndef CIPHER_H 38 #define CIPHER_H 39 40 #include <openssl/des.h> 41 #include <openssl/blowfish.h> 42 #include <openssl/rc4.h> 43 #include <openssl/cast.h> 44 #include "rijndael.h" 45 /* 46 * Cipher types for SSH-1. New types can be added, but old types should not 47 * be removed for compatibility. The maximum allowed value is 31. 48 */ 49 #define SSH_CIPHER_SSH2 -3 50 #define SSH_CIPHER_ILLEGAL -2 /* No valid cipher selected. */ 51 #define SSH_CIPHER_NOT_SET -1 /* None selected (invalid number). */ 52 #define SSH_CIPHER_NONE 0 /* no encryption */ 53 #define SSH_CIPHER_IDEA 1 /* IDEA CFB */ 54 #define SSH_CIPHER_DES 2 /* DES CBC */ 55 #define SSH_CIPHER_3DES 3 /* 3DES CBC */ 56 #define SSH_CIPHER_BROKEN_TSS 4 /* TRI's Simple Stream encryption CBC */ 57 #define SSH_CIPHER_BROKEN_RC4 5 /* Alleged RC4 */ 58 #define SSH_CIPHER_BLOWFISH 6 59 #define SSH_CIPHER_RESERVED 7 60 #define SSH_CIPHER_MAX 31 61 62 typedef struct Cipher Cipher; 63 typedef struct CipherContext CipherContext; 64 65 struct CipherContext { 66 union { 67 struct { 68 des_key_schedule key; 69 des_cblock iv; 70 } des; 71 struct { 72 des_key_schedule key1; 73 des_key_schedule key2; 74 des_key_schedule key3; 75 des_cblock iv1; 76 des_cblock iv2; 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); 108 Cipher *cipher_by_name(const char *); 109 Cipher *cipher_by_number(int); 110 int cipher_number(const char *); 111 char *cipher_name(int); 112 int ciphers_valid(const char *); 113 void cipher_init(CipherContext *, Cipher *, const u_char *, u_int, 114 const u_char *, u_int); 115 void cipher_encrypt(CipherContext *, u_char *, const u_char *, u_int); 116 void cipher_decrypt(CipherContext *, u_char *, const u_char *, u_int); 117 void cipher_set_key_string(CipherContext *, Cipher *, const char *); 118 119 #endif /* CIPHER_H */ 120