Ejemplo n.º 1
0
Archivo: bn.c Proyecto: reaperhulk/ring
const BIGNUM *BN_value_one(void) {
  static const BN_ULONG kOneLimbs[1] = { 1 };
  STATIC_BIGNUM_DIAGNOSTIC_PUSH
  static const BIGNUM kOne = STATIC_BIGNUM(kOneLimbs);
  STATIC_BIGNUM_DIAGNOSTIC_POP

  return &kOne;
}
Ejemplo n.º 2
0
int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx) {
  int ret = 0;
  BIGNUM *Ri, *R;
  BIGNUM tmod;
  BN_ULONG buf[2];

  if (BN_is_zero(mod)) {
    OPENSSL_PUT_ERROR(BN, BN_R_DIV_BY_ZERO);
    return 0;
  }

  BN_CTX_start(ctx);
  Ri = BN_CTX_get(ctx);
  if (Ri == NULL) {
    goto err;
  }
  R = &mont->RR; /* grab RR as a temp */
  if (!BN_copy(&mont->N, mod)) {
    goto err; /* Set N */
  }
  if (BN_get_flags(mod, BN_FLG_CONSTTIME)) {
    BN_set_flags(&mont->N, BN_FLG_CONSTTIME);
  }

  mont->N.neg = 0;

  BN_init(&tmod);
  tmod.d = buf;
  tmod.dmax = 2;
  tmod.neg = 0;

  BN_zero(R);
  if (!BN_set_bit(R, BN_MONT_CTX_N0_LIMBS * BN_BITS2)) {
    goto err;
  }

  tmod.top = 0;
  buf[0] = mod->d[0];
  if (buf[0] != 0) {
    tmod.top = 1;
  }

  buf[1] = 0;
  if (BN_MONT_CTX_N0_LIMBS == 2 && mod->top > 1 && mod->d[1] != 0) {
    buf[1] = mod->d[1];
    tmod.top = 2;
  }

  if (BN_mod_inverse(Ri, R, &tmod, ctx) == NULL) {
    goto err;
  }
  if (!BN_lshift(Ri, Ri, BN_MONT_CTX_N0_LIMBS * BN_BITS2)) {
    goto err; /* R*Ri */
  }
  const BIGNUM *Ri_dividend;
  if (!BN_is_zero(Ri)) {
    if (!BN_usub(Ri, Ri, BN_value_one())) {
      goto err;
    }
    Ri_dividend = Ri;
  } else {
    /* Ri == 0 so Ri - 1 == -1. -1 % tmod == 0xff..ff. */
    static const BN_ULONG kMinusOneLimbs[BN_MONT_CTX_N0_LIMBS] = {
      BN_MASK2,
#if BN_MONT_CTX_N0_LIMBS == 2
      BN_MASK2
#endif
    };
    STATIC_BIGNUM_DIAGNOSTIC_PUSH
    static const BIGNUM kMinusOne = STATIC_BIGNUM(kMinusOneLimbs);
    STATIC_BIGNUM_DIAGNOSTIC_POP
    Ri_dividend = &kMinusOne;
  }

  if (!BN_div(Ri, NULL, Ri_dividend, &tmod, ctx)) {
    goto err;
  }

  mont->n0[0] = 0;
  if (Ri->top > 0) {
    mont->n0[0] = Ri->d[0];
  }
  mont->n0[1] = 0;
  if (BN_MONT_CTX_N0_LIMBS == 2 && Ri->top > 1) {
    mont->n0[1] = Ri->d[1];
  }

  /* RR = (2^ri)^2 == 2^(ri*2) == 1 << (ri*2), which has its (ri*2)th bit set. */
  int ri = (BN_num_bits(mod) + (BN_BITS2 - 1)) / BN_BITS2 * BN_BITS2;
  BN_zero(&(mont->RR));
  if (!BN_set_bit(&(mont->RR), ri * 2)) {
    goto err;
  }
  if (!BN_mod(&(mont->RR), &(mont->RR), &(mont->N), ctx)) {
    goto err;
  }

  ret = 1;

err:
  BN_CTX_end(ctx);
  return ret;
}
Ejemplo n.º 3
0
    TOBN(0xBDD4798E, 0x7CF180C3), TOBN(0x495BE32C, 0xE6969D3D)};

static const BN_ULONG bn_two_data[] = {2};

#define STATIC_BIGNUM(x)                                     \
  {                                                          \
    (BN_ULONG *) x, sizeof(x) / sizeof(BN_ULONG),            \
        sizeof(x) / sizeof(BN_ULONG), 0, BN_FLG_STATIC_DATA \
  }

struct standard_parameters {
  BIGNUM p, q, g;
};

static const struct standard_parameters dh1024_160 = {
  STATIC_BIGNUM(dh1024_160_p),
  STATIC_BIGNUM(dh1024_160_q),
  STATIC_BIGNUM(dh1024_160_g),
};

static const struct standard_parameters dh2048_224 = {
  STATIC_BIGNUM(dh2048_224_p),
  STATIC_BIGNUM(dh2048_224_q),
  STATIC_BIGNUM(dh2048_224_g),
};

static const struct standard_parameters dh2048_256 = {
  STATIC_BIGNUM(dh2048_256_p),
  STATIC_BIGNUM(dh2048_256_q),
  STATIC_BIGNUM(dh2048_256_g),
};
Ejemplo n.º 4
0
const BIGNUM *BN_value_one(void) {
  static const BN_ULONG kOneLimbs[1] = { 1 };
  static const BIGNUM kOne = STATIC_BIGNUM(kOneLimbs);

  return &kOne;
}