[Mixmaster-devel] secring.pgp binary?
Brought to you by:
weaselp
From: Peter P. <pe...@pa...> - 2002-08-26 04:33:17
|
I wonder why secring.pgp is binary. I doubt the dearmoring would be too expensive so I propose to change it to ascii. This patch (UNTESTED!) seems to work so far. It needs considerable more testing before I want to apply it. It produces secring.pgps that look like this: | Type Bits/KeyID Date User ID | sec 1024R/80428AC1 2002/08/25 Anonymous Remailer <weasel@foo> |=20 | -----BEGIN PGP PRIVATE KEY BLOCK----- | Version: Mixmaster 2.9b37 (OpenPGP module) |=20 | lQHgAz1o/7gAAAEEAMooZhKuZVBMhLIy4oUyhLno9eb4nRkJQqYFv4QizANvRfT8 | [..] | b6AetCJBbm9ueW1vdXMgUmVtYWlsZXIgPHdlYXNlbEB0aGV0aXM+ | =3D9G5q | -----END PGP PRIVATE KEY BLOCK----- |=20 | Type Bits/KeyID Date User ID | sec 1024R/A8365A31 2002/08/25 Anonymous Remailer <weasel@foo> |=20 | -----BEGIN PGP PRIVATE KEY BLOCK----- | Version: Mixmaster 2.9b37 (OpenPGP module) |=20 | lQHgAz1pADgAAAEEALKTkfCa58+mHhKLY8n63ckx8Pb2GS52P/NpXIRdrq7G68R1 | [..] | 8qrvtCJBbm9ueW1vdXMgUmVtYWlsZXIgPHdlYXNlbEB0aGV0aXM+ | =3DfbYQ | -----END PGP PRIVATE KEY BLOCK----- |=20 | Type Bits/KeyID Date User ID | sec 1024D/4674DA59 2002/08/25 Anonymous Remailer <weasel@foo> | ssb 1024g/FD39CBAD 2002/08/25=20 |=20 | -----BEGIN PGP PRIVATE KEY BLOCK----- | Version: Mixmaster 2.9b37 (OpenPGP module) |=20 | lQHPBD1o/7gRBACPxQnvfe8mg0OdzBWCCXJ3cBrO4B8h9NGFJYEeNvGsjsVebBDc | [..] | 4xOsMpFlp9KrIY6km/Ub | =3DMz+V | -----END PGP PRIVATE KEY BLOCK----- |=20 | Type Bits/KeyID Date User ID | sec 1024D/62444D4E 2002/08/25 Anonymous Remailer <weasel@foo> | ssb 1024g/A803D186 2002/08/25=20 |=20 | -----BEGIN PGP PRIVATE KEY BLOCK----- | Version: Mixmaster 2.9b37 (OpenPGP module) |=20 | lQHPBD1pADgRBACPxQnvfe8mg0OdzBWCCXJ3cBrO4B8h9NGFJYEeNvGsjsVebBDc | [..] | =3D+PTz | -----END PGP PRIVATE KEY BLOCK----- That makes it considerable easier to get rid of old secret keys. You no longer need an external tool like GnuPG or PGP but only your text editor. In the course of writing it I also fixed a bug I introduced earlier in=20 pgp_readkeyring(). Comments apprechiated. Index: pgp.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/mixmaster/Mix/Src/pgp.h,v retrieving revision 1.6 diff -u -r1.6 pgp.h --- pgp.h 20 Aug 2002 06:50:38 -0000 1.6 +++ pgp.h 26 Aug 2002 04:26:05 -0000 @@ -104,6 +104,8 @@ void pgp_sigcanonic(BUFFER *msg); int pgp_makepubkey(BUFFER *seckey, BUFFER *outtxt, BUFFER *pubkey, BUFFER *pass, int keyalgo); +int pgp_makeseckey(BUFFER *keypacket, BUFFER *outtxt, + BUFFER *pass, int keyalgo); int pgp_getkey(int mode, int algo, int *sym, int *mdc, BUFFER *keypacket, = BUFFER *key, BUFFER *keyid, BUFFER *userid, BUFFER *pass); int pgp_rsakeygen(int bits, BUFFER *userid, BUFFER *pass, char *pubring, Index: pgpdata.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/mixmaster/Mix/Src/pgpdata.c,v retrieving revision 1.11 diff -u -r1.11 pgpdata.c --- pgpdata.c 16 Aug 2002 19:03:37 -0000 1.11 +++ pgpdata.c 26 Aug 2002 04:26:06 -0000 @@ -689,8 +689,12 @@ default: algoid =3D '?'; } - buf_appendf(outtxt, "%s %4d%c/%02X%02X%02X%02X ", type =3D=3D PGP_PUBS= UBKEY ? - "sub" : "pub", len, algoid, + buf_appendf(outtxt, "%s %4d%c/%02X%02X%02X%02X ", + type =3D=3D PGP_PUBSUBKEY ? "sub" :=20 + type =3D=3D PGP_PUBKEY ? "pub" : + type =3D=3D PGP_SECKEY ? "sec" :=20 + type =3D=3D PGP_SECSUBKEY ? "ssb" : + "???", len, algoid, id->data[4], id->data[5], id->data[6], id->data[7]); tc =3D localtime(created); strftime(txt, LINELEN, "%Y/%m/%d ", tc); @@ -757,6 +761,56 @@ buf_free(subkey); buf_free(sig); buf_free(p); + buf_free(tmp); + return (err); +} + +int pgp_makeseckey(BUFFER *keypacket, BUFFER *outtxt, + BUFFER *pass, int keyalgo) +{ + BUFFER *p, *pubkey, *seckey, *subkey, *sig, *tmp, *dummy; + int type, thisalgo, err =3D -1; + time_t created; + + p =3D buf_new(); + seckey =3D buf_new(); + pubkey =3D buf_new(); + subkey =3D buf_new(); + sig =3D buf_new(); + tmp =3D buf_new(); + dummy =3D buf_new(); + + buf_set(seckey, keypacket); + type =3D pgp_getpacket(keypacket, p); + if (type !=3D PGP_SECKEY) + goto end; + + thisalgo =3D pgp_makepkpacket(PGP_SECKEY, p, outtxt, tmp, pubkey, pass, + &created); + if (thisalgo =3D=3D -1 || (keyalgo !=3D 0 && keyalgo !=3D thisalgo)) + goto end; + + while ((type =3D pgp_getpacket(keypacket, p)) > 0) { + if (type =3D=3D PGP_SECSUBKEY) { + if (pgp_makepkpacket(PGP_SECSUBKEY, p, outtxt, dummy, subkey, pass, + &created) =3D=3D -1) + goto end; + buf_nl(outtxt); + } else if (type =3D=3D PGP_USERID) { + buf_cat(outtxt, p); + buf_nl(outtxt); + pgp_packet(p, PGP_USERID); + } else if (type =3D=3D PGP_PUBKEY || type =3D=3D PGP_SECKEY) + break; + } + err =3D 0; +end: + buf_free(pubkey); + buf_free(seckey); + buf_free(subkey); + buf_free(sig); + buf_free(p); + buf_free(dummy); buf_free(tmp); return (err); } Index: pgpdb.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvsroot/mixmaster/Mix/Src/pgpdb.c,v retrieving revision 1.8 diff -u -r1.8 pgpdb.c --- pgpdb.c 25 Aug 2002 13:27:40 -0000 1.8 +++ pgpdb.c 26 Aug 2002 04:26:06 -0000 @@ -43,9 +43,15 @@ } while (!bufleft(line, begin_pgp)) ; buf_clear(tmp); - buf_appends(tmp, begin_pgp); + buf_cat(tmp, line); buf_appends(tmp, "\n"); - buf_cat(tmp, armored); + do { + if (buf_getline(armored, line) =3D=3D -1) { + goto end_greedy_dearmor; + } + buf_cat(tmp, line); + buf_appends(tmp, "\n"); + } while (!bufleft(line, end_pgp)) ; =20 if (pgp_dearmor(tmp, tmp) =3D=3D 0) { err =3D ARMORED; @@ -55,6 +61,7 @@ end_greedy_dearmor: buf_free(line); buf_free(tmp); + } buf_free(armored); return (err); @@ -310,12 +317,14 @@ int pgp_keymgt(int force) { FILE *f =3D NULL; - BUFFER *key, *userid, *out, *outkey, *outtxt, *pass; + BUFFER *key, *keybak, *userid, *out, *outkey, *outtxt, *pass, *secout; KEYRING *keys; int err =3D 0, type =3D 0; =20 key =3D buf_new(); out =3D buf_new(); + keybak =3D buf_new(); + secout =3D buf_new(); =20 userid =3D buf_new(); buf_sets(userid, REMAILERNAME); @@ -355,15 +364,28 @@ if (keys =3D=3D NULL) goto end; while (pgpdb_getnext(keys, key, NULL, userid) !=3D -1) { + buf_clear(outtxt); buf_clear(outkey); + buf_clear(keybak); + buf_cat(keybak, key); + if (pgp_makeseckey(key, outtxt, pass, + type =3D=3D 0 ? PGP_ES_RSA : PGP_S_DSA) =3D=3D 0) { + err =3D 0; + buf_appends(secout, "Type Bits/KeyID Date User ID\n"); + buf_cat(secout, outtxt); + buf_nl(secout); + pgp_armor(key, PGP_ARMOR_SECKEY); + buf_cat(secout, key); + buf_nl(secout); + } buf_clear(outtxt); - if (pgp_makepubkey(key, outtxt, outkey, pass, + if (pgp_makepubkey(keybak, outtxt, outkey, pass, type =3D=3D 0 ? PGP_ES_RSA : PGP_S_DSA) =3D=3D 0) { err =3D 0; buf_appends(out, "Type Bits/KeyID Date User ID\n"); buf_cat(out, outtxt); - pgp_armor(outkey, PGP_ARMOR_KEY); buf_nl(out); + pgp_armor(outkey, PGP_ARMOR_KEY); buf_cat(out, outkey); buf_nl(out); } @@ -371,18 +393,25 @@ pgpdb_close(keys); } =20 + if (err =3D=3D 0 && (f =3D mix_openfile(PGPREMSECRING, "w")) !=3D NULL) { + buf_write(secout, f); + fclose(f); + } else + err =3D -1; if (err =3D=3D 0 && (f =3D mix_openfile(PGPKEY, "w")) !=3D NULL) { - buf_write(out, f); - fclose(f); - } else - err =3D -1; + buf_write(out, f); + fclose(f); + } else + err =3D -1; end: buf_free(key); + buf_free(keybak); buf_free(out); buf_free(userid); buf_free(pass); buf_free(outtxt); buf_free(outkey); + buf_free(secout); return (err); } =20 yours, peter --=20 PGP signed and encrypted | .''`. ** Debian GNU/Linux ** messages preferred. | : :' : The universal | `. `' Operating System http://www.palfrader.org/ | `- http://www.debian.org/ |