[openssl.org #1261] [PATCH] - binary S/MIME handling in openssl smime 1.0.0e - fixed for empty preamble

2011-10-21 Thread John Hughes via RT
Here's a slightly fixed version of the smime binary patch (for 1.0.0e)

It handles multiparts with an empty preamble.

The original code could cope with:

Content-Type: multipart/blah, boundary=fred

This is a MIME multpart with a preamble
--fred
...

But not:

Content-Type: multipart/blah, boundary=joe

--joe

Sorry about spamming the tracker.


Index: apps/smime.c
===
RCS file: /home/john/cvsroot/openssl/apps/smime.c,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.2.1
diff -u -p -r1.1.1.1 -r1.1.1.1.2.1
--- apps/smime.c	14 Oct 2011 11:17:40 -	1.1.1.1
+++ apps/smime.c	20 Oct 2011 07:16:06 -	1.1.1.1.2.1
@@ -78,7 +78,7 @@ static int smime_cb(int ok, X509_STORE_C
 #define SMIME_ENCRYPT	(1 | SMIME_OP)
 #define SMIME_DECRYPT	(2 | SMIME_IP)
 #define SMIME_SIGN	(3 | SMIME_OP | SMIME_SIGNERS)
-#define SMIME_VERIFY	(4 | SMIME_IP)
+#define SMIME_VERIFY	(4 | SMIME_IP | SMIME_OP)
 #define SMIME_PK7OUT	(5 | SMIME_IP | SMIME_OP)
 #define SMIME_RESIGN	(6 | SMIME_IP | SMIME_OP | SMIME_SIGNERS)
 
@@ -365,6 +365,23 @@ int MAIN(int argc, char **argv)
 goto argerr;
 			contfile = *++args;
 			}
+		else if (!strcmp(*args, -transenc) || !strcmp (*args, -transferencoding))
+			{
+			if (args[1])
+{
+if (!strcmp(args[1], binary))
+	flags |= SMIME_TRANSFER_ENCODING_BINARY;
+else if (!strcmp(args[1], base64))
+	;
+else {
+	BIO_printf(bio_err, Supported transfer encodings are base64 and binary\n);
+	badarg = 1;
+}
+args++;
+}
+			else
+badarg = 1;
+			}
 		else if (args_verify(args, NULL, badarg, bio_err, vpm))
 			continue;
 		else if ((cipher = EVP_get_cipherbyname(*args + 1)) == NULL)
@@ -488,6 +505,7 @@ int MAIN(int argc, char **argv)
 		BIO_printf(bio_err,  -rand file%cfile%c...\n, LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
 		BIO_printf(bio_err, load the file (or the files in the directory) into\n);
 		BIO_printf(bio_err, the random number generator\n);
+		BIO_printf(bio_err,  -transenc enc  transfer encoding to use (base64 or binary)\n);
 		BIO_printf (bio_err, cert.pem   recipient certificate(s) for encryption\n);
 		goto end;
 		}
Index: crypto/asn1/asn1.h
===
RCS file: /home/john/cvsroot/openssl/crypto/asn1/asn1.h,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.2.1
diff -u -p -r1.1.1.1 -r1.1.1.1.2.1
--- crypto/asn1/asn1.h	14 Oct 2011 11:17:40 -	1.1.1.1
+++ crypto/asn1/asn1.h	15 Oct 2011 09:36:51 -	1.1.1.1.2.1
@@ -161,6 +161,7 @@ extern C {
 #define SMIME_OLDMIME		0x400
 #define SMIME_CRLFEOL		0x800
 #define SMIME_STREAM		0x1000
+#define SMIME_TRANSFER_ENCODING_BINARY	0x2000
 
 struct X509_algor_st;
 DECLARE_STACK_OF(X509_ALGOR)
@@ -1222,6 +1223,8 @@ void ERR_load_ASN1_strings(void);
 #define ASN1_F_ASN1_VERIFY 137
 #define ASN1_F_B64_READ_ASN1 209
 #define ASN1_F_B64_WRITE_ASN1 210
+#define ASN1_F_BINARY_READ_ASN1 219
+#define ASN1_F_BINARY_WRITE_ASN1			 220
 #define ASN1_F_BIO_NEW_NDEF 208
 #define ASN1_F_BITSTR_CB 180
 #define ASN1_F_BN_TO_ASN1_ENUMERATED			 138
@@ -1335,6 +1338,7 @@ void ERR_load_ASN1_strings(void);
 #define ASN1_R_INVALID_OBJECT_ENCODING			 216
 #define ASN1_R_INVALID_SEPARATOR			 131
 #define ASN1_R_INVALID_TIME_FORMAT			 132
+#define ASN1_R_INVALID_TRANSFER_ENCODING		 217
 #define ASN1_R_INVALID_UNIVERSALSTRING_LENGTH		 133
 #define ASN1_R_INVALID_UTF8STRING			 134
 #define ASN1_R_IV_TOO_LARGE 135
Index: crypto/asn1/asn1_err.c
===
RCS file: /home/john/cvsroot/openssl/crypto/asn1/asn1_err.c,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.2.1
diff -u -p -r1.1.1.1 -r1.1.1.1.2.1
--- crypto/asn1/asn1_err.c	14 Oct 2011 11:17:40 -	1.1.1.1
+++ crypto/asn1/asn1_err.c	15 Oct 2011 09:36:51 -	1.1.1.1.2.1
@@ -135,6 +135,8 @@ static ERR_STRING_DATA ASN1_str_functs[]
 {ERR_FUNC(ASN1_F_ASN1_VERIFY),	ASN1_verify},
 {ERR_FUNC(ASN1_F_B64_READ_ASN1),	B64_READ_ASN1},
 {ERR_FUNC(ASN1_F_B64_WRITE_ASN1),	B64_WRITE_ASN1},
+{ERR_FUNC(ASN1_F_BINARY_READ_ASN1),	BINARY_READ_ASN1},
+{ERR_FUNC(ASN1_F_BINARY_WRITE_ASN1),	BINARY_WRITE_ASN1},
 {ERR_FUNC(ASN1_F_BIO_NEW_NDEF),	BIO_new_NDEF},
 {ERR_FUNC(ASN1_F_BITSTR_CB),	BITSTR_CB},
 {ERR_FUNC(ASN1_F_BN_TO_ASN1_ENUMERATED),	BN_to_ASN1_ENUMERATED},
Index: crypto/asn1/asn_mime.c
===
RCS file: /home/john/cvsroot/openssl/crypto/asn1/asn_mime.c,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.2.4
diff -u -p -r1.1.1.1 -r1.1.1.1.2.4
--- crypto/asn1/asn_mime.c	14 Oct 2011 11:17:40 -	1.1.1.1
+++ crypto/asn1/asn_mime.c	21 Oct 2011 10:27:43 -	1.1.1.1.2.4
@@ -100,7 +100,6 @@ static int mime_hdr_cmp(const MIME_HEADE
 static int mime_param_cmp(const MIME_PARAM * const *a,
 			const MIME_PARAM * const *b);
 static void mime_param_free(MIME_PARAM *param);
-static 

[openssl.org #1261] [PATCH] - binary S/MIME handling in openssl smime 1.0.0e

2011-10-20 Thread John Hughes via RT
This is an update of the patch made by Antti Tapio for 0.9.8a - ticket 
#1261

Index: apps/smime.c
===
RCS file: /home/john/cvsroot/openssl/apps/smime.c,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.2.1
diff -u -p -r1.1.1.1 -r1.1.1.1.2.1
--- apps/smime.c	14 Oct 2011 11:17:40 -	1.1.1.1
+++ apps/smime.c	20 Oct 2011 07:16:06 -	1.1.1.1.2.1
@@ -78,7 +78,7 @@ static int smime_cb(int ok, X509_STORE_C
 #define SMIME_ENCRYPT	(1 | SMIME_OP)
 #define SMIME_DECRYPT	(2 | SMIME_IP)
 #define SMIME_SIGN	(3 | SMIME_OP | SMIME_SIGNERS)
-#define SMIME_VERIFY	(4 | SMIME_IP)
+#define SMIME_VERIFY	(4 | SMIME_IP | SMIME_OP)
 #define SMIME_PK7OUT	(5 | SMIME_IP | SMIME_OP)
 #define SMIME_RESIGN	(6 | SMIME_IP | SMIME_OP | SMIME_SIGNERS)
 
@@ -365,6 +365,23 @@ int MAIN(int argc, char **argv)
 goto argerr;
 			contfile = *++args;
 			}
+		else if (!strcmp(*args, -transenc) || !strcmp (*args, -transferencoding))
+			{
+			if (args[1])
+{
+if (!strcmp(args[1], binary))
+	flags |= SMIME_TRANSFER_ENCODING_BINARY;
+else if (!strcmp(args[1], base64))
+	;
+else {
+	BIO_printf(bio_err, Supported transfer encodings are base64 and binary\n);
+	badarg = 1;
+}
+args++;
+}
+			else
+badarg = 1;
+			}
 		else if (args_verify(args, NULL, badarg, bio_err, vpm))
 			continue;
 		else if ((cipher = EVP_get_cipherbyname(*args + 1)) == NULL)
@@ -488,6 +505,7 @@ int MAIN(int argc, char **argv)
 		BIO_printf(bio_err,  -rand file%cfile%c...\n, LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
 		BIO_printf(bio_err, load the file (or the files in the directory) into\n);
 		BIO_printf(bio_err, the random number generator\n);
+		BIO_printf(bio_err,  -transenc enc  transfer encoding to use (base64 or binary)\n);
 		BIO_printf (bio_err, cert.pem   recipient certificate(s) for encryption\n);
 		goto end;
 		}
Index: crypto/asn1/asn1.h
===
RCS file: /home/john/cvsroot/openssl/crypto/asn1/asn1.h,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.2.1
diff -u -p -r1.1.1.1 -r1.1.1.1.2.1
--- crypto/asn1/asn1.h	14 Oct 2011 11:17:40 -	1.1.1.1
+++ crypto/asn1/asn1.h	15 Oct 2011 09:36:51 -	1.1.1.1.2.1
@@ -161,6 +161,7 @@ extern C {
 #define SMIME_OLDMIME		0x400
 #define SMIME_CRLFEOL		0x800
 #define SMIME_STREAM		0x1000
+#define SMIME_TRANSFER_ENCODING_BINARY	0x2000
 
 struct X509_algor_st;
 DECLARE_STACK_OF(X509_ALGOR)
@@ -1222,6 +1223,8 @@ void ERR_load_ASN1_strings(void);
 #define ASN1_F_ASN1_VERIFY 137
 #define ASN1_F_B64_READ_ASN1 209
 #define ASN1_F_B64_WRITE_ASN1 210
+#define ASN1_F_BINARY_READ_ASN1 219
+#define ASN1_F_BINARY_WRITE_ASN1			 220
 #define ASN1_F_BIO_NEW_NDEF 208
 #define ASN1_F_BITSTR_CB 180
 #define ASN1_F_BN_TO_ASN1_ENUMERATED			 138
@@ -1335,6 +1338,7 @@ void ERR_load_ASN1_strings(void);
 #define ASN1_R_INVALID_OBJECT_ENCODING			 216
 #define ASN1_R_INVALID_SEPARATOR			 131
 #define ASN1_R_INVALID_TIME_FORMAT			 132
+#define ASN1_R_INVALID_TRANSFER_ENCODING		 217
 #define ASN1_R_INVALID_UNIVERSALSTRING_LENGTH		 133
 #define ASN1_R_INVALID_UTF8STRING			 134
 #define ASN1_R_IV_TOO_LARGE 135
Index: crypto/asn1/asn1_err.c
===
RCS file: /home/john/cvsroot/openssl/crypto/asn1/asn1_err.c,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.2.1
diff -u -p -r1.1.1.1 -r1.1.1.1.2.1
--- crypto/asn1/asn1_err.c	14 Oct 2011 11:17:40 -	1.1.1.1
+++ crypto/asn1/asn1_err.c	15 Oct 2011 09:36:51 -	1.1.1.1.2.1
@@ -135,6 +135,8 @@ static ERR_STRING_DATA ASN1_str_functs[]
 {ERR_FUNC(ASN1_F_ASN1_VERIFY),	ASN1_verify},
 {ERR_FUNC(ASN1_F_B64_READ_ASN1),	B64_READ_ASN1},
 {ERR_FUNC(ASN1_F_B64_WRITE_ASN1),	B64_WRITE_ASN1},
+{ERR_FUNC(ASN1_F_BINARY_READ_ASN1),	BINARY_READ_ASN1},
+{ERR_FUNC(ASN1_F_BINARY_WRITE_ASN1),	BINARY_WRITE_ASN1},
 {ERR_FUNC(ASN1_F_BIO_NEW_NDEF),	BIO_new_NDEF},
 {ERR_FUNC(ASN1_F_BITSTR_CB),	BITSTR_CB},
 {ERR_FUNC(ASN1_F_BN_TO_ASN1_ENUMERATED),	BN_to_ASN1_ENUMERATED},
Index: crypto/asn1/asn_mime.c
===
RCS file: /home/john/cvsroot/openssl/crypto/asn1/asn_mime.c,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.2.2
diff -u -p -r1.1.1.1 -r1.1.1.1.2.2
--- crypto/asn1/asn_mime.c	14 Oct 2011 11:17:40 -	1.1.1.1
+++ crypto/asn1/asn_mime.c	20 Oct 2011 07:16:07 -	1.1.1.1.2.2
@@ -100,7 +100,6 @@ static int mime_hdr_cmp(const MIME_HEADE
 static int mime_param_cmp(const MIME_PARAM * const *a,
 			const MIME_PARAM * const *b);
 static void mime_param_free(MIME_PARAM *param);
-static int mime_bound_check(char *line, int linelen, char *bound, int blen);
 static int multi_split(BIO *bio, char *bound, STACK_OF(BIO) **ret);
 static int strip_eol(char *linebuf, int *plen);
 static MIME_HEADER *mime_hdr_find(STACK_OF(MIME_HEADER) *hdrs, char *name);
@@