/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "ecp.h"
#include "mpi.h"
#include "mplogic.h"
#include "mpi-priv.h"

/* Fast modular reduction for p384 = 2^384 - 2^128 - 2^96 + 2^32 - 1.  a can be r.
 * Uses algorithm 2.30 from Hankerson, Menezes, Vanstone. Guide to
 * Elliptic Curve Cryptography. */
static mp_err
ec_GFp_nistp384_mod(const mp_int *a, mp_int *r, const GFMethod *meth)
{
    mp_err res = MP_OKAY;
    int a_bits = mpl_significant_bits(a);
    int i;

    /* m1, m2 are statically-allocated mp_int of exactly the size we need */
    mp_int m[10];

#ifdef ECL_THIRTY_TWO_BIT
    mp_digit s[10][12];
    for (i = 0; i < 10; i++) {
        MP_SIGN(&m[i]) = MP_ZPOS;
        MP_ALLOC(&m[i]) = 12;
        MP_USED(&m[i]) = 12;
        MP_DIGITS(&m[i]) = s[i];
    }
#else
    mp_digit s[10][6];
    for (i = 0; i < 10; i++) {
        MP_SIGN(&m[i]) = MP_ZPOS;
        MP_ALLOC(&m[i]) = 6;
        MP_USED(&m[i]) = 6;
        MP_DIGITS(&m[i]) = s[i];
    }
#endif

#ifdef ECL_THIRTY_TWO_BIT
    /* for polynomials larger than twice the field size or polynomials
     * not using all words, use regular reduction */
    if ((a_bits > 768) || (a_bits <= 736)) {
        MP_CHECKOK(mp_mod(a, &meth->irr, r));
    } else {
        for (i = 0; i < 12; i++) {
            s[0][i] = MP_DIGIT(a, i);
        }
        s[1][0] = 0;
        s[1][1] = 0;
        s[1][2] = 0;
        s[1][3] = 0;
        s[1][4] = MP_DIGIT(a, 21);
        s[1][5] = MP_DIGIT(a, 22);
        s[1][6] = MP_DIGIT(a, 23);
        s[1][7] = 0;
        s[1][8] = 0;
        s[1][9] = 0;
        s[1][10] = 0;
        s[1][11] = 0;
        for (i = 0; i < 12; i++) {
            s[2][i] = MP_DIGIT(a, i + 12);
        }
        s[3][0] = MP_DIGIT(a, 21);
        s[3][1] = MP_DIGIT(a, 22);
        s[3][2] = MP_DIGIT(a, 23);
        for (i = 3; i < 12; i++) {
            s[3][i] = MP_DIGIT(a, i + 9);
        }
        s[4][0] = 0;
        s[4][1] = MP_DIGIT(a, 23);
        s[4][2] = 0;
        s[4][3] = MP_DIGIT(a, 20);
        for (i = 4; i < 12; i++) {
            s[4][i] = MP_DIGIT(a, i + 8);
        }
        s[5][0] = 0;
        s[5][1] = 0;
        s[5][2] = 0;
        s[5][3] = 0;
        s[5][4] = MP_DIGIT(a, 20);
        s[5][5] = MP_DIGIT(a, 21);
        s[5][6] = MP_DIGIT(a, 22);
        s[5][7] = MP_DIGIT(a, 23);
        s[5][8] = 0;
        s[5][9] = 0;
        s[5][10] = 0;
        s[5][11] = 0;
        s[6][0] = MP_DIGIT(a, 20);
        s[6][1] = 0;
        s[6][2] = 0;
        s[6][3] = MP_DIGIT(a, 21);
        s[6][4] = MP_DIGIT(a, 22);
        s[6][5] = MP_DIGIT(a, 23);
        s[6][6] = 0;
        s[6][7] = 0;
        s[6][8] = 0;
        s[6][9] = 0;
        s[6][10] = 0;
        s[6][11] = 0;
        s[7][0] = MP_DIGIT(a, 23);
        for (i = 1; i < 12; i++) {
            s[7][i] = MP_DIGIT(a, i + 11);
        }
        s[8][0] = 0;
        s[8][1] = MP_DIGIT(a, 20);
        s[8][2] = MP_DIGIT(a, 21);
        s[8][3] = MP_DIGIT(a, 22);
        s[8][4] = MP_DIGIT(a, 23);
        s[8][5] = 0;
        s[8][6] = 0;
        s[8][7] = 0;
        s[8][8] = 0;
        s[8][9] = 0;
        s[8][10] = 0;
        s[8][11] = 0;
        s[9][0] = 0;
        s[9][1] = 0;
        s[9][2] = 0;
        s[9][3] = MP_DIGIT(a, 23);
        s[9][4] = MP_DIGIT(a, 23);
        s[9][5] = 0;
        s[9][6] = 0;
        s[9][7] = 0;
        s[9][8] = 0;
        s[9][9] = 0;
        s[9][10] = 0;
        s[9][11] = 0;

        MP_CHECKOK(mp_add(&m[0], &m[1], r));
        MP_CHECKOK(mp_add(r, &m[1], r));
        MP_CHECKOK(mp_add(r, &m[2], r));
        MP_CHECKOK(mp_add(r, &m[3], r));
        MP_CHECKOK(mp_add(r, &m[4], r));
        MP_CHECKOK(mp_add(r, &m[5], r));
        MP_CHECKOK(mp_add(r, &m[6], r));
        MP_CHECKOK(mp_sub(r, &m[7], r));
        MP_CHECKOK(mp_sub(r, &m[8], r));
        MP_CHECKOK(mp_submod(r, &m[9], &meth->irr, r));
        s_mp_clamp(r);
    }
#else
    /* for polynomials larger than twice the field size or polynomials
     * not using all words, use regular reduction */
    if ((a_bits > 768) || (a_bits <= 736)) {
        MP_CHECKOK(mp_mod(a, &meth->irr, r));
    } else {
        for (i = 0; i < 6; i++) {
            s[0][i] = MP_DIGIT(a, i);
        }
        s[1][0] = 0;
        s[1][1] = 0;
        s[1][2] = (MP_DIGIT(a, 10) >> 32) | (MP_DIGIT(a, 11) << 32);
        s[1][3] = MP_DIGIT(a, 11) >> 32;
        s[1][4] = 0;
        s[1][5] = 0;
        for (i = 0; i < 6; i++) {
            s[2][i] = MP_DIGIT(a, i + 6);
        }
        s[3][0] = (MP_DIGIT(a, 10) >> 32) | (MP_DIGIT(a, 11) << 32);
        s[3][1] = (MP_DIGIT(a, 11) >> 32) | (MP_DIGIT(a, 6) << 32);
        for (i = 2; i < 6; i++) {
            s[3][i] = (MP_DIGIT(a, i + 4) >> 32) | (MP_DIGIT(a, i + 5) << 32);
        }
        s[4][0] = (MP_DIGIT(a, 11) >> 32) << 32;
        s[4][1] = MP_DIGIT(a, 10) << 32;
        for (i = 2; i < 6; i++) {
            s[4][i] = MP_DIGIT(a, i + 4);
        }
        s[5][0] = 0;
        s[5][1] = 0;
        s[5][2] = MP_DIGIT(a, 10);
        s[5][3] = MP_DIGIT(a, 11);
        s[5][4] = 0;
        s[5][5] = 0;
        s[6][0] = (MP_DIGIT(a, 10) << 32) >> 32;
        s[6][1] = (MP_DIGIT(a, 10) >> 32) << 32;
        s[6][2] = MP_DIGIT(a, 11);
        s[6][3] = 0;
        s[6][4] = 0;
        s[6][5] = 0;
        s[7][0] = (MP_DIGIT(a, 11) >> 32) | (MP_DIGIT(a, 6) << 32);
        for (i = 1; i < 6; i++) {
            s[7][i] = (MP_DIGIT(a, i + 5) >> 32) | (MP_DIGIT(a, i + 6) << 32);
        }
        s[8][0] = MP_DIGIT(a, 10) << 32;
        s[8][1] = (MP_DIGIT(a, 10) >> 32) | (MP_DIGIT(a, 11) << 32);
        s[8][2] = MP_DIGIT(a, 11) >> 32;
        s[8][3] = 0;
        s[8][4] = 0;
        s[8][5] = 0;
        s[9][0] = 0;
        s[9][1] = (MP_DIGIT(a, 11) >> 32) << 32;
        s[9][2] = MP_DIGIT(a, 11) >> 32;
        s[9][3] = 0;
        s[9][4] = 0;
        s[9][5] = 0;

        MP_CHECKOK(mp_add(&m[0], &m[1], r));
        MP_CHECKOK(mp_add(r, &m[1], r));
        MP_CHECKOK(mp_add(r, &m[2], r));
        MP_CHECKOK(mp_add(r, &m[3], r));
        MP_CHECKOK(mp_add(r, &m[4], r));
        MP_CHECKOK(mp_add(r, &m[5], r));
        MP_CHECKOK(mp_add(r, &m[6], r));
        MP_CHECKOK(mp_sub(r, &m[7], r));
        MP_CHECKOK(mp_sub(r, &m[8], r));
        MP_CHECKOK(mp_submod(r, &m[9], &meth->irr, r));
        s_mp_clamp(r);
    }
#endif

CLEANUP:
    return res;
}

