MCPcopy Create free account
hub / github.com/Tripwire/tripwire-open-source / InverseMod

Method InverseMod

src/cryptlib/integer.cpp:2116–2139  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2114}
2115
2116Integer Integer::InverseMod(const Integer &m) const
2117{
2118 assert(m.NotNegative());
2119
2120 if (IsNegative() || *this>=m)
2121 return (*this%m).InverseMod(m);
2122
2123 if (m.IsEven())
2124 {
2125 if (!m || IsEven())
2126 return Zero(); // no inverse
2127 if (*this == One())
2128 return One();
2129
2130 Integer u = m.InverseMod(*this);
2131 return !u ? Zero() : (m*(*this-u)+1)/(*this);
2132 }
2133
2134 SecBlock<word> T(m.reg.size * 4);
2135 Integer r((word)0, m.reg.size);
2136 unsigned k = AlmostInverse(r.reg, T, reg, reg.size, m.reg, m.reg.size);
2137 DivideByPower2Mod(r.reg, r.reg, k, m.reg, m.reg.size);
2138 return r;
2139}
2140
2141// ********************************************************
2142

Callers 2

MultiplicativeInverseMethod · 0.80

Calls 4

AlmostInverseFunction · 0.85
DivideByPower2ModFunction · 0.85
NotNegativeMethod · 0.80
IsEvenMethod · 0.80

Tested by

no test coverage detected