I've been trying to get the PKCS#7 stuff in openssl-0.9.2b work
with S/MIME emails to/from Netscape Messenger and MS Outlook.
After some research in the openssl code and by analyzing the
pkcs7 encodings from Messenger and Outlook I have concluded that
the following changes (or at least some of them) are necessary.
Please correct me if I'm wrong about any of this. With these changes
S/MIME messages can be decoded/verified and encoded for use with
Messenger and Outlook (I haven't managed to make signatures
verify in Outlook yet ... still something missing?).

I have done the following, rows added/changed are marked with
a + and function context is shown as **** function_decl
(patches and example program follows as attachments):

crypt/objects/objects.h:

 #define SN_rc2_40_cbc   "RC2-40-CBC"
 #define LN_rc2_40_cbc   "rc2-40-cbc"
 #define NID_rc2_40_cbc   98
+ /* OID added, sak */
+        #define OBJ_rc2_40_cbc   OBJ_rsadsi,3L,2L
...

+ /* NID_rc2_64_cbc added by sak */
+ #define SN_rc2_64_cbc   "RC2-64-CBC"
+ #define LN_rc2_64_cbc   "rc2-64-cbc"
+ #define NID_rc2_64_cbc   143
+ /* OID added, sak */
+ #define OBJ_rc2_64_cbc   OBJ_rsadsi,3L,2L

Comments: No OBJ defined for 40 bit rc2. Same as for 128 bit but needs to be
   there for encoding.

crypt/evp/m_sha1.c:

 static EVP_MD sha1_md=
 {
 NID_sha1,
+ NID_rsaEncryption, /* Had to change this from sha1WithRSAEncryption, sak */
 SHA_DIGEST_LENGTH,
 SHA1_Init,
 SHA1_Update,
 SHA1_Final,
 EVP_PKEY_RSA_method,
 SHA_CBLOCK,
 sizeof(EVP_MD *)+sizeof(SHA_CTX),
 };

Comments: Bad encryption algorithm in sha1 struct.


crypt/evp/bio_enc.c: **** static int enc_read(b,out,outl)

   /* Should be continue next time we are called? */
   if (!BIO_should_retry(b->next_bio))
    {
    ctx->cont=i;
    i=EVP_CipherFinal(&(ctx->cipher),
     (unsigned char *)ctx->buf,
     &(ctx->buf_len));
    ctx->ok=i;
    ctx->buf_off=0;

+    /* Last block copy needed. sak */
+    i=outl<ctx->buf_len ? outl:ctx->buf_len;
+    memcpy(out,ctx->buf,i);
+    outl-=i;
+    out+=i;
+    ret+=i;
    }
Comments: I frequently loose data at the end when decrypting. May be a padding problem 
but this
hack fixes it for now. This would cause a lot of other problems for other applications 
so I'm most
likely doing something wrong.

crypt/evp/e_cbc_r2.c:

 static EVP_CIPHER r2_64_cbc_cipher=
 {
+ NID_rc2_64_cbc,   /* NID_rc2_40_cbc, sak */
 8,8 /* 64 bit */,8,
 rc2_cbc_init_key,
 rc2_cbc_cipher,
 NULL,
 sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+
  sizeof((((EVP_CIPHER_CTX *)NULL)->c.rc2_ks)),
 rc2_set_asn1_type_and_iv,
 rc2_get_asn1_type_and_iv,
 };

... **** static EVP_CIPHER *rc2_magic_to_meth(i)

 static int rc2_meth_to_magic(e)
 EVP_CIPHER *e;
 {
 int i;

 i=EVP_CIPHER_key_length(e);
+ if  (i == 16) return(RC2_128_MAGIC); /* i == 128 sak */
+ else if (i == 8)  return(RC2_64_MAGIC); /* i == 64 sak */
+ else if (i == 5)  return(RC2_40_MAGIC); /* i == 40 sak */
 else return(0);
 }

Comments: Bad NID for 64 bit rc2 (had to hitch with 40 bit previously). The magic
number matching failed, should be bytes not bits.


crypt/pkcs7/pk7_doit.c:   **** BIO *PKCS7_dataInit(p7,bio)

+ #if 0
   os=ASN1_OCTET_STRING_new();
   ASN1_OCTET_STRING_set(os,iv,ivlen);
   /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX this needs to change */
   if (xalg->parameter == NULL)
    xalg->parameter=ASN1_TYPE_new();
   ASN1_TYPE_set(xalg->parameter,V_ASN1_OCTET_STRING,
    (char *)os);
+ #endif

...

  for (i=0; i<sk_num(rsk); i++)
   {
   ri=(PKCS7_RECIP_INFO *)sk_value(rsk,i);
   pkey=X509_get_pubkey(ri->cert);
   jj=EVP_PKEY_encrypt(tmp,key,keylen,pkey);
   EVP_PKEY_free(pkey);
   if (jj <= 0)
    {
    PKCS7err(PKCS7_F_PKCS7_DATAINIT,ERR_R_EVP_LIB);
    Free(tmp);
    goto err;
    }
   ASN1_OCTET_STRING_set(ri->enc_key,tmp,jj);
   }
  Free(tmp);

