Commit 6caa4edd authored by Ben Laurie's avatar Ben Laurie
Browse files

Add JPAKE.

parent ac786241
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -722,6 +722,10 @@

 Changes between 0.9.8i and 0.9.8j  [xx XXX xxxx]

  *) Add JPAKE support, including demo authentication in s_client and
     s_server.
     [Ben Laurie]

  *) Set the comparison function in v3_addr_canonize().
     [Rob Austein <sra@hactrn.net>]

+1 −1
Original line number Diff line number Diff line
@@ -119,7 +119,7 @@ SDIRS= \
	bn ec rsa dsa ecdsa dh ecdh dso engine \
	buffer bio stack lhash rand err \
	evp asn1 pem x509 x509v3 conf txt_db pkcs7 pkcs12 comp ocsp ui krb5 \
	cms pqueue ts 
	cms pqueue ts jpake
# keep in mind that the above list is adjusted by ./Configure
# according to no-xxx arguments...

+12 −11
Original line number Diff line number Diff line
@@ -188,17 +188,18 @@ apps.o: ../include/openssl/conf.h ../include/openssl/crypto.h
apps.o: ../include/openssl/e_os2.h ../include/openssl/ec.h
apps.o: ../include/openssl/ecdh.h ../include/openssl/ecdsa.h
apps.o: ../include/openssl/engine.h ../include/openssl/err.h
apps.o: ../include/openssl/evp.h ../include/openssl/lhash.h
apps.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h
apps.o: ../include/openssl/ocsp.h ../include/openssl/opensslconf.h
apps.o: ../include/openssl/opensslv.h ../include/openssl/ossl_typ.h
apps.o: ../include/openssl/pem.h ../include/openssl/pem2.h
apps.o: ../include/openssl/pkcs12.h ../include/openssl/pkcs7.h
apps.o: ../include/openssl/rsa.h ../include/openssl/safestack.h
apps.o: ../include/openssl/sha.h ../include/openssl/stack.h
apps.o: ../include/openssl/symhacks.h ../include/openssl/txt_db.h
apps.o: ../include/openssl/ui.h ../include/openssl/x509.h
apps.o: ../include/openssl/x509_vfy.h ../include/openssl/x509v3.h apps.c apps.h
apps.o: ../include/openssl/evp.h ../include/openssl/jpake.h
apps.o: ../include/openssl/lhash.h ../include/openssl/obj_mac.h
apps.o: ../include/openssl/objects.h ../include/openssl/ocsp.h
apps.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h
apps.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h
apps.o: ../include/openssl/pem2.h ../include/openssl/pkcs12.h
apps.o: ../include/openssl/pkcs7.h ../include/openssl/rsa.h
apps.o: ../include/openssl/safestack.h ../include/openssl/sha.h
apps.o: ../include/openssl/stack.h ../include/openssl/symhacks.h
apps.o: ../include/openssl/txt_db.h ../include/openssl/ui.h
apps.o: ../include/openssl/x509.h ../include/openssl/x509_vfy.h
apps.o: ../include/openssl/x509v3.h apps.c apps.h
asn1pars.o: ../e_os.h ../include/openssl/asn1.h ../include/openssl/bio.h
asn1pars.o: ../include/openssl/buffer.h ../include/openssl/conf.h
asn1pars.o: ../include/openssl/crypto.h ../include/openssl/e_os2.h
+214 −0
Original line number Diff line number Diff line
@@ -122,6 +122,7 @@
#include <sys/types.h>
#include <ctype.h>
#include <errno.h>
#include <assert.h>
#include <openssl/err.h>
#include <openssl/x509.h>
#include <openssl/x509v3.h>
@@ -136,6 +137,7 @@
#include <openssl/rsa.h>
#endif
#include <openssl/bn.h>
#include <openssl/jpake.h>

#define NON_MAIN
#include "apps.h"
@@ -2377,6 +2379,218 @@ void policies_print(BIO *out, X509_STORE_CTX *ctx)
		BIO_free(out);
	}

