From: Mark Wooding Date: Tue, 18 Sep 2012 02:32:53 +0000 (+0100) Subject: Merge branch 'mdw/multi-priv' X-Git-Tag: 1.0.0pre11~1 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/commitdiff_plain/91ac51aa6d078ba287972988fc9cca6593bfbe8f Merge branch 'mdw/multi-priv' * mdw/multi-priv: server/tests.at, t/keyring-*: New tests for key management. Allow different peer associations to use different private keys. server: Use the new kdata system. server/{keymgmt.c,tripe.h}: Unify public and private key handling. server/keyexch.c: Prefix crypto-details trace messages correctly. server/{keymgmt.c,tripe-admin.5.in}: Improve key-management errors. admin.c (a_format): New function formats token sequences to strings. Conflicts: server/tests.at server/tripe.h --- 91ac51aa6d078ba287972988fc9cca6593bfbe8f diff --cc server/keyexch.c index b1f23d73,50a85f6f..d26ac787 --- a/server/keyexch.c +++ b/server/keyexch.c @@@ -1358,15 -1383,19 +1477,20 @@@ newkeys int kx_init(keyexch *kx, peer *p, keyset **ks, unsigned f) { + if ((kx->kpriv = km_findpriv(p_privtag(p))) == 0) goto fail_0; + if ((kx->kpub = km_findpub(p_tag(p))) == 0) goto fail_1; + if (!group_samep(kx->kpriv->g, kx->kpub->g)) { + a_warn("KX", "?PEER", kx->p, "group-mismatch", + "local-private-key", "%s", p_privtag(p), + "peer-public-key", "%s", p_tag(p), + A_END); + goto fail_2; + } + kx->ks = ks; kx->p = p; - kx->kpub = G_CREATE(gg); - if (km_getpubkey(p_tag(p), kx->kpub, &kx->texp_kpub)) { - G_DESTROY(gg, kx->kpub); - return (-1); - } kx->f = KXF_DEAD | KXF_PUBKEY | f; + rs_reset(&kx->rs); if (!(kx->f & KXF_CORK)) { start(kx, time(0)); resend(kx); diff --cc server/tests.at index e0eaa05b,a326709e..1171fa22 --- a/server/tests.at +++ b/server/tests.at @@@ -438,44 -423,143 +438,181 @@@ WITH_3TRIPES([alice], [bob], [carol], [ AT_CLEANUP +###-------------------------------------------------------------------------- +### Adverse communication. + +AT_SETUP([server retry]) +AT_KEYWORDS([backoff]) +export TRIPE_SLIPIF=USLIP + +for i in alice bob; do (mkdir $i; cd $i; SETUPDIR([beta])); done + +WITH_2TRIPES([alice], [bob], [-nslip], [-talice], [-tbob], [ + + ## Set up the evil proxy. + alicemitm=24516 bobmitm=14016 + MITM -kalice/keyring.pub >mitm.out 2>mitm.err \ + peer:alice:$alicemitm:127.0.0.1:$(cat alice/port) \ + peer:bob:$bobmitm:127.0.0.1:$(cat bob/port) \ + filt:drop:5 filt:send& mitmpid=$! + strace -omitm.trace -p$mitmpid& mitmtrace=$! + trap 'kill $mitmpid $mitmtrace; exit 127' EXIT INT QUIT TERM HUP + + ## Try to establish keys anyway. + AWAIT_KXDONE([alice], [alice], [bob], [bob], [ + AT_CHECK([TRIPECTL -dalice ADD -cork bob INET 127.0.0.1 $alicemitm]) + AT_CHECK([TRIPECTL -dbob ADD alice INET 127.0.0.1 $bobmitm]) + ]) + + ## Check pinging. + COMMS_EPING([alice], [alice], [bob], [bob], [10]) + COMMS_EPING([bob], [bob], [alice], [alice], [10]) + + ## Tear down the MITM proxy. + kill $mitmpid + wait $mitmpid + wait $mitmtrace +]) + +AT_CLEANUP + + ###-------------------------------------------------------------------------- + ### Key management. + + AT_SETUP([server key-management]) + AT_KEYWORDS([keymgmt]) + export TRIPE_SLIPIF=USLIP + + ## Determine all of the nets and the principals. + princs="" + nets=" " + while read princ pnets; do + princs="$princs $princ" + for n in $pnets; do + case " $nets " in *" $n "*) ;; *) nets="$nets$n " ;; esac + done + done <