38 if (Jacobi(in, m_n)==-1)
50 pass = pass && Jacobi(m_r, m_n) == -1 && Jacobi(m_s, m_n) == -1;
56 return GetValueHelper(
this, name, valueType, pValue).Assignable()
57 CRYPTOPP_GET_FUNCTION_ENTRY(Modulus)
58 CRYPTOPP_GET_FUNCTION_ENTRY(QuadraticResidueModPrime1)
59 CRYPTOPP_GET_FUNCTION_ENTRY(QuadraticResidueModPrime2)
65 AssignFromHelper(
this, source)
66 CRYPTOPP_SET_FUNCTION_ENTRY(Modulus)
67 CRYPTOPP_SET_FUNCTION_ENTRY(QuadraticResidueModPrime1)
68 CRYPTOPP_SET_FUNCTION_ENTRY(QuadraticResidueModPrime2)
78 int modulusSize = 2048;
82 throw InvalidArgument(
"InvertibleRabinFunction: specified modulus size is too small");
85 bool rFound=
false, sFound=
false;
89 (
"EquivalentTo", 3)(
"Mod", 4);
90 m_p.GenerateRandom(rng, primeParam);
91 m_q.GenerateRandom(rng, primeParam);
93 while (!(rFound && sFound))
95 int jp = Jacobi(t, m_p);
96 int jq = Jacobi(t, m_q);
98 if (!rFound && jp==1 && jq==-1)
104 if (!sFound && jp==-1 && jq==1)
153 int jp = Jacobi(cp, m_p);
154 int jq = Jacobi(cq, m_q);
158 cp = cp*EuclideanMultiplicativeInverse(m_r, m_p)%m_p;
159 cq = cq*EuclideanMultiplicativeInverse(m_r, m_q)%m_q;
164 cp = cp*EuclideanMultiplicativeInverse(m_s, m_p)%m_p;
165 cq = cq*EuclideanMultiplicativeInverse(m_s, m_q)%m_q;
168 cp = ModularSquareRoot(cp, m_p);
169 cq = ModularSquareRoot(cq, m_q);
174 Integer out = CRT(cq, m_q, cp, m_p, m_u);
176 out = modn.
Divide(out, r);
178 if ((jq==-1 && out.
IsEven()) || (jq==1 && out.
IsOdd()))
187 pass = pass && m_p >
Integer::One() && m_p%4 == 3 && m_p < m_n;
188 pass = pass && m_q >
Integer::One() && m_q%4 == 3 && m_q < m_n;
192 pass = pass && m_p * m_q == m_n;
193 pass = pass && m_u * m_q % m_p == 1;
194 pass = pass && Jacobi(m_r, m_p) == 1;
195 pass = pass && Jacobi(m_r, m_q) == -1;
196 pass = pass && Jacobi(m_s, m_p) == -1;
197 pass = pass && Jacobi(m_s, m_q) == 1;
206 return GetValueHelper<RabinFunction>(
this, name, valueType, pValue).Assignable()
207 CRYPTOPP_GET_FUNCTION_ENTRY(Prime1)
208 CRYPTOPP_GET_FUNCTION_ENTRY(Prime2)
209 CRYPTOPP_GET_FUNCTION_ENTRY(MultiplicativeInverseOfPrime2ModPrime1)
215 AssignFromHelper<RabinFunction>(
this, source)
216 CRYPTOPP_SET_FUNCTION_ENTRY(Prime1)
217 CRYPTOPP_SET_FUNCTION_ENTRY(Prime2)
218 CRYPTOPP_SET_FUNCTION_ENTRY(MultiplicativeInverseOfPrime2ModPrime1)