[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Patches to make PGP2.3a compatible with 2.6



-----BEGIN PGP SIGNED MESSAGE-----

Here's a set of patches relative to PGP 2.3a to make it do the following:

  * Display and accept hexadecimal key IDs with 8 digits.

  * Accept input "packets" with version 2 or 3.

  * Produce output "packets" with either version 2 or 3, under control
    of the new "version_byte" variable in the config file or on the
    command line.

  * Produce ASCII armour (or "armor" for USAans) with an desired version
    string, under control of the new "armor_version" variable in the
    config file or on the command line.

This stuff needs testing and documentation.  No warranty, etc.
Please send comments to me.

If it works the way I hope, then

	pgp +armor_version=2.6 +version+byte=2

should be compatible with MIT PGP 2.6 before September, and

	pgp +armor_version=2.6 +version+byte=2

should be compatible with MIT PGP 2.6 after September.

Enjoy,
- --apb (Alan Barrett)

diff -u3 -r pgp/src/armor.c pgp-apb/src/armor.c
- --- pgp/src/armor.c	Sat Jul  3 00:32:38 1993
+++ pgp-apb/src/armor.c	Wed May 25 17:38:32 1994
@@ -29,6 +29,8 @@
 #include "crypto.h"
 #include "armor.h"
 
+char armor_version[20] = "";	/* version text in armor output */
+
 static int dpem_file(char *infile, char *outfile);
 static crcword crchware(byte ch, crcword poly, crcword accum);
 static int pem_file(char *infilename, char *outfilename, char *clearfilename);
@@ -508,7 +510,8 @@
 	else
 		fprintf (outFile, "-----BEGIN PGP MESSAGE, PART %02d/%02d-----\n",
 					1, noSections);
- -	fprintf (outFile, "Version: %s\n",rel_version);
+	fprintf (outFile, "Version: %s\n", (armor_version[0] != '\0' ?
+					    armor_version : rel_version));
 	fprintf (outFile, "\n");
 
 	init_crc();
diff -u3 -r pgp/src/config.c pgp-apb/src/config.c
- --- pgp/src/config.c	Mon Jun 14 02:44:57 1993
+++ pgp-apb/src/config.c	Wed May 25 18:00:33 1994
@@ -84,7 +84,7 @@
 	MYNAME, TEXTMODE, TMP, TZFIX, VERBOSE, BAKRING,
 	ARMORLINES, COMPLETES_NEEDED, MARGINALS_NEEDED, PAGER,
 	CERT_DEPTH, CHARSET, CLEAR, SELF_ENCRYPT,
- -	INTERACTIVE, PKCS_COMPAT,
+	INTERACTIVE, PKCS_COMPAT, ARMOR_VERSION, VERSION_BYTE,
 	/* options below this line can only be used as command line
 	 * "long" options */
 #define CONFIG_INTRINSICS	BATCHMODE
@@ -96,7 +96,7 @@
 	"MYNAME", "TEXTMODE", "TMP", "TZFIX", "VERBOSE", "BAKRING",
 	"ARMORLINES", "COMPLETES_NEEDED", "MARGINALS_NEEDED", "PAGER",
 	"CERT_DEPTH", "CHARSET", "CLEARSIG", "ENCRYPTTOSELF", 
- -	"INTERACTIVE", "PKCS_COMPAT",
+	"INTERACTIVE", "PKCS_COMPAT", "ARMOR_VERSION", "VERSION_BYTE",
 	/* command line only */
 	"BATCHMODE", "FORCE",
 };
@@ -106,7 +106,7 @@
 	STRING, BOOL, STRING, NUMERIC, NUMERIC, STRING,
 	NUMERIC, NUMERIC, NUMERIC, STRING,
 	NUMERIC, STRING, BOOL, BOOL,
- -	BOOL, NUMERIC,
+	BOOL, NUMERIC, STRING, NUMERIC,
 	/* command line only */
 	BOOL, BOOL,
 };
@@ -392,6 +392,20 @@
 				
 			case INTERACTIVE:
 				interactive_add = flag;
+				break;
+
+			case ARMOR_VERSION:
+				strncpy(armor_version, str,
+					sizeof(armor_version));
+				armor_version[sizeof(armor_version)-1] = '\0';
+				break;
+
+			case VERSION_BYTE:
+				version_byte = value;
+				if (version_byte < VERSION_BYTE_MIN)
+					version_byte = VERSION_BYTE_MIN;
+				if (version_byte > VERSION_BYTE_MAX)
+					version_byte = VERSION_BYTE_MAX;
 				break;
 				
 			case BATCHMODE: batchmode = flag; break;
diff -u3 -r pgp/src/crypto.c pgp-apb/src/crypto.c
- --- pgp/src/crypto.c	Fri Jul  2 23:55:07 1993
+++ pgp-apb/src/crypto.c	Wed May 25 17:53:53 1994
@@ -59,6 +59,7 @@
 
 #define	USE_LITERAL2
 
