static void test_div_signs(void) { TB_INFO(" Testing signs of q and r"); DEF_BIGINT(n, 2048); DEF_BIGINT(d, 2048); DEF_BIGINT(q, 2048); DEF_BIGINT(r, 2048); DEF_BIGINT(v, 2048); DIV_CHECK_SIGN("53", "7", CMP_LARGER, CMP_LARGER); DIV_CHECK_SIGN("-53", "7", CMP_SMALLER, CMP_SMALLER); DIV_CHECK_SIGN("53", "-7", CMP_SMALLER, CMP_LARGER); DIV_CHECK_SIGN("-53", "-7", CMP_LARGER, CMP_SMALLER); DIV_CHECK_SIGN("123456789abcdef123456789abcdef", "fedcba98765432100", CMP_LARGER, CMP_LARGER); DIV_CHECK_SIGN("-123456789abcdef123456789abcdef", "fedcba98765432100", CMP_SMALLER, CMP_SMALLER); DIV_CHECK_SIGN("123456789abcdef123456789abcdef", "-fedcba98765432100", CMP_SMALLER, CMP_LARGER); DIV_CHECK_SIGN("-123456789abcdef123456789abcdef", "-fedcba98765432100", CMP_LARGER, CMP_SMALLER); DEL_BIGINT(n); DEL_BIGINT(d); DEL_BIGINT(q); DEL_BIGINT(r); DEL_BIGINT(v); }
static void test_div_random(void) { int i; char str[MAX_RAND_STRING_SIZE]; TB_INFO(" Testing random divisions"); DEF_BIGINT(n, 2048); DEF_BIGINT(d, 2048); DEF_BIGINT(q, 2048); DEF_BIGINT(r, 2048); DEF_BIGINT(v, 2048); for (i = 0; i < 10000; i++) { tb_set_random_value(n, str, 1); /* don't divide by zero */ do { tb_set_random_value(d, str, 1); } while (TEE_BigIntCmpS32(d, 0) == 0); TEE_BigIntDiv(q, r, n, d); TEE_BigIntMul(v, q, d); TEE_BigIntAdd(v, v, r); TB_ASSERT_BIGINT_EQ(n, v); if (TEE_BigIntCmpS32(d, 0) > 0) TB_ASSERT_BIGINT_LESS(r, d); } DEL_BIGINT(n); DEL_BIGINT(d); DEL_BIGINT(q); DEL_BIGINT(r); DEL_BIGINT(v); }
static void test_BigInt_getsetOctetString(void) { const uint8_t os1[] = { 1, 2, 3, 4 }; const uint8_t os2[] = { 1, 2, 3, 4, 5 }; const uint8_t os3[] = { 0, 1, 2, 3, 4 }; const uint8_t os4[] = { 0x11, 0x22, 0x44, 0x55, 0x66, 0x77, 0x88 }; uint8_t os_res[10]; TEE_Result res; size_t os_len; DEF_BIGINT(a, 512); DEF_BIGINT(b, 512); TB_INFO("Testing Convert to and from OctetString"); /* Test with 0x0102030405 */ TEE_BigIntConvertFromString(a, "0x0102030405"); os_len = sizeof(os_res); res = TEE_BigIntConvertToOctetString(os_res, &os_len, a); TB_ASSERT(res == TEE_SUCCESS); TB_ASSERT(sizeof(os2) == os_len && TEE_MemCompare(os2, os_res, sizeof(os2)) == 0); res = TEE_BigIntConvertFromOctetString(b, os_res, os_len, 1); TB_ASSERT(res == TEE_SUCCESS); TB_ASSERT(TEE_BigIntCmp(a, b) == 0); /* Test with 0x11224455667788 */ TEE_BigIntConvertFromString(a, "0x11224455667788"); os_len = sizeof(os_res); res = TEE_BigIntConvertToOctetString(os_res, &os_len, a); TB_ASSERT(res == TEE_SUCCESS); TB_ASSERT(sizeof(os4) == os_len && TEE_MemCompare(os4, os_res, sizeof(os4)) == 0); res = TEE_BigIntConvertFromOctetString(b, os_res, os_len, 1); TB_ASSERT(res == TEE_SUCCESS); TB_ASSERT(TEE_BigIntCmp(a, b) == 0); /* Test with static octet strings */ res = TEE_BigIntConvertFromOctetString(a, os1, sizeof(os1), 1); TB_ASSERT(res == TEE_SUCCESS); os_len = sizeof(os_res); res = TEE_BigIntConvertToOctetString(os_res, &os_len, a); TB_ASSERT(res == TEE_SUCCESS); TB_ASSERT(sizeof(os1) == os_len && TEE_MemCompare(os1, os_res, sizeof(os1)) == 0); res = TEE_BigIntConvertFromOctetString(b, os3, sizeof(os3), 1); TB_ASSERT(res == TEE_SUCCESS); TB_ASSERT(TEE_BigIntCmp(a, b) == 0); DEL_BIGINT(a); DEL_BIGINT(b); }
static void test_BigInt_getsetShort(void) { int32_t b; TEE_Result res; TB_INFO("Testing GetShort and SetShort"); DEF_BIGINT(a, 512); getsettest(a, 1); getsettest(a, -1); getsettest(a, 123); getsettest(a, -123); getsettest(a, 0x7FFFFFFF); getsettest(a, (int)0x80000000); getsettest(a, (int)0xFFFFFFFF); getsettest(a, 0); /* Testing too large BigInt */ TEE_BigIntConvertFromString(a, "0x1FFFFFFFFF"); res = TEE_BigIntConvertToS32(&b, a); TB_ASSERT(res == TEE_ERROR_OVERFLOW); mpa_wipe((mpanum) a); TEE_BigIntConvertFromString(a, "-0x1FFFFFFFFF"); res = TEE_BigIntConvertToS32(&b, a); TB_ASSERT(res == TEE_ERROR_OVERFLOW); DEL_BIGINT(a); }
static void test_div_basic(void) { TB_INFO(" Testing basic cases"); DEF_BIGINT(n, 2048); DEF_BIGINT(d, 2048); DEF_BIGINT(q, 2048); DEF_BIGINT(r, 2048); DEF_BIGINT(v, 2048); SELF_VERIFY_DIV("8111_1110_0000_0001_12345678", "8000000012345678"); DIV("0", "1", "0"); DIV("1", "1", "1"); DIV("b7fb", "5", "24CB"); DIV("124378912734891273894712890347102358129034789120374", "1984086C15FA011154C86FA68", "B73D14EC7205D3311F6E78411D"); SELF_VERIFY_DIV("124378912734891273894712890347102358129034789120374", "1984086C15FA011154C86FA68"); SELF_VERIFY_DIV("-124378912734891273894712890347102358129034789120374", "1984086C15FA011154C86FA68"); SELF_VERIFY_DIV("124378912734891273894712890347102358129034789120374", "-1984086C15FA011154C86FA68"); SELF_VERIFY_DIV("-124378912734891273894712890347102358129034789120374", "-1984086C15FA011154C86FA68"); SELF_VERIFY_DIV("12345678", "10"); SELF_VERIFY_DIV("-12345678", "10"); SELF_VERIFY_DIV("12345678", "-10"); SELF_VERIFY_DIV("-12345678", "-10"); SELF_VERIFY_DIV("12345678901234567890123456789012345678901", "10"); SELF_VERIFY_DIV("1234567890123456789012345678901234567890", "10"); SELF_VERIFY_DIV("123456789012345678901234567890123456789", "10"); DEL_BIGINT(n); DEL_BIGINT(d); DEL_BIGINT(q); DEL_BIGINT(r); DEL_BIGINT(v); }
static void large_composites(void) { TB_INFO("Large Composites"); DEF_BIGINT(x, 2048); IS_COMPOSITE("136233FDE5569"); IS_COMPOSITE("177B96388FD94D5D7EC9AE513"); IS_COMPOSITE("22770A7DC599BC90B2FF981CCB5CF05703344C8F3504189ED"); IS_COMPOSITE("0002ECD5_3B215054_2D1494A4_24D50322_EBABBBD5_DB89392A_368D7759"); IS_COMPOSITE("00000004_C8971C2B_6F7A8503_AB80749E_2BBA5BB6_B6031BD4_3564DCA8_003F0E3E_54E677A0_A4B1B615_3662B313_0C11C273_C0F94084_45B2ABB4_7D64153B_EB48C154_659FDFDE_DC496C8E_A81AA7B7_CE2B2CB1_AA7C8B40_7DE8C86F_122607B2_A226385D_9432F6CB_30B5E4DE_033E3363_D48A1865_D9BC95DC_7883D9DC_9331691A_17964979"); IS_COMPOSITE("00038AFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFEA_5C6D11ED_D2905192_C5429E6A_6D796E89_250BF563_DA53D393_25129B70_435894B5_6E337D58_66F0BEF6_63D6C26D_A889B69D_4B1508ED_63A17AFD_8BC0C5BE_09AC18B6_4B2B7D87_279D32EB_4F3375C1_0D58DF1F_7CA2147A_61CFA557_235244D4_A4700AB5_953C4C6E_D428EB5F_09F07DAE_D46A995B_8FFE48EF_B93390C9_60685A31_987879F8_18CCE9B9_816E13DE_E4BEA5CC_38C56A5D_1983425D_DD909C88_463B447F"); DEL_BIGINT(x); }
static void simple(void) { TB_INFO("Simple cases"); DEF_BIGINT(x, 2048); IS_COMPOSITE("0"); IS_COMPOSITE("1"); IS_PRIME("2"); IS_PRIME("3"); IS_PRIME("17"); IS_PRIME("FA1"); IS_COMPOSITE("FA0"); DEL_BIGINT(x); }
static void large_primes(void) { TB_INFO("Large Primes"); DEF_BIGINT(x, 2048); IS_PRIME("000136A3_52B2C7A5"); IS_PRIME("00000002_2770A7DC_599BC90B_2FF981CC_B5CF0570_3344C8F3_50418AAD"); IS_PRIME("000067E0_4F440C5F_ECCA2694_B1A4AB4F_CEC2D2B2_D286FC93_DD259D2B_36A3A00D_F3726A4D_4DFA9919_5998D92F_43DD7370_B8C079E2_3072036F_0C13F3F6_ABA1D6DF"); IS_PRIME("000BC9F7_E42CE741_32EC6933_DE1B8357_CD2AEB9E_4B8A5F26_BD233D1E_6F295555_4D2CFA97_60F3F69C_CC52E8E4_28F68C37_AD5BC70C_DB12F4DC_EF23CB10_1C36A2A7"); IS_PRIME("00000005_233FE157_B5B44102_598513AE_BB8876B0_D1791769_C8A1B0F3_6875D06F_E26951C7_372192C7_B21CAB67_ADF0D6FE_1A718FB3_FC4A5145_4DE87CD3_F852005B_AAEC35D5"); IS_PRIME("0000001A_655954FB_C4408E09_FE97EB82_5E0F0964_26B42317_A36E53FF_9608DD3F_A6610402_45906334_496987EF_B14BEA5F_7C050444_C9B22A09_EC76AF4E_BDC609D8_A90C05E9_E5AF0682_9C542DFC_F7E6B9DC_0B065659_C1816309_CD6012C3_7F8CE649_8DECF850_F33943F0_F8308140_6846D306_22E0BCE6_97E612FC_1F7A5D90_2280D6E0_3009E585"); DEL_BIGINT(x); }
static void test_modexp(void) { TEE_BigIntFMMContext *context; size_t nLen; const char *nstr; const char *xstr; const char *estr; const char *resstr; int nbitsize; TB_INFO(" Testing modular exponentiation"); DEF_BIGINT(dest, 2048); DEF_BIGINT(x, 2048); DEF_BIGINT(e, 2048); DEF_BIGINT(n, 2048); nstr = "2C8D59AF47C81AB3725B472BE417E3BF" "7AB85439AF726ED3DFDF66489D155DC0" "B771C7A50EF7C5E58FB"; nbitsize = 330; xstr = "18EE90FF6C373E0EE4E3F0AD2"; estr = "AB54A98CEB1F0AD2"; resstr = "23F455C413C2F037A8A1D06CCFD007BE" "021ABEEE4CE522990A67C65CA94922BD" "822218A79BE6A0AB00C"; MOD_EXP_TEST; nstr = "FFF1FFF1"; nbitsize = 33; xstr = "ABCDEF"; estr = "1234567"; resstr = "E9D974C2"; MOD_EXP_TEST; nstr = "C7970CEEDCC3B0754490201A7AA613CD" "73911081C790F5F1A8726F463550BB5B" "7FF0DB8E1EA1189EC72F93D1650011BD" "721AEEACC2ACDE32A04107F0648C2813" "A31F5B0B7765FF8B44B4B6FFC93384B6" "46EB09C7CF5E8592D40EA33C80039F35" "B4F14A04B51F7BFD781BE4D1673164BA" "8EB991C2C4D730BBBE35F592BDEF524A" "F7E8DAEFD26C66FC02C479AF89D64D37" "3F442709439DE66CEB955F3EA37D5159" "F6135809F85334B5CB1813ADDC80CD05" "609F10AC6A95AD65872C909525BDAD32" "BC729592642920F24C61DC5B3C3B7923" "E56B16A4D9D373D8721F24A3FC0F1B31" "31F55615172866BCCC30F95054C824E7" "33A5EB6817F7BC16399D48C6361CC7E5"; nbitsize = 2048; xstr = "63CB86776E61D83AA248100D3D5309E6" "B9C88840E3C87AF8D43937A31AA85DAD" "BFF86DC70F508C4F6397C9E8B28008DE" "B90D775661566F19502083F832461409" "D18FAD85BBB2FFC5A25A5B7FE499C25B" "237584E3E7AF42C96A07519E4001CF9A" "DA78A5025A8FBDFEBC0DF268B398B25D" "475CC8E1626B985DDF1AFAC95EF7A925" "7BF46D77E936337E01623CD7C4EB269B" "9FA21384A1CEF33675CAAF9F51BEA8AC" "FB09AC04FC299A5AE58C09D6EE406682" "B04F8856354AD6B2C396484A92DED699" "5E394AC9321490792630EE2D9E1DBC91" "F2B58B526CE9B9EC390F9251FE078D98" "98FAAB0A8B94335E66187CA82A641273" "99D2F5B40BFBDE0B1CCEA4631B0E63F3"; estr = "31E5C33BB730EC1D512408069EA984F3" "5CE4442071E43D7C6A1C9BD18D542ED6" "DFFC36E387A84627B1CBE4F45940046F" "5C86BBAB30AB378CA81041FC19230A04" "E8C7D6C2DDD97FE2D12D2DBFF24CE12D" "91BAC271F3D7A164B503A8CF2000E7CD" "6D3C52812D47DEFF5E06F93459CC592E" "A3AE6470B135CC2EEF8D7D64AF7BD492" "BDFA36BBF49B19BF00B11E6BE275934D" "CFD109C250E7799B3AE557CFA8DF5456" "7D84D6027E14CD2D72C604EB77203341" "5827C42B1AA56B5961CB2425496F6B4C" "AF1CA564990A483C93187716CF0EDE48" "F95AC5A93674DCF61C87C928FF03C6CC" "4C7D558545CA19AF330C3E5415320939" "CCE97ADA05FDEF058E6752318D8731FA"; resstr = "4F7CAEC2D0663A719DC73CF51030906D" "320E9B7AB19AAAF887EFA16E1A92C829" "D7AC7F984E792C94955EFDE31E97E716" "3D9193D3F4A4656EF94C3202DC84D499" "5D25EC33C5284635285639E7B59EB92C" "CA883348AE1F5B78098B0DE87C718CF0" "AA7BE51623A57C1DD8BD1B72E9F0FD17" "98085A5E100810C740C45DB79D391F48" "8BC4ACB3F3C24D5948A994637FF4593B" "7FA8D07F88649EFEED2840EAC47248B6" "5BD3A09A923065A0BDA0EBEB6340AAE1" "08701FEB85811D628467A8D2CCC2D888" "5DE807D0CF65B254B3435E9F844AA86F" "3795ACC2EF71DE64F55EBC638B88B964" "E5C2D55F8F7E3F00B0FC86C19C6AF1EA" "B5CC45E90D7464BA230298F660DDE812"; MOD_EXP_TEST; nstr = "000000022770A7DC599BC90B2FF981CCB5CF05703344C8F3504189ED"; nbitsize = 2048; xstr = "000000020BCFDDA4E89FE86AAC303CB3D767FE66627C797794403831"; estr = "89DC29F71666F242CBFE60732D73C15C0CD1323CD410627B"; resstr = "7202419F1301F56B6D0BF9F287D49061F6F378426A78533F"; MOD_EXP_TEST; nstr = "00000002_2770A7DC_599BC90B_2FF981CC_B5CF0570_3344C8F3_50418AAD"; nbitsize = 2048; xstr = "00000001_8D359BB6_4F9B75A9_357C8215_E1E4D5F1_764D016C_F0130738"; estr = "89DC29F7_1666F242_CBFE6073_2D73C15C_0CD1323C_D41062AB"; resstr = "1"; MOD_EXP_TEST; DEL_BIGINT(dest); DEL_BIGINT(x); DEL_BIGINT(e); DEL_BIGINT(n); }