Annotation of src/usr.bin/ssh/cipher-bf1.c, Revision 1.1
1.1 ! markus 1: /*
! 2: * Copyright (c) 2003 Markus Friedl. All rights reserved.
! 3: *
! 4: * Redistribution and use in source and binary forms, with or without
! 5: * modification, are permitted provided that the following conditions
! 6: * are met:
! 7: * 1. Redistributions of source code must retain the above copyright
! 8: * notice, this list of conditions and the following disclaimer.
! 9: * 2. Redistributions in binary form must reproduce the above copyright
! 10: * notice, this list of conditions and the following disclaimer in the
! 11: * documentation and/or other materials provided with the distribution.
! 12: *
! 13: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 14: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 15: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 16: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 17: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 18: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 19: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 20: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 21: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 22: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 23: */
! 24:
! 25: #include "includes.h"
! 26: RCSID("$OpenBSD: $");
! 27:
! 28: #include <openssl/evp.h>
! 29: #include "xmalloc.h"
! 30: #include "log.h"
! 31: /*
! 32: * SSH1 uses a variation on Blowfish, all bytes must be swapped before
! 33: * and after encryption/decryption. Thus the swap_bytes stuff (yuk).
! 34: */
! 35:
! 36: const EVP_CIPHER * evp_ssh1_bf(void);
! 37:
! 38: static void
! 39: swap_bytes(const u_char *src, u_char *dst, int n)
! 40: {
! 41: u_char c[4];
! 42:
! 43: /* Process 4 bytes every lap. */
! 44: for (n = n / 4; n > 0; n--) {
! 45: c[3] = *src++;
! 46: c[2] = *src++;
! 47: c[1] = *src++;
! 48: c[0] = *src++;
! 49:
! 50: *dst++ = c[0];
! 51: *dst++ = c[1];
! 52: *dst++ = c[2];
! 53: *dst++ = c[3];
! 54: }
! 55: }
! 56:
! 57: static int (*orig_bf)(EVP_CIPHER_CTX *, u_char *, const u_char *, u_int) = NULL;
! 58:
! 59: static int
! 60: bf_ssh1_cipher(EVP_CIPHER_CTX *ctx, u_char *out, const u_char *in, u_int len)
! 61: {
! 62: int ret;
! 63:
! 64: swap_bytes(in, out, len);
! 65: ret = (*orig_bf)(ctx, out, out, len);
! 66: swap_bytes(out, out, len);
! 67: return (ret);
! 68: }
! 69:
! 70: const EVP_CIPHER *
! 71: evp_ssh1_bf(void)
! 72: {
! 73: static EVP_CIPHER ssh1_bf;
! 74:
! 75: memcpy(&ssh1_bf, EVP_bf_cbc(), sizeof(EVP_CIPHER));
! 76: orig_bf = ssh1_bf.do_cipher;
! 77: ssh1_bf.nid = NID_undef;
! 78: ssh1_bf.do_cipher = bf_ssh1_cipher;
! 79: ssh1_bf.key_len = 32;
! 80: return (&ssh1_bf);
! 81: }