Shadowrun: Awakened 29 September 2011 - Build 871
BigMontgomery.hpp
Go to the documentation of this file.
00001 /*
00002     Copyright (c) 2009-2010 Christopher A. Taylor.  All rights reserved.
00003 
00004     Redistribution and use in source and binary forms, with or without
00005     modification, are permitted provided that the following conditions are met:
00006 
00007     * Redistributions of source code must retain the above copyright notice,
00008       this list of conditions and the following disclaimer.
00009     * Redistributions in binary form must reproduce the above copyright notice,
00010       this list of conditions and the following disclaimer in the documentation
00011       and/or other materials provided with the distribution.
00012     * Neither the name of LibCat nor the names of its contributors may be used
00013       to endorse or promote products derived from this software without
00014       specific prior written permission.
00015 
00016     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00017     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00018     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00019     ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
00020     LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00021     CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00022     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00023     INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00024     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00025     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00026     POSSIBILITY OF SUCH DAMAGE.
00027 */
00028 
00029 /*
00030     Several algorithms based on ideas from the "Handbook of Applied Cryptography"
00031     http://www.cacr.math.uwaterloo.ca/hac/
00032 */
00033 
00034 #ifndef CAT_BIG_MONTGOMERY_HPP
00035 #define CAT_BIG_MONTGOMERY_HPP
00036 
00037 #include <cat/math/BigRTL.hpp>
00038 #include <cat/rand/IRandom.hpp>
00039 
00040 namespace cat {
00041 
00042 
00043 // Performs fast modular arithmetic in the Montgomery Residue Number System
00044 class BigMontgomery : public BigRTL
00045 {
00046     static const int MON_OVERHEAD = 3 + 4;
00047     int mon_regs;
00048 
00049 protected:
00050     Leg *TempProduct;
00051     Leg *TempProductHi;
00052     Leg *CachedModulus;
00053     Leg mod_inv;
00054 
00055 public:
00056     BigMontgomery(int regs, int bits);
00057 
00058     // Must call SetModulus() before using this object
00059     void SetModulus(const Leg *mod);
00060 
00061 public:
00062     const Leg *GetModulus() { return CachedModulus; }
00063     void CopyModulus(Leg *out);
00064 
00065 public:
00066     // Convert value in register into RNS, stored in out
00067     void MonInput(const Leg *in, Leg *out);
00068 
00069     // Convert value in register from RNS, stored in out
00070     void MonOutput(const Leg *in, Leg *out);
00071 
00072     // Note: This will clobber the input product!
00073     // Reduce a double-register product to a single register in the RNS
00074     void MonReduceProduct(Leg *inout_product, Leg *out);
00075 
00076 public:
00077     // Inputs and outputs must be in the Montgomery RNS
00078     void MonAdd(const Leg *in_a, const Leg *in_b, Leg *out);
00079     void MonSubtract(const Leg *in_a, const Leg *in_b, Leg *out);
00080     void MonNegate(const Leg *in, Leg *out);
00081     void MonDouble(const Leg *in, Leg *out);
00082 
00083 public:
00084     // Inputs and outputs must be in the Montgomery RNS
00085     void MonMultiply(const Leg *in_a, const Leg *in_b, Leg *out);
00086     void MonSquare(const Leg *in, Leg *out);
00087 
00088 public:
00089     // Base must be in the Montgomery RNS.  in_base != out
00090     void MonExpMod(const Leg *in_base, const Leg *in_exp, Leg *out);
00091 
00092 public:
00093     // Input is NOT in the RNS (don't call MonInput)
00094     // Probably a prime, certainty = 4^-trials.  20: %99.9999999999 certainty
00095     bool IsRabinMillerPrime(IRandom *prng, const Leg *n, int trials = 20);
00096 };
00097 
00098 
00099 } // namespace cat
00100 
00101 #endif // CAT_BIG_MONTGOMERY_HPP

Copyright © 2007-2010 by The Shadowrun: Awakened Team. This work is licensed under the GNU Lesser General Public License 3.

GNU Lesser General Public License 3 Sourceforge.net