+int version_byte = VERSION_BYTE_DEFAULT;	/* PGP packet format version */
 
 /* This variable stores the md5 hash of the current file, if it is
    available.  It is used in open_strong_pseudorandom. */
@@ -313,7 +314,15 @@
  */
 int
 version_error(int val, int checkval)
- -{	if (val != checkval)
+{	return version_range_error(val, checkval, checkval);
+}
+
+/* Return nonzero if val isn't in range from minval to maxval, after
+ * printing a warning.
+ */
+int
+version_range_error(int val, int minval, int maxval)
+{	if (val < minval || val > maxval)
 	{	fprintf (pgpout, PSTR(
 "\n\007Unsupported packet format - you need a newer version of PGP for this file.\n"));
 		return(1);
@@ -786,7 +795,7 @@
 	put_word16((word16) ske_length, certificate+certificate_length);
 	certificate_length+=2;	/* advance past word */
 
- -	certificate[certificate_length++] = VERSION_BYTE;
+	certificate[certificate_length++] = version_byte;
 
 	/* Begin fields that are included in MD calculation... */
 
@@ -1367,7 +1376,7 @@
 		goto badcert;	/* complain and return bad status */
 
 	version = *certificate++;
- -	if (version_error(version, VERSION_BYTE))
+	if (version_range_error(version, VERSION_BYTE_MIN, VERSION_BYTE_MAX))
 		goto err1;
 
 	mdlensave = mdlen = *certificate++;	/* length of material to be added to MD */
@@ -1807,7 +1816,7 @@
 		goto badcert2;	/* complain and return bad status */
 
 	version = *certificate++;
- -	if (version_error(version, VERSION_BYTE))
+	if (version_range_error(version, VERSION_BYTE_MIN, VERSION_BYTE_MAX))
 		goto err2;
 
 	mdlensave = mdlen = *certificate++;	/* length of material to be added to MD */
@@ -2361,7 +2370,7 @@
 			       FALSE);
 		
 		/* Write version byte */
- -		ver = VERSION_BYTE;
+		ver = version_byte;
 		fwrite (&ver, 1, 1, g);
 		
 		writekeyID( n, g );	
@@ -2745,7 +2754,8 @@
 
 		/* Read and check version */
 		fread (&ver, 1, 1, f);
- -		if (version_error(ver, VERSION_BYTE))
+		if (version_range_error(ver, VERSION_BYTE_MIN,
+					VERSION_BYTE_MAX))
 			{	fclose (f);
 				return (-1);
 			}
diff -u3 -r pgp/src/crypto.h pgp-apb/src/crypto.h
- --- pgp/src/crypto.h	Mon May 10 01:38:27 1993
+++ pgp-apb/src/crypto.h	Wed May 25 17:11:46 1994
@@ -75,6 +75,9 @@
 /* Print an error message and return nonzero if val != checkval */
 int version_error (int val, int checkval);
 
+/* Print an error message and return nonzero if val not in [minval..maxval] */
+int version_range_error (int val, int minval, int maxval);
+
 int check_key_sig(FILE *fkey, long fpkey, int keypktlen, char *keyuserid,
 	 FILE *fsig, long fpsig, char *keyfile, char *siguserid, byte *xtimestamp,
 	 byte *sigclass);
diff -u3 -r pgp/src/keymgmt.c pgp-apb/src/keymgmt.c
- --- pgp/src/keymgmt.c	Wed Jun 23 22:53:53 1993
+++ pgp-apb/src/keymgmt.c	Wed May 25 18:06:31 1994
@@ -137,7 +137,7 @@
 	char		*bufptr;	/* ptr to Key ID string */
 	static char	keyIDbuf[2*KEYFRAGSIZE+1];
 
- -	/*	only show bottom 3 bytes of keyID	*/
+	/*	only show bottom 4 bytes of keyID	*/
 
 	bufptr = keyIDbuf;
 	
@@ -156,7 +156,7 @@
 	**	MSB-first keyID format
 	*/
 
- -	for (i = KEYFRAGSIZE-3; i < KEYFRAGSIZE; i++)
+	for (i = KEYFRAGSIZE-4; i < KEYFRAGSIZE; i++)
 		{
 		sprintf( bufptr, "%02X", keyID[i] );
 		bufptr += 2;
@@ -302,7 +302,7 @@
 	fwrite(&ctb,1,1,f);		/* write key certificate header byte */
 	convert(cert_length);	/* convert to external byteorder */
 	fwrite(&cert_length,1,sizeof(cert_length),f);
- -	version = VERSION_BYTE;
+	version = version_byte;
 	fwrite(&version,1,1,f);		/* set version number */
 	convert_byteorder(timestamp,4);	/* convert to external form */
 	fwrite(timestamp,1,4,f); /* write certificate timestamp */
@@ -467,7 +467,8 @@
 	else if (is_ctb_type (ctb, CTB_SKE_TYPE))
 	{	if (sigkeyID)
 		{	fread(&version,1,1,f);		/* Read version of sig packet */
- -			if (version_error(version, VERSION_BYTE))
+			if (version_range_error(version, VERSION_BYTE_MIN,
+						VERSION_BYTE_MAX))
 				SKIP_RETURN(-6);			/* Need a later version */
 			/* Skip timestamp, validity period, and type byte */
 			fread(&mdlen, 1, 1, f);
@@ -493,7 +494,7 @@
 	if (n != NULL)
 		set_precision(MAX_UNIT_PRECISION);	/* safest opening assumption */
 	fread(&version,1,1,f);	/* read and check version */
- -	if (version_error(version, VERSION_BYTE))
+	if (version_range_error(version, VERSION_BYTE_MIN, VERSION_BYTE_MAX))
 		SKIP_RETURN(-6);			/* Need a later version */
 	if (timestamp)
 	{	fread(timestamp,1,SIZEOF_TIMESTAMP,f);	/* read certificate timestamp */
@@ -1214,10 +1215,10 @@
 	}
 
 /*	Here's a good format for display of key or signature certificates:
- -Type bits/keyID   Date       User ID
- -pub  1024/xxxxxx yyyy-mm-dd  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- -sec   512/xxxxxx yyyy-mm-dd  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- -sig   384/xxxxxx yyyy-mm-dd  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Type bits/keyID     Date       User ID
+pub  1024/xxxxxxxx yyyy-mm-dd  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+sec   512/xxxxxxxx yyyy-mm-dd  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+sig   384/xxxxxxxx yyyy-mm-dd  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 */
 
 	if (moreflag)
@@ -1406,7 +1407,7 @@
 			if (mcguffin && strlen(mcguffin) > 0)
 				fprintf(pgpout,PSTR(", looking for user ID \"%s\"."),LOCAL_CHARSET(mcguffin));
 		}
- -		fprintf(pgpout,PSTR("\nType bits/keyID   Date       User ID\n"));
+		fprintf(pgpout,PSTR("\nType bits/keyID     Date       User ID\n"));
 	}
 	for ( ; ; )
 	{	long fpos = ftell(f);
diff -u3 -r pgp/src/pgp.h pgp-apb/src/pgp.h
- --- pgp/src/pgp.h	Fri Jun 11 09:44:11 1993
+++ pgp-apb/src/pgp.h	Wed May 25 17:33:27 1994
@@ -118,7 +118,9 @@
 #define CK_ENCRYPTED_BYTE	2	/* Conventional key is encrypted */
 
 /* Version byte for data structures created by this version of PGP */
- -#define	VERSION_BYTE		2	/* PGP2 */
+#define	VERSION_BYTE_MIN	2	/* PGP2 to 2.5 */
+#define	VERSION_BYTE_MAX	3	/* PGP2.6 */
+#define	VERSION_BYTE_DEFAULT	2	/* PGP2 */
 
 /* Values for trust bits in keycntrl packet after key packet */
 #define	KC_OWNERTRUST_MASK		0x07	/* Trust bits for key owner */
@@ -230,6 +232,8 @@
 extern int compl_min;	/* number of fully trusted signatures needed */
 extern int max_cert_depth;
 extern char pager[];	/* file lister command */
+extern char armor_version[20];	/* version text in armor output */
+extern int version_byte;	/* PGP packet format version */
 
 /* These lists store hashed passwords for future use. */
 /* passwds are passwords of as-yet-unknown purpose; keypasswds
diff -u3 -r pgp/src/zipup.c pgp-apb/src/zipup.c
- --- pgp/src/zipup.c	Mon May 10 01:39:19 1993
+++ pgp-apb/src/zipup.c	Wed May 25 17:49:09 1994
@@ -37,7 +37,7 @@
 #    define fhow (O_RDONLY|O_BINARY)
 #  else /* !MSDOS */
 #ifndef AMIGA
- -     long lseek();
+     off_t lseek();
 #endif /* AMIGA */
 #    define fhow 0
 #  endif /* ?MSDOS */

-----BEGIN PGP SIGNATURE-----
Version: 2.whatever

iQCVAgUBLeN86t7alOJsS1cfAQFS1gQArASHvKV51lLRIuaSiyAqF6h9XXQpalZo
jdeZpoCC7P8oEe4inKNbtmFqPcQl8uTVlpTdUxJeErDLxSoDXlw04csW6gNssaFL
07+DpXqoogrOV9+kaPflNl+U3O1EWEDMGG064uDSSgJXLldYs8gGONOWpMV3EqZr
tdQzYgc0rBM=
=wsTt
-----END PGP SIGNATURE-----