jdk/src/jdk.crypto.ec/share/native/libsunec/impl/ec2.h
changeset 25859 3317bb8137f4
parent 9774 50a2b28ca54c
child 45993 076a6b39a5a9
equal deleted inserted replaced
25858:836adbf7a2cd 25859:3317bb8137f4
       
     1 /*
       
     2  * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
       
     3  * Use is subject to license terms.
       
     4  *
       
     5  * This library is free software; you can redistribute it and/or
       
     6  * modify it under the terms of the GNU Lesser General Public
       
     7  * License as published by the Free Software Foundation; either
       
     8  * version 2.1 of the License, or (at your option) any later version.
       
     9  *
       
    10  * This library is distributed in the hope that it will be useful,
       
    11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       
    13  * Lesser General Public License for more details.
       
    14  *
       
    15  * You should have received a copy of the GNU Lesser General Public License
       
    16  * along with this library; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * questions.
       
    22  */
       
    23 
       
    24 /* *********************************************************************
       
    25  *
       
    26  * The Original Code is the elliptic curve math library for binary polynomial field curves.
       
    27  *
       
    28  * The Initial Developer of the Original Code is
       
    29  * Sun Microsystems, Inc.
       
    30  * Portions created by the Initial Developer are Copyright (C) 2003
       
    31  * the Initial Developer. All Rights Reserved.
       
    32  *
       
    33  * Contributor(s):
       
    34  *   Douglas Stebila <douglas@stebila.ca>, Sun Microsystems Laboratories
       
    35  *
       
    36  *********************************************************************** */
       
    37 
       
    38 #ifndef _EC2_H
       
    39 #define _EC2_H
       
    40 
       
    41 #include "ecl-priv.h"
       
    42 
       
    43 /* Checks if point P(px, py) is at infinity.  Uses affine coordinates. */
       
    44 mp_err ec_GF2m_pt_is_inf_aff(const mp_int *px, const mp_int *py);
       
    45 
       
    46 /* Sets P(px, py) to be the point at infinity.  Uses affine coordinates. */
       
    47 mp_err ec_GF2m_pt_set_inf_aff(mp_int *px, mp_int *py);
       
    48 
       
    49 /* Computes R = P + Q where R is (rx, ry), P is (px, py) and Q is (qx,
       
    50  * qy). Uses affine coordinates. */
       
    51 mp_err ec_GF2m_pt_add_aff(const mp_int *px, const mp_int *py,
       
    52                                                   const mp_int *qx, const mp_int *qy, mp_int *rx,
       
    53                                                   mp_int *ry, const ECGroup *group);
       
    54 
       
    55 /* Computes R = P - Q.  Uses affine coordinates. */
       
    56 mp_err ec_GF2m_pt_sub_aff(const mp_int *px, const mp_int *py,
       
    57                                                   const mp_int *qx, const mp_int *qy, mp_int *rx,
       
    58                                                   mp_int *ry, const ECGroup *group);
       
    59 
       
    60 /* Computes R = 2P.  Uses affine coordinates. */
       
    61 mp_err ec_GF2m_pt_dbl_aff(const mp_int *px, const mp_int *py, mp_int *rx,
       
    62                                                   mp_int *ry, const ECGroup *group);
       
    63 
       
    64 /* Validates a point on a GF2m curve. */
       
    65 mp_err ec_GF2m_validate_point(const mp_int *px, const mp_int *py, const ECGroup *group);
       
    66 
       
    67 /* by default, this routine is unused and thus doesn't need to be compiled */
       
    68 #ifdef ECL_ENABLE_GF2M_PT_MUL_AFF
       
    69 /* Computes R = nP where R is (rx, ry) and P is (px, py). The parameters
       
    70  * a, b and p are the elliptic curve coefficients and the irreducible that
       
    71  * determines the field GF2m.  Uses affine coordinates. */
       
    72 mp_err ec_GF2m_pt_mul_aff(const mp_int *n, const mp_int *px,
       
    73                                                   const mp_int *py, mp_int *rx, mp_int *ry,
       
    74                                                   const ECGroup *group);
       
    75 #endif
       
    76 
       
    77 /* Computes R = nP where R is (rx, ry) and P is (px, py). The parameters
       
    78  * a, b and p are the elliptic curve coefficients and the irreducible that
       
    79  * determines the field GF2m.  Uses Montgomery projective coordinates. */
       
    80 mp_err ec_GF2m_pt_mul_mont(const mp_int *n, const mp_int *px,
       
    81                                                    const mp_int *py, mp_int *rx, mp_int *ry,
       
    82                                                    const ECGroup *group);
       
    83 
       
    84 #ifdef ECL_ENABLE_GF2M_PROJ
       
    85 /* Converts a point P(px, py) from affine coordinates to projective
       
    86  * coordinates R(rx, ry, rz). */
       
    87 mp_err ec_GF2m_pt_aff2proj(const mp_int *px, const mp_int *py, mp_int *rx,
       
    88                                                    mp_int *ry, mp_int *rz, const ECGroup *group);
       
    89 
       
    90 /* Converts a point P(px, py, pz) from projective coordinates to affine
       
    91  * coordinates R(rx, ry). */
       
    92 mp_err ec_GF2m_pt_proj2aff(const mp_int *px, const mp_int *py,
       
    93                                                    const mp_int *pz, mp_int *rx, mp_int *ry,
       
    94                                                    const ECGroup *group);
       
    95 
       
    96 /* Checks if point P(px, py, pz) is at infinity.  Uses projective
       
    97  * coordinates. */
       
    98 mp_err ec_GF2m_pt_is_inf_proj(const mp_int *px, const mp_int *py,
       
    99                                                           const mp_int *pz);
       
   100 
       
   101 /* Sets P(px, py, pz) to be the point at infinity.  Uses projective
       
   102  * coordinates. */
       
   103 mp_err ec_GF2m_pt_set_inf_proj(mp_int *px, mp_int *py, mp_int *pz);
       
   104 
       
   105 /* Computes R = P + Q where R is (rx, ry, rz), P is (px, py, pz) and Q is
       
   106  * (qx, qy, qz).  Uses projective coordinates. */
       
   107 mp_err ec_GF2m_pt_add_proj(const mp_int *px, const mp_int *py,
       
   108                                                    const mp_int *pz, const mp_int *qx,
       
   109                                                    const mp_int *qy, mp_int *rx, mp_int *ry,
       
   110                                                    mp_int *rz, const ECGroup *group);
       
   111 
       
   112 /* Computes R = 2P.  Uses projective coordinates. */
       
   113 mp_err ec_GF2m_pt_dbl_proj(const mp_int *px, const mp_int *py,
       
   114                                                    const mp_int *pz, mp_int *rx, mp_int *ry,
       
   115                                                    mp_int *rz, const ECGroup *group);
       
   116 
       
   117 /* Computes R = nP where R is (rx, ry) and P is (px, py). The parameters
       
   118  * a, b and p are the elliptic curve coefficients and the prime that
       
   119  * determines the field GF2m.  Uses projective coordinates. */
       
   120 mp_err ec_GF2m_pt_mul_proj(const mp_int *n, const mp_int *px,
       
   121                                                    const mp_int *py, mp_int *rx, mp_int *ry,
       
   122                                                    const ECGroup *group);
       
   123 #endif
       
   124 
       
   125 #endif /* _EC2_H */