+  /* Need to set the algorithm parameter using context. sak */
  BIO_set_cipher(btmp,evp_cipher,key,iv,1);
+  if (ivlen > 0) {
+      BIO_get_cipher_ctx(btmp, &evp_ctx);
+      evp_cipher->set_asn1_parameters(evp_ctx,xalg->parameter);
+  }

... **** BIO *PKCS7_dataDecode(p7,pkey,in_bio,xs)

  evp_ctx=NULL;
  BIO_get_cipher_ctx(etmp,&evp_ctx);
  EVP_CipherInit(evp_ctx,evp_cipher,NULL,NULL,0);
+  /* Added support for non RC2 ciphers, sak */
+  if (evp_cipher->get_asn1_parameters != NULL &&
+      evp_cipher->get_asn1_parameters(evp_ctx,enc_alg->parameter) < 0)
   return(NULL);

... **** int PKCS7_dataFinal(p7,bio)

    /* Add content type, sak */
    PKCS7_add_signed_attribute(si,
     NID_pkcs9_contentType,
     V_ASN1_OBJECT,(char *)OBJ_nid2obj(NID_pkcs7_data));

    /* Add signing time */
    sign_time=X509_gmtime_adj(NULL,0);
    PKCS7_add_signed_attribute(si,
     NID_pkcs9_signingTime,
     V_ASN1_UTCTIME,(char *)sign_time);

Coments: Bad decoding of RC2 parameter, it now decodes the magic
number and patches the cipher correctly (I hope?). Added a pkcs7
content type object to signed attributes.


The smime.c program demonstrates how to create a signed and
enveloped S/MIME message using the pkcs7 stuff. I only need to
figure out why Outlook wont recognize the signature.

Hope this is of use for someone.

Sebastian Akerman
Parallel Consulting Group Int

Only in openssl-0.9.2b/crypto/bf: blowfish.doc
Only in openssl-0.9.2b/crypto/bn/asm: bn86unix.cpp
Only in openssl-0.9.2b/crypto/bn/asm: co86unix.cpp
Only in openssl-0.9.2b/crypto/cast/asm: cx86unix.cpp
Only in openssl-0.9.2b/crypto: date.h
Only in openssl-0.9.2b/crypto/des/asm: dx86unix.cpp
Only in openssl-0.9.2b/crypto/des/asm: yx86unix.cpp
diff -ur openssl-0.9.2b-orig/crypto/evp/bio_enc.c openssl-0.9.2b/crypto/evp/bio_enc.c
--- openssl-0.9.2b-orig/crypto/evp/bio_enc.c    Mon Dec 21 11:59:22 1998
+++ openssl-0.9.2b/crypto/evp/bio_enc.c Mon May  3 13:18:50 1999
@@ -199,6 +199,13 @@
                                        &(ctx->buf_len));
                                ctx->ok=i;
                                ctx->buf_off=0;
+
+                               /* Last block copy needed. sak */
+                               i=outl<ctx->buf_len ? outl:ctx->buf_len;
+                               memcpy(out,ctx->buf,i);
+                               outl-=i;
+                               out+=i;
+                               ret+=i;
                                }
                        else
                                ret=(ret == 0)?i:ret;
Only in openssl-0.9.2b/crypto/evp: bio_enc.c~
diff -ur openssl-0.9.2b-orig/crypto/evp/e_cbc_r2.c openssl-0.9.2b/crypto/evp/e_cbc_r2.c
--- openssl-0.9.2b-orig/crypto/evp/e_cbc_r2.c   Mon Dec 21 11:59:23 1998
+++ openssl-0.9.2b/crypto/evp/e_cbc_r2.c        Tue Mar 30 17:26:39 1999
@@ -102,7 +102,7 @@
 
 static EVP_CIPHER r2_64_cbc_cipher=
        {
-       NID_rc2_40_cbc,
+       NID_rc2_64_cbc,   /* NID_rc2_40_cbc, sak */
        8,8 /* 64 bit */,8,
        rc2_cbc_init_key,
        rc2_cbc_cipher,
@@ -173,9 +173,9 @@
        int i;
 
        i=EVP_CIPHER_key_length(e);
-       if      (i == 128) return(RC2_128_MAGIC);
-       else if (i == 64)  return(RC2_64_MAGIC);
-       else if (i == 40)  return(RC2_40_MAGIC);
+       if      (i == 16) return(RC2_128_MAGIC); /* i == 128 sak */
+       else if (i == 8)  return(RC2_64_MAGIC); /* i == 64 sak */
+       else if (i == 5)  return(RC2_40_MAGIC); /* i == 40 sak */
        else return(0);
        }
 
