13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/* $Id$ */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/** @file
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * IPRT - Testcase for the RTBigNum* functions.
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/*
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * Copyright (C) 2006-2014 Oracle Corporation
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync *
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * available from http://www.virtualbox.org. This file is free software;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * you can redistribute it and/or modify it under the terms of the GNU
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * General Public License (GPL) as published by the Free Software
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync *
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * The contents of this file may alternatively be used under the terms
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * of the Common Development and Distribution License Version 1.0
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * VirtualBox OSE distribution, in which case the provisions of the
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * CDDL are applicable instead of those of the GPL.
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync *
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * You may elect to license modified versions of this file under the
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync * terms and conditions of either the GPL or the CDDL or both.
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/*******************************************************************************
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync* Header Files *
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync*******************************************************************************/
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <iprt/bignum.h>
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync#include <iprt/uint128.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <iprt/test.h>
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync#include <iprt/thread.h>
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync#include <iprt/time.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#include <iprt/string.h>
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync#if 1
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync# include <openssl/bn.h>
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync#endif
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync/*******************************************************************************
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync* Global Variables *
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync*******************************************************************************/
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTTEST g_hTest;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic uint8_t const g_abLargePositive[] =
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0x67,0xcd,0xd6,0x60,0x4e,0xaa,0xe9,0x8e,0x06,0x99,0xde,0xb2,0xf5,0x1c,0xc3,0xfc,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0xf5,0x17,0x41,0xec,0x42,0x68,0xf0,0xab,0x0e,0xe6,0x79,0xa8,0x32,0x97,0x55,0x00,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0x49,0x21,0x2b,0x72,0x4b,0x34,0x33,0xe1,0xe2,0xfe,0xa2,0xb8,0x39,0x7a,0x2f,0x17,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0xae,0x1f,0xbb,0xdb,0x46,0xbc,0x59,0x8b,0x13,0x05,0x28,0x96,0xf6,0xfd,0xc1,0xa4
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync};
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_LargePositive;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_LargePositive2; /**< Smaller than g_LargePositive. */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic uint8_t const g_abLargePositiveMinus1[] =
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0x67,0xcd,0xd6,0x60,0x4e,0xaa,0xe9,0x8e,0x06,0x99,0xde,0xb2,0xf5,0x1c,0xc3,0xfc,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0xf5,0x17,0x41,0xec,0x42,0x68,0xf0,0xab,0x0e,0xe6,0x79,0xa8,0x32,0x97,0x55,0x00,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0x49,0x21,0x2b,0x72,0x4b,0x34,0x33,0xe1,0xe2,0xfe,0xa2,0xb8,0x39,0x7a,0x2f,0x17,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0xae,0x1f,0xbb,0xdb,0x46,0xbc,0x59,0x8b,0x13,0x05,0x28,0x96,0xf6,0xfd,0xc1,0xa3
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync};
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_LargePositiveMinus1; /**< g_LargePositive - 1 */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic uint8_t const g_abLargeNegative[] =
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0xf2,0xde,0xbd,0xaf,0x43,0x9e,0x1e,0x88,0xdc,0x64,0x37,0xa9,0xdb,0xb7,0x26,0x31,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0x92,0x1d,0xf5,0x43,0x4c,0xb0,0x21,0x2b,0x07,0x4e,0xf5,0x94,0x9e,0xce,0x15,0x79,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0x13,0x0c,0x70,0x68,0x49,0x46,0xcf,0x72,0x2b,0xc5,0x8f,0xab,0x7c,0x88,0x2d,0x1e,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0x3b,0x43,0x5b,0xdb,0x47,0x45,0x7a,0x25,0x74,0x46,0x1d,0x87,0x24,0xaa,0xab,0x0d,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0x3e,0xdf,0xd1,0xd8,0x44,0x6f,0x01,0x84,0x01,0x36,0xe0,0x84,0x6e,0x6f,0x41,0xbb,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0xae,0x1a,0x31,0xef,0x42,0x23,0xfd,0xda,0xda,0x0f,0x7d,0x88,0x8f,0xf5,0x63,0x72,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0x36,0x9f,0xa9,0xa4,0x4f,0xa0,0xa6,0xb1,0x3b,0xbe,0x0d,0x9d,0x62,0x88,0x98,0x8b
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync};
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_LargeNegative;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_LargeNegative2; /**< A few digits less than g_LargeNegative, i.e. larger value. */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic uint8_t const g_abLargeNegativePluss1[] =
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0xf2,0xde,0xbd,0xaf,0x43,0x9e,0x1e,0x88,0xdc,0x64,0x37,0xa9,0xdb,0xb7,0x26,0x31,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0x92,0x1d,0xf5,0x43,0x4c,0xb0,0x21,0x2b,0x07,0x4e,0xf5,0x94,0x9e,0xce,0x15,0x79,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0x13,0x0c,0x70,0x68,0x49,0x46,0xcf,0x72,0x2b,0xc5,0x8f,0xab,0x7c,0x88,0x2d,0x1e,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0x3b,0x43,0x5b,0xdb,0x47,0x45,0x7a,0x25,0x74,0x46,0x1d,0x87,0x24,0xaa,0xab,0x0d,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0x3e,0xdf,0xd1,0xd8,0x44,0x6f,0x01,0x84,0x01,0x36,0xe0,0x84,0x6e,0x6f,0x41,0xbb,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0xae,0x1a,0x31,0xef,0x42,0x23,0xfd,0xda,0xda,0x0f,0x7d,0x88,0x8f,0xf5,0x63,0x72,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync 0x36,0x9f,0xa9,0xa4,0x4f,0xa0,0xa6,0xb1,0x3b,0xbe,0x0d,0x9d,0x62,0x88,0x98,0x8c
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync};
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_LargeNegativePluss1; /**< g_LargeNegative + 1 */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic uint8_t const g_ab64BitPositive1[] = { 0x53, 0xe0, 0xdf, 0x11, 0x85, 0x93, 0x06, 0x21 };
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic uint64_t g_u64BitPositive1 = UINT64_C(0x53e0df1185930621);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_64BitPositive1;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_Zero;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_One;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_Two;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_Three;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_Four;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_Five;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_Ten;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_FourtyTwo;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic uint8_t const g_abMinus1[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic int64_t g_iBitMinus1 = -1;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic RTBIGNUM g_Minus1;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync/** @name The components of a real PKCS #7 signature (extracted from a build of
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync * this testcase).
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync * @{ */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncstatic uint8_t const g_abPubKeyExp[] = { 0x01, 0x00, 0x01 };
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncstatic RTBIGNUM g_PubKeyExp;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncstatic uint8_t const g_abPubKeyMod[] =
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync{
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x00, 0xea, 0x61, 0x4e, 0xa0, 0xb2, 0xae, 0x38, 0xbc, 0x43, 0x24, 0x5a, 0x28, 0xc7, 0xa0, 0x69,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x82, 0x11, 0xd5, 0x78, 0xe8, 0x6b, 0x41, 0x54, 0x7b, 0x6c, 0x69, 0x13, 0xc8, 0x68, 0x75, 0x0f,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xe4, 0x66, 0x54, 0xcd, 0xe3, 0x55, 0x33, 0x3b, 0x7f, 0x9f, 0x55, 0x75, 0x80, 0x6e, 0xd0, 0x8a,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xff, 0xc1, 0xf4, 0xbf, 0xfd, 0x70, 0x9b, 0x73, 0x7e, 0xee, 0xf1, 0x80, 0x23, 0xd4, 0xbd, 0xba,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xdc, 0xce, 0x09, 0x4a, 0xeb, 0xb0, 0xdd, 0x86, 0x4a, 0x0b, 0x8e, 0x3e, 0x9a, 0x8a, 0x58, 0xed,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x98, 0x4f, 0x25, 0xe5, 0x0c, 0x18, 0xd8, 0x10, 0x95, 0xce, 0xe4, 0x19, 0x82, 0x38, 0xcd, 0x76,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x6a, 0x38, 0xe5, 0x14, 0xe6, 0x95, 0x0d, 0x80, 0xc5, 0x09, 0x5e, 0x93, 0xf4, 0x6f, 0x82, 0x8e,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x9c, 0x81, 0x09, 0xd6, 0xd4, 0xee, 0xd5, 0x1f, 0x94, 0x2d, 0x13, 0x18, 0x9a, 0xbc, 0x88, 0x5d,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x9a, 0xe5, 0x66, 0x08, 0x99, 0x93, 0x1b, 0x8a, 0x69, 0x3f, 0x68, 0xb2, 0x97, 0x2a, 0x24, 0xf6,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x65, 0x2a, 0x94, 0x33, 0x94, 0x14, 0x5c, 0x6f, 0xff, 0x95, 0xd0, 0x2b, 0xf0, 0x2b, 0xcb, 0x49,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xcd, 0x03, 0x3a, 0x45, 0xd5, 0x22, 0x1c, 0xb3, 0xee, 0xd5, 0xaf, 0xb3, 0x5b, 0xcb, 0x1b, 0x35,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x4e, 0xff, 0x21, 0x0a, 0x55, 0x1f, 0xa0, 0xf9, 0xdc, 0xad, 0x7a, 0x89, 0x0b, 0x6e, 0x3f, 0x75,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xc0, 0x6c, 0x44, 0xff, 0x90, 0x63, 0x79, 0xcf, 0x70, 0x20, 0x60, 0x33, 0x3c, 0xb1, 0xfa, 0x6b,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x6c, 0x55, 0x3c, 0xeb, 0x8d, 0x18, 0xe9, 0x0a, 0x81, 0xd5, 0x24, 0xc1, 0x88, 0x7c, 0xa6, 0x8e,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xd3, 0x2c, 0x51, 0x1d, 0x6d, 0xdf, 0x51, 0xd5, 0x72, 0x54, 0x7a, 0x98, 0xc0, 0x36, 0x35, 0x21,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x66, 0x3c, 0x2f, 0x01, 0xc0, 0x8e, 0xb0, 0x56, 0x60, 0x6e, 0x67, 0x4f, 0x5f, 0xac, 0x05, 0x60,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x9b
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync};
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncstatic RTBIGNUM g_PubKeyMod;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncstatic uint8_t const g_abSignature[] =
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync{
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x00, 0xae, 0xca, 0x93, 0x47, 0x0b, 0xfa, 0xd8, 0xb9, 0xbb, 0x5a, 0x5e, 0xf6, 0x75, 0x90, 0xed,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x80, 0x37, 0x03, 0x6d, 0x23, 0x91, 0x30, 0x0c, 0x9d, 0xbf, 0x34, 0xc1, 0xf9, 0x43, 0xa7, 0xec,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xc0, 0x83, 0xc0, 0x98, 0x3f, 0x8a, 0x65, 0x48, 0x7c, 0xa4, 0x9f, 0x14, 0x4d, 0x52, 0x90, 0x2d,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x17, 0xd1, 0x3e, 0x05, 0xd6, 0x35, 0x1b, 0xdb, 0xe5, 0x1a, 0xa2, 0x54, 0x8c, 0x30, 0x6f, 0xfe,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xa1, 0xd9, 0x98, 0x3f, 0xb5, 0x65, 0x14, 0x9c, 0x50, 0x55, 0xa1, 0xbf, 0xb5, 0x12, 0xc4, 0xf2,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x72, 0x27, 0x14, 0x59, 0xb5, 0x23, 0x67, 0x11, 0x2a, 0xd8, 0xa8, 0x85, 0x4b, 0xc5, 0xb0, 0x2f,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x73, 0x54, 0xcf, 0x33, 0xa0, 0x06, 0xf2, 0x8e, 0x4f, 0x4b, 0x18, 0x97, 0x08, 0x47, 0xce, 0x0c,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x47, 0x97, 0x0d, 0xbd, 0x8b, 0xce, 0x61, 0x31, 0x21, 0x7e, 0xc4, 0x1d, 0x03, 0xf8, 0x06, 0xca,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x9f, 0xd3, 0x5e, 0x4b, 0xfc, 0xf1, 0x99, 0x34, 0x78, 0x83, 0xfa, 0xab, 0x9c, 0x7c, 0x6b, 0x5c,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x3d, 0x45, 0x39, 0x6d, 0x6a, 0x6c, 0xd5, 0x63, 0x3e, 0xbe, 0x09, 0x62, 0x64, 0x5f, 0x83, 0x3b,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xb6, 0x5c, 0x7e, 0x8e, 0xeb, 0x1e, 0x6a, 0x34, 0xb9, 0xc7, 0x92, 0x92, 0x58, 0x64, 0x48, 0xfe,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xf8, 0x35, 0x53, 0x07, 0x89, 0xb4, 0x29, 0x4d, 0x3d, 0x79, 0x43, 0x73, 0x0f, 0x16, 0x21, 0xab,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xb7, 0x07, 0x2b, 0x5a, 0x8a, 0x0f, 0xd7, 0x2e, 0x95, 0xb4, 0x26, 0x66, 0x65, 0x72, 0xac, 0x7e,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x46, 0x70, 0xe6, 0xad, 0x43, 0xa2, 0x73, 0x54, 0x6a, 0x41, 0xc8, 0x9c, 0x1e, 0x65, 0xed, 0x06,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xd1, 0xc7, 0x99, 0x3e, 0x5f, 0x5a, 0xd3, 0xd0, 0x1a, 0x9b, 0x0e, 0x3e, 0x04, 0x66, 0xb6, 0xaa,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xa6, 0x51, 0xb8, 0xc0, 0x13, 0x19, 0x34, 0x0e, 0x86, 0x02, 0xd5, 0xc8, 0x10, 0xaa, 0x1f, 0x97,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x95
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync};
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncstatic RTBIGNUM g_Signature;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncstatic uint8_t const g_abSignatureDecrypted[] =
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync{
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x21, 0x30,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14, 0x54, 0x60, 0xb0, 0x65,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync 0xf1, 0xbc, 0x40, 0x77, 0xfc, 0x9e, 0xfc, 0x2f, 0x94, 0x62, 0x62, 0x61, 0x43, 0xb9, 0x01, 0xb9
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync};
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncstatic RTBIGNUM g_SignatureDecrypted;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync/** @} */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic void testInitOneLittleEndian(uint8_t const *pb, size_t cb, PRTBIGNUM pBigNum)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync uint8_t abLittleEndian[sizeof(g_abLargePositive) + sizeof(g_abLargeNegative)];
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RETV(cb <= sizeof(abLittleEndian));
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync size_t cbLeft = cb;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync uint8_t *pbDst = abLittleEndian + cb - 1;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync uint8_t const *pbSrc = pb;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync while (cbLeft-- > 0)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync *pbDst-- = *pbSrc++;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Num;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInit(&Num, RTBIGNUMINIT_F_ENDIAN_LITTLE | RTBIGNUMINIT_F_SIGNED,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync abLittleEndian, cb), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(Num.fNegative == pBigNum->fNegative);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(Num.cUsed == pBigNum->cUsed);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Num, pBigNum) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Num), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInit(&Num, RTBIGNUMINIT_F_ENDIAN_LITTLE | RTBIGNUMINIT_F_SIGNED | RTBIGNUMINIT_F_SENSITIVE,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync abLittleEndian, cb), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(Num.fNegative == pBigNum->fNegative);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(Num.cUsed == pBigNum->cUsed);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Num, pBigNum) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Num), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic void testMoreInit(void)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(!g_LargePositive.fNegative);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(!g_LargePositive.fSensitive);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(!g_LargePositive2.fNegative);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(!g_LargePositive2.fSensitive);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_LargeNegative.fNegative);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(!g_LargeNegative.fSensitive);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_LargeNegative2.fNegative);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(!g_LargeNegative2.fSensitive);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(!g_Zero.fNegative);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(!g_Zero.fSensitive);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_Zero.cUsed == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_Minus1.fNegative);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(!g_Minus1.fSensitive);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_Minus1.cUsed == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_Minus1.pauElements[0] == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_One.cUsed == 1 && g_One.pauElements[0] == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_Two.cUsed == 1 && g_Two.pauElements[0] == 2);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_Three.cUsed == 1 && g_Three.pauElements[0] == 3);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_Four.cUsed == 1 && g_Four.pauElements[0] == 4);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_Ten.cUsed == 1 && g_Ten.pauElements[0] == 10);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_FourtyTwo.cUsed == 1 && g_FourtyTwo.pauElements[0] == 42);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync /* Test big endian initialization w/ sensitive variation. */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync testInitOneLittleEndian(g_abLargePositive, sizeof(g_abLargePositive), &g_LargePositive);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync testInitOneLittleEndian(g_abLargePositive, sizeof(g_abLargePositive) - 11, &g_LargePositive2);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync testInitOneLittleEndian(g_abLargeNegative, sizeof(g_abLargeNegative), &g_LargeNegative);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync testInitOneLittleEndian(g_abLargeNegative, sizeof(g_abLargeNegative) - 9, &g_LargeNegative2);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_Minus1.cUsed == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync testInitOneLittleEndian(g_abMinus1, sizeof(g_abMinus1), &g_Minus1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync testInitOneLittleEndian(g_abMinus1, 1, &g_Minus1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync testInitOneLittleEndian(g_abMinus1, 4, &g_Minus1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic void testCompare(void)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestSub(g_hTest, "RTBigNumCompare*");
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargePositive) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive2, &g_LargePositive) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargePositive2) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_Zero, &g_LargePositive) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_Zero) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive2, &g_Zero) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargePositiveMinus1) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargePositiveMinus1, &g_LargePositive) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargeNegative) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargeNegative2) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative2, &g_LargeNegative) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_Zero, &g_LargeNegative) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_Zero) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative2, &g_Zero) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargeNegativePluss1) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegativePluss1, &g_LargeNegative) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargePositive) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargeNegative) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative2, &g_LargePositive) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive, &g_LargeNegative2) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative2, &g_LargePositive2) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargePositive2, &g_LargeNegative2) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&g_Zero, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&g_Zero, 1) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&g_Zero, UINT32_MAX) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&g_Zero, UINT64_MAX) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargePositive, UINT64_MAX) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargePositive2, 0x7213593) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargeNegative, 0) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargeNegative, 1) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargeNegative, UINT64_MAX) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&g_LargeNegative, 0x80034053) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&g_64BitPositive1, g_u64BitPositive1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&g_64BitPositive1, g_u64BitPositive1 - 1) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&g_64BitPositive1, g_u64BitPositive1 + 1) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Zero, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Zero, 1) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Zero, -1) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Zero, INT32_MAX) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&g_LargeNegative, INT32_MIN) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&g_LargeNegative, INT64_MIN) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_u64BitPositive1 < (uint64_t)INT64_MAX);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, g_u64BitPositive1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, g_u64BitPositive1 - 1) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, g_u64BitPositive1 + 1) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, INT64_MIN) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&g_64BitPositive1, INT64_MAX) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Minus1, -1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Minus1, -2) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&g_Minus1, 0) == -1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic void testSubtraction(void)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestSub(g_hTest, "RTBigNumSubtract");
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Result;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Result2;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result2, fFlags), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_Minus1, &g_Minus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_Zero, &g_Minus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_Minus1, &g_Zero), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_64BitPositive1, &g_Minus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, g_u64BitPositive1 + 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_Minus1, &g_64BitPositive1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, INT64_C(-1) - g_u64BitPositive1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargePositive, &g_LargePositiveMinus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(Result.cUsed == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargePositiveMinus1, &g_LargePositive), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(Result.cUsed == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&g_LargeNegative, &g_LargeNegativePluss1) < 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargeNegative, &g_LargeNegativePluss1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(Result.cUsed == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargeNegativePluss1, &g_LargeNegative), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(Result.cUsed == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result, &g_LargeNegativePluss1, &g_LargeNegativePluss1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(Result.cUsed == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Result2), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic void testAddition(void)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestSub(g_hTest, "RTBigNumAdd");
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Result;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Result2;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result2, fFlags), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_Minus1, &g_Minus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -2) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_Zero, &g_Minus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_Zero, &g_64BitPositive1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, g_u64BitPositive1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_Minus1, &g_64BitPositive1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, g_u64BitPositive1 - 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(g_u64BitPositive1 * 2 > g_u64BitPositive1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_64BitPositive1, &g_64BitPositive1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, g_u64BitPositive1 * 2) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAssign(&Result2, &g_LargePositive), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumNegateThis(&Result2), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositive, &Result2), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &Result2, &g_LargePositive), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithU64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositiveMinus1, &Result2), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &Result2, &g_LargePositiveMinus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositive, &g_LargePositiveMinus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargePositive) > 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargePositiveMinus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargePositive) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargePositive), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargePositiveMinus1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositive, &g_LargeNegative), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargeNegative) > 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargePositive) < 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargePositive), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargeNegative) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargeNegative), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargePositive) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargeNegativePluss1, &g_LargeNegative), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargeNegative) < 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumSubtract(&Result2, &Result, &g_LargeNegative), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargeNegativePluss1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Result2), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncstatic void testShift(void)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync{
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestSub(g_hTest, "RTBigNumShiftLeft, RTBigNumShiftRight");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTBIGNUM Result;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTBIGNUM Result2;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result2, fFlags), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync /* basic left tests */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result, &g_Minus1, 1), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -2) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result, &g_Minus1, 0), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result, &g_Minus1, 2), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -4) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result, &g_Minus1, 8), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -256) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result, &g_Zero, 511), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result, &g_FourtyTwo, 1), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 84) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result, &g_FourtyTwo, 27+24), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, UINT64_C(0x150000000000000)) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result, &g_FourtyTwo, 27), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result2, &Result, 24), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result2, UINT64_C(0x150000000000000)) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result, &g_LargePositive, 2), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumMultiply(&Result2, &g_LargePositive, &g_Four), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompare(&Result2, &Result) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync /* basic right tests. */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result, &g_Minus1, 1), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result, &g_Minus1, 8), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result, &g_Zero, 511), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result, &g_FourtyTwo, 0), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 42) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result, &g_FourtyTwo, 1), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 21) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result, &g_FourtyTwo, 2), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 10) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result, &g_FourtyTwo, 3), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 5) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result, &g_FourtyTwo, 4), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 2) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result, &g_FourtyTwo, 5), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result, &g_FourtyTwo, 6), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result, &g_FourtyTwo, 549), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumDivideLong(&Result2, &Result, &g_LargePositive, &g_Four), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result, &g_LargePositive, 2), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompare(&Result2, &Result) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync /* Some simple back and forth. */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result, &g_One, 2), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result2, &Result, 2), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_One) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result, &g_Three, 63), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result2, &Result, 63), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_Three) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync for (uint32_t i = 0; i < 1024; i++)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result, &g_LargePositive, i), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result2, &Result, i), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompare(&Result2, &g_LargePositive) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result, &g_LargePositive, 2), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result2, &Result, 250), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftLeft(&Result, &Result2, 999), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result2, &Result, 1), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result, &Result2, 250), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result2, &Result, 1), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumShiftRight(&Result, &Result2, 999), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargePositive) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Result2), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync}
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic bool testHexStringToNum(PRTBIGNUM pBigNum, const char *pszHex, uint32_t fFlags)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync uint8_t abBuf[_4K];
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync size_t cbHex = strlen(pszHex);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RET(!(cbHex & 1), false);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync cbHex /= 2;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RET(cbHex < sizeof(abBuf), false);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RET(RTStrConvertHexBytes(pszHex, abBuf, cbHex, 0), VINF_SUCCESS, false);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RET(RTBigNumInit(pBigNum, RTBIGNUMINIT_F_ENDIAN_BIG | fFlags, abBuf, cbHex), VINF_SUCCESS, false);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync return true;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic void testMultiplication(void)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestSub(g_hTest, "RTBigNumMultiply");
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Result;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Result2;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result2, fFlags), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_Minus1, &g_Minus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_Zero, &g_Minus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_Minus1, &g_Zero), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_Minus1, &g_64BitPositive1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -(int64_t)g_u64BitPositive1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &g_64BitPositive1, &g_Minus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -(int64_t)g_u64BitPositive1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync static struct
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync const char *pszF1, *pszF2, *pszResult;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync } s_aTests[] =
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "29865DBFA717181B9DD4B515BD072DE10A5A314385F6DED735AC553FCD307D30C499",
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "4DD65692F7365B90C55F63988E5B6C448653E7DB9DD941507586BD8CF71398287C",
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "0CA02E8FFDB0EEA37264338A4AAA91C8974E162DDFCBCF804B434A11955671B89B3645AAB75423D60CA3459B0B4F3F28978DA768779FB54CF362FD61924637582F221C"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync },
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000000000000000000000000001"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync };
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM F1, F2, Expected;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync if ( testHexStringToNum(&F1, s_aTests[i].pszF1, RTBIGNUMINIT_F_UNSIGNED | fFlags)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync && testHexStringToNum(&F2, s_aTests[i].pszF2, RTBIGNUMINIT_F_UNSIGNED | fFlags)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync && testHexStringToNum(&Expected, s_aTests[i].pszResult, RTBIGNUMINIT_F_UNSIGNED | fFlags))
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumMultiply(&Result, &F1, &F2), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Result, &Expected) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&F1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&F2), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Expected), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Result2), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync#if 0 /* Java program for generating testDivision test data. */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncimport java.math.BigInteger;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncimport java.lang.System;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncimport java.lang.Integer;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncimport java.util.Random;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncimport java.security.SecureRandom;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncclass bigintdivtestgen
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync{
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncpublic static String format(BigInteger BigNum)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync{
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync String str = BigNum.toString(16);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if ((str.length() & 1) != 0)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync str = "0" + str;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync return str;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync}
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncpublic static void main(String args[])
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync{
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync Random Rnd = new SecureRandom();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync /* Can't go to far here because before we reach 11K both windows compilers
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync will have reached some kind of section limit. Probably string pool related. */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync int cDivisorLarger = 0;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync for (int i = 0; i < 9216; i++)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync int cDividendBits = Rnd.nextInt(4095) + 1;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync int cDivisorBits = i < 9 ? cDividendBits : Rnd.nextInt(4095) + 1;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if (cDivisorBits > cDividendBits)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync cDivisorLarger++;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if (cDivisorLarger > i / 4)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync cDivisorBits = Rnd.nextInt(cDividendBits);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync BigInteger Dividend = new BigInteger(cDividendBits, Rnd);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync BigInteger Divisor = new BigInteger(cDivisorBits, Rnd);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync while (Divisor.compareTo(BigInteger.ZERO) == 0) {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync cDivisorBits++;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync Divisor = new BigInteger(cDivisorBits, Rnd);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync BigInteger[] Result = Dividend.divideAndRemainder(Divisor);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync System.out.println(" { /* i=" + Integer.toString(i)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync + " cDividendBits=" + Integer.toString(cDividendBits)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync + " cDivisorBits=" + Integer.toString(cDivisorBits) + " */");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync System.out.println(" \"" + format(Dividend) + "\",");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync System.out.println(" \"" + format(Divisor) + "\",");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync System.out.println(" \"" + format(Result[0]) + "\",");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync System.out.println(" \"" + format(Result[1]) + "\"");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync System.out.println(" },");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync}
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync}
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync#endif
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic void testDivision(void)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestSub(g_hTest, "RTBigNumDivide");
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync //for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uint32_t fFlags = 0;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Quotient;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Quotient, fFlags), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Remainder;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Remainder, fFlags), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Minus1, &g_Minus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Zero, &g_Minus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Minus1, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_LargeNegative, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_LargePositive, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Four, &g_Two), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 2) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Three, &g_Two), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_Ten, &g_Two), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 5) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_LargePositive, &g_LargePositiveMinus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &g_LargeNegative, &g_LargeNegativePluss1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Quotient, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Remainder, -1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync static struct
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync const char *pszDividend, *pszDivisor, *pszQuotient, *pszRemainder;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync } const s_aTests[] =
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync#if 1
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync#include "tstRTBigNum-div-test-data.h"
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { "ff", "10", /* = */ "0f", "0f" },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { /* cDividendBits=323 cDivisorBits=195 */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "064530fd21b30e179b5bd5efd1f4a7e8df173c13965bd75e1502891303060b417e62711ceb17a73e56",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "0784fac4a7c6b5165a99dc3228b6484cba9c7dfadde85cdde3",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "d578cc87ed22ac3630a4d1e5fc590ae6",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "06acef436982f9c4fc9b0a44d3df1e72cad3ef0cb51ba20664"
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "ffffffffffffffffffffffffffffffffffffffffffffffff",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "fffffffffffffffffffffffffffffffffffffffffffffffe",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "01",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "01"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync },
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "922222222222222222222222222222222222222222222222",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "811111111111111111111111111111111111111111111111",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "01",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "111111111111111111111111111111111111111111111111"
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "955555555555555555555555555555555555555555555555",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "211111111111111111111111111111111111111111111111",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "04",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "111111111111111111111111111111111111111111111111"
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync#endif
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync /* This test triggers negative special cases in Knuth's division algorithm. */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "0137698320ec00bcaa13cd9c18df564bf6df45c5c4c73ad2012cb36cf897c5ff00db638256e19c9ba5a8fbe828ac6e8d470a5f3391d4350ca1390f79c4e4f944eb",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "67cdd6604eaae98e0699deb2f51cc3fcf51741ec4268f0ab0ee679a83297550049212b724b3433e1e2fea2b8397a2f17ae1fbbdb46bc598b13052896f6fdc1a4",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "02",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "67cdd6604eaae98e0699deb2f51cc3fcf51741ec4268f0ab0ee679a83297550049212b724b3433e1e2fea2b8397a2f17ae1fbbdb46bc598b13052896f6fdc1a3"
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync };
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTBIGNUM Dividend, Divisor, ExpectedQ, ExpectedR;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if ( testHexStringToNum(&Dividend, s_aTests[i].pszDividend, RTBIGNUMINIT_F_UNSIGNED | fFlags)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync && testHexStringToNum(&Divisor, s_aTests[i].pszDivisor, RTBIGNUMINIT_F_UNSIGNED | fFlags)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync && testHexStringToNum(&ExpectedQ, s_aTests[i].pszQuotient, RTBIGNUMINIT_F_UNSIGNED | fFlags)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync && testHexStringToNum(&ExpectedR, s_aTests[i].pszRemainder, RTBIGNUMINIT_F_UNSIGNED | fFlags))
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumDivide(&Quotient, &Remainder, &Dividend, &Divisor), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if ( RTBigNumCompare(&Quotient, &ExpectedQ) != 0
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync || RTBigNumCompare(&Remainder, &ExpectedR) != 0)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIFailed("i=%#x both\n"
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "ExpQ: %.*Rhxs\n"
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "GotQ: %.*Rhxs\n"
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "ExpR: %.*Rhxs\n"
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync "GotR: %.*Rhxs\n",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync i,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync ExpectedQ.cUsed * RTBIGNUM_ELEMENT_SIZE, ExpectedQ.pauElements,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync Quotient.cUsed * RTBIGNUM_ELEMENT_SIZE, Quotient.pauElements,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync ExpectedR.cUsed * RTBIGNUM_ELEMENT_SIZE, ExpectedR.pauElements,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync Remainder.cUsed * RTBIGNUM_ELEMENT_SIZE, Remainder.pauElements);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIPrintf(RTTESTLVL_ALWAYS, "{ \"%s\", \"%s\", \"%s\", \"%s\" },\n",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync s_aTests[i].pszDividend, s_aTests[i].pszDivisor,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync s_aTests[i].pszQuotient, s_aTests[i].pszRemainder);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumDivideLong(&Quotient, &Remainder, &Dividend, &Divisor), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompare(&Quotient, &ExpectedQ) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompare(&Remainder, &ExpectedR) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumModulo(&Remainder, &Dividend, &Divisor), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompare(&Remainder, &ExpectedR) == 0);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&ExpectedR), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&ExpectedQ), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Divisor), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Dividend), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Quotient), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Remainder), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic void testModulo(void)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestSub(g_hTest, "RTBigNumModulo");
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Result;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Tmp;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Tmp, fFlags), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Minus1, &g_Minus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Zero, &g_Minus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Minus1, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargeNegative, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargePositive, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Four, &g_Two), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Three, &g_Two), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_Ten, &g_Two), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargePositive, &g_LargePositiveMinus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargePositiveMinus1, &g_LargePositive), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargePositiveMinus1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAdd(&Result, &g_LargePositiveMinus1, &g_LargePositive), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumAdd(&Tmp, &g_LargePositive, &Result), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &Tmp, &g_LargePositiveMinus1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 2) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &Tmp, &g_LargePositive), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Result, &g_LargePositiveMinus1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModulo(&Result, &g_LargeNegative, &g_LargeNegativePluss1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, -1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic void testExponentiation(void)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestSub(g_hTest, "RTBigNumExponentiate");
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Result;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Result2;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result2, fFlags), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_One, &g_One), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Two, &g_One), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 2) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Two, &g_Two), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 4) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Two, &g_Ten), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1024) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Five, &g_Five), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 3125) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &g_Five, &g_Ten), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 9765625) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync static struct
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync const char *pszBase, *pszExponent, *pszResult;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync } s_aTests[] =
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "180DB4284A119D6133AE4BB0C27C27D1", /*^*/ "3A", /* = */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "04546412B9E39476F10009F62608F614774C5AE475482434F138C3EA976583ECE09E58F1F03CE41F821A1D5DA59B69D031290B0AC7F7D5058E3AFA2CA3DAA7261D1620CA"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "D050576C0AFDF51ADBFCB9073B9D8324E816EA6BE4648DF68092F6617ED609045E6BE9D5410AE2CFF725832414E67656233F4DFA952461D321282426D50E2AF524D779EC"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "0744547E8A4F0768C2C49AF3A5A89D129430CA58456BE4534BC53C67523506C7A8B5770D88CF28B6B3EEBE73F3EA71BA2CE27C4C89BE0D699922B1A1EB20143CB0830A43"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "D864DDFFF026BA781614C2D55F3EDEA7257B93A0F40824E57D6EDFCFFB4611C316374D0D15698E6584851F1898DCAE75FC4D180908763DDB2FF93766EF144D091274AFE5"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "6980A1F4F574D577DAD833EA9486A4B499BFCA9C08225D7BDB2C632B4D9B53EF51C02ED419F22657D626064BCC2B083CD664E1A8D68F82F33233A833AC98AA0282B8B88D"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "A430CF2E581A1C7C4A1D646CA42760ED10C398F7C032A94D53964E6885B5C1CA884EC15081D4C010978627C85767FEC6F93364044EA86567F9610ABFB837808CC995FB5F"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "710B21CE198E0D4AD9F73C3BD56CB9965C85C790BF3F4B326B5245BFA81783126217BF80687C4A8AA3AE80969A4407191B4F90E71A0ABCCB5FEDD40477CE9D10FBAEF103"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "8457AB19BD793CECDFF8B29A96F12F590BFED544E08F834A44DEEF461281C40024EFE9388689AAC69BCBAB3D06434172D9319F30754756E1CF77B300679215BEBD27FC20"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "A2F1D2029BC767D4894A5F7B21BD784CD1DD4F41697839969CB6D2AA1E0AFA5D3D644A792586F681EB36475CAE59EB457E55D6AC2E286E196BFAC000C7389A96C514552D"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "5D9D3DD962F72DAE4A7575A9A67856646239560A39E50826BB2523598C8F8FF0EC8D09618378E9F362A8FBFE842B55CD1855A95D8A5E93B8B91D31EB8FBBF57113F06171"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "BB69B81C4240EC4C7D1AC67EA1CE4CEBEE71828917EC1CF500E1AD2F09535F5498CD6E613383810A840A265AED5DD20AE58FFF2D0DEB8EF99FA494B22714F520E8E8B684"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "5E8521966A7B1699236998A730FDF9F049CE2A4EA44D1EBC3B9754908848540D0DEE64A6D60E2BFBC3362B659C10543BDC20C1BAD3D68B173442C100C2C366CB885E8490"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "EDB977E49E9D51D4427B73B3B999AF4BA17685387182C3918D20808197A2E3FCDD0F66ECDEC05542C23A08B94C83BDF93606A49E9A0645B002CFCA1EAE1917BEED0D6542"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "9A0EF00E5FB5F70D61C8C4DF1F1E9DA58188A221"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync },
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "03", /*^*/ "164b", /* = */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "29ABEC229C2B15C41573F8608D4DCD2DADAACA94CA3C40B42FFAD32D6202E228E16F61E050FF97EC5D45F24A4EB057C2D1A5DA72DFC5944E6941DBEDDE70EF56702BEC35"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "A3150EFE84E87185E3CBAB1D73F434EB820E41298BDD4F3941230DFFD8DFF1D2E2F3C5D0CB5088505B9C78507A81AAD8073C28B8FA70771C3E04110344328C6B3F38E55A"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "32B009F4DDA1813232C3FF422DF4E4D12545C803C63D0BE67E2E773B2BAC41CC69D895787B217D7BE9CE80BD4B500AE630AA21B50A06E0A74953F8011E9F23863CA79885"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "35D5FF0214DBD9B25756BE3D43008A15C018348E6A7C3355F4BECF37595BD530E5AC1AD3B14182862E47AD002097465F6B78F435B0D6365E18490567F508CD3CAAAD340A"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "E76A218FE8B517F923FE9CCDE61CB35409590CDBC606D89BA33B32A3862DEE7AB99DFBE103D02D2BED6D418B949E6B3C51CAB8AB5BE93AA104FA10D3A02D4CAD6700CD0F"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "83922EAAB18705915198DE51C1C562984E2B7571F36A4D756C459B61E0A4B7DE268A74E807311273DD51C2863771AB72504044C870E2498F13BF1DE92C13D93008E304D2"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "879C5D8A646DB5BF7BC64D96BB9E2FBA2EA6BF55CD825ABD995762F661C327133BE01F9A9F298CA096B3CE61CBBD8047A003870B218AC505D72ED6C7BF3B37BE5877B6A1"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "606A713EE86509C99B2A3627FD74AE7E81FE7F69C34B40E01A6F8B18A328E0F9D18A7911E5645331540538AA76B6D5D591F14313D730CFE30728089A245EE91058748F0C"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "E3E6CE4DE51D23E233BFF9007E0065AEBAA3FB0D0FACE62A4757FE1C9C7075E2214071197D5074C92AF1E6D853F7DE782F32F1E40507CB981A1C10AC6B1C23AC46C07EF1"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "EDE857C444902B936771DF75E0EE6C2CB3F0F9DBB387BAD0658E98F42A7338DE45E2F1B012B530FFD66861F74137C041D7558408A4A23B83FBDDE494381D9F9FF0326D44"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "302F75DE68B91A54CFF6E3C2821D09F2664CA74783C29AF98E2F1D3D84CAC49EAE55BABE3D2CBE8833D50517109E19CB5C63D1DE26E308ACC213D1CBCCF7C3AAE05B06D9"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "909AB0A1AEFD02A193CFADC7F724D377E1F4E78DC21012BE26D910548CDF55B0AB9CB64756045FF48C3B858E954553267C4087EC5A9C860CFA56CF5CFBB442BDDA298230"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "D6C000A6A6010D87FB4C3859C3AFAF15C37BCE03EBC392E8149056C489508841110060A991F1EEAF1E7CCF0B279AB2B35F3DAC0FAB4F4A107794E67D305E6D61A27C8FEB"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "DEA00C3334C888B2092E740DD3EFF7A69F06CE12EF511126EB23D80902D1D54BF4AEE04DF9457D59E8859AA83D6229481E1B1BC7C3ED96F6F7C1CEEF7B904268FD00BE51"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "1EF69692D593F8A9F7CCC053C343306940A4054A55DBA94D95FF6D02B7A73E110C2DBE6CA29C01B5921420B5BC9C92DAA9D82003829C6AE772FF12135C2E138C6725DC47"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "7938F3062264575EBBB1CBB359E496DD7A38AE0E33D1B1D9C16BDD87E6DE44DFB832286AE01D00AA14B423DBF7ECCC34A0A06A249707B75C2BA931D7F4F513FDF0F6E516"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "345B8DA85FEFD218B390828AECADF0C47916FAF44CB29010B0BB2BBA8E120B6DAFB2CC90B9D1B8659C2AFB"
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync };
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Base, Exponent, Expected;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync if ( testHexStringToNum(&Base, s_aTests[i].pszBase, RTBIGNUMINIT_F_UNSIGNED | fFlags)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync && testHexStringToNum(&Exponent, s_aTests[i].pszExponent, RTBIGNUMINIT_F_UNSIGNED | fFlags)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync && testHexStringToNum(&Expected, s_aTests[i].pszResult, RTBIGNUMINIT_F_UNSIGNED | fFlags))
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumExponentiate(&Result, &Base, &Exponent), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Result, &Expected) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Base), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Exponent), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Expected), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Result2), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic void testModExp(void)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestSub(g_hTest, "RTBigNumModExp");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTBIGNUM Result;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync for (uint32_t fFlags = 0; fFlags <= RTBIGNUMINIT_F_SENSITIVE; fFlags += RTBIGNUMINIT_F_SENSITIVE)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, fFlags), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_One, &g_One, &g_One), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_One, &g_One), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_LargePositive, &g_One), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_One, &g_Zero, &g_Five), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_Zero, &g_Five), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_Zero, &g_One), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_Zero, &g_LargePositive), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 1);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Zero, &g_Zero, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_Zero, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_LargePositive, &g_LargePositive, &g_Zero), VERR_BIGNUM_DIV_BY_ZERO);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Two, &g_Four, &g_Five), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Two, &g_Four, &g_Three), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Three, &g_Three, &g_Three), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 0) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Three, &g_Three, &g_Five), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 2) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Three, &g_Five, &g_Five), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 3) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Three, &g_Five, &g_Four), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompareWithS64(&Result, 3) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#if 0
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync static struct
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync const char *pszBase, *pszExponent, *pszModulus, *pszResult;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync } s_aTests[] =
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync "180DB4284A119D6133AE4BB0C27C27D1", /*^*/ "3A", /*mod */ " ", /* = */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync },
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync };
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTBIGNUM Base, Exponent, Expected, Modulus;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync if ( testHexStringToNum(&Base, s_aTests[i].pszBase, RTBIGNUMINIT_F_UNSIGNED | fFlags)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync && testHexStringToNum(&Exponent, s_aTests[i].pszExponent, RTBIGNUMINIT_F_UNSIGNED | fFlags)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync && testHexStringToNum(&Modulus, s_aTests[i].pszModulus, RTBIGNUMINIT_F_UNSIGNED | fFlags)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync && testHexStringToNum(&Expected, s_aTests[i].pszResult, RTBIGNUMINIT_F_UNSIGNED | fFlags))
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &Base, &Exponent, &Modulus), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(RTBigNumCompare(&Result, &Expected) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Base), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Exponent), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Expected), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Modulus), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync#endif
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&Result), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync /* Decrypt a PKCS#7 signature. */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Result, 0), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumModExp(&Result, &g_Signature, &g_PubKeyExp, &g_PubKeyMod), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTBigNumCompare(&Result, &g_SignatureDecrypted) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsyncstatic void testToBytes(void)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestSub(g_hTest, "RTBigNumToBytes*Endian");
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync uint8_t abBuf[sizeof(g_abLargePositive) + sizeof(g_abLargeNegative)];
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync memset(abBuf, 0xcc, sizeof(abBuf));
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Zero, abBuf, 1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(abBuf[0] == 0 && abBuf[1] == 0xcc);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync memset(abBuf, 0xcc, sizeof(abBuf));
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Zero, abBuf, 2), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(abBuf[0] == 0 && abBuf[1] == 0 && abBuf[2] == 0xcc);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync memset(abBuf, 0xcc, sizeof(abBuf));
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Zero, abBuf, 3), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(abBuf[0] == 0 && abBuf[1] == 0 && abBuf[2] == 0 && abBuf[3] == 0xcc);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync memset(abBuf, 0xcc, sizeof(abBuf));
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Zero, abBuf, 4), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(abBuf[0] == 0 && abBuf[1] == 0 && abBuf[2] == 0 && abBuf[3] == 0 && abBuf[4] == 0xcc);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync memset(abBuf, 0xcc, sizeof(abBuf));
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Minus1, abBuf, 1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(abBuf[0] == 0xff && abBuf[1] == 0xcc && abBuf[2] == 0xcc && abBuf[3] == 0xcc && abBuf[4] == 0xcc);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync memset(abBuf, 0xcc, sizeof(abBuf));
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Minus1, abBuf, 2), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(abBuf[0] == 0xff && abBuf[1] == 0xff && abBuf[2] == 0xcc && abBuf[3] == 0xcc && abBuf[4] == 0xcc);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync memset(abBuf, 0xcc, sizeof(abBuf));
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Minus1, abBuf, 3), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(abBuf[0] == 0xff && abBuf[1] == 0xff && abBuf[2] == 0xff && abBuf[3] == 0xcc && abBuf[4] == 0xcc);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync memset(abBuf, 0xcc, sizeof(abBuf));
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_Minus1, abBuf, 4), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(abBuf[0] == 0xff && abBuf[1] == 0xff && abBuf[2] == 0xff && abBuf[3] == 0xff && abBuf[4] == 0xcc);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync memset(abBuf, 0xcc, sizeof(abBuf));
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_LargePositive, abBuf, sizeof(g_abLargePositive)), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(memcmp(abBuf, g_abLargePositive, sizeof(g_abLargePositive)) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(abBuf[sizeof(g_abLargePositive)] == 0xcc);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync memset(abBuf, 0xcc, sizeof(abBuf));
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumToBytesBigEndian(&g_LargePositive, abBuf, sizeof(g_abLargePositive) -1 ), VERR_BUFFER_OVERFLOW);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(memcmp(abBuf, &g_abLargePositive[1], sizeof(g_abLargePositive) - 1) == 0);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK(abBuf[sizeof(g_abLargePositive) - 1] == 0xcc);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncstatic void testBenchmarks(bool fOnlyModExp)
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync{
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync RTTestSub(g_hTest, "Benchmarks");
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync /*
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync * For the modexp benchmark we decrypt a real PKCS #7 signature.
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync */
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync RTBIGNUM Decrypted;
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Decrypted, 0 /*fFlags*/), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC_RETV(RTBigNumModExp(&Decrypted, &g_Signature, &g_PubKeyExp, &g_PubKeyMod), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC_RETV(RTBigNumModExp(&Decrypted, &g_Signature, &g_PubKeyExp, &g_PubKeyMod), VINF_SUCCESS);
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync RTThreadYield();
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync int rc = VINF_SUCCESS;
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync uint32_t cRounds = 0;
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync uint64_t uStartTS = RTTimeNanoTS();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync while (cRounds < 10240)
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync rc |= RTBigNumModExp(&Decrypted, &g_Signature, &g_PubKeyExp, &g_PubKeyMod);
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync cRounds++;
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync }
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync uint64_t uElapsed = RTTimeNanoTS() - uStartTS;
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync RTTESTI_CHECK_RC(rc, VINF_SUCCESS);
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync RTTestIValue("RTBigNumModExp", uElapsed / cRounds, RTTESTUNIT_NS_PER_CALL);
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if (fOnlyModExp)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync return;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync#if 1
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync /* Compare with OpenSSL BN. */
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync BN_CTX *pObnCtx = BN_CTX_new();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync BIGNUM *pObnPubKeyExp = BN_bin2bn(g_abPubKeyExp, sizeof(g_abPubKeyExp), NULL);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync BIGNUM *pObnPubKeyMod = BN_bin2bn(g_abPubKeyMod, sizeof(g_abPubKeyMod), NULL);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync BIGNUM *pObnSignature = BN_bin2bn(g_abSignature, sizeof(g_abSignature), NULL);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync BIGNUM *pObnSignatureDecrypted = BN_bin2bn(g_abSignatureDecrypted, sizeof(g_abSignatureDecrypted), NULL);
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync BIGNUM *pObnResult = BN_new();
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync RTTESTI_CHECK_RETV(BN_mod_exp(pObnResult, pObnSignature, pObnPubKeyExp, pObnPubKeyMod, pObnCtx) == 1);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RETV(BN_ucmp(pObnResult, pObnSignatureDecrypted) == 0);
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync rc = 1;
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync cRounds = 0;
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync uStartTS = RTTimeNanoTS();
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync while (cRounds < 4096)
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync {
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync rc &= BN_mod_exp(pObnResult, pObnSignature, pObnPubKeyExp, pObnPubKeyMod, pObnCtx);
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync cRounds++;
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync }
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync uElapsed = RTTimeNanoTS() - uStartTS;
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync RTTESTI_CHECK_RC(rc, 1);
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync RTTestIValue("BN_mod_exp", uElapsed / cRounds, RTTESTUNIT_NS_PER_CALL);
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync rc = 1;
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync cRounds = 0;
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync uStartTS = RTTimeNanoTS();
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync while (cRounds < 4096)
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync {
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync rc &= BN_mod_exp_simple(pObnResult, pObnSignature, pObnPubKeyExp, pObnPubKeyMod, pObnCtx);
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync cRounds++;
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync }
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync uElapsed = RTTimeNanoTS() - uStartTS;
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync RTTESTI_CHECK_RC(rc, 1);
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync RTTestIValue("BN_mod_exp_simple", uElapsed / cRounds, RTTESTUNIT_NS_PER_CALL);
97577ef00652d41a33418bae9cac47f9ad592b72vboxsync#endif
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync /*
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync * Check out the speed of modulo.
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTBIGNUM Product;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC_RETV(RTBigNumInitZero(&Product, 0), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC_RETV(RTBigNumMultiply(&Product, &g_Signature, &g_Signature), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC_RETV(RTBigNumModulo(&Decrypted, &Product, &g_PubKeyMod), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTThreadYield();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync rc = VINF_SUCCESS;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync cRounds = 0;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uStartTS = RTTimeNanoTS();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync while (cRounds < 10240)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync rc |= RTBigNumModulo(&Decrypted, &Product, &g_PubKeyMod);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync cRounds++;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uElapsed = RTTimeNanoTS() - uStartTS;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(rc, VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIValue("RTBigNumModulo", uElapsed / cRounds, RTTESTUNIT_NS_PER_CALL);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync#if 1
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync /* Compare with OpenSSL BN. */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync BIGNUM *pObnProduct = BN_new();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RETV(BN_mul(pObnProduct, pObnSignature, pObnSignature, pObnCtx) == 1);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RETV(BN_mod(pObnResult, pObnProduct, pObnPubKeyMod, pObnCtx) == 1);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync rc = 1;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync cRounds = 0;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uStartTS = RTTimeNanoTS();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync while (cRounds < 10240)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync rc &= BN_mod(pObnResult, pObnProduct, pObnPubKeyMod, pObnCtx);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync cRounds++;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uElapsed = RTTimeNanoTS() - uStartTS;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(rc, 1);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIValue("BN_mod", uElapsed / cRounds, RTTESTUNIT_NS_PER_CALL);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync#endif
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync /*
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync * Check out the speed of multiplication.
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTThreadYield();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync rc = VINF_SUCCESS;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync cRounds = 0;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uStartTS = RTTimeNanoTS();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync while (cRounds < 10240)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync rc |= RTBigNumMultiply(&Product, &g_Signature, &g_Signature);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync cRounds++;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uElapsed = RTTimeNanoTS() - uStartTS;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(rc, VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIValue("RTBigNumMultiply", uElapsed / cRounds, RTTESTUNIT_NS_PER_CALL);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync#if 1
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync /* Compare with OpenSSL BN. */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync rc = 1;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync cRounds = 0;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uStartTS = RTTimeNanoTS();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync while (cRounds < 10240)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync rc &= BN_mul(pObnProduct, pObnSignature, pObnSignature, pObnCtx);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync cRounds++;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uElapsed = RTTimeNanoTS() - uStartTS;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(rc, 1);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIValue("BN_mul", uElapsed / cRounds, RTTESTUNIT_NS_PER_CALL);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync#endif
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync}
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync/*
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync * UInt128 tests (RTBigInt uses UInt128 in some cases.
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncstatic void testUInt128Subtraction(void)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync{
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestSub(g_hTest, "RTUInt128Sub");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync static struct
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128U uMinuend, uSubtrahend, uResult;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync } const s_aTests[] =
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 0), RTUINT128_INIT_C(0, 0), RTUINT128_INIT_C(0, 0) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 0), RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(~0, ~0) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 0) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 2), RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 1) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 2), RTUINT128_INIT_C(~0, ~0) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(2, 9), RTUINT128_INIT_C(2, 0), RTUINT128_INIT_C(0, 9) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(2, 1), RTUINT128_INIT_C(0, 2), RTUINT128_INIT_C(1, ~0) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0x0000000000000000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0xffffffffffffffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xfffffffffffffffe, 0x0000000000000001),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0xfffffffffff00000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x00000000000fffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0xffffffffffe00001),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0xffffffffffffffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x00000fffffffffff, 0xffffffffffffffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xfffff00000000000, 0x0000000000000000)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x000000251ce8fe85),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x0000000301f41b4d),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x000000221af4e338),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xfd4d22a441ffa48c, 0x170739b573a9498d),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x43459cea40782b26, 0xc8c16bb29cb3b343),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xba0785ba01877965, 0x4e45ce02d6f5964a),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync };
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128U uResult;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync PRTUINT128U pResult = RTUInt128Sub(&uResult, &s_aTests[i].uMinuend, &s_aTests[i].uSubtrahend);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if (pResult != &uResult)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIFailed("test #%i returns %p instead of %p", i, pResult, &uResult);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync else if (RTUInt128IsNotEqual(&uResult, &s_aTests[i].uResult))
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIFailed("test #%i failed: remainder differs:\nExp: %016RX64`%016RX64\nGot: %016RX64`%016RX64",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync i, s_aTests[i].uResult.s.Hi, s_aTests[i].uResult.s.Lo, uResult.s.Hi, uResult.s.Lo );
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uResult = s_aTests[i].uMinuend;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync pResult = RTUInt128AssignSub(&uResult, &s_aTests[i].uSubtrahend);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(pResult == &uResult);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTUInt128IsEqual(&uResult, &s_aTests[i].uResult));
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync}
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncstatic void testUInt128Addition(void)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync{
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestSub(g_hTest, "RTUInt128Add");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync static struct
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128U uAugend, uAddend, uResult;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync } const s_aTests[] =
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 0), RTUINT128_INIT_C(0, 0), RTUINT128_INIT_C(0, 0) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 0), RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 1) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 2) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 2), RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 3) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 2), RTUINT128_INIT_C(0, 3) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(2, 9), RTUINT128_INIT_C(2, 0), RTUINT128_INIT_C(4, 9) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(2, 1), RTUINT128_INIT_C(0, 2), RTUINT128_INIT_C(2, 3) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0x0000000000000000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0xffffffffffffffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0xffffffffffffffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0xfffffffffff00000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x00000000000ffeff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0xfffffffffffffeff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xefffffffffffffff, 0xfffffffffff00000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x00000000001fffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xf000000000000000, 0x00000000000fffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xeeeeeeeeeeeeeeee, 0xeeeeeeeeeee00000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0111111111111111, 0x11111111112fffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xf000000000000000, 0x00000000000fffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0xffffffffffffffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x00000fffffffffff, 0xffffffffffffffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x00000fffffffffff, 0xfffffffffffffffe)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0xffffffffffffffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0xffffffffffffffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0xfffffffffffffffe)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x000000251ce8fe85),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x0000000301f41b4d),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x000000281edd19d2),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xfd4d22a441ffa48c, 0x170739b573a9498d),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x43459cea40782b26, 0xc8c16bb29cb3b343),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x4092bf8e8277cfb2, 0xdfc8a568105cfcd0),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync };
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128U uResult;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync PRTUINT128U pResult = RTUInt128Add(&uResult, &s_aTests[i].uAugend, &s_aTests[i].uAddend);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if (pResult != &uResult)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIFailed("test #%i returns %p instead of %p", i, pResult, &uResult);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync else if (RTUInt128IsNotEqual(&uResult, &s_aTests[i].uResult))
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIFailed("test #%i failed: result differs:\nExp: %016RX64`%016RX64\nGot: %016RX64`%016RX64",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync i, s_aTests[i].uResult.s.Hi, s_aTests[i].uResult.s.Lo, uResult.s.Hi, uResult.s.Lo );
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uResult = s_aTests[i].uAugend;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync pResult = RTUInt128AssignAdd(&uResult, &s_aTests[i].uAddend);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(pResult == &uResult);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTUInt128IsEqual(&uResult, &s_aTests[i].uResult));
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if (s_aTests[i].uAddend.s.Hi == 0)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync pResult = RTUInt128AddU64(&uResult, &s_aTests[i].uAugend, s_aTests[i].uAddend.s.Lo);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(pResult == &uResult);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTUInt128IsEqual(&uResult, &s_aTests[i].uResult));
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uResult = s_aTests[i].uAugend;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync pResult = RTUInt128AssignAddU64(&uResult, s_aTests[i].uAddend.s.Lo);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(pResult == &uResult);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTUInt128IsEqual(&uResult, &s_aTests[i].uResult));
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if (s_aTests[i].uAugend.s.Hi == 0)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync pResult = RTUInt128AddU64(&uResult, &s_aTests[i].uAddend, s_aTests[i].uAugend.s.Lo);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(pResult == &uResult);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTUInt128IsEqual(&uResult, &s_aTests[i].uResult));
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uResult = s_aTests[i].uAddend;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync pResult = RTUInt128AssignAddU64(&uResult, s_aTests[i].uAugend.s.Lo);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(pResult == &uResult);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTUInt128IsEqual(&uResult, &s_aTests[i].uResult));
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync}
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncstatic void testUInt128Multiplication(void)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync{
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestSub(g_hTest, "RTUInt128Mul");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync static struct
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128U uFactor1, uFactor2, uResult;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync } const s_aTests[] =
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 0), RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 0) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(~0, ~0), RTUINT128_INIT_C(0, 0), RTUINT128_INIT_C(0, 0) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 1) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 2), RTUINT128_INIT_C(0, 2) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(2, 0), RTUINT128_INIT_C(2, 0), RTUINT128_INIT_C(0, 0) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(2, 1), RTUINT128_INIT_C(0, 2), RTUINT128_INIT_C(4, 2) },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x1111111111111111, 0x1111111111111111),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0, 2),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x2222222222222222, 0x2222222222222222)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x1111111111111111, 0x1111111111111111),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0, 0xf),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0xffffffffffffffff)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x1111111111111111, 0x1111111111111111),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0, 0x30000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x3333333333333333, 0x3333333333330000)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x1111111111111111, 0x1111111111111111),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0, 0x30000000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x3333333333333333, 0x3333333330000000)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x1111111111111111, 0x1111111111111111),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0, 0x3000000000000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x3333333333333333, 0x3333000000000000)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x1111111111111111, 0x1111111111111111),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000003, 0x0000000000000000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x3333333333333333, 0x0000000000000000)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x1111111111111111, 0x1111111111111111),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000300000000, 0x0000000000000000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x3333333300000000, 0x0000000000000000)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x1111111111111111, 0x1111111111111111),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0003000000000000, 0x0000000000000000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x3333000000000000, 0x0000000000000000)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x1111111111111111, 0x1111111111111111),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x3000000000000000, 0x0000000000000000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x3000000000000000, 0x0000000000000000)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync };
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128U uResult;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync PRTUINT128U pResult = RTUInt128Mul(&uResult, &s_aTests[i].uFactor1, &s_aTests[i].uFactor2);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if (pResult != &uResult)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIFailed("test #%i returns %p instead of %p", i, pResult, &uResult);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync else if (RTUInt128IsNotEqual(&uResult, &s_aTests[i].uResult))
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIFailed("test #%i failed: \nExp: %016RX64`%016RX64\nGot: %016RX64`%016RX64",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync i, s_aTests[i].uResult.s.Hi, s_aTests[i].uResult.s.Lo, uResult.s.Hi, uResult.s.Lo );
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if (s_aTests[i].uFactor2.s.Hi == 0)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync pResult = RTUInt128MulByU64(&uResult, &s_aTests[i].uFactor1, s_aTests[i].uFactor2.s.Lo);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(pResult == &uResult);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTUInt128IsEqual(&uResult, &s_aTests[i].uResult));
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if (s_aTests[i].uFactor1.s.Hi == 0)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync pResult = RTUInt128MulByU64(&uResult, &s_aTests[i].uFactor2, s_aTests[i].uFactor1.s.Lo);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(pResult == &uResult);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTUInt128IsEqual(&uResult, &s_aTests[i].uResult));
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uResult = s_aTests[i].uFactor1;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync pResult = RTUInt128AssignMul(&uResult, &s_aTests[i].uFactor2);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(pResult == &uResult);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTUInt128IsEqual(&uResult, &s_aTests[i].uResult));
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync}
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync#if 0 /* Java program for generating testUInt128Division test data. */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncimport java.math.BigInteger;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncimport java.lang.System;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncimport java.lang.Integer;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncimport java.util.Random;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncimport java.security.SecureRandom;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncclass uint128divtestgen
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync{
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncpublic static String format(BigInteger BigNum)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync{
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync String str = BigNum.toString(16);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync while (str.length() < 32)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync str = "0" + str;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync return "RTUINT128_INIT_C(0x" + str.substring(0, 16) + ", 0x" + str.substring(16) + ")";
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync}
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncpublic static void main(String args[])
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync{
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync Random Rnd = new SecureRandom();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync int cDivisorLarger = 0;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync for (int i = 0; i < 4096; i++)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync int cDividendBits = Rnd.nextInt(127) + 1;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync int cDivisorBits = i < 9 ? cDividendBits : Rnd.nextInt(127) + 1;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if (cDivisorBits > cDividendBits)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if (cDivisorLarger > i / 16)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync cDividendBits = 128 - Rnd.nextInt(16);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync else
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync cDivisorLarger++;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync BigInteger Dividend = new BigInteger(cDividendBits, Rnd);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync BigInteger Divisor = new BigInteger(cDivisorBits, Rnd);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync while (Divisor.compareTo(BigInteger.ZERO) == 0) {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync cDivisorBits++;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync Divisor = new BigInteger(cDivisorBits, Rnd);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync BigInteger[] Result = Dividend.divideAndRemainder(Divisor);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync System.out.println(" { /* i=" + Integer.toString(i) + "; " + Integer.toString(cDividendBits) + " / " + Integer.toString(cDivisorBits) + " */");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync System.out.println(" " + format(Dividend) + ", " + format(Divisor) + ",");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync System.out.println(" " + format(Result[0]) + ", " + format(Result[1]) + "");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync System.out.println(" },");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync}
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync}
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync#endif
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsyncstatic void testUInt128Division(void)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync{
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestSub(g_hTest, "RTUInt128DivMod");
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync static struct
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128U uDividend, uDivisor, uQuotient, uRemainder;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync } const s_aTests[] =
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 0), RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 0), RTUINT128_INIT_C(0, 0) }, /* #0 */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 0) }, /* #1 */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 2), RTUINT128_INIT_C(0, 0), RTUINT128_INIT_C(0, 1) }, /* #2 */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(2, 0), RTUINT128_INIT_C(2, 0), RTUINT128_INIT_C(0, 1), RTUINT128_INIT_C(0, 0) }, /* #3 */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { RTUINT128_INIT_C(2, 1), RTUINT128_INIT_C(0, 2), RTUINT128_INIT_C(1, 0), RTUINT128_INIT_C(0, 1) }, /* #4 */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { /* #5 */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0x0000000000000000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0xffffffffffffffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000001, 0x0000000000000000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x0000000000000000)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { /* #6 */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0xfffffffffff00000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x00000fffffffffff, 0xffffffffffffffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x0000000000100000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x0000000000000000)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { /* #7 */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0xffffffffffffffff, 0xffffffffffffffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x00000fffffffffff, 0xffffffffffffffff),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x0000000000100000),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x00000000000fffff)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync { /* #8 */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x000000251ce8fe85), RTUINT128_INIT_C(0x0000000000000000, 0x0000000301f41b4d),
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128_INIT_C(0x0000000000000000, 0x000000000000000c), RTUINT128_INIT_C(0x0000000000000000, 0x000000010577b6e9)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync },
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync#include "tstRTBigNum-uint128-div-test-data.h"
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync };
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync for (uint32_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTUINT128U uResultQ, uResultR;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync PRTUINT128U pResultQ = RTUInt128DivRem(&uResultQ, &uResultR, &s_aTests[i].uDividend, &s_aTests[i].uDivisor);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync if (pResultQ != &uResultQ)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIFailed("test #%i returns %p instead of %p", i, pResultQ, &uResultQ);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync else if ( RTUInt128IsNotEqual(&uResultQ, &s_aTests[i].uQuotient)
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync && RTUInt128IsNotEqual(&uResultR, &s_aTests[i].uRemainder))
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIFailed("test #%i failed on both counts", i);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync else if (RTUInt128IsNotEqual(&uResultQ, &s_aTests[i].uQuotient))
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIFailed("test #%i failed: quotient differs:\nExp: %016RX64`%016RX64\nGot: %016RX64`%016RX64",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync i, s_aTests[i].uQuotient.s.Hi, s_aTests[i].uQuotient.s.Lo, uResultQ.s.Hi, uResultQ.s.Lo );
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync else if (RTUInt128IsNotEqual(&uResultR, &s_aTests[i].uRemainder))
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTestIFailed("test #%i failed: remainder differs:\nExp: %016RX64`%016RX64\nGot: %016RX64`%016RX64",
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync i, s_aTests[i].uRemainder.s.Hi, s_aTests[i].uRemainder.s.Lo, uResultR.s.Hi, uResultR.s.Lo );
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync pResultQ = RTUInt128Div(&uResultQ, &s_aTests[i].uDividend, &s_aTests[i].uDivisor);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(pResultQ == &uResultQ);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTUInt128IsEqual(&uResultQ, &s_aTests[i].uQuotient));
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uResultQ = s_aTests[i].uDividend;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync pResultQ = RTUInt128AssignDiv(&uResultQ, &s_aTests[i].uDivisor);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(pResultQ == &uResultQ);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTUInt128IsEqual(&uResultQ, &s_aTests[i].uQuotient));
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync PRTUINT128U pResultR = RTUInt128Mod(&uResultR, &s_aTests[i].uDividend, &s_aTests[i].uDivisor);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(pResultR == &uResultR);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTUInt128IsEqual(&uResultR, &s_aTests[i].uRemainder));
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync uResultR = s_aTests[i].uDividend;
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync pResultR = RTUInt128AssignMod(&uResultR, &s_aTests[i].uDivisor);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(pResultR == &uResultR);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK(RTUInt128IsEqual(&uResultR, &s_aTests[i].uRemainder));
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync }
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync}
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsyncint main(int argc, char **argv)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync{
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTEXITCODE rcExit = RTTestInitAndCreate("tstRTBigNum", &g_hTest);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync if (rcExit != RTEXITCODE_SUCCESS)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync return rcExit;
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestBanner(g_hTest);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync /* Init fixed integers. */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestSub(g_hTest, "RTBigNumInit");
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_LargePositive, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync g_abLargePositive, sizeof(g_abLargePositive)), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_LargePositive2, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync g_abLargePositive, sizeof(g_abLargePositive) - 11), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_LargePositiveMinus1, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync g_abLargePositiveMinus1, sizeof(g_abLargePositiveMinus1)), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_LargeNegative, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync g_abLargeNegative, sizeof(g_abLargeNegative)), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_LargeNegative2, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync g_abLargeNegative, sizeof(g_abLargeNegative) - 9), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_LargeNegativePluss1, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync g_abLargeNegativePluss1, sizeof(g_abLargeNegativePluss1)), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_64BitPositive1, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync g_ab64BitPositive1, sizeof(g_ab64BitPositive1)), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInitZero(&g_Zero, 0), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_One, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x01", 1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_Two, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x02", 1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_Three, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x03", 1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_Four, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x04", 1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_Five, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x05", 1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_Ten, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x0a", 1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_FourtyTwo, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED, "\x2a", 1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_Minus1, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_SIGNED,
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync g_abMinus1, sizeof(g_abMinus1)), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_PubKeyExp, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_UNSIGNED,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync g_abPubKeyExp, sizeof(g_abPubKeyExp)), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_PubKeyMod, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_UNSIGNED,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync g_abPubKeyMod, sizeof(g_abPubKeyMod)), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_Signature, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_UNSIGNED,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync g_abSignature, sizeof(g_abSignature)), VINF_SUCCESS);
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync RTTESTI_CHECK_RC(RTBigNumInit(&g_SignatureDecrypted, RTBIGNUMINIT_F_ENDIAN_BIG | RTBIGNUMINIT_F_UNSIGNED,
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync g_abSignatureDecrypted, sizeof(g_abSignatureDecrypted)), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync testMoreInit();
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync if (RTTestIErrorCount() == 0)
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync {
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync if (argc != 2)
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync {
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync /* Test UInt128 first as it may be used by RTBigInt. */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync testUInt128Multiplication();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync testUInt128Division();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync testUInt128Subtraction();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync testUInt128Addition();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync /* Test the RTBigInt operations. */
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync testCompare();
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync testSubtraction();
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync testAddition();
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync testShift();
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync testMultiplication();
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync testDivision();
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync testModulo();
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync testExponentiation();
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync testModExp();
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync testToBytes();
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync }
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync
16dabf3bb210fd7d774fe21451900c5a9f4dae8fvboxsync /* Benchmarks */
972c3ecf2c929440ce70e51af38ba021101c8f7bvboxsync testBenchmarks(argc == 2);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync /* Cleanups. */
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTestSub(g_hTest, "RTBigNumDestroy");
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&g_LargePositive), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&g_LargePositive2), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&g_LargeNegative), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&g_LargeNegative2), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&g_Zero), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync RTTESTI_CHECK_RC(RTBigNumDestroy(&g_64BitPositive1), VINF_SUCCESS);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync }
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync return RTTestSummaryAndDestroy(g_hTest);
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync}
13493ab7596e827b8d0caab2c89e635dd65f78f9vboxsync