[email protected] (Niels Möller) writes:

> Let me first explain what I mean when I talk about a "side-channel
> silent" function. That means that if we call the function with operands
> which are of the same size, but otherwise different, the function should
> execute exactly the same sequence of instructions in both cases, and
> access memory in exactly the same pattern.

To give a flavor of what this means, here's some code (totally untested)
I wrote earlier today. It's basic binary point multiplication, but
intended to have running time independent of the exponent bits.

Regards,
/Niels

/* nettle, low-level cryptographics library
 *
 * Copyright (C) 2013 Niels Möller
 *  
 * The nettle library is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or (at your
 * option) any later version.
 * 
 * The nettle library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
 * License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with the nettle library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02111-1301, USA.
 */

/* Development of Nettle's ECC support was funded by Internetfonden. */

#include <assert.h>

#include "ecc.h"

void
cnd_copy (int cnd, mp_limb_t *rp, const mp_limb_t *ap, mp_size_t n)
{
  mp_limb_t mask, keep;
  mp_size_t i;

  mask = -(mp_limb_t) (cnd !=0);
  keep = ~mask;

  for (i = 0; i < n; i++)
    rp[i] = (rp[i] & keep) + (ap[i] & mask);
}

void
ecc_mul_binary (const struct ecc_curve *ecc,
                mp_limb_t *r, const mp_limb_t *np, const mp_limb_t *p)
{
  mp_limb_t tp[9*ecc->size];
  mp_limb_t *rj = tp + 3*ecc->size;
  mp_limb_t *pj = tp + 6*ecc->size;
  int is_zero;

  unsigned i;

  mpn_zero (rj, 3*ecc->size);

  /* Extend p to jacobian coordinates, with z = 1 */
  mpn_copyi (pj, p, 2*ecc->size);
  pj[2*ecc->size] = 1;
  mpn_zero (pj + 2*ecc->size+1, ecc->size - 1);

  for (i = ecc->size, is_zero = 1; i-- > 0; )
    {
      mp_limb_t w = np[i];
      mp_limb_t bit;
      
      for (bit = (mp_limb_t) 1 << (GMP_NUMB_BITS - 1);
           bit > 0;
           bit >>= 1)
        {
          int digit;
          
          ecc_dup_jj (ecc, rj, rj);
          ecc_add_jja (ecc, tp, rj, p);

          digit = (w & bit) > 0;
          /* If is_zero is set, rj is the zero point,
             and ecc_add_jja produced garbage. */
          cnd_copy (is_zero, tp, pj, 3*ecc->size);
          is_zero &= ~digit;
          /* If we had a one-bit, use the sum. */
          cnd_copy (digit, rj, tp, 3*ecc->size);
        }
    }
  ecc_normalize (ecc, r, rj);
}

-- 
Niels Möller. PGP-encrypted email is preferred. Keyid C0B98E26.
Internet email is subject to wholesale government surveillance.
_______________________________________________
nettle-bugs mailing list
[email protected]
http://lists.lysator.liu.se/mailman/listinfo/nettle-bugs

Reply via email to