diff -ur openssl-0.9.2b-orig/crypto/evp/m_sha1.c openssl-0.9.2b/crypto/evp/m_sha1.c
--- openssl-0.9.2b-orig/crypto/evp/m_sha1.c     Mon Dec 21 11:55:18 1998
+++ openssl-0.9.2b/crypto/evp/m_sha1.c  Fri Apr 23 17:40:55 1999
@@ -65,7 +65,7 @@
 static EVP_MD sha1_md=
        {
        NID_sha1,
-       NID_sha1WithRSAEncryption,
+       NID_rsaEncryption, /* Had to change this from sha1WithRSAEncryption, sak */
        SHA_DIGEST_LENGTH,
        SHA1_Init,
        SHA1_Update,
Only in openssl-0.9.2b/crypto/md5/asm: mx86unix.cpp
diff -ur openssl-0.9.2b-orig/crypto/objects/obj_dat.h 
openssl-0.9.2b/crypto/objects/obj_dat.h
--- openssl-0.9.2b-orig/crypto/objects/obj_dat.h        Fri Feb 19 02:29:26 1999
+++ openssl-0.9.2b/crypto/objects/obj_dat.h     Tue Apr 20 11:52:14 1999
@@ -61,12 +61,12 @@
  * perl obj_dat.pl < objects.h > obj_dat.h
  */
 
-#define NUM_NID 143
-#define NUM_SN 114
-#define NUM_LN 139
-#define NUM_OBJ 115
+#define NUM_NID 144
+#define NUM_SN 115
+#define NUM_LN 140
+#define NUM_OBJ 117
 
-static unsigned char lvalues[735]={
+static unsigned char lvalues[751]={
 0x00,                                        /* [  0] OBJ_undef */
 0x2A,0x86,0x48,0x86,0xF7,0x0D,               /* [  1] OBJ_rsadsi */
 0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,          /* [  7] OBJ_pkcs */
@@ -146,42 +146,44 @@
 0x55,0x1D,0x23,                              /* [504] OBJ_authority_key_identifier */
 0x55,0x08,0x03,0x65,                         /* [507] OBJ_mdc2 */
 0x55,0x08,0x03,0x64,                         /* [511] OBJ_mdc2WithRSA */
-0x55,0x04,0x2A,                              /* [515] OBJ_givenName */
-0x55,0x04,0x04,                              /* [518] OBJ_surname */
-0x55,0x04,0x2B,                              /* [521] OBJ_initials */
-0x55,0x04,0x2D,                              /* [524] OBJ_uniqueIdentifier */
-0x55,0x1D,0x1F,                              /* [527] OBJ_crl_distribution_points */
-0x2B,0x0E,0x03,0x02,0x03,                    /* [530] OBJ_md5WithRSA */
-0x55,0x04,0x05,                              /* [535] OBJ_serialNumber */
-0x55,0x04,0x0C,                              /* [538] OBJ_title */
-0x55,0x04,0x0D,                              /* [541] OBJ_description */
-0x2A,0x86,0x48,0x86,0xF6,0x7D,0x07,0x42,0x0A,/* [544] OBJ_cast5_cbc */
-0x2A,0x86,0x48,0x86,0xF6,0x7D,0x07,0x42,0x0C,/* [553] OBJ_pbeWithMD5AndCast5_CBC */
-0x2A,0x86,0x48,0xCE,0x38,0x04,0x03,          /* [562] OBJ_dsaWithSHA1 */
-0x2B,0x0E,0x03,0x02,0x1D,                    /* [569] OBJ_sha1WithRSA */
-0x2A,0x86,0x48,0xCE,0x38,0x04,0x01,          /* [574] OBJ_dsa */
-0x2B,0x24,0x03,0x02,0x01,                    /* [581] OBJ_ripemd160 */
-0x2B,0x24,0x03,0x03,0x01,0x02,               /* [586] OBJ_ripemd160WithRSA */
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x03,0x08,     /* [592] OBJ_rc5_cbc */
-0x29,0x01,0x01,0x85,0x1A,                    /* [600] OBJ_rle_compression */
-0x29,0x01,0x01,0x85,0x1A,                    /* [605] OBJ_zlib_compression */
-0x55,0x1D,0x25,                              /* [610] OBJ_ext_key_usage */
-0x2B,0x06,0x01,0x05,0x05,0x07,               /* [613] OBJ_id_pkix */
-0x2B,0x06,0x01,0x05,0x05,0x07,0x03,          /* [619] OBJ_id_kp */
-0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x01,     /* [626] OBJ_server_auth */
-0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x02,     /* [634] OBJ_client_auth */
-0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x03,     /* [642] OBJ_code_sign */
-0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x04,     /* [650] OBJ_email_protect */
-0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x08,     /* [658] OBJ_time_stamp */
-0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x15,/* [666] OBJ_ms_code_ind */
-0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x16,/* [676] OBJ_ms_code_com */
-0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x0A,0x03,0x01,/* [686] OBJ_ms_ctl_sign */
-0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x0A,0x03,0x03,/* [696] OBJ_ms_sgc */
-0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x0A,0x03,0x04,/* [706] OBJ_ms_efs */
-0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x04,0x01,/* [716] OBJ_ns_sgc */
-0x55,0x1D,0x1B,                              /* [725] OBJ_delta_crl */
-0x55,0x1D,0x15,                              /* [728] OBJ_crl_reason */
-0x55,0x1D,0x18,                              /* [731] OBJ_invalidity_date */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x03,0x02,     /* [515] OBJ_rc2_40_cbc */
+0x55,0x04,0x2A,                              /* [523] OBJ_givenName */
+0x55,0x04,0x04,                              /* [526] OBJ_surname */
+0x55,0x04,0x2B,                              /* [529] OBJ_initials */
+0x55,0x04,0x2D,                              /* [532] OBJ_uniqueIdentifier */
+0x55,0x1D,0x1F,                              /* [535] OBJ_crl_distribution_points */
+0x2B,0x0E,0x03,0x02,0x03,                    /* [538] OBJ_md5WithRSA */
+0x55,0x04,0x05,                              /* [543] OBJ_serialNumber */
+0x55,0x04,0x0C,                              /* [546] OBJ_title */
+0x55,0x04,0x0D,                              /* [549] OBJ_description */
+0x2A,0x86,0x48,0x86,0xF6,0x7D,0x07,0x42,0x0A,/* [552] OBJ_cast5_cbc */
+0x2A,0x86,0x48,0x86,0xF6,0x7D,0x07,0x42,0x0C,/* [561] OBJ_pbeWithMD5AndCast5_CBC */
+0x2A,0x86,0x48,0xCE,0x38,0x04,0x03,          /* [570] OBJ_dsaWithSHA1 */
+0x2B,0x0E,0x03,0x02,0x1D,                    /* [577] OBJ_sha1WithRSA */
+0x2A,0x86,0x48,0xCE,0x38,0x04,0x01,          /* [582] OBJ_dsa */
+0x2B,0x24,0x03,0x02,0x01,                    /* [589] OBJ_ripemd160 */
+0x2B,0x24,0x03,0x03,0x01,0x02,               /* [594] OBJ_ripemd160WithRSA */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x03,0x08,     /* [600] OBJ_rc5_cbc */
+0x29,0x01,0x01,0x85,0x1A,                    /* [608] OBJ_rle_compression */
+0x29,0x01,0x01,0x85,0x1A,                    /* [613] OBJ_zlib_compression */
+0x55,0x1D,0x25,                              /* [618] OBJ_ext_key_usage */
+0x2B,0x06,0x01,0x05,0x05,0x07,               /* [621] OBJ_id_pkix */
+0x2B,0x06,0x01,0x05,0x05,0x07,0x03,          /* [627] OBJ_id_kp */
+0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x01,     /* [634] OBJ_server_auth */
+0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x02,     /* [642] OBJ_client_auth */
+0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x03,     /* [650] OBJ_code_sign */
+0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x04,     /* [658] OBJ_email_protect */
+0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x08,     /* [666] OBJ_time_stamp */
+0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x15,/* [674] OBJ_ms_code_ind */
+0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x16,/* [684] OBJ_ms_code_com */
+0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x0A,0x03,0x01,/* [694] OBJ_ms_ctl_sign */
+0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x0A,0x03,0x03,/* [704] OBJ_ms_sgc */
+0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x0A,0x03,0x04,/* [714] OBJ_ms_efs */
+0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x04,0x01,/* [724] OBJ_ns_sgc */
+0x55,0x1D,0x1B,                              /* [733] OBJ_delta_crl */
+0x55,0x1D,0x15,                              /* [736] OBJ_crl_reason */
+0x55,0x1D,0x18,                              /* [739] OBJ_invalidity_date */
+0x2A,0x86,0x48,0x86,0xF7,0x0D,0x03,0x02,     /* [742] OBJ_rc2_64_cbc */
 };
 
 static ASN1_OBJECT nid_objs[NUM_NID]={
@@ -322,64 +324,65 @@
 {"MDC2","mdc2",NID_mdc2,4,&(lvalues[507]),0},
 {"RSA-MDC2","mdc2withRSA",NID_mdc2WithRSA,4,&(lvalues[511]),0},
 {"RC4-40","rc4-40",NID_rc4_40,0,NULL},
-{"RC2-40-CBC","rc2-40-cbc",NID_rc2_40_cbc,0,NULL},
-{"G","givenName",NID_givenName,3,&(lvalues[515]),0},
-{"S","surname",NID_surname,3,&(lvalues[518]),0},
-{"I","initials",NID_initials,3,&(lvalues[521]),0},
-{"UID","uniqueIdentifier",NID_uniqueIdentifier,3,&(lvalues[524]),0},
+{"RC2-40-CBC","rc2-40-cbc",NID_rc2_40_cbc,8,&(lvalues[515]),0},
+{"G","givenName",NID_givenName,3,&(lvalues[523]),0},
+{"S","surname",NID_surname,3,&(lvalues[526]),0},
+{"I","initials",NID_initials,3,&(lvalues[529]),0},
+{"UID","uniqueIdentifier",NID_uniqueIdentifier,3,&(lvalues[532]),0},
 {"crlDistributionPoints","X509v3 CRL Distribution Points",
-       NID_crl_distribution_points,3,&(lvalues[527]),0},
-{"RSA-NP-MD5","md5WithRSA",NID_md5WithRSA,5,&(lvalues[530]),0},
-{"SN","serialNumber",NID_serialNumber,3,&(lvalues[535]),0},
-{"T","title",NID_title,3,&(lvalues[538]),0},
-{"D","description",NID_description,3,&(lvalues[541]),0},
-{"CAST5-CBC","cast5-cbc",NID_cast5_cbc,9,&(lvalues[544]),0},
+       NID_crl_distribution_points,3,&(lvalues[535]),0},
+{"RSA-NP-MD5","md5WithRSA",NID_md5WithRSA,5,&(lvalues[538]),0},
+{"SN","serialNumber",NID_serialNumber,3,&(lvalues[543]),0},
+{"T","title",NID_title,3,&(lvalues[546]),0},
+{"D","description",NID_description,3,&(lvalues[549]),0},
+{"CAST5-CBC","cast5-cbc",NID_cast5_cbc,9,&(lvalues[552]),0},
 {"CAST5-ECB","cast5-ecb",NID_cast5_ecb,0,NULL},
 {"CAST5-CFB","cast5-cfb",NID_cast5_cfb64,0,NULL},
 {"CAST5-OFB","cast5-ofb",NID_cast5_ofb64,0,NULL},
 {"pbeWithMD5AndCast5CBC","pbeWithMD5AndCast5CBC",
-       NID_pbeWithMD5AndCast5_CBC,9,&(lvalues[553]),0},
-{"DSA-SHA1","dsaWithSHA1",NID_dsaWithSHA1,7,&(lvalues[562]),0},
+       NID_pbeWithMD5AndCast5_CBC,9,&(lvalues[561]),0},
+{"DSA-SHA1","dsaWithSHA1",NID_dsaWithSHA1,7,&(lvalues[570]),0},
 {"MD5-SHA1","md5-sha1",NID_md5_sha1,0,NULL},
-{"RSA-SHA1-2","sha1WithRSA",NID_sha1WithRSA,5,&(lvalues[569]),0},
-{"DSA","dsaEncryption",NID_dsa,7,&(lvalues[574]),0},
-{"RIPEMD160","ripemd160",NID_ripemd160,5,&(lvalues[581]),0},
+{"RSA-SHA1-2","sha1WithRSA",NID_sha1WithRSA,5,&(lvalues[577]),0},
+{"DSA","dsaEncryption",NID_dsa,7,&(lvalues[582]),0},
+{"RIPEMD160","ripemd160",NID_ripemd160,5,&(lvalues[589]),0},
 {NULL,NULL,NID_undef,0,NULL},
 {"RSA-RIPEMD160","ripemd160WithRSA",NID_ripemd160WithRSA,6,
-       &(lvalues[586]),0},
-{"RC5-CBC","rc5-cbc",NID_rc5_cbc,8,&(lvalues[592]),0},
+       &(lvalues[594]),0},
+{"RC5-CBC","rc5-cbc",NID_rc5_cbc,8,&(lvalues[600]),0},
 {"RC5-ECB","rc5-ecb",NID_rc5_ecb,0,NULL},
 {"RC5-CFB","rc5-cfb",NID_rc5_cfb64,0,NULL},
 {"RC5-OFB","rc5-ofb",NID_rc5_ofb64,0,NULL},