static JPAKE_CTX *jpake_init(const char *us, const char *them,
							 const char *secret)
	{
	BIGNUM *p = NULL;
	BIGNUM *g = NULL;
	BIGNUM *q = NULL;
	BIGNUM *bnsecret = BN_new();
	JPAKE_CTX *ctx;

	// Use a safe prime for p (that we found earlier)
	BN_hex2bn(&p, "F9E5B365665EA7A05A9C534502780FEE6F1AB5BD4F49947FD036DBD7E905269AF46EF28B0FC07487EE4F5D20FB3C0AF8E700F3A2FA3414970CBED44FEDFF80CE78D800F184BB82435D137AADA2C6C16523247930A63B85661D1FC817A51ACD96168E95898A1F83A79FFB529368AA7833ABD1B0C3AEDDB14D2E1A2F71D99F763F");
	g = BN_new();
	BN_set_word(g, 2);
	q = BN_new();
	BN_rshift1(q, p);

	BN_bin2bn(secret, strlen(secret), bnsecret);

	ctx = JPAKE_CTX_new(us, them, p, g, q, bnsecret);
	BN_free(bnsecret);
	BN_free(q);
	BN_free(g);
	BN_free(p);

	return ctx;
	}

static void jpake_send_part(BIO *conn, const JPAKE_STEP_PART *p)
	{
	BN_print(conn, p->gx);
	BIO_puts(conn, "\n");
	BN_print(conn, p->zkpx.gr);
	BIO_puts(conn, "\n");
	BN_print(conn, p->zkpx.b);
	BIO_puts(conn, "\n");
	}

static void jpake_send_step1(BIO *bconn, JPAKE_CTX *ctx)
	{
	JPAKE_STEP1 s1;

	JPAKE_STEP1_init(&s1);
	JPAKE_STEP1_generate(&s1, ctx);
	jpake_send_part(bconn, &s1.p1);
	jpake_send_part(bconn, &s1.p2);
	BIO_flush(bconn);
	JPAKE_STEP1_release(&s1);
	}

static void jpake_send_step2(BIO *bconn, JPAKE_CTX *ctx)
	{
	JPAKE_STEP2 s2;

	JPAKE_STEP2_init(&s2);
	JPAKE_STEP2_generate(&s2, ctx);
	jpake_send_part(bconn, &s2);
	BIO_flush(bconn);
	JPAKE_STEP2_release(&s2);
	}

static void jpake_send_step3a(BIO *bconn, JPAKE_CTX *ctx)
	{
	JPAKE_STEP3A s3a;

	JPAKE_STEP3A_init(&s3a);
	JPAKE_STEP3A_generate(&s3a, ctx);
	BIO_write(bconn, s3a.hhk, sizeof s3a.hhk);
	BIO_flush(bconn);
	JPAKE_STEP3A_release(&s3a);
	}

static void jpake_send_step3b(BIO *bconn, JPAKE_CTX *ctx)
	{
	JPAKE_STEP3B s3b;

	JPAKE_STEP3B_init(&s3b);
	JPAKE_STEP3B_generate(&s3b, ctx);
	BIO_write(bconn, s3b.hk, sizeof s3b.hk);
	BIO_flush(bconn);
	JPAKE_STEP3B_release(&s3b);
	}

static void readbn(BIGNUM **bn, BIO *bconn)
	{
	char buf[10240];
	int l;

	l = BIO_gets(bconn, buf, sizeof buf);
	assert(l >= 0);
	assert(buf[l-1] == '\n');
	buf[l-1] = '\0';
	BN_hex2bn(bn, buf);
	}

static void jpake_receive_part(JPAKE_STEP_PART *p, BIO *bconn)
	{
	readbn(&p->gx, bconn);
	readbn(&p->zkpx.gr, bconn);
	readbn(&p->zkpx.b, bconn);
	}

