From 58133d22a8ffd5efec1ac58b8ff45f70c39ba7f9 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Sat, 16 Feb 2002 12:21:43 +0000 Subject: [PATCH] Add the modes OFB128, CFB128 and CTR128 to AES. Submitted by Stephen Sprunk --- crypto/aes/Makefile.ssl | 4 ++-- crypto/aes/aes.h | 36 ++++++++++++++++++++++++++---------- crypto/aes/aes_cbc.c | 2 +- crypto/aes/aes_core.c | 10 ---------- crypto/aes/aes_ecb.c | 2 +- crypto/aes/aes_locl.h | 11 ++++++++++- crypto/aes/aes_misc.c | 2 +- 7 files changed, 41 insertions(+), 26 deletions(-) diff --git a/crypto/aes/Makefile.ssl b/crypto/aes/Makefile.ssl index 13deef0604..099bf0dd28 100644 --- a/crypto/aes/Makefile.ssl +++ b/crypto/aes/Makefile.ssl @@ -26,8 +26,8 @@ TEST= APPS= LIB=$(TOP)/libcrypto.a -LIBSRC=aes_core.c aes_misc.c aes_ecb.c aes_cbc.c -LIBOBJ=aes_core.o aes_misc.o aes_ecb.o aes_cbc.o +LIBSRC=aes_core.c aes_misc.c aes_ecb.c aes_cbc.c aes_cfb.c aes_ofb.c aes_ctr.c +LIBOBJ=aes_core.o aes_misc.o aes_ecb.o aes_cbc.o aes_cfb.o aes_ofb.o aes_ctr.o SRC= $(LIBSRC) diff --git a/crypto/aes/aes.h b/crypto/aes/aes.h index 2d6c201838..e8da921ec5 100644 --- a/crypto/aes/aes.h +++ b/crypto/aes/aes.h @@ -1,6 +1,6 @@ /* crypto/aes/aes.h -*- mode:C; c-file-style: "eay" -*- */ /* ==================================================================== - * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -58,8 +58,10 @@ static const int AES_DECRYPT = 0; static const int AES_ENCRYPT = 1; -#define AES_MAXNR 14 /* array size can't be a const in C */ -static const int AES_BLOCK_SIZE = 16; /* bytes */ +/* Because array size can't be a const in C, the following two are macros. + Both sizes are in bytes. */ +#define AES_MAXNR 14 +#define AES_BLOCK_SIZE 16 #ifdef __cplusplus extern "C" { @@ -74,17 +76,31 @@ typedef struct aes_key_st AES_KEY; const char *AES_options(void); -int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key); -int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key); +int AES_set_encrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); +int AES_set_decrypt_key(const unsigned char *userKey, const int bits, + AES_KEY *key); -void AES_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key); -void AES_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key); +void AES_encrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); +void AES_decrypt(const unsigned char *in, unsigned char *out, + const AES_KEY *key); void AES_ecb_encrypt(const unsigned char *in, unsigned char *out, - const AES_KEY *key, const int enc); + const AES_KEY *key, const int enc); void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, - const unsigned long length, const AES_KEY *key, - unsigned char *ivec, const int enc); + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, const int enc); +void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, int *num, const int enc); +void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, int *num); +void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *counter, unsigned int *num); + #ifdef __cplusplus } diff --git a/crypto/aes/aes_cbc.c b/crypto/aes/aes_cbc.c index 964a9780e4..3dfd7aba2a 100644 --- a/crypto/aes/aes_cbc.c +++ b/crypto/aes/aes_cbc.c @@ -1,6 +1,6 @@ /* crypto/aes/aes_cbc.c -*- mode:C; c-file-style: "eay" -*- */ /* ==================================================================== - * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/crypto/aes/aes_core.c b/crypto/aes/aes_core.c index a9bc1c0de4..937988dd8c 100644 --- a/crypto/aes/aes_core.c +++ b/crypto/aes/aes_core.c @@ -715,16 +715,6 @@ static const u32 rcon[] = { 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ }; -#define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00) - -#ifdef _MSC_VER -#define GETU32(p) SWAP(*((u32 *)(p))) -#define PUTU32(ct, st) { *((u32 *)(ct)) = SWAP((st)); } -#else -#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) -#define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } -#endif - /** * Expand the cipher key into the encryption key schedule. */ diff --git a/crypto/aes/aes_ecb.c b/crypto/aes/aes_ecb.c index 8ea0f66088..1cb2e07d3d 100644 --- a/crypto/aes/aes_ecb.c +++ b/crypto/aes/aes_ecb.c @@ -1,6 +1,6 @@ /* crypto/aes/aes_ecb.c -*- mode:C; c-file-style: "eay" -*- */ /* ==================================================================== - * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/crypto/aes/aes_locl.h b/crypto/aes/aes_locl.h index d49e829933..541d1d6e84 100644 --- a/crypto/aes/aes_locl.h +++ b/crypto/aes/aes_locl.h @@ -1,6 +1,6 @@ /* crypto/aes/aes.h -*- mode:C; c-file-style: "eay" -*- */ /* ==================================================================== - * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -65,6 +65,15 @@ #include #endif +#ifdef _MSC_VER +# define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00) +# define GETU32(p) SWAP(*((u32 *)(p))) +# define PUTU32(ct, st) { *((u32 *)(ct)) = SWAP((st)); } +#else +# define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) +# define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } +#endif + typedef unsigned long u32; typedef unsigned short u16; typedef unsigned char u8; diff --git a/crypto/aes/aes_misc.c b/crypto/aes/aes_misc.c index 6bec96f67d..090def25d5 100644 --- a/crypto/aes/aes_misc.c +++ b/crypto/aes/aes_misc.c @@ -1,6 +1,6 @@ /* crypto/aes/aes_misc.c -*- mode:C; c-file-style: "eay" -*- */ /* ==================================================================== - * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. + * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions -- 2.25.1