-{"RLE","run length compression",NID_rle_compression,5,&(lvalues[600]),0},
-{"ZLIB","zlib compression",NID_zlib_compression,5,&(lvalues[605]),0},
+{"RLE","run length compression",NID_rle_compression,5,&(lvalues[608]),0},
+{"ZLIB","zlib compression",NID_zlib_compression,5,&(lvalues[613]),0},
 {"extendedKeyUsage","X509v3 Extended Key Usage",NID_ext_key_usage,3,
-       &(lvalues[610]),0},
-{"PKIX","PKIX",NID_id_pkix,6,&(lvalues[613]),0},
-{"id-kp","id-kp",NID_id_kp,7,&(lvalues[619]),0},
+       &(lvalues[618]),0},
+{"PKIX","PKIX",NID_id_pkix,6,&(lvalues[621]),0},
+{"id-kp","id-kp",NID_id_kp,7,&(lvalues[627]),0},
 {"serverAuth","TLS Web Server Authentication",NID_server_auth,8,
-       &(lvalues[626]),0},
-{"clientAuth","TLS Web Client Authentication",NID_client_auth,8,
        &(lvalues[634]),0},
-{"codeSigning","Code Signing",NID_code_sign,8,&(lvalues[642]),0},
+{"clientAuth","TLS Web Client Authentication",NID_client_auth,8,
+       &(lvalues[642]),0},
+{"codeSigning","Code Signing",NID_code_sign,8,&(lvalues[650]),0},
 {"emailProtection","E-mail Protection",NID_email_protect,8,
-       &(lvalues[650]),0},
-{"timeStamping","Time Stamping",NID_time_stamp,8,&(lvalues[658]),0},
+       &(lvalues[658]),0},
+{"timeStamping","Time Stamping",NID_time_stamp,8,&(lvalues[666]),0},
 {"msCodeInd","Microsoft Individual Code Signing",NID_ms_code_ind,10,
-       &(lvalues[666]),0},
+       &(lvalues[674]),0},
 {"msCodeCom","Microsoft Commercial Code Signing",NID_ms_code_com,10,
-       &(lvalues[676]),0},
+       &(lvalues[684]),0},
 {"msCTLSign","Microsoft Trust List Signing",NID_ms_ctl_sign,10,
-       &(lvalues[686]),0},
-{"msSGC","Microsoft Server Gated Crypto",NID_ms_sgc,10,&(lvalues[696]),0},
+       &(lvalues[694]),0},
+{"msSGC","Microsoft Server Gated Crypto",NID_ms_sgc,10,&(lvalues[704]),0},
 {"msEFS","Microsoft Encrypted File System",NID_ms_efs,10,
-       &(lvalues[706]),0},
-{"nsSGC","Netscape Server Gated Crypto",NID_ns_sgc,9,&(lvalues[716]),0},
+       &(lvalues[714]),0},
+{"nsSGC","Netscape Server Gated Crypto",NID_ns_sgc,9,&(lvalues[724]),0},
 {"deltaCRL","X509v3 Delta CRL Indicator",NID_delta_crl,3,
-       &(lvalues[725]),0},
-{"CRLReason","CRL Reason Code",NID_crl_reason,3,&(lvalues[728]),0},
+       &(lvalues[733]),0},
+{"CRLReason","CRL Reason Code",NID_crl_reason,3,&(lvalues[736]),0},
 {"invalidityDate","Invalidity Date",NID_invalidity_date,3,
-       &(lvalues[731]),0},
+       &(lvalues[739]),0},
+{"RC2-64-CBC","rc2-64-cbc",NID_rc2_64_cbc,8,&(lvalues[742]),0},
 };
 
 static ASN1_OBJECT *sn_objs[NUM_SN]={
@@ -430,6 +433,7 @@
 &(nid_objs[18]),/* "OU" */
 &(nid_objs[127]),/* "PKIX" */
 &(nid_objs[98]),/* "RC2-40-CBC" */
+&(nid_objs[143]),/* "RC2-64-CBC" */
 &(nid_objs[37]),/* "RC2-CBC" */
 &(nid_objs[39]),/* "RC2-CFB" */
 &(nid_objs[38]),/* "RC2-ECB" */
@@ -608,6 +612,7 @@
 &(nid_objs[22]),/* "pkcs7-signedData" */
 &(nid_objs[47]),/* "pkcs9" */
 &(nid_objs[98]),/* "rc2-40-cbc" */
+&(nid_objs[143]),/* "rc2-64-cbc" */
 &(nid_objs[37]),/* "rc2-cbc" */
 &(nid_objs[39]),/* "rc2-cfb" */
 &(nid_objs[38]),/* "rc2-ecb" */
@@ -705,6 +710,8 @@
 &(nid_objs[47]),/* OBJ_pkcs9                        1 2 840 113549 1 9 */
 &(nid_objs[ 3]),/* OBJ_md2                          1 2 840 113549 2 2 */
 &(nid_objs[ 4]),/* OBJ_md5                          1 2 840 113549 2 5 */
+&(nid_objs[98]),/* OBJ_rc2_40_cbc                   1 2 840 113549 3 2 */
+&(nid_objs[143]),/* OBJ_rc2_64_cbc                   1 2 840 113549 3 2 */
 &(nid_objs[37]),/* OBJ_rc2_cbc                      1 2 840 113549 3 2 */
 &(nid_objs[ 5]),/* OBJ_rc4                          1 2 840 113549 3 4 */
 &(nid_objs[44]),/* OBJ_des_ede3_cbc                 1 2 840 113549 3 7 */
diff -ur openssl-0.9.2b-orig/crypto/objects/objects.h 
openssl-0.9.2b/crypto/objects/objects.h
--- openssl-0.9.2b-orig/crypto/objects/objects.h        Fri Feb 19 02:29:26 1999
+++ openssl-0.9.2b/crypto/objects/objects.h     Mon Apr 19 10:36:08 1999
@@ -1,4 +1,5 @@
 /* crypto/objects/objects.h */
+
 /* Copyright (C) 1995-1998 Eric Young ([EMAIL PROTECTED])
  * All rights reserved.
  *
@@ -527,6 +528,8 @@
 #define SN_rc2_40_cbc                  "RC2-40-CBC"
 #define LN_rc2_40_cbc                  "rc2-40-cbc"
 #define NID_rc2_40_cbc                 98
+/* OID added, sak */
+#define OBJ_rc2_40_cbc                 OBJ_rsadsi,3L,2L
 
 #define SN_givenName                   "G"
 #define LN_givenName                   "givenName"
@@ -753,6 +756,13 @@
 #define LN_invalidity_date             "Invalidity Date"
 #define NID_invalidity_date            142
 #define OBJ_invalidity_date            OBJ_ld_ce,24L
+
+/* NID_rc2_64_cbc added by sak */
+#define SN_rc2_64_cbc                  "RC2-64-CBC"
+#define LN_rc2_64_cbc                  "rc2-64-cbc"
+#define NID_rc2_64_cbc                 143
+/* OID added, sak */
+#define OBJ_rc2_64_cbc                 OBJ_rsadsi,3L,2L
 
 #include "bio.h"
 #include "asn1.h"
diff -ur openssl-0.9.2b-orig/crypto/pkcs7/pk7_doit.c 
openssl-0.9.2b/crypto/pkcs7/pk7_doit.c
--- openssl-0.9.2b-orig/crypto/pkcs7/pk7_doit.c Sun Mar 14 14:31:40 1999
+++ openssl-0.9.2b/crypto/pkcs7/pk7_doit.c      Mon May  3 14:43:37 1999
@@ -75,6 +75,7 @@
        X509_ALGOR *xa;
        EVP_MD *evp_md;
        EVP_CIPHER *evp_cipher=NULL;
+       EVP_CIPHER_CTX *evp_ctx;
        STACK *md_sk=NULL,*rsk=NULL;
        X509_ALGOR *xalg=NULL;
        PKCS7_RECIP_INFO *ri=NULL;
@@ -163,6 +164,9 @@
                        ASN1_OCTET_STRING *os;
 
                        RAND_bytes(iv,ivlen);
+                       if (xalg->parameter == NULL)
+                               xalg->parameter=ASN1_TYPE_new();
+#if 0
                        os=ASN1_OCTET_STRING_new();
                        ASN1_OCTET_STRING_set(os,iv,ivlen);
 /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX this needs to change */
@@ -170,6 +174,7 @@
                                xalg->parameter=ASN1_TYPE_new();
                        ASN1_TYPE_set(xalg->parameter,V_ASN1_OCTET_STRING,
                                (char *)os);
+#endif
                        }
                RAND_bytes(key,keylen);
 