static void jpake_receive_step1(JPAKE_CTX *ctx, BIO *bconn)
	{
	JPAKE_STEP1 s1;

	JPAKE_STEP1_init(&s1);
	jpake_receive_part(&s1.p1, bconn);
	jpake_receive_part(&s1.p2, bconn);
	if(!JPAKE_STEP1_process(ctx, &s1))
		{
		ERR_print_errors(bio_err);
		exit(1);
		}
	JPAKE_STEP1_release(&s1);
	}

static void jpake_receive_step2(JPAKE_CTX *ctx, BIO *bconn)
	{
	JPAKE_STEP2 s2;

	JPAKE_STEP2_init(&s2);
	jpake_receive_part(&s2, bconn);
	if(!JPAKE_STEP2_process(ctx, &s2))
		{
		ERR_print_errors(bio_err);
		exit(1);
		}
	JPAKE_STEP2_release(&s2);
	}

static void jpake_receive_step3a(JPAKE_CTX *ctx, BIO *bconn)
	{
	JPAKE_STEP3A s3a;
	int l;

	JPAKE_STEP3A_init(&s3a);
	l = BIO_read(bconn, s3a.hhk, sizeof s3a.hhk);
	assert(l == sizeof s3a.hhk);
	if(!JPAKE_STEP3A_process(ctx, &s3a))
		{
		ERR_print_errors(bio_err);
		exit(1);
		}
	JPAKE_STEP3A_release(&s3a);
	}

static void jpake_receive_step3b(JPAKE_CTX *ctx, BIO *bconn)
	{
	JPAKE_STEP3B s3b;
	int l;

	JPAKE_STEP3B_init(&s3b);
	l = BIO_read(bconn, s3b.hk, sizeof s3b.hk);
	assert(l == sizeof s3b.hk);
	if(!JPAKE_STEP3B_process(ctx, &s3b))
		{
		ERR_print_errors(bio_err);
		exit(1);
		}
	JPAKE_STEP3B_release(&s3b);
	}

void jpake_client_auth(BIO *out, BIO *conn, const char *secret)
	{
	JPAKE_CTX *ctx;
	BIO *bconn;

	BIO_puts(out, "Authenticating with JPAKE\n");

	ctx = jpake_init("client", "server", secret);

	bconn = BIO_new(BIO_f_buffer());
	BIO_push(bconn, conn);

	jpake_send_step1(bconn, ctx);
	jpake_receive_step1(ctx, bconn);
	jpake_send_step2(bconn, ctx);
	jpake_receive_step2(ctx, bconn);
	jpake_send_step3a(bconn, ctx);
	jpake_receive_step3b(ctx, bconn);

	BIO_puts(out, "JPAKE authentication succeeded\n");

	BIO_pop(bconn);
	BIO_free(bconn);
	}

void jpake_server_auth(BIO *out, BIO *conn, const char *secret)
	{
	JPAKE_CTX *ctx;
	BIO *bconn;

	BIO_puts(out, "Authenticating with JPAKE\n");

	ctx = jpake_init("server", "client", secret);

	bconn = BIO_new(BIO_f_buffer());
	BIO_push(bconn, conn);

	jpake_receive_step1(ctx, bconn);
	jpake_send_step1(bconn, ctx);
	jpake_receive_step2(ctx, bconn);
	jpake_send_step2(bconn, ctx);
	jpake_receive_step3a(ctx, bconn);
	jpake_send_step3b(bconn, ctx);

	BIO_puts(out, "JPAKE authentication succeeded\n");

	BIO_pop(bconn);
	BIO_free(bconn);
	}

/*
 * Platform-specific sections
 */
+2 −0
Original line number Diff line number Diff line
@@ -308,6 +308,8 @@ int bio_to_mem(unsigned char **out, int maxlen, BIO *in);
int pkey_ctrl_string(EVP_PKEY_CTX *ctx, char *value);
int init_gen_str(BIO *err, EVP_PKEY_CTX **pctx,
			const char *algname, ENGINE *e, int do_param);
void jpake_client_auth(BIO *out, BIO *conn, const char *secret);
void jpake_server_auth(BIO *out, BIO *conn, const char *secret);

#define FORMAT_UNDEF    0
#define FORMAT_ASN1     1
Loading