Commit a8a97452 authored by Andy Polyakov's avatar Andy Polyakov
Browse files

ec/ecp_nistz256.c: fix ecp_nistz256_set_from_affine.



ecp_nistz256_set_from_affine is called when application attempts to use
custom generator, i.e. rarely. Even though it was wrong, it didn't
affect point operations, they were just not as fast as expected.

Reviewed-by: default avatarPaul Dale <paul.dale@oracle.com>
Reviewed-by: default avatarRich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/6761)
parent 7ccc506b
Loading
Loading
Loading
Loading
+16 −7
Original line number Diff line number Diff line
@@ -1118,23 +1118,32 @@ static int ecp_nistz256_set_from_affine(EC_POINT *out, const EC_GROUP *group,
                                        const P256_POINT_AFFINE *in,
                                        BN_CTX *ctx)
{
    BIGNUM x, y;
    BN_ULONG d_x[P256_LIMBS], d_y[P256_LIMBS];
    BIGNUM x, y, z;
    int ret = 0;

    memcpy(d_x, in->X, sizeof(d_x));
    x.d = d_x;
    /*
     * |const| qualifier omission is compensated by BN_FLG_STATIC_DATA
     * flag, which effectively means "read-only data".
     */
    x.d = (BN_ULONG *)in->X;
    x.dmax = x.top = P256_LIMBS;
    x.neg = 0;
    x.flags = BN_FLG_STATIC_DATA;

    memcpy(d_y, in->Y, sizeof(d_y));
    y.d = d_y;
    y.d = (BN_ULONG *)in->Y;
    y.dmax = y.top = P256_LIMBS;
    y.neg = 0;
    y.flags = BN_FLG_STATIC_DATA;

    ret = EC_POINT_set_affine_coordinates_GFp(group, out, &x, &y, ctx);
    z.d = (BN_ULONG *)ONE;
    z.dmax = z.top = P256_LIMBS;
    z.neg = 0;
    z.flags = BN_FLG_STATIC_DATA;

    if ((ret = (BN_copy(&out->X, &x) != NULL))
        && (ret = (BN_copy(&out->Y, &y) != NULL))
        && (ret = (BN_copy(&out->Z, &z) != NULL)))
        out->Z_is_one = 1;

    return ret;
}