summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorBen Laurie <ben@openssl.org>2001-02-06 14:09:13 +0000
committerBen Laurie <ben@openssl.org>2001-02-06 14:09:13 +0000
commit259810e05bfcb465469a326cbfb939661a2fbcb9 (patch)
treed1d0e9f496dc18d640caad8eae5ef3c93190ef49 /crypto
parent171cc53a962533f284b8f1f4cf5d92f6bca3b3e0 (diff)
Rijdael CBC mode and partial undebugged SSL support.
Diffstat (limited to 'crypto')
-rw-r--r--crypto/evp/c_allc.c3
-rw-r--r--crypto/evp/e_rd.c82
-rw-r--r--crypto/evp/evp.h1
-rw-r--r--crypto/objects/obj_dat.h36
-rw-r--r--crypto/objects/obj_mac.h36
-rw-r--r--crypto/objects/obj_mac.num12
-rw-r--r--crypto/objects/objects.txt9
-rw-r--r--crypto/rijndael/Makefile.ssl4
8 files changed, 174 insertions, 9 deletions
diff --git a/crypto/evp/c_allc.c b/crypto/evp/c_allc.c
index bb78c68160..02b3579b86 100644
--- a/crypto/evp/c_allc.c
+++ b/crypto/evp/c_allc.c
@@ -150,7 +150,10 @@ void OpenSSL_add_all_ciphers(void)
#ifndef NO_RIJNDAEL
for(i=0 ; i < 3 ; ++i)
for(j=0 ; j < 3 ; ++j)
+ {
EVP_add_cipher(EVP_rijndael_ecb(i,j));
+ EVP_add_cipher(EVP_rijndael_cbc(i,j));
+ }
#endif
PKCS12_PBE_add();
PKCS5_PBE_add();
diff --git a/crypto/evp/e_rd.c b/crypto/evp/e_rd.c
index 78122edc7a..c2888aa055 100644
--- a/crypto/evp/e_rd.c
+++ b/crypto/evp/e_rd.c
@@ -56,15 +56,22 @@
static EVP_CIPHER rd_cipher[3][3];
static int anSizes[]={16,24,32};
-static int anNIDs[3][3]=
+static int anECBNIDs[3][3]=
{
{ NID_rijndael_ecb_k128_b128,NID_rijndael_ecb_k192_b128,NID_rijndael_ecb_k256_b128 },
{ NID_rijndael_ecb_k128_b192,NID_rijndael_ecb_k192_b192,NID_rijndael_ecb_k256_b192 },
{ NID_rijndael_ecb_k128_b256,NID_rijndael_ecb_k192_b256,NID_rijndael_ecb_k256_b256 }
};
-static int rd_init_ecb(EVP_CIPHER_CTX *ctx, const unsigned char *key,
- const unsigned char *iv, int enc)
+static int anCBCNIDs[3][3]=
+ {
+ { NID_rd128_cbc_b128,NID_rd192_cbc_b128,NID_rd256_cbc_b128 },
+ { NID_rd128_cbc_b192,NID_rd192_cbc_b192,NID_rd256_cbc_b192 },
+ { NID_rd128_cbc_b256,NID_rd192_cbc_b256,NID_rd256_cbc_b256 }
+ };
+
+static int rd_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,
+ const unsigned char *iv, int enc)
{
RIJNDAEL_KEY *k=&ctx->c.rijndael;
@@ -98,6 +105,39 @@ static int rd_cipher_ecb(EVP_CIPHER_CTX *ctx, unsigned char *out,
return 1;
}
+static int rd_cipher_cbc(EVP_CIPHER_CTX *ctx, unsigned char *out,
+ const unsigned char *in, unsigned int inl)
+ {
+ int n;
+ unsigned char tmp[16];
+
+ while(inl > 0)
+ {
+ if(ctx->c.rijndael.enc)
+ {
+ for(n=0 ; n < 16 ; ++n)
+ tmp[n]=in[n]^ctx->c.rijndael.iv[n];
+ rijndaelEncrypt(tmp,out,ctx->c.rijndael.keySched,
+ ctx->c.rijndael.rounds);
+ memcpy(ctx->c.rijndael.iv,out,16);
+ }
+ else
+ {
+ rijndaelDecrypt(in,out,ctx->c.rijndael.keySched,
+ ctx->c.rijndael.rounds);
+ for(n=0 ; n < 16 ; ++n)
+ out[n]^=ctx->c.rijndael.iv[n];
+ memcpy(ctx->c.rijndael.iv,in,16);
+ }
+ inl-=16;
+ in+=16;
+ out+=16;
+ }
+ assert(inl == 0);
+
+ return 1;
+ }
+
EVP_CIPHER *EVP_rijndael_ecb(int nBlockLength,int nKeyLength)
{
EVP_CIPHER *c;
@@ -117,15 +157,47 @@ EVP_CIPHER *EVP_rijndael_ecb(int nBlockLength,int nKeyLength)
memset(c,'\0',sizeof *c);
- c->nid=anNIDs[nBlockLength][nKeyLength];
+ c->nid=anECBNIDs[nBlockLength][nKeyLength];
c->block_size=anSizes[nBlockLength];
c->key_len=anSizes[nKeyLength];
c->iv_len=16;
c->flags=EVP_CIPH_ECB_MODE;
- c->init=rd_init_ecb;
+ c->init=rd_init;
c->do_cipher=rd_cipher_ecb;
c->ctx_size=sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+
sizeof((((EVP_CIPHER_CTX *)NULL)->c.rijndael));
return c;
}
+
+EVP_CIPHER *EVP_rijndael_cbc(int nBlockLength,int nKeyLength)
+ {
+ EVP_CIPHER *c;
+
+ if(nBlockLength < 0 || nBlockLength > 2)
+ {
+ EVPerr(EVP_F_EVP_RIJNDAEL,EVP_R_BAD_BLOCK_LENGTH);
+ return NULL;
+ }
+ if(nKeyLength < 0 || nKeyLength > 2)
+ {
+ EVPerr(EVP_F_EVP_RIJNDAEL,EVP_R_BAD_KEY_LENGTH);
+ return NULL;
+ }
+
+ c=&rd_cipher[nKeyLength][nBlockLength];
+
+ memset(c,'\0',sizeof *c);
+
+ c->nid=anCBCNIDs[nBlockLength][nKeyLength];
+ c->block_size=anSizes[nBlockLength];
+ c->key_len=anSizes[nKeyLength];
+ c->iv_len=16;
+ c->flags=EVP_CIPH_CBC_MODE;
+ c->init=rd_init;
+ c->do_cipher=rd_cipher_cbc;
+ c->ctx_size=sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+
+ sizeof((((EVP_CIPHER_CTX *)NULL)->c.rijndael));
+
+ return c;
+ }
diff --git a/crypto/evp/evp.h b/crypto/evp/evp.h
index 60578f9d5e..e8b4de48df 100644
--- a/crypto/evp/evp.h
+++ b/crypto/evp/evp.h
@@ -707,6 +707,7 @@ EVP_CIPHER *EVP_rc5_32_12_16_ofb(void);
#endif
#ifndef NO_RIJNDAEL
EVP_CIPHER *EVP_rijndael_ecb(int nBlockLength,int nKeyLength);
+EVP_CIPHER *EVP_rijndael_cbc(int nBlockLength,int nKeyLength);
#endif
void OpenSSL_add_all_algorithms(void);
diff --git a/crypto/objects/obj_dat.h b/crypto/objects/obj_dat.h
index b10da2d9b6..5c5b5aaf14 100644
--- a/crypto/objects/obj_dat.h
+++ b/crypto/objects/obj_dat.h
@@ -61,9 +61,9 @@
* perl obj_dat.pl objects.h obj_dat.h
*/
-#define NUM_NID 405
-#define NUM_SN 401
-#define NUM_LN 401
+#define NUM_NID 417
+#define NUM_SN 410
+#define NUM_LN 410
#define NUM_OBJ 366
static unsigned char lvalues[2896]={
@@ -1066,6 +1066,18 @@ static ASN1_OBJECT nid_objs[NUM_NID]={
NID_rijndael_ecb_k192_b256,0,NULL},
{"RIJNDAEL-ECB-K256-B256","rijndael-ecb-k256-b256",
NID_rijndael_ecb_k256_b256,0,NULL},
+{NULL,NULL,NID_undef,0,NULL},
+{NULL,NULL,NID_undef,0,NULL},
+{NULL,NULL,NID_undef,0,NULL},
+{"RD128-CBC-B128","rd128-cbc-b128",NID_rd128_cbc_b128,0,NULL},
+{"RD192-CBC-B128","rd192-cbc-b128",NID_rd192_cbc_b128,0,NULL},
+{"RD256-CBC-B128","rd256-cbc-b128",NID_rd256_cbc_b128,0,NULL},
+{"RD128-CBC-B192","rd128-cbc-b192",NID_rd128_cbc_b192,0,NULL},
+{"RD192-CBC-B192","rd192-cbc-b192",NID_rd192_cbc_b192,0,NULL},
+{"RD256-CBC-B192","rd256-cbc-b192",NID_rd256_cbc_b192,0,NULL},
+{"RD128-CBC-B256","rd128-cbc-b256",NID_rd128_cbc_b256,0,NULL},
+{"RD192-CBC-B256","rd192-cbc-b256",NID_rd192_cbc_b256,0,NULL},
+{"RD256-CBC-B256","rd256-cbc-b256",NID_rd256_cbc_b256,0,NULL},
};
static ASN1_OBJECT *sn_objs[NUM_SN]={
@@ -1155,6 +1167,15 @@ static ASN1_OBJECT *sn_objs[NUM_SN]={
&(nid_objs[122]),/* "RC5-CFB" */
&(nid_objs[121]),/* "RC5-ECB" */
&(nid_objs[123]),/* "RC5-OFB" */
+&(nid_objs[408]),/* "RD128-CBC-B128" */
+&(nid_objs[411]),/* "RD128-CBC-B192" */
+&(nid_objs[414]),/* "RD128-CBC-B256" */
+&(nid_objs[409]),/* "RD192-CBC-B128" */
+&(nid_objs[412]),/* "RD192-CBC-B192" */
+&(nid_objs[415]),/* "RD192-CBC-B256" */
+&(nid_objs[410]),/* "RD256-CBC-B128" */
+&(nid_objs[413]),/* "RD256-CBC-B192" */
+&(nid_objs[416]),/* "RD256-CBC-B256" */
&(nid_objs[396]),/* "RIJNDAEL-ECB-K128-B128" */
&(nid_objs[399]),/* "RIJNDAEL-ECB-K128-B192" */
&(nid_objs[402]),/* "RIJNDAEL-ECB-K128-B256" */
@@ -1834,6 +1855,15 @@ static ASN1_OBJECT *ln_objs[NUM_LN]={
&(nid_objs[122]),/* "rc5-cfb" */
&(nid_objs[121]),/* "rc5-ecb" */
&(nid_objs[123]),/* "rc5-ofb" */
+&(nid_objs[408]),/* "rd128-cbc-b128" */
+&(nid_objs[411]),/* "rd128-cbc-b192" */
+&(nid_objs[414]),/* "rd128-cbc-b256" */
+&(nid_objs[409]),/* "rd192-cbc-b128" */
+&(nid_objs[412]),/* "rd192-cbc-b192" */
+&(nid_objs[415]),/* "rd192-cbc-b256" */
+&(nid_objs[410]),/* "rd256-cbc-b128" */
+&(nid_objs[413]),/* "rd256-cbc-b192" */
+&(nid_objs[416]),/* "rd256-cbc-b256" */
&(nid_objs[396]),/* "rijndael-ecb-k128-b128" */
&(nid_objs[399]),/* "rijndael-ecb-k128-b192" */
&(nid_objs[402]),/* "rijndael-ecb-k128-b256" */
diff --git a/crypto/objects/obj_mac.h b/crypto/objects/obj_mac.h
index 308528f9cc..ccfea00d8c 100644
--- a/crypto/objects/obj_mac.h
+++ b/crypto/objects/obj_mac.h
@@ -1833,3 +1833,39 @@
#define LN_rijndael_ecb_k256_b256 "rijndael-ecb-k256-b256"
#define NID_rijndael_ecb_k256_b256 404
+#define SN_rd128_cbc_b128 "RD128-CBC-B128"
+#define LN_rd128_cbc_b128 "rd128-cbc-b128"
+#define NID_rd128_cbc_b128 408
+
+#define SN_rd192_cbc_b128 "RD192-CBC-B128"
+#define LN_rd192_cbc_b128 "rd192-cbc-b128"
+#define NID_rd192_cbc_b128 409
+
+#define SN_rd256_cbc_b128 "RD256-CBC-B128"
+#define LN_rd256_cbc_b128 "rd256-cbc-b128"
+#define NID_rd256_cbc_b128 410
+
+#define SN_rd128_cbc_b192 "RD128-CBC-B192"
+#define LN_rd128_cbc_b192 "rd128-cbc-b192"
+#define NID_rd128_cbc_b192 411
+
+#define SN_rd192_cbc_b192 "RD192-CBC-B192"
+#define LN_rd192_cbc_b192 "rd192-cbc-b192"
+#define NID_rd192_cbc_b192 412
+
+#define SN_rd256_cbc_b192 "RD256-CBC-B192"
+#define LN_rd256_cbc_b192 "rd256-cbc-b192"
+#define NID_rd256_cbc_b192 413
+
+#define SN_rd128_cbc_b256 "RD128-CBC-B256"
+#define LN_rd128_cbc_b256 "rd128-cbc-b256"
+#define NID_rd128_cbc_b256 414
+
+#define SN_rd192_cbc_b256 "RD192-CBC-B256"
+#define LN_rd192_cbc_b256 "rd192-cbc-b256"
+#define NID_rd192_cbc_b256 415
+
+#define SN_rd256_cbc_b256 "RD256-CBC-B256"
+#define LN_rd256_cbc_b256 "rd256-cbc-b256"
+#define NID_rd256_cbc_b256 416
+
diff --git a/crypto/objects/obj_mac.num b/crypto/objects/obj_mac.num
index 94e13b44eb..9196462b14 100644
--- a/crypto/objects/obj_mac.num
+++ b/crypto/objects/obj_mac.num
@@ -402,3 +402,15 @@ rijndael_ecb_k256_b192 401
rijndael_ecb_k128_b256 402
rijndael_ecb_k192_b256 403
rijndael_ecb_k256_b256 404
+rd128_cbc 405
+rd192_cbc 406
+rd256_cbc 407
+rd128_cbc_b128 408
+rd192_cbc_b128 409
+rd256_cbc_b128 410
+rd128_cbc_b192 411
+rd192_cbc_b192 412
+rd256_cbc_b192 413
+rd128_cbc_b256 414
+rd192_cbc_b256 415
+rd256_cbc_b256 416
diff --git a/crypto/objects/objects.txt b/crypto/objects/objects.txt
index d4ee20db37..d110ad6c65 100644
--- a/crypto/objects/objects.txt
+++ b/crypto/objects/objects.txt
@@ -601,3 +601,12 @@ enterprises 1466 344 : dcobject : dcObject
: RIJNDAEL-ECB-K128-B256: rijndael-ecb-k128-b256
: RIJNDAEL-ECB-K192-B256: rijndael-ecb-k192-b256
: RIJNDAEL-ECB-K256-B256: rijndael-ecb-k256-b256
+ : RD128-CBC-B128 : rd128-cbc-b128
+ : RD192-CBC-B128 : rd192-cbc-b128
+ : RD256-CBC-B128 : rd256-cbc-b128
+ : RD128-CBC-B192 : rd128-cbc-b192
+ : RD192-CBC-B192 : rd192-cbc-b192
+ : RD256-CBC-B192 : rd256-cbc-b192
+ : RD128-CBC-B256 : rd128-cbc-b256
+ : RD192-CBC-B256 : rd192-cbc-b256
+ : RD256-CBC-B256 : rd256-cbc-b256
diff --git a/crypto/rijndael/Makefile.ssl b/crypto/rijndael/Makefile.ssl
index 6ed8aa3c03..368a82c5bd 100644
--- a/crypto/rijndael/Makefile.ssl
+++ b/crypto/rijndael/Makefile.ssl
@@ -20,7 +20,7 @@ RD_ENC= rd_enc.o
# or use
#DES_ENC= bx86-elf.o
-CFLAGS= $(INCLUDES) $(CFLAG) -DINTERMEDIATE_VALUE_KAT -DBINARY_KEY_MATERIAL
+CFLAGS= -mpentiumpro $(INCLUDES) $(CFLAG) -DINTERMEDIATE_VALUE_KAT -DBINARY_KEY_MATERIAL -O3 -fexpensive-optimizations -funroll-loops -fforce-addr
GENERAL=Makefile
#TEST=rijndael-test-fst.c table.128 table.192 table.256
@@ -45,6 +45,8 @@ lib: $(LIBOBJ)
$(RANLIB) $(LIB)
@touch lib
+$(LIBOBJ): $(LIBSRC)
+
files:
$(PERL) $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO