X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Fjpake%2Fjpake.c;h=8e4b633ccc5310f85f2f242f73560e51f0c44260;hb=057c8a2b9e24b91d4e98b38bf1c91f232f065637;hp=086d9f47e065f7b9dd67ebd0a7db51c6415d6940;hpb=70d71f61853f67dad75abce42c63e3b71704a763;p=oweals%2Fopenssl.git diff --git a/crypto/jpake/jpake.c b/crypto/jpake/jpake.c index 086d9f47e0..8e4b633ccc 100644 --- a/crypto/jpake/jpake.c +++ b/crypto/jpake/jpake.c @@ -282,8 +282,37 @@ int JPAKE_STEP1_generate(JPAKE_STEP1 *send, JPAKE_CTX *ctx) return 1; } +/* g^x is a legal value */ +static int is_legal(const BIGNUM *gx, const JPAKE_CTX *ctx) + { + BIGNUM *t; + int res; + + if(BN_is_negative(gx) || BN_is_zero(gx) || BN_cmp(gx, ctx->p.p) >= 0) + return 0; + + t = BN_new(); + BN_mod_exp(t, gx, ctx->p.q, ctx->p.p, ctx->ctx); + res = BN_is_one(t); + BN_free(t); + + return res; + } + int JPAKE_STEP1_process(JPAKE_CTX *ctx, const JPAKE_STEP1 *received) { + if(!is_legal(received->p1.gx, ctx)) + { + JPAKEerr(JPAKE_F_JPAKE_STEP1_PROCESS, JPAKE_R_G_TO_THE_X3_IS_NOT_LEGAL); + return 0; + } + + if(!is_legal(received->p2.gx, ctx)) + { + JPAKEerr(JPAKE_F_JPAKE_STEP1_PROCESS, JPAKE_R_G_TO_THE_X4_IS_NOT_LEGAL); + return 0; + } + /* verify their ZKP(xc) */ if(!verify_zkp(&received->p1, ctx->p.g, ctx)) {