@@ -209,7 +214,12 @@
                        }
                Free(tmp);
 
+               /* Need to set the algorithm parameter using context. sak */
                BIO_set_cipher(btmp,evp_cipher,key,iv,1);
+               if (ivlen > 0) {
+                   BIO_get_cipher_ctx(btmp, &evp_ctx);
+                   evp_cipher->set_asn1_parameters(evp_ctx,xalg->parameter);
+               }
 
                if (out == NULL)
                        out=btmp;
@@ -217,7 +227,6 @@
                        BIO_push(out,btmp);
                btmp=NULL;
                }
-
        if (bio == NULL) /* ??????????? */
                {
                if (p7->detached)
@@ -417,7 +426,9 @@
                evp_ctx=NULL;
                BIO_get_cipher_ctx(etmp,&evp_ctx);
                EVP_CipherInit(evp_ctx,evp_cipher,NULL,NULL,0);
-               if (EVP_CIPHER_asn1_to_param(evp_ctx,enc_alg->parameter) < 0)
+               /* Added support for non RC2 ciphers, sak */
+               if (evp_cipher->get_asn1_parameters != NULL && 
+                   evp_cipher->get_asn1_parameters(evp_ctx,enc_alg->parameter) < 0)
                        return(NULL);
 
                if (jj != EVP_CIPHER_CTX_key_length(evp_ctx))
@@ -569,6 +580,11 @@
                                ASN1_OCTET_STRING *digest;
                                ASN1_UTCTIME *sign_time;
                                EVP_MD *md_tmp;
+
+                               /* Add content type, sak */
+                               PKCS7_add_signed_attribute(si,
+                                       NID_pkcs9_contentType,
+                                       V_ASN1_OBJECT,(char 
+*)OBJ_nid2obj(NID_pkcs7_data));
 
                                /* Add signing time */
                                sign_time=X509_gmtime_adj(NULL,0);
Only in openssl-0.9.2b/crypto/pkcs7: pk7_doit.c~
Only in openssl-0.9.2b/crypto/rc4/asm: rx86unix.cpp
Only in openssl-0.9.2b/crypto/ripemd/asm: rm86unix.cpp
/*
 * Simple test for creating S/MIME signed messages with openssl-0.9.2b
 *
 * Author: Sebastian �kerman
 * Parallel Consulting Group
 * [EMAIL PROTECTED]
 */

#include <string.h>
#include <stdio.h>

#include "bio.h"
#include "x509.h"
#include "pem.h"

char * msg = "Content-Type: text/plain; charset=us-ascii\r
Content-Transfer-Encoding: 7bit\r\n\r
Hello, this is a signed message!\r\n"; 

char * mphead = "Content-Type: multipart/signed; 
protocol=\"application/x-pkcs7-signature\"; micalg=sha1; boundary=\"next\"\n\nThis is 
a digitally signed message in MIME format\n\n";
    
char * mpshead = "Content-Type: application/x-pkcs7-signature; name=smime.p7s
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=smime.p7s
Content-Description: S/MIME Cryptographic Signature\n\n";

char * enchead = "Content-Type: application/x-pkcs7-mime; name=smime.p7m
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=smime.p7m
Content-Description: S/MIME Encrypted Message\n\n";

main(void) {
    PKCS7 * p7 = PKCS7_new();
    X509 * x;
    ASN1_UTCTIME *sign_time;
    PKCS7_SIGNER_INFO *si;
    EVP_PKEY *pkey;
    BIO *in,*sign,*out;
    char *p,*q;
    int len;

    SSLeay_add_all_algorithms();

    /* read certificate and private key */
    in=BIO_new_file("cert.pem","r");    
    x=PEM_read_bio_X509(in,NULL,NULL);
    BIO_free(in);
    in=BIO_new_file("key.pem","r");    
    pkey=PEM_read_bio_PrivateKey(in,NULL,NULL);
    BIO_free(in);

    PKCS7_set_type(p7, NID_pkcs7_signed);

    /* Add certificates */
    PKCS7_add_certificate(p7,x);

    /* Add signature info */
    si=PKCS7_add_signature(p7,x,pkey,EVP_sha1());

#if 0
    Not needed for Netscape Messenger
    /* Add signed attributes */
    sign_time=X509_gmtime_adj(NULL,0);
    PKCS7_add_signed_attribute(si,NID_pkcs9_signingTime,
                               V_ASN1_UTCTIME,(char *)sign_time);
#endif

    PKCS7_content_new(p7,NID_pkcs7_data);

    sign = PKCS7_dataInit(p7,NULL);
    BIO_write(sign, msg, strlen(msg));
    BIO_flush(sign);
    PKCS7_dataFinal(p7,sign);
    BIO_free(sign);
    
    /* convert to PEM */
    sign=BIO_new(BIO_s_mem());
    PEM_write_bio_PKCS7(sign,p7);
    PKCS7_free(p7);
    len=BIO_get_mem_data(sign,&p);

    /* Create Enveloped P7 */
    p7=PKCS7_new();
    PKCS7_set_type(p7,NID_pkcs7_enveloped);
    PKCS7_add_recipient(p7,x);
    PKCS7_set_cipher(p7, EVP_rc2_40_cbc()); 
    out=PKCS7_dataInit(p7,NULL);

    /* output to encryption bio */
    BIO_write(out,mphead,strlen(mphead));
    BIO_write(out,"--next\n",7); /* boundary */
/* msg better be in canonical form (end of line should be \r\n) */
    BIO_write(out,msg,strlen(msg)); 
    BIO_write(out,"\n--next\n",8); /* boundary */
    BIO_write(out,mpshead,strlen(mpshead));

    /* remove PEM header and footer */
    q=strstr(p,"-----END");
    if (q) *q=0;
    p+=strlen("-----BEGIN PKCS7-----\n");
    BIO_write(out,p,strlen(p)); 
    BIO_write(out,"--next\n",7); /* boundary */
    BIO_flush(out);
    PKCS7_dataFinal(p7,out);
    BIO_free(out);

    printf(enchead);
    out=BIO_new(BIO_s_mem());
    PEM_write_bio_PKCS7(out,p7);
    len=BIO_get_mem_data(out,&p);
    q=strstr(p,"-----END");
    if (q) *q=0;
    p+=strlen("-----BEGIN PKCS7-----\n");
    printf(p);
    BIO_free(out);
    BIO_free(sign);
    PKCS7_free(p7);
}

begin:          vcard
fn:             Sebastian Akerman
n:              Akerman;Sebastian
org:            <img src="http://www.parallelconsulting.com/content_img/pslogga.gif" alt="Parallel Systems">
email;internet: [EMAIL PROTECTED]
title:          Security Expert
note:           If you care to trust us download our CA certificate from www.parallelconsulting.com
x-mozilla-cpt:  ;0
x-mozilla-html: TRUE
version:        2.1
end:            vcard

Reply via email to