src/crypto/p224.cc
// IsZero returns 0xffffffff if a == 0 mod p and 0 otherwise.
IsZero returns 0xffffffff if a == 0 mod p and 0 otherwise.
IsZero returns 0xffffffff if a == 0 mod p and 0 otherwise .
uint32_t IsZero(const FieldElement& a) {
  FieldElement minimal;
  memcpy(&minimal, &a, sizeof(minimal));
  Contract(&minimal);
  uint32_t is_zero = 0, is_p = 0;
  for (unsigned i = 0; i < 8; i++) {
    is_zero |= minimal[i];
    is_p |= minimal[i] - kP[i];
  }
  is_zero |= is_zero >> 16;
  is_zero |= is_zero >> 8;
  is_zero |= is_zero >> 4;
  is_zero |= is_zero >> 2;
  is_zero |= is_zero >> 1;
  is_p |= is_p >> 16;
  is_p |= is_p >> 8;
  is_p |= is_p >> 4;
  is_p |= is_p >> 2;
  is_p |= is_p >> 1;
  is_zero &= is_p & 1;
  is_zero = (~is_zero) << 31;
  is_zero = static_cast<int32_t>(is_zero) >> 31;
  return is_zero;
}
uint32_t IsZero ( const FieldElement & a ) { FieldElement minimal ; memcpy ( & minimal , & a , sizeof ( minimal ) ) ; Contract ( & minimal ) ; uint32_t is_zero = 0 , is_p = 0 ; for ( unsigned i = 0 ; i < 8 ; i ++ ) { is_zero |= minimal [ i ] ; is_p |= minimal [ i ] - kP [ i ] ; } is_zero |= is_zero >> 16 ; is_zero |= is_zero >> 8 ; is_zero |= is_zero >> 4 ; is_zero |= is_zero >> 2 ; is_zero |= is_zero >> 1 ; is_p |= is_p >> 16 ; is_p |= is_p >> 8 ; is_p |= is_p >> 4 ; is_p |= is_p >> 2 ; is_p |= is_p >> 1 ; is_zero &= is_p & 1 ; is_zero = ( ~ is_zero ) << 31 ; is_zero = static_cast < int32_t > ( is_zero ) >> 31 ; return is_zero ; }
IsZero returns 0xffffffff if a == 0 mod p and 0 otherwise.
IsZero returns 0xffffffff if a == 0 mod p and 0 otherwise .
// If either is_zero or is_p is 0, then we should return 1. // For is_zero and is_p, the LSB is 0 iff all the bits are zero.