/* Compute the square of polynomial a, reduce modulo p384. Store the
 * result in r.  r could be a.  Uses optimized modular reduction for p384.
 */
static mp_err
ec_GFp_nistp384_sqr(const mp_int *a, mp_int *r, const GFMethod *meth)
{
    mp_err res = MP_OKAY;

    MP_CHECKOK(mp_sqr(a, r));
    MP_CHECKOK(ec_GFp_nistp384_mod(r, r, meth));
CLEANUP:
    return res;
}

/* Compute the product of two polynomials a and b, reduce modulo p384.
 * Store the result in r.  r could be a or b; a could be b.  Uses
 * optimized modular reduction for p384. */
static mp_err
ec_GFp_nistp384_mul(const mp_int *a, const mp_int *b, mp_int *r,
                    const GFMethod *meth)
{
    mp_err res = MP_OKAY;

    MP_CHECKOK(mp_mul(a, b, r));
    MP_CHECKOK(ec_GFp_nistp384_mod(r, r, meth));
CLEANUP:
    return res;
}

/* Wire in fast field arithmetic and precomputation of base point for
 * named curves. */
mp_err
ec_group_set_gfp384(ECGroup *group, ECCurveName name)
{
    if (name == ECCurve_NIST_P384) {
        group->meth->field_mod = &ec_GFp_nistp384_mod;
        group->meth->field_mul = &ec_GFp_nistp384_mul;
        group->meth->field_sqr = &ec_GFp_nistp384_sqr;
    }
    return MP_OKAY;
}
