The BigNumber Library is a custom implementation designed to handle large integer arithmetic operations. It provides support for operations such as modular addition, modular multiplication, and modular inversion, which are essential for cryptographic applications and public-key cryptosystems.
- Representation of large numbers using an array of
uint32_t
digits. - Comparison Operators
- Arithmetic Operators
- Modular arithmetic operations:
- Modular Addition
- Modular Multiplication
- Modular Inversion
- Basic testing using Google Test (gtest).
- CMake (version 3.10 or higher)
- C++ compiler supporting C++17
- Google Test (gtest) library
-
Clone the Repository:
git clone https://github.com/CharinduThisara/BigNumLibCPP.git cd BigNumberLibrary
-
Install Google Test:
If Google Test is not installed on your system, you can install it using a package manager (for Linux users):
sudo apt-get install libgtest-dev sudo apt-get install cmake
Alternatively, you can include Google Test as a submodule in your project.
-
Build the Project:
mkdir build cd build cmake .. make
-
Run Tests:
./BigNumberTests
After building the project, you will have the BigNumberLibrary
and BigNumberTests
executable. You can use the library in your own projects by linking against it.
To run the tests:
-
Navigate to the build directory:
cd build
-
Run the test executable:
./BigNumberTests
This will run all the tests defined using Google Test in
tests/BigNumberTests.cpp
.
BigNumberLibrary/
│
├── CMakeLists.txt # CMake build configuration
├── include/
│ └── BigNumber.h # Header file for BigNumber class
├── src/
│ └── BigNumber.cpp # Source file for BigNumber class implementation
├── tests/
│ └── BigNumberTests.cpp # Test cases for BigNumber class
└── README.md # Project README file
┌─[charindu-thisara@charindu-thisara-GF75-Thin-9SC] - [~/CodeBases/Crypto/BigNumLibCPP] - [Fri Sep 06, 17:50]
└─[$]> cd build
┌─[charindu-thisara@charindu-thisara-GF75-Thin-9SC] - [~/CodeBases/Crypto/BigNumLibCPP/build] - [Fri Sep 06, 17:50]
└─[$]> cmake ..
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: /home/charindu-thisara/CodeBases/Crypto/BigNumLibCPP/build
┌─[charindu-thisara@charindu-thisara-GF75-Thin-9SC] - [~/CodeBases/Crypto/BigNumLibCPP/build] - [Fri Sep 06, 17:48]
└─[$]> make
[ 50%] Built target BigNumberLibrary
[ 75%] Building CXX object CMakeFiles/BigNumberTests.dir/tests/BigNumberTests.cpp.o
[100%] Linking CXX executable BigNumberTests
[100%] Built target BigNumberTests
┌─[charindu-thisara@charindu-thisara-GF75-Thin-9SC] - [~/CodeBases/Crypto/BigNumLibCPP/build] - [Fri Sep 06, 17:49]
└─[$]> ./BigNumberTests
Running main() from ./googletest/src/gtest_main.cc
[==========] Running 20 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 20 tests from BigNumberTest
[ RUN ] BigNumberTest.AdditionWithZero
num 1 : 0x123456789ABCDEF987654321ABCDEF46FF78789ABCDEF987654321ABCDEF46FF783636EEFAB7866BCDEF46FF783636EEFAB786636789ABCDEF987654789ABCDEF987654321ABCDEF46FF783636EEFAB786636EEFAB7866F46FF783636EEFAB7866BEEDEF46FF783636EEFDEF46FF783636EEF
num 2 : 0x0
modulus(bits): 1024
Expected: 0x123456789ABCDEF987654321ABCDEF46FF78789ABCDEF987654321ABCDEF46FF783636EEFAB7866BCDEF46FF783636EEFAB786636789ABCDEF987654789ABCDEF987654321ABCDEF46FF783636EEFAB786636EEFAB7866F46FF783636EEFAB7866BEEDEF46FF783636EEFDEF46FF783636EEF
Result : 0x123456789ABCDEF987654321ABCDEF46FF78789ABCDEF987654321ABCDEF46FF783636EEFAB7866BCDEF46FF783636EEFAB786636789ABCDEF987654789ABCDEF987654321ABCDEF46FF783636EEFAB786636EEFAB7866F46FF783636EEFAB7866BEEDEF46FF783636EEFDEF46FF783636EEF
[ OK ] BigNumberTest.AdditionWithZero (0 ms)
[ RUN ] BigNumberTest.AdditionSmall
num 1 : 0x1AEF2345
num 2 : 0x1ABCDEFEE
modulus(bits): 32
Expected: 0xC6BD1333
Result : 0xC6BD1333
[ OK ] BigNumberTest.AdditionSmall (0 ms)
[ RUN ] BigNumberTest.AdditionLarge512
num 1 : 0x123456789ABCDEF987654321ABCDEF46FF783636EEFAB7866BEEDEF46FF783636EEFDEF46FF783636EEF
num 2 : 0x987654321ABCDEF23456789ABCDEF23456789ABCDEF6789ABCDEF6789ABCDEF6789ABCDEF6789ABCDEF423456789ABCDEF6789ABCDEF6789ABCDEF6789ABCDEF6789ABCDEF4
modulus(bits): 512
Expected: 0xCDEF23456789ABCDEF23456789ABCDEF6789ABCDEF679BE0246802468AC776CCCCCD79BD317B55F0D0F3CDF1302128CDD56D0AB46259E78A9BD366701E204DE3
Result : 0xCDEF23456789ABCDEF23456789ABCDEF6789ABCDEF679BE0246802468AC776CCCCCD79BD317B55F0D0F3CDF1302128CDD56D0AB46259E78A9BD366701E204DE3
[ OK ] BigNumberTest.AdditionLarge512 (0 ms)
[ RUN ] BigNumberTest.AdditionLarge1024
num 1 : 0x123456789ABCDEF987654321ABCDEF46FF783636EEFAB7866BEEDEF46FF783636EEFDEF46FF783636EEF123456789ABCDEF9876543123456789ABCDEF9876543F783636EEF123456789ABCD
num 2 : 0x987654321ABCDEF23456789ABCDEF23456789ABCDABCDEF6789ABCDEF6789ABCDEF6789ABCDEF46FF783636EEFDEF46FF783636EEF123456789ABCDEF986BEEDEF46FF78999999999987654321ABCDEF23456789ABCDEF23456789ABCDABCDEF6789ABCDEF6789ABCDEF6789ABCDEF46FF783636EEFDEF46FF783636EEF123456789ABCDEF986BEEDEF46FF78999999999
modulus(bits): 1024
Expected: 0x789ABCDABCDEF6789ABCDEF6789ABCDEF6789ABCDEF46FF783636EEFDEF46FF783636EEF123456789ABCDEF986BEEDEF46FF78999ABCDF011111111144444355602468A03DE6A6A8D6795746128CDD56D0AB46259E78A9BD366701E204DE3822BD9DC09ACBDEDF75CC675A3458ACF13579444443D7E42515E3611ACF01234566
Result : 0x789ABCDABCDEF6789ABCDEF6789ABCDEF6789ABCDEF46FF783636EEFDEF46FF783636EEF123456789ABCDEF986BEEDEF46FF78999ABCDF011111111144444355602468A03DE6A6A8D6795746128CDD56D0AB46259E78A9BD366701E204DE3822BD9DC09ACBDEDF75CC675A3458ACF13579444443D7E42515E3611ACF01234566
[ OK ] BigNumberTest.AdditionLarge1024 (0 ms)
[ RUN ] BigNumberTest.AdditionWithNegatives512
num 1 : -0x123456789AABCDEF23456789ABCDEF23456789ABCDEF6789ABCDEF987654321ABCDEF46FF783636EEFAB7866BEEDEF46FF78363ABCDEF23456789ABCDEF23456789ABCDEF6789AABCDEF23456789ABCDEF23456789ABCDEF6789A6EEFDEF46FF783636EEF
num 2 : 0x987654321ABCDEF23456789ABCDEF2ABCDEF23456789ABCDEF23456789ABCDEF6789A3456789AABCDEF23456789ABCDEF23456789ABF6789ABCDEF6789ABCDEF4
modulus(bits): 512
test: -0x123456789AABCDEF23456789ABCDEF23456789ABCDEF6789ABCDEF987654321ABCDEF46F5F0D0F3CD4EE99748A9776AC4299438EEEEFCEEEEEEEEEEEEFCEEEEEEEEEEEEF8EEEF76666657888889777777688888897777776CCCA3F6552215797EE8A68FFB
Expected: 0xF2F0C32B11668B75688953BD66BC711110311111111111103111111111111071110899999A87777768888889777777688888893335C09AADDEA868117597005
Result : 0xF2F0C32B11668B75688953BD66BC711110311111111111103111111111111071110899999A87777768888889777777688888893335C09AADDEA868117597005
[ OK ] BigNumberTest.AdditionWithNegatives512 (0 ms)
[ RUN ] BigNumberTest.AdditionWithNegatives1024
num 1 : -0x123456789ABCDEF987654321ABCDEF46FF783636EEFAB7866BEEDEF46FF783636EEFDEF46FF783636EEF23456789ABCDEF987654321ABCDEF46FF783636EEFAB7866BEE23456789ABCDEF987654321ABCDEF46FF783636EEFAB7866BEE23456789ABCDEF987654321ABCDEF46FF783636EEFAB7866BEE23456789ABCDEF987654321ABCDEF46FF783636EEFAB7866BEE
num 2 : 0x987654321ABCDEF23456789ABCDEF23456789ABCDEF6789ABCDEF6789ABCDEF6789ABCDEF6789ABCDEF4DEF6789ABCDEF6789ABCDEF6789ABCDEFDEF6789ABCDEF6789ABCDEF6789ABCDEFDEF6789ABCDEF6789ABCDEF6789ABCDEFDEF6789ABCDEF6789ABCDEF6789ABCDEFDEF6789ABCDEF6789ABCDEF6789ABCDEFDEF6789ABCDEF6789ABCDEF6789ABCDEF
modulus(bits): 1024
test: -0x123455E02468ACDECA8650ED5555548A208601E0765FFAA77576443791010AC8B210E87BD53AA46CF654666672AAB55554DB975DB97FFFFFFDF75CC684710043EEBAF0F2CCCCCCCCCD776FDB975342B555548A2081BD9C321BC10DD13144477822222221A90ECA864CCD776AC4299384787710BB87C869999999A444443CA86753BA2222215797EE8A68FF932DDA9DFF
Expected: 0xDF79FE1F89A005588A89BBC86EFEF5374DEF17842AC55B9309AB99998D554AAAAB2468A2468000000208A3397B8EFFBC11450F0D333333333288902468ACBD4AAAAB75DF7E4263CDE43EF22ECEBBB887DDDDDDDE56F13579B33288953BD66C7B8788EF447837966666665BBBBBC35798AC45DDDDDEA868117597006CD2256201
Result : 0xDF79FE1F89A005588A89BBC86EFEF5374DEF17842AC55B9309AB99998D554AAAAB2468A2468000000208A3397B8EFFBC11450F0D333333333288902468ACBD4AAAAB75DF7E4263CDE43EF22ECEBBB887DDDDDDDE56F13579B33288953BD66C7B8788EF447837966666665BBBBBC35798AC45DDDDDEA868117597006CD2256201
[ OK ] BigNumberTest.AdditionWithNegatives1024 (0 ms)
[ RUN ] BigNumberTest.MultiplicationWithZero
num 1 : 0x123456789ABCDEF987654321ABCDEF46FF78323252FFABFF4242478BEEDEF46FF783636EEFDEF46FF783EEFE7
num 2 : 0x0
modulus(bits): 1024
Expected: 0x0
Result : 0x0
[ OK ] BigNumberTest.MultiplicationWithZero (0 ms)
[ RUN ] BigNumberTest.MultiplicationByOne
num 1 : 0xAAAAAB579BDEBB2879294EFACBBBBBBBC68ACE17B55F0D0F3CDF1302128CDD56D0AB46259E78A9BD366701E204DE3
num 2 : 0x1
modulus(bits): 1024
Expected: 0xAAAAAB579BDEBB2879294EFACBBBBBBBC68ACE17B55F0D0F3CDF1302128CDD56D0AB46259E78A9BD366701E204DE3
Result : 0xAAAAAB579BDEBB2879294EFACBBBBBBBC68ACE17B55F0D0F3CDF1302128CDD56D0AB46259E78A9BD366701E204DE3
[ OK ] BigNumberTest.MultiplicationByOne (0 ms)
[ RUN ] BigNumberTest.MultiplicationSmall
num 1 : 0x123456789ABCDEF
num 2 : 0x987654321ABCDEF
modulus(bits): 32
Expected: 0x78F2A521
Result : 0x78F2A521
[ OK ] BigNumberTest.MultiplicationSmall (0 ms)
[ RUN ] BigNumberTest.Multiplication512
num 1 : 0x123456789ABCDEF987654321ABCDEF46FF78323252FFABFF4242478BEEDEF46FF783636EEFDEF46FF783EEFE7
num 2 : 0x987654321ABCDEF23456789ABCDEF23456789ABCDEF6789AB56336CDEF6789ABCDEF6789ABCDEF6789ABCDEF4
modulus(bits): 512
Expected: 0x60D3EB45616AE7F08357FD46B8F5810400EA398EF921EF64E80C26F4829E60F7E0C50602A32E315295E2A75A6DC9E7F6F94B2A7C8819E571DFEDCE9653AAFA2C
Result : 0x60D3EB45616AE7F08357FD46B8F5810400EA398EF921EF64E80C26F4829E60F7E0C50602A32E315295E2A75A6DC9E7F6F94B2A7C8819E571DFEDCE9653AAFA2C
[ OK ] BigNumberTest.Multiplication512 (0 ms)
[ RUN ] BigNumberTest.Multiplication1024
num 1 : 0x987654321ABCDEF23456789ABCDEF23456789ABCDEF6789ABCDEF6789ABCDEF6789ABCDEF6789ABCDEF4DEF6789ABCDEF6789ABCDEF6789ABCDEFDEF6789ABCDEF6789ABCDEF6789ABCDEFDEF6789ABCDEF6789ABCDEF6789ABCDEFDEF6789ABCDEF6789ABCDEF6789ABCDEFDEF6789ABCDEF6789ABCDEF6789ABCDEFDEF6789ABCDEF6789ABCDEF6789ABCDEF
num 2 : 0x987654321ABCDEF23456789ABCDEF23456789ABCDEF6789AB56336CDEF6789ABCDEF6789ABCDEF6789ABCDEF4
modulus(bits): 1024
Expected: 0x5FDD94F14969459242CA9358F3A2BE9364660040F158696FBEC6C10AE85C5FC17734282C86A06905190340E7C245C5FC17734282C86A06905190340E7C245C5FC17734282C86A06905190340E7C245C5FC17733A36320146E8DCC470509A9551248CEE469BB74598F18AF6A2FD537FF2447556774F714E46286C9E2735D989CC
Result : 0x5FDD94F14969459242CA9358F3A2BE9364660040F158696FBEC6C10AE85C5FC17734282C86A06905190340E7C245C5FC17734282C86A06905190340E7C245C5FC17734282C86A06905190340E7C245C5FC17733A36320146E8DCC470509A9551248CEE469BB74598F18AF6A2FD537FF2447556774F714E46286C9E2735D989CC
[ OK ] BigNumberTest.Multiplication1024 (0 ms)
[ RUN ] BigNumberTest.MultiplicationWithNegatives1024
num 1 : -0x578875ABFEEFE123456789ABCDEF987654321ABCDEF46FF78323252FFABFF4242478BEEDEF46FF783636EEFDEF46FF783EEFE7
num 2 : 0x987654321ABCDEF23456789ABCDEF23456789ABCDEF6789AB56336CDEF6789ABCDEF6789ABCDEF6789ABCDEF4
modulus(bits): 1024
Expected: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBDE8471BAF2341DBEABBB31BACC6F82D59F03AB7EE02B42D8C1BE80A9D5DB6EE2AB9FAD8F600B4BCE263A1ED2307281394E4F106DE109B17F3D90B7D619F081F3AF9FD5CD1CEAD6A1D58A59236180906B4D58377E61A8E20123169AC5505D4
Result : 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBDE8471BAF2341DBEABBB31BACC6F82D59F03AB7EE02B42D8C1BE80A9D5DB6EE2AB9FAD8F600B4BCE263A1ED2307281394E4F106DE109B17F3D90B7D619F081F3AF9FD5CD1CEAD6A1D58A59236180906B4D58377E61A8E20123169AC5505D4
[ OK ] BigNumberTest.MultiplicationWithNegatives1024 (0 ms)
[ RUN ] BigNumberTest.InversionZero
number : 0x0
modulus(bits): 1024
Inverse does not exist for zero
[ OK ] BigNumberTest.InversionZero (6 ms)
[ RUN ] BigNumberTest.InversionOne
number : 0x1
modulus(bits): 1024
Inverse: 0x1
[ OK ] BigNumberTest.InversionOne (0 ms)
[ RUN ] BigNumberTest.InversionSmall
number : 0x123456789ABCDEF
modulus(bits): 32
Inverse: 0xFEF010F
[ OK ] BigNumberTest.InversionSmall (2 ms)
[ RUN ] BigNumberTest.Inversion512
number : 0x123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEFF
modulus(bits): 512
Inverse: 0xEB5ABAFF6BF44F810F9110B166BAECB44059DF82D2418B9EEB0655E91D90022FF9F911430DF9D2B6843E1597727C67893DD79589925DBD78C0220FF77C0220FF
[ OK ] BigNumberTest.Inversion512 (87 ms)
[ RUN ] BigNumberTest.Inversion1024
number : 0x123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEF123456789ABCDEFF
modulus(bits): 1024
Inverse: 0xA320290A7979FE8055EDDA33F84422A5CF3610A32D34D4C339BD9EFD88B969B714586A50F67A2ED70F7A46B7C1068A83440B0618EAA9DA7D6609E60B3EA90FCFEB5ABAFF6BF44F810F9110B166BAECB44059DF82D2418B9EEB0655E91D90022FF9F911430DF9D2B6843E1597727C67893DD79589925DBD78C0220FF77C0220FF
[ OK ] BigNumberTest.Inversion1024 (484 ms)
[ RUN ] BigNumberTest.InversionDoesNotExist
number : 0xC1A23F9B6C9E1B4F9DDEB2AA221222B21FFFFFFFFF2BBB221222222222222
modulus(bits): 1024
Inverse does not exist for the given number
[ OK ] BigNumberTest.InversionDoesNotExist (149 ms)
[ RUN ] BigNumberTest.AddandMultiply
num 1 : 0x123456789ABCDEF987654321ABCDEF46FF78323252FFABFF4242478BEEDEF46FF783636EEFDEF46FF783EEFE7
num 2 : 0x987654321ABCDEF23456789ABCDEF23456789ABCDEF67789ABCDEF6789AB89AB5789ABCDEF6789AB6336CDEF6789ABCDEF6789AB789ABCDEF6789ABCDEF6789ABCDEF4
num 3 : 0x123456789ABCDEF987654321ABCDEF46FF78323252F789ABCDEF6789ABFABFF4242478BEEDEF46FF783636EEFDEF46FF783EEFE7
modulus(bits): 1024
Expected: 0xAD77D7433F6ACD97DEDE2F6D7A1B25C0F78AB5F210ABA3B90EC28D0080DBDBB6ABFEE4F524EFDE7154DBC2CE04A74B773B9C96F6A1F3F4BC46363576B7F7BB4FAB3E844A7AA48A52092774C68FE04E6430A51DE9088299214C78777AD5D4A929C28C785C252087771C3DD08290B5B984F2129F8601C9D
Result : 0xAD77D7433F6ACD97DEDE2F6D7A1B25C0F78AB5F210ABA3B90EC28D0080DBDBB6ABFEE4F524EFDE7154DBC2CE04A74B773B9C96F6A1F3F4BC46363576B7F7BB4FAB3E844A7AA48A52092774C68FE04E6430A51DE9088299214C78777AD5D4A929C28C785C252087771C3DD08290B5B984F2129F8601C9D
[ OK ] BigNumberTest.AddandMultiply (0 ms)
[ RUN ] BigNumberTest.AddMultiplyAndInvertNegatives
num 1 : -0x123456789ABCDEF987654321ABCDEF46FF78323252FFABFF4242478BEEDEF46FF783636EEFDEF46FF783EEFE7
num 2 : 0x987654321ABCDEF23456789ABCDEF23456789ABCDEF6789AB56336CDEF6789ABCDEF6789ABCDEF6789ABCDEF4
num 3 : -0x123456789ABCDEF987654321ABCDEF46FF78323252FFABFF4242478BEEDEF46FF783636EEFDEF46FF783EEFE7
modulus(bits): 2048
Expected: 0xA7EF6C39D435D0D692593F92534651C44FBC6AD3E36D95C298DA35DB08FB6EA9226337044852E4FE4553EFCF5B5B42D3B8F8F818E3A63E3F5222D0BDD02F55B3D66A5FDE0CA799673CF702117A0679BE4D2C7DDC8EA371BE5623E34513E3B4B5A67AEF7CACC7FA5BCD71034737B76B6568E4635D1F8C6E6EA164614ED6A4DAEC63CD11C007AD88E35A4F954B4E2CB590CC222B864157A97B9A0EEFDA17385F90E9FD80C0040B0EFA34EA61FC19C361FDFF448387EFE086730DBFE748E0D856511FF5CDA70037E178CC6630326F9D61E6856B9E391269094B81DF7AD8F32A2ADB86D290478ECEF8D92E1BE2B0AFFC201814CBA49410F00AE3DCFA1F5D47A2AA8D
Result : 0xA7EF6C39D435D0D692593F92534651C44FBC6AD3E36D95C298DA35DB08FB6EA9226337044852E4FE4553EFCF5B5B42D3B8F8F818E3A63E3F5222D0BDD02F55B3D66A5FDE0CA799673CF702117A0679BE4D2C7DDC8EA371BE5623E34513E3B4B5A67AEF7CACC7FA5BCD71034737B76B6568E4635D1F8C6E6EA164614ED6A4DAEC63CD11C007AD88E35A4F954B4E2CB590CC222B864157A97B9A0EEFDA17385F90E9FD80C0040B0EFA34EA61FC19C361FDFF448387EFE086730DBFE748E0D856511FF5CDA70037E178CC6630326F9D61E6856B9E391269094B81DF7AD8F32A2ADB86D290478ECEF8D92E1BE2B0AFFC201814CBA49410F00AE3DCFA1F5D47A2AA8D
[ OK ] BigNumberTest.AddMultiplyAndInvertNegatives (1308 ms)
[----------] 20 tests from BigNumberTest (2040 ms total)
[----------] Global test environment tear-down
[==========] 20 tests from 1 test suite ran. (2040 ms total)
[ PASSED ] 20 tests.