- •1 Аналіз методів формування хешу
- •Основні поняття функцій хешування
- •Розглянемо основні вимоги до функцій хешування. Нехай, хеш-код створюється функцією н [1]: , де є повідомленням довільної довжини і є хеш-кодом фіксованої довжини.
- •Відомі атаки на функції хешування
- •Аналіз відомих функцій хешування
- •Логіка виконання sha-1. Алгоритм одержує на вході повідомлення максимальної довжини 264 бітів і створює як вихід хеш-код повідомлення довжиною 160 бітів. Алгоритм складається з таких кроків:
- •1.4 Результати проведеного аналізу функцій хешування
- •2 Розробка структури і алгоритму програмного засобу
- •2.1 Розробка структури програми та взаємодії модулів
- •2.2 Розробка алгоритму обчислення хешу на основі еліптичних кривих
- •2.3 Опис модулів з набором параметрів
- •3 Реалізація та аналіз роботи програмного засобу
- •3.1 Обґрунтування вибору засобів реалізації
- •3.2 Програмна реалізація модуля формування обчислень в скінчених полях
- •3.3 Програмна реалізація модуля формування обчислень в групі точок еліптичних кривих
- •3.4 Програмна реалізація модуля обчислення хешу на основі еліптичних кривих
- •3.5 Аналіз роботи програмного засобу
- •Висновки
- •Список використаних джерел
- •Додатки
- •Додаток г
Додатки
Додаток А
Блок-схема алгоритму функції хешування ECOH
Рисунок А.1 – Блок схема алгоритму функції хешування ECOH
Рисунок А.1 (продовження)
Рисунок А.1 (продовження)
Додаток Б
Лістинг файлу ecchash.inc
#include "ecchash.h"
uint gNT283[SECT283_SIZE] = { 0x5B042A7CEFADB307, 0x399660FC938A9016, 0xFFFFFFFFFFFFEF90, 0xFFFFFFFFFFFFFFFF, 0x0000000003FFFFFF };
uint gfT283[SECT283_SIZE] = { 0x00000000000010A1, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000008000000 };
uint gbT283[SECT283_SIZE] = { 0xF6263E313B79A2F5, 0x45309FA2A581485A, 0x19A0303FCA97FD76, 0xC8B8596DA5A4AF8A, 0x00000000027B680A };
point GT283[71] = {
{ { 0xF8CDBECD86B12053, 0x557EAC9C80E2E198,0x70B0DFEC2EED25B8, 0x8DB7DD90E1934F8C, 0x0000000005F93925 },
{ 0x13F0DF45BE8112F4, 0x350EDDB0826779C8, 0xB20D02B4516FF702, 0xFE24141CB98FE6D4, 0x0000000003676854 }},
{ { 0x4C2E1F6F891EE4F1, 0xDA1DE1818F3274A9, 0xAD8097CC55FDBE4F, 0x8C4EBCFB81CB6B66, 0x00000000004E779F, },
{ 0xC17A6DED788444C7, 0xA4892FD549495B91, 0x3585ECDE48BBD1D1, 0xA594A3D9FE9F7015, 0x00000000026B299C, } },
{ { 0x57C0277FAF7678B9, 0x13C321C7B021B85E, 0xE036088D4BC7B924, 0x8D207FF4C6B6BE10, 0x00000000069A60EB, },
{ 0xF6A066D7579AB18F, 0xE4E201C15A81F002, 0x4D2E7EED50391939, 0x719505ECA5A2E720, 0x0000000007950FC1, } },
{ { 0xBA28BA8F1D497F8A, 0x798300E93A7FB760, 0xED68212303305849, 0x2DE83066B5FE0991, 0x00000000077183EF, },
{ 0xC4C55DDFE1FBEEC7, 0x60F8D9CDF9497A98, 0x6D8FE5402CACB253, 0x0B3165FC65B13C30, 0x0000000004C1F5FA, } },
{ { 0x03B5D7BDF8B83BD3, 0x0FB1E4A878F63663, 0x4D330EB47178A26C, 0xA45D35D893FE0F6F, 0x00000000053452D6, },
{ 0x0B135FB1B7382F31, 0x3C0ED833D0E399BF, 0x4109C5D8EAA560D6, 0xB6520B2911396938, 0x00000000009494BE, } },
{ { 0xE6F242DD85535A38, 0xD363231F2A97AAED, 0x888A20EE840484C4, 0x34347DE1C22ADE70, 0x000000000232BDAA, },
{ 0x04DE662E1BD1C421, 0xF17C67623FCA78FC, 0x42318211E5A4EB9A, 0xD237F91AA8B6A8FC, 0x00000000023499EF, } },
{ { 0xC527CC5CD41024C2, 0xC929205F69786BC1, 0x08202642C2D255D1, 0xDA707E09C846884B, 0x00000000019EF584, },
{ 0x2B9685EAAA9F9220, 0xAF81949AAE125D87, 0xFB1EAB13F71FFD7C, 0x3786F8EE7A740CBB, 0x0000000006FCDDE9, } },
{ { 0xEEAA96B5C2BF7EEE, 0x93F190CC64A5CA39, 0x5D159C71FF1FF743, 0x4EE58D47C37B4B24, 0x0000000004DEADEA, },
{ 0xDDE11CFF4B52BC10, 0xFB41F3AF159926D0, 0xD119599801737F0D, 0xBD2F3282E34245EE, 0x0000000004CD0666, } },
{ { 0x995CEDCA02820BE9, 0x9BAAD61CC079CA40, 0x542206415D8E55FA, 0x90DFD75DA4003775, 0x00000000045E458B, },
{ 0xAF813B82C493FE0F, 0xF996C3722CA2E480, 0x597C56BB6CE0BDF3, 0x0FEDD8CFF1F9C3ED, 0x0000000002D82E56, } },
{ { 0x5A2E16B7B84D0EB3, 0x87BE6195FCED4BDF, 0xCCA9A54BBA61BAF5, 0xD4E29BA0567FA105, 0x00000000036E625D, },
{ 0x03E835A020EA97FD, 0xE2A22E4F33C86E9B, 0xF5AFA7B465F9B4E9, 0x7D1958963529225B, 0x00000000047CC55C, } },
{ { 0x7D3633C5D6C86B83, 0x074ECAD29EC777FF, 0x42A927E4521940D1, 0x7E11B2B8893905E2, 0x0000000004761D70, },
{ 0x9FFCD428C4917A8E, 0x84F612EE2A17C0BF, 0xC10CCF2F3AE8AE70, 0x5530CDD512B87C0B, 0x00000000077D44AC, } },
{ { 0xEFBFE4B373BECF09, 0x645A74A4D429475C, 0xE0D727BD8985B358, 0xBCEA5A60C314DB51, 0x00000000066510DE, },
{ 0x70A2C825AC1D4C10, 0x8472E72610932EE9, 0x8DF27B7F932257CC, 0xD2B8AF0F0A7880C9, 0x000000000425F105, } },
{ { 0xA42FADBF56D6171F, 0x87302BAC1ADFF700, 0x85598AECD8BE28FE, 0xC521A82969A9303D, 0x00000000013F222F, },
{ 0x1269B8C0ED772536, 0xD06ADE546B25AFB4, 0x94EECE3C5BE3F754, 0x5030DB447AD016FC, 0x0000000005404F3B, } },
{ { 0x6AC72D95EFA7FCE4, 0x52D9B69E538245DC, 0x464FE960E4C4A044, 0x453E70A895621608, 0x00000000022DA530, },
{ 0x5A5344C85AC009B4, 0x9F53A0EE5B6ED711, 0xD9BAEC65F85A28EC, 0xD808698F4D55B487, 0x0000000000255C70, } },
{ { 0x537EF6EA5688E08D, 0x1A4F03BD0C43F01F, 0xA2BB9C5045B00009, 0xC9FB27E2BEC1C357, 0x00000000037C239B, },
{ 0xF1EB5423436CE15E, 0x0E23D77DDC307C16, 0x0EA7847AF26B1A9E, 0xCD7A1A02BB933620, 0x0000000005D16348, } },
{ { 0xAACD087B3159D2FF, 0x00BD31F7DCF48E41, 0x58F0F63F3071CFD2, 0x79426B27D5829AAB, 0x0000000000160547, },
{ 0xA9E4D8162856421A, 0x6FD18877E56EBF7A, 0x829BD5055D710438, 0x8DBE3F8A121DB77E, 0x0000000007A0E944, } },
{ { 0x85BB6914ECDB524D, 0x83B3E37AAC4E2F41, 0x0F37FF11B5B2CF56, 0x574E0591B216193D, 0x00000000073408B5, },
{ 0x708A731B690332FB, 0xEB4BB196CDF33BDC, 0x9ED20B5113495BFD, 0xD83C75436FBBEC07, 0x00000000073082EE, } },
{ { 0xD2B1A8AB44D2193A, 0x839DEB80072303C4, 0x67AFFB2C841999B5, 0x2B1B5D4C67F4046F, 0x00000000069FB2D6, },
{ 0xE64C1A0D2952AC69, 0x6C52E5A2BCBEF6A2, 0xA80215BC4BFB3758, 0x3173B4ABC121D175, 0x00000000029A24B0, } },
{ { 0x6B04D74262124DDC, 0x3567733EE3F2D3A0, 0xE5142DBBF78307BB, 0x6BA5E00E1282DC73, 0x000000000468E3A3, },
{ 0xE7EDD75CCE44356E, 0xDAA5EFEA29E120D1, 0x5F6F75D44D8708E8, 0x36EB90CD14A95F1A, 0x000000000732062D, } },
{ { 0x5FE8A29FF256160E, 0x4618C263DFBE256C, 0x03283E62EFA1E640, 0xE911F1A09B6CF98D, 0x0000000005368068, },
{ 0x0D13BDB20A64A3CA, 0x25545DA607FE84BC, 0x676BADE89641073A, 0xCB1B83BC2E97BC6A, 0x00000000003B5B88, } },
{ { 0x9EB294918C33D2F8, 0x5005BB5FF6AAB946, 0xC90CA65E6A2B8ADF, 0x84585CFE17C8E46D, 0x0000000006D8A756, },
{ 0x8267D8B3133D0B36, 0x065AC59A90298A2E, 0xFED2D5FCE2582D53, 0x80F21A6C2F802404, 0x000000000414AD58, } },
{ { 0xFB08F16D7155B063, 0x0AD9D4B2DC09DB1E, 0xAD78464668BF15F2, 0x96CF58BFE760FEDD, 0x0000000001594ED5, },
{ 0xC21E708DFBEAA97A, 0x3B07F4E0C4E9C4C9, 0x9313D6EFB60A582E, 0x027651482E9CC07F, 0x00000000053D6383, } },
{ { 0x9C898F5FCB69A411, 0xC7138241ACC33819, 0x48C6A100DE82C395, 0x4C6B0F730C33080F, 0x0000000002962F62, },
{ 0x04D431AB1AB8D6A8, 0x0B5F2F7DDD433D01, 0x3005801F7D95A177, 0x098D6E0E12046F0A, 0x0000000002162EDD, } },
{ { 0x62512F04C91D5A89, 0x2F2F71380F0BD9C2, 0x20518D420807B8B2, 0x5443A054C182CA6D, 0x0000000006251F40, },
{ 0xA9E00B61BF05915B, 0x361F891DD763DE47, 0x13067697719C3476, 0x5BF81E7A1DC4EC40, 0x00000000022E9DAB, } },
{ { 0xDD4D17DA7AA28B2F, 0x156BDA6E5E4986FD, 0x890A0668A878FF97, 0x1BD88AEF69ED81A6, 0x0000000002E26307, },
{ 0x2A57ABBE160CE6A2, 0x739FE5E1EFD5C472, 0x48E13FBA3D70C55D, 0x3C1220B8337E0FED, 0x0000000005072652, } },
{ { 0xF41D3FD28C6AE5F7, 0xC272B4591650816A, 0x9A245FEB83F81135, 0x6346A38EB3652679, 0x0000000006A23C5A, },
{ 0x0C220148400DE0A6, 0x772ED69D317A385D, 0x2B87533C4782E9AD, 0xD79BA4F3DED1D11A, 0x0000000002E6F88D, } },
{ { 0x72AFD3E19D1FF938, 0xA411151386266EB0, 0x6CCCB705BF9B1B6D, 0x3492A97E153824C2, 0x00000000025BB41A, },
{ 0xFED5A75CDE428FD2, 0x2486197619F2BDC2, 0x7758D1C08A72332D, 0x8D3361F6FB7F3F22, 0x00000000052C8DF3, } },
{ { 0xC7E85C185AFBA1F4, 0x302AB6E1444AA451, 0x7AC62060EA6CBF12, 0xEC5BF943B933CF79, 0x000000000259FECF, },
{ 0x3B6FAAEA8AE7B072, 0xE581D8737A34AC0D, 0x739DFE1B99F9AB27, 0x66C35D956AC0E900, 0x0000000002D2249E, } },
{ { 0x8229F3075353D347, 0xBAE576BBC49C1591, 0x34D256FBFF966213, 0x5AF98503E8F5B7FC, 0x00000000053A3EB5, },
{ 0x9454E59C945AE4A8, 0x7E74FAE97170265D, 0x131F97730C7DE265, 0x754EF4810A9F8A36, 0x00000000034A0D82, } },
{ { 0x4896FD38B91CA7DC, 0x23A563D6AD9F0E8D, 0x8AB704A04771C088, 0xFDAAA3485717E3B7, 0x0000000006D6F6AF, },
{ 0x089D71CF23862332, 0xBB76D196E6564932, 0xF574D10B83B8AB51, 0x3EC31BBFF7AA90A6, 0x00000000033583D1, } },
{ { 0x83830FB52723710F, 0x41463976AC016E09, 0x2E8B86DB86376A1B, 0x142A240CD6A7CFF6, 0x00000000015B33AA, },
{ 0x44AD4B3F095630D0, 0xFC61E87197BDFAFE, 0xEEF94A8AF835C2B2, 0xD134AC7C8ABF5070, 0x0000000003FE564A, } },
{ { 0x1C840BBBF1C9B43C, 0x28DFB51A504E5F30, 0x3D08302E7900B2B9, 0x994ACCEE954C0276, 0x0000000005AADFCF, },
{ 0x3B4BE131F2172F97, 0xB7A31B8CC8F3573F, 0x477AAA662C63D4BA, 0x0F4FB4E86C6B1F4B, 0x00000000053AE43E, } },
{ { 0x9A821DC239EE1E13, 0xD0EA8859FDC6F3B0, 0xB67D701CDFD45BAD, 0x5C3654F3C90750F4, 0x0000000000A2335D, },
{ 0x57D8AA0F1B8FC192, 0x05FD81509A8E42D0, 0x34741D31A650EB83, 0x6881B50FD1A6F620, 0x0000000007769F5A, } },
{ { 0x5DC10FDBCAEE11B8, 0x14854ABCA587B791, 0x1FB8ED86EE596D33, 0x042C053594D72F57, 0x0000000000BEE654, },
{ 0x084EEC0791C4D50C, 0x4A537FEFC5B359FC, 0x0AF0E37A2C802598, 0xA7C6418A545D2823, 0x00000000064A82B7, } },
{ { 0x6122C95F3EA93924, 0xB3251EDD77F9DF27, 0xE244F33F3BCCA96B, 0xCF1CB07A03742242, 0x0000000006AEB2A1, },
{ 0x3973BED31A953A07, 0xCD2C7A7B97ACDA84, 0x17D3EE52E4B9004C, 0x313DCDA499D13A79, 0x000000000228AC1B, } },
{ { 0x1EE04290A317C98E, 0xDF5080762A1A8307, 0x6EC3D3668FAC27D4, 0x85B3DC0548BF2207, 0x000000000304F9EA, },
{ 0xA2BF31AC2ECF873C, 0xE70A37978FDAAEC6, 0x5EF02497D72D35DC, 0x5BBBB17A03E0B966, 0x00000000016C54F2, } },
{ { 0x923CE8599D34BFD2, 0xD2C5C5AA40A587A7, 0x32E875C2A376DE9C, 0xF937E4EAFE050EA4, 0x000000000104BE5E, },
{ 0xC5C2B27BB31AA29F, 0xDEE93FF1368DEC64, 0x189094A9434F7F94, 0x5188E087852BBD1A, 0x0000000006572C28, } },
{ { 0xB5F282BCCE3570BD, 0xF2B23054760E40FE, 0x94FB80E0C620C8CB, 0x878C0D7A020FE45E, 0x00000000056E7658, },
{ 0xCA90A652C4EF412F, 0xC5A3855A07C286A6, 0x5A64A94E55E5C431, 0x0FEB7ABD5A45660D, 0x0000000004D79AB8, } },
{ { 0xA9F65321362D0695, 0x8A455AC81BC39B3C, 0xF5D027279B3461A1, 0xD81F44E8F31F1B2B, 0x0000000007651270, },
{ 0x88D14EB3CA3D4FC3, 0xEDF87F0B58898BE5, 0xBCBC590A7D8F5FE6, 0x0D35F1596D9D8AD9, 0x0000000005FB8CC9, } },
{ { 0x08F44E66D4B5FF94, 0xE02CEE802B4C7311, 0xF6F097E79E4408C5, 0xE1B61A0A8CFFEEE0, 0x000000000590E237, },
{ 0x545EB5381E4B8E84, 0xDFAD0E2A5466FE16, 0x91B83B8F6E8C5677, 0x51D4B6087FA4E28B, 0x0000000004C28BFE, } },
{ { 0x44AB8BBF2ADC5423, 0x8F0B3E59666E28E9, 0x3719BD1CF86FC6D8, 0x2FF06D126C76C76B, 0x00000000000850DD, },
{ 0x1981E996594C9F43, 0x685B594761152519, 0x4B24AD8DBDEDFE3F, 0xE69215F6CD7A2D13, 0x0000000005557697, } },
{ { 0x649167DD38A1CEDE, 0x12FE8BCF569CCD06, 0xE8767FADB397FD27, 0xFCAD9D36A8A45EFF, 0x000000000060AA41, },
{ 0x0CB48207AFC80A62, 0xECB7CA862570FB02, 0x25D224E161426660, 0x5E879DA658D3A22F, 0x0000000002B14180, } },
{ { 0x177775BC31B56207, 0x1FC6028997355DA5, 0x9FAD03ABBEAFAAAE, 0xDB7476FC2FFEA845, 0x0000000003793907, },
{ 0xD00A921773BC803F, 0x9084738E85DACCB3, 0xE721DF6C873CDBDB, 0xF6B9EBDAAC716C83, 0x000000000040A341, } },
{ { 0x127255BB4431FB92, 0x7D6FF6B548FCDD66, 0xDCA794C936F8DEEA, 0xA13E23ACC6039B41, 0x0000000000C2D94D, },
{ 0x87993C4CBB5D2740, 0x1BE0A31863D2EE67, 0x0306E49EB8B7ED70, 0xCEECDF98D542EF62, 0x00000000019F8B03, } },
{ { 0xA3DFF2E9B10BB747, 0xEFFBB47D1B830A0E, 0x9D492AE40FEBE3C9, 0x434F9877DB82AF66, 0x0000000005BB3AA4, },
{ 0x37F02650828BA2AC, 0xDE80F8CBF3A9C592, 0x1F0A6CA37CF3F7BB, 0x57B7A3D6AFDE08C1, 0x0000000000BC10BC, } },
{ { 0xDAE21BF45E51FD0B, 0x5AFE264674CE9498, 0x43393AE6D80C48AA, 0xD60B51B7647CB9EF, 0x0000000006386159, },
{ 0x17EE6DF6F2E3F3E1, 0xD1E6F3C96D510415, 0xF49E37E343E0806D, 0xF0390703EBC2492C, 0x000000000226F169, } },
{ { 0x119C8124444E19A6, 0x4A4B450B8C851D7C, 0x261252852B60B648, 0x24C3CE785926FD2A, 0x000000000460EDDB, },
{ 0xA318AEF2140C5B57, 0xDC76062F4CC3D4CA, 0x4399EDE5B937633B, 0x602BB9BC223BE9BA, 0x0000000002DC2D0D, } },
{ { 0x28B879111FA4AFD3, 0x16325699B9A84AC0, 0x6E2CB9FC81775A63, 0xB4507617B691C8C8, 0x00000000037331F9, },
{ 0xFB69947DC37D03D9, 0x95BE857A1F4FBC74, 0x57CBD6020B2AE815, 0x7AAB1839427DCCCF, 0x0000000000D09A0D, } },
{ { 0xF9F166FAF2604505, 0x676C301C05B1FF7F, 0x7E6B4A7D25E3AE3F, 0xEFC9E939D6004BE7, 0x00000000029F5B91, },
{ 0x433F92842B1832E7, 0xCC2DF634DCA55470, 0xBE8AF6F1A5D8AC13, 0x90703DCE5338AC42, 0x000000000437B822, } },
{ { 0x2CC7E74E8637E5B3, 0x84D0B4C46272FC21, 0x9F71844C068E61E6, 0x3AB78A78ADB01330, 0x000000000215659C, },
{ 0x1ED89DE795125267, 0xB739A6C546E0DAC9, 0x1B8AF06E8D8DFD53, 0x33D4951FAEDA17B4, 0x0000000001DECEED, } },
{ { 0xD99DDFBF4D6FEA11, 0x1880374DC374D063, 0x3A594B77DC8035E9, 0xCD57861C3C9F88D6, 0x0000000007F46532, },
{ 0xEAEC11F0FD11BD70, 0x4B9B6D3723A2F91F, 0xF193B1D80F9D1793, 0x936C4676A297F745, 0x00000000050DBC87, } },
{ { 0xFF0ECF251E94F3C6, 0x4C6F1375A5A025A5, 0x7D9CF6925639BD7A, 0x9482E02AB97C98BD, 0x000000000562DDDA, },
{ 0x0BFC7FB983A02310, 0x18BCD8A03BD326DF, 0x166904A5083D25DE, 0x538420FC6D59DB86, 0x000000000145E755, } },
{ { 0xFFD0ECC33A2099DA, 0x7E511A9CA60A9B85, 0x8F8BB1EC6F749900, 0x90203BA5214E9E4D, 0x000000000763867F, },
{ 0xF75657AF11FCA950, 0x41E5DFC093BE7903, 0x29A5F246A11F0B6A, 0x9DEBD3385E237B3D, 0x00000000064F2531, } },
{ { 0xD1617DCFF6005BBC, 0x8B007104D3D18825, 0x72106F01AC7B9730, 0xFD43AF8D71DCD4CC, 0x0000000002589967, },
{ 0xF038827C841A8B0D, 0xAED42B030AFB3FFA, 0xCE5EF721A96045FA, 0xE0C75DB09F40A544, 0x00000000015A6DAA, } },
{ { 0xB8BC4D9E0BC80168, 0x9F12E92B1482F7E0, 0xD1A0F051BC1DD599, 0x9C2F239456AF910C, 0x0000000002E8C13A, },
{ 0x6B279D77906CD67B, 0x194AD84E731E0731, 0x116BE1B48CA04C44, 0x6F9E6C63B7BBAEEE, 0x0000000002D4B600, } },
{ { 0xAC667A82A9E86BF7, 0xB54CFAD782D4E0F6, 0xEFA208568EF34375, 0x21E0BB25D384C498, 0x00000000013A0B20, },
{ 0x9BCBAAC091D7F7A3, 0xF6391C707A6388F5, 0xFE62F11A48025457, 0x98D8F0E61CAA6224, 0x00000000052B299F, } },
{ { 0xE5D82D11AEE0668D, 0xEEED209FA9AA15EC, 0xA9ACC52D814ADBCB, 0xEC96665E9AA81F06, 0x00000000067D18EB, },
{ 0x078FED51AB0A73FD, 0xA64A9034A4E991BE, 0xE9C7A4DAFFE893E2, 0x4CE8BD6A1C688241, 0x0000000005ADACF0, } },
{ { 0x9E5772D9564E2E75, 0xC5566B5E7A4FF377, 0xEFB70A1EF1698F57, 0x50A47DD89DD1E7F1, 0x00000000036C261C, },
{ 0xD8EC6AE454510A5A, 0x2B048DF4C1DF9FA9, 0x1A35951D40BF4327, 0xE3D8A566FC4DC642, 0x000000000364CA8B, } },
{ { 0xD96378A9DA991F63, 0x72F4BBC395835C80, 0xA4E658874E36EB9E, 0xD68FB2559A384B81, 0x0000000002022185, },
{ 0x2AE368CB58F00517, 0x7ACB6E97CAF0E5C9, 0xBE9C12B8980F630C, 0x35DEC9E6BFE49A5C, 0x0000000003DE1043, } },
{ { 0x8A10D6F1593CC35B, 0x214B590BD732FAC8, 0x3FAD8BF3C8ED6D68, 0xFA793653C463CF32, 0x0000000005F04190, },
{ 0xFE131CB7E2002CC0, 0xE60476996B28AF18, 0x8A2AEF128DD3AEEA, 0xDFB5A5D7F35F7CD4, 0x0000000001E9E6F3, } },
{ { 0x9304C20615D2552B, 0x8E85402D053EE027, 0x6A9ECBE8DCAA99A9, 0x0EBAEC99040DA1EB, 0x0000000007031563, },
{ 0xB1996B8E144185D3, 0xCDB3B6D8C6C3A081, 0xF9B0C0CB526BFFD2, 0xE37762729B827B4A, 0x0000000003285AFC, } },
{ { 0x256BCB0B18C645FE, 0xCD9E6991CABAC7D4, 0xB69CBD9EAB7DA761, 0x2FDFCFB2B28C6781, 0x00000000054CBFBE, },
{ 0x8CBFFEC06BA02740, 0x71AF21983995CF81, 0x4E5AB0DD14F39A84, 0x76975884D6F30A18, 0x0000000007253CFF, } },
{ { 0x9D87EA0719D9E594, 0xCD04875BD671C21B, 0x59D32DDB4FCC4848, 0xF9967E8CB9C335DB, 0x0000000004BA8BD8, },
{ 0x5D6DFFB71A71FD88, 0xAA8C0A58E84262E4, 0xC33F9D85BE389410, 0x71812745249B7E51, 0x00000000070F3094, } },
{ { 0x64EA1C059B1D9297, 0xB75664BB8DCA7B81, 0x596F234902D098DA, 0x03F22EA568ACA88B, 0x0000000002146C89, },
{ 0x045A5B1BABEF9240, 0x25891E20187CEC31, 0x7767D2E2E4D18E3A, 0x31C1B1C7210DA867, 0x00000000026B2DDE, } },
{ { 0x0F19FED930094A47, 0xF62960A32F398E0E, 0x00CA817B03AAC3CF, 0x8C02EC47A26A0396, 0x00000000059C553E, },
{ 0x77EDF9445CBE570F, 0x16869CE6645659B2, 0xAE7F88F0E9B21F3A, 0xA26CB01609FA7670, 0x0000000000B86183, } },
{ { 0xBEE855FD999EA678, 0x2DC584A46E7A4CE4, 0x565BAC55A8C9BA45, 0x4A55F9B1EBE76481, 0x00000000008DDF2E, },
{ 0x58154F9CA7114F9B, 0x493FC9FADB05C6A7, 0x10C34775F638980C, 0x45EA2CC9390AE795, 0x0000000000B57978, } },
{ { 0x401654EACA80F9C8, 0xEF68C1B007CB7EAB, 0x88CC5CFEE3FA278D, 0x653119F70DBDFB69, 0x000000000241E820, },
{ 0x7FE899BE912B5BB0, 0x1DAC9F15E335CDCE, 0x7EA3BC23115A88FD, 0x42C37AB945C59B28, 0x00000000040023D2, } },
{ { 0xB18FC480565FEF42, 0xFCCC24F9D345FF0E, 0x89CD26F6E0C686B8, 0x2826249415E6368B, 0x0000000000CCD660, },
{ 0xDAA114B34E9EDD28, 0xEB75B1053E3DA010, 0x6FD77581298AC7F4, 0xA3739CF535F43681, 0x0000000006416B9F, } },
{ { 0x1B97C2731E799645, 0x6A5EEFB5868BB8F5, 0xBFFBF7D6411C86B6, 0xA95FA463FB08E16B, 0x0000000000210CA6, },
{ 0x2DECC9D4821CE3FF, 0xE4EA32E9BC55E16E, 0x0E33851297597119, 0x69E97911CC613CB5, 0x0000000000C3121E, } },
{ { 0x90D19E5E6278822A, 0x41E911756FA3D605, 0x36E5F24F068865EF, 0x9430AEA7A12B567B, 0x00000000036AD99D, },
{ 0x1D3A592B5B326110, 0x0AC69CB892338A68, 0x01DD771C53530441, 0xC2371179A94E3979, 0x0000000007E19A3F, } },
{ { 0x5CCCB2073AE94266, 0x6C8ED79BF023973C, 0x1FB880B6DD1E179C, 0x9F1819A610276910, 0x000000000544C85A, },
{ 0x1ED7230FD6F9B26D, 0x8B5A421A98A5CF95, 0x1444F302C38B554D, 0x243E0211D25B172F, 0x00000000049F2F20, } }
};
};
#endif
uint ga = 1;
curve sect283r1 = { SECT283_SIZE, 1, gbT283, gNT283, gfT283, GT283 };
#ifdef _x64_
uint BIT[64] =
{ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000,
0x10000, 0x20000, 0x40000, 0x80000, 0x100000, 0x200000, 0x400000, 0x800000,
0x1000000, 0x2000000, 0x4000000, 0x8000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000,
0x0100000000, 0x0200000000, 0x0400000000, 0x0800000000, 0x1000000000, 0x2000000000, 0x4000000000, 0x8000000000,
0x10000000000, 0x20000000000, 0x40000000000, 0x80000000000, 0x100000000000, 0x200000000000, 0x400000000000, 0x800000000000,
0x1000000000000, 0x2000000000000, 0x4000000000000, 0x8000000000000, 0x10000000000000, 0x20000000000000, 0x40000000000000, 0x80000000000000,
0x100000000000000,0x200000000000000,0x400000000000000,0x800000000000000,0x1000000000000000,0x2000000000000000,0x4000000000000000,0x8000000000000000
};
#else
uint BIT[32] =
{ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000,
0x10000, 0x20000, 0x40000, 0x80000, 0x100000, 0x200000, 0x400000, 0x800000,
0x1000000,0x2000000,0x4000000,0x8000000,0x10000000,0x20000000,0x40000000,0x80000000
};
#endif
uchar BMASK[] = { 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE };
uchar TBIT[] = { 0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
/*****************************************************************************/
/*
/* Look-up table used to speed up squaring of polynomials, based on the
/* following computations.
/*
/* BYTE: a_7 a_6 a_5 a_4 a_3 a_2 a_1 a_0
/* to
/* SHORT: 0 a_7 0 a_6 0 a_5 0 a_4 0 a_3 0 a_2 0 a_1 0 a_0
/*
/*****************************************************************************/
uint F2X2[] = {
0x0000, 0x0001, 0x0004, 0x0005, 0x0010, 0x0011, 0x0014, 0x0015,
0x0040, 0x0041, 0x0044, 0x0045, 0x0050, 0x0051, 0x0054, 0x0055,
0x0100, 0x0101, 0x0104, 0x0105, 0x0110, 0x0111, 0x0114, 0x0115,
0x0140, 0x0141, 0x0144, 0x0145, 0x0150, 0x0151, 0x0154, 0x0155,
0x0400, 0x0401, 0x0404, 0x0405, 0x0410, 0x0411, 0x0414, 0x0415,
0x0440, 0x0441, 0x0444, 0x0445, 0x0450, 0x0451, 0x0454, 0x0455,
0x0500, 0x0501, 0x0504, 0x0505, 0x0510, 0x0511, 0x0514, 0x0515,
0x0540, 0x0541, 0x0544, 0x0545, 0x0550, 0x0551, 0x0554, 0x0555,
0x1000, 0x1001, 0x1004, 0x1005, 0x1010, 0x1011, 0x1014, 0x1015,
0x1040, 0x1041, 0x1044, 0x1045, 0x1050, 0x1051, 0x1054, 0x1055,
0x1100, 0x1101, 0x1104, 0x1105, 0x1110, 0x1111, 0x1114, 0x1115,
0x1140, 0x1141, 0x1144, 0x1145, 0x1150, 0x1151, 0x1154, 0x1155,
0x1400, 0x1401, 0x1404, 0x1405, 0x1410, 0x1411, 0x1414, 0x1415,
0x1440, 0x1441, 0x1444, 0x1445, 0x1450, 0x1451, 0x1454, 0x1455,
0x1500, 0x1501, 0x1504, 0x1505, 0x1510, 0x1511, 0x1514, 0x1515,
0x1540, 0x1541, 0x1544, 0x1545, 0x1550, 0x1551, 0x1554, 0x1555,
0x4000, 0x4001, 0x4004, 0x4005, 0x4010, 0x4011, 0x4014, 0x4015,
0x4040, 0x4041, 0x4044, 0x4045, 0x4050, 0x4051, 0x4054, 0x4055,
0x4100, 0x4101, 0x4104, 0x4105, 0x4110, 0x4111, 0x4114, 0x4115,
0x4140, 0x4141, 0x4144, 0x4145, 0x4150, 0x4151, 0x4154, 0x4155,
0x4400, 0x4401, 0x4404, 0x4405, 0x4410, 0x4411, 0x4414, 0x4415,
0x4440, 0x4441, 0x4444, 0x4445, 0x4450, 0x4451, 0x4454, 0x4455,
0x4500, 0x4501, 0x4504, 0x4505, 0x4510, 0x4511, 0x4514, 0x4515,
0x4540, 0x4541, 0x4544, 0x4545, 0x4550, 0x4551, 0x4554, 0x4555,
0x5000, 0x5001, 0x5004, 0x5005, 0x5010, 0x5011, 0x5014, 0x5015,
0x5040, 0x5041, 0x5044, 0x5045, 0x5050, 0x5051, 0x5054, 0x5055,
0x5100, 0x5101, 0x5104, 0x5105, 0x5110, 0x5111, 0x5114, 0x5115,
0x5140, 0x5141, 0x5144, 0x5145, 0x5150, 0x5151, 0x5154, 0x5155,
0x5400, 0x5401, 0x5404, 0x5405, 0x5410, 0x5411, 0x5414, 0x5415,
0x5440, 0x5441, 0x5444, 0x5445, 0x5450, 0x5451, 0x5454, 0x5455,
0x5500, 0x5501, 0x5504, 0x5505, 0x5510, 0x5511, 0x5514, 0x5515,
0x5540, 0x5541, 0x5544, 0x5545, 0x5550, 0x5551, 0x5554, 0x5555,
};
uint F2X22[] = {
0x00000000, 0x00010000, 0x00040000, 0x00050000, 0x00100000, 0x00110000, 0x00140000, 0x00150000,
0x00400000, 0x00410000, 0x00440000, 0x00450000, 0x00500000, 0x00510000, 0x00540000, 0x00550000,
0x01000000, 0x01010000, 0x01040000, 0x01050000, 0x01100000, 0x01110000, 0x01140000, 0x01150000,
0x01400000, 0x01410000, 0x01440000, 0x01450000, 0x01500000, 0x01510000, 0x01540000, 0x01550000,
0x04000000, 0x04010000, 0x04040000, 0x04050000, 0x04100000, 0x04110000, 0x04140000, 0x04150000,
0x04400000, 0x04410000, 0x04440000, 0x04450000, 0x04500000, 0x04510000, 0x04540000, 0x04550000,
0x05000000, 0x05010000, 0x05040000, 0x05050000, 0x05100000, 0x05110000, 0x05140000, 0x05150000,
0x05400000, 0x05410000, 0x05440000, 0x05450000, 0x05500000, 0x05510000, 0x05540000, 0x05550000,
0x10000000, 0x10010000, 0x10040000, 0x10050000, 0x10100000, 0x10110000, 0x10140000, 0x10150000,
0x10400000, 0x10410000, 0x10440000, 0x10450000, 0x10500000, 0x10510000, 0x10540000, 0x10550000,
0x11000000, 0x11010000, 0x11040000, 0x11050000, 0x11100000, 0x11110000, 0x11140000, 0x11150000,
0x11400000, 0x11410000, 0x11440000, 0x11450000, 0x11500000, 0x11510000, 0x11540000, 0x11550000,
0x14000000, 0x14010000, 0x14040000, 0x14050000, 0x14100000, 0x14110000, 0x14140000, 0x14150000,
0x14400000, 0x14410000, 0x14440000, 0x14450000, 0x14500000, 0x14510000, 0x14540000, 0x14550000,
0x15000000, 0x15010000, 0x15040000, 0x15050000, 0x15100000, 0x15110000, 0x15140000, 0x15150000,
0x15400000, 0x15410000, 0x15440000, 0x15450000, 0x15500000, 0x15510000, 0x15540000, 0x15550000,
0x40000000, 0x40010000, 0x40040000, 0x40050000, 0x40100000, 0x40110000, 0x40140000, 0x40150000,
0x40400000, 0x40410000, 0x40440000, 0x40450000, 0x40500000, 0x40510000, 0x40540000, 0x40550000,
0x41000000, 0x41010000, 0x41040000, 0x41050000, 0x41100000, 0x41110000, 0x41140000, 0x41150000,
0x41400000, 0x41410000, 0x41440000, 0x41450000, 0x41500000, 0x41510000, 0x41540000, 0x41550000,
0x44000000, 0x44010000, 0x44040000, 0x44050000, 0x44100000, 0x44110000, 0x44140000, 0x44150000,
0x44400000, 0x44410000, 0x44440000, 0x44450000, 0x44500000, 0x44510000, 0x44540000, 0x44550000,
0x45000000, 0x45010000, 0x45040000, 0x45050000, 0x45100000, 0x45110000, 0x45140000, 0x45150000,
0x45400000, 0x45410000, 0x45440000, 0x45450000, 0x45500000, 0x45510000, 0x45540000, 0x45550000,
0x50000000, 0x50010000, 0x50040000, 0x50050000, 0x50100000, 0x50110000, 0x50140000, 0x50150000,
0x50400000, 0x50410000, 0x50440000, 0x50450000, 0x50500000, 0x50510000, 0x50540000, 0x50550000,
0x51000000, 0x51010000, 0x51040000, 0x51050000, 0x51100000, 0x51110000, 0x51140000, 0x51150000,
0x51400000, 0x51410000, 0x51440000, 0x51450000, 0x51500000, 0x51510000, 0x51540000, 0x51550000,
0x54000000, 0x54010000, 0x54040000, 0x54050000, 0x54100000, 0x54110000, 0x54140000, 0x54150000,
0x54400000, 0x54410000, 0x54440000, 0x54450000, 0x54500000, 0x54510000, 0x54540000, 0x54550000,
0x55000000, 0x55010000, 0x55040000, 0x55050000, 0x55100000, 0x55110000, 0x55140000, 0x55150000,
0x55400000, 0x55410000, 0x55440000, 0x55450000, 0x55500000, 0x55510000, 0x55540000, 0x55550000,
};
#ifdef _x64_
uint W_MASK[] = {
0x000000000000000F, 0x00000000000000F0, 0x0000000000000F00, 0x000000000000F000, 0x00000000000F0000, 0x0000000000F00000, 0x000000000F000000, 0x00000000F0000000,
0x0000000F00000000, 0x000000F000000000, 0x00000F0000000000, 0x0000F00000000000, 0x000F000000000000, 0x00F0000000000000, 0x0F00000000000000, 0xF000000000000000
};
uint HT283[141][SECT283_SIZE] = {
{ 0x0C1CF0B2B854C5D1, 0xF7436D5CE12272D6, 0xF1015C5383EF1108, 0xF6BD1082293BED64, 0x000000000683E87F, },
{ 0x86A886B5BA3B913F, 0xC7A4F31FFFEF93BE, 0x56A50BB05D8180B6, 0x36F9105D490CBF61, 0x00000000021BA4CD, },
{ 0x4F631AE804541CB7, 0x4ABA91FBDDD41773, 0xAD1C64A7A08233AD, 0x77B80AC96868FDC8, 0x0000000001048353, },
{ 0xF00F2BCE86BD26A5, 0x9FF678AE80F9AFB1, 0xD8ED49E4E83E8092, 0x83D82636F73B642D, 0x0000000004D9DBF5, },
{ 0x687836150B241D15, 0x283095616E276F01, 0x0464E3E9F7EBB33F, 0x39FF79E353919120, 0x000000000451BE95, },
{ 0x230A6895FD84DDDC, 0x0D1D629B7C2F4BA3, 0x2BC81D27F7345199, 0x615726E1A3596F9C, 0x00000000025A338F, },
{ 0xA5BF54F0974C42DE, 0x8FADE2608F822B84, 0x691D0CFCFF6FD1B7, 0x1D23C843227E746F, 0x00000000070F62AF, },
{ 0xCE85CE93E39C3E38, 0x70FAE09C08F52051, 0x0A0451FF44C9C03D, 0xAE1F0030CC3A6FF0, 0x00000000018C666A, },
{ 0xEED0B0B0B11B8E42, 0xEF94667E91C8FDBF, 0x52C1E859AA6B3389, 0x0F0669BE1A9D2E41, 0x00000000064A1A58, },
{ 0xD112C42A46B9E78D, 0xE765240EC9ED22EE, 0x81A8FC704604D175, 0xD2B5B247FBFF7930, 0x0000000001CDE700, },
{ 0xEA386D059B9BCBD6, 0x389D9D8ED3090726, 0x335F68573C4E80AA, 0x0A2DA3DC11271326, 0x00000000021B20B4, },
{ 0x8EC6F1654E01459C, 0x2810D1D3D07234C6, 0x48A7D6E24D0C22A1, 0x516496744C121430, 0x00000000035E5D71, },
{ 0xB565786B89957851, 0x043E2979FD7FB5F1, 0x43E86D71A13C80D3, 0x9AB93EE5F30AA389, 0x000000000397D1F9, },
{ 0x65CC1BEC27E49056, 0x5CABD0FE2C179A3B, 0x0F5CC45B53304003, 0x117310734E2CB3E0, 0x0000000000000005, },
{ 0x938A3CD559FE8A70, 0x96B8AF3FF0802D0E, 0xA55D17C47989805C, 0xBD28BA2AB2A00294, 0x0000000003973D12, },
{ 0x76965E92CB3A888C, 0x15E8DB19431F20FC, 0xF5C45F25AF89B39F, 0x8A6EE345207B37D1, 0x0000000007C67856, },
{ 0x6E9AD651CCDB28A0, 0xCFA3234E159FB1FD, 0x0307D13F6C1B00FA, 0x4663FFEE3F9D7A54, 0x0000000000007EEE, },
{ 0x12A9D3DD3C5C7939, 0x29544932503CFE4F, 0xA798915BF7BCA22B, 0xA6828EE107C1D020, 0x00000000078787C6, },
{ 0x37C1004611A93D0D, 0xE919CF83C10EE207, 0x838DE6C3092AD1F6, 0xC9DD858CEA8DBB0E, 0x0000000001CD8E90, },
{ 0xFED8255FCD615CEF, 0x22179EB4322FDB55, 0x5113FF0652EF801A, 0xA9817AEA587E7ABB, 0x00000000018CE775, },
{ 0xEBFA9FAF2EA647C8, 0x730BC2943D4024E5, 0xA2EBE37266E680F0, 0x2250D09DA3D2C74E, 0x0000000000007EAA, },
{ 0xD62AA7CD92F19A7D, 0xDBF4C75EB57104B2, 0x9DB2C68DCDAA3374, 0x3FAB15FA7362DFC3, 0x000000000451ACCC, },
{ 0x81BADCE2F1785A6D, 0xAA01C0EA2E13149D, 0x8D441AE47C36C019, 0xC3F43061BA8FBC00, 0x0000000006C2FF61, },
{ 0x6A447ED8B026893B, 0x34CBDBA44ED0EF24, 0x6D8ECF4DCDF2404E, 0x99CC4D5EC98B2FF4, 0x0000000004D9A12E, },
{ 0xB1901E3E73923B90, 0x9623A16DB3FDB9F1, 0x3606F71562D23368, 0xD51F0A78309B3A7C, 0x0000000000881EF8, },
{ 0x4F5D639262FC5C90, 0x78CEDB8ED0F54695, 0xD4DF65A6C2575121, 0x8305375615C61C1B, 0x0000000006836934, },
{ 0x29F0670EA54B5E97, 0xB450F0F484569DB9, 0x51C6B4BAB927910C, 0x5DDED6508DD2C9E7, 0x000000000514C633, },
{ 0x2BB3B8547313BD0C, 0xD4EC7EB60AB483E9, 0x9B51D911A6CAD111, 0xB339C996FB375DF9, 0x0000000001CD7406, },
{ 0x7A9A6DD6C707072A, 0x5299C96761AAAE0D, 0x055A980B4483118D, 0x663E165AC829ACA8, 0x00000000025A329D, },
{ 0x82021172C528B3A2, 0x63AC8DD98178AE1B, 0x57D995E69FF92268, 0x760D915FF277887F, 0x0000000001456BFD, },
{ 0x28334946416508BE, 0x83DB9F73ED93FFB0, 0xD2A371E2ABAAA208, 0x30796F21CAD48099, 0x00000000060B65D1, },
{ 0xB2674FA4BF8A34E8, 0x2FFABBD44E2D9436, 0x45220D60BE034029, 0x100495506564942F, 0x00000000021B4924, },
{ 0x9EC7FC4DE492A109, 0x6A8F22D9AF3A97C0, 0xCDC09BD6B82951C7, 0x44C4CF96E26FB7A5, 0x000000000514BDFF, },
{ 0x80DB89BFAC0D46A1, 0x3FBF0495B18153CD, 0x5DBEE307B126A218, 0x40BD8E178FFA3A95, 0x000000000410ACBC, },
{ 0x0FBD33E8D48BD2E8, 0x2B8E99BAE345956E, 0xC4C38D0A7756E2F1, 0x622C91CE9935085A, 0x00000000060B1B3A, },
{ 0x2317D2452D77D3FF, 0x4809117F706DB8BA, 0x3FB8074CA2EE1101, 0x2BDAD81E6B72CB0E, 0x000000000514C662, },
{ 0x7E53806CAE563421, 0x78181D1DDCF5B740, 0x1ED79E09A070A20F, 0x46B7EC8B9CB60B4F, 0x000000000410ADAB, },
{ 0xD8F86245AF5A5099, 0xB39558C5E28800AC, 0x8AF1E90A791762FA, 0xE580E5284268FC28, 0x00000000059CB008, },
{ 0x403D460CC3F53FA3, 0x6A9E6B3AD5A62571, 0x3B60861E6B308010, 0x0BC6ABDBFC869A13, 0x000000000555D17C, },
{ 0x7151D4717F568DD7, 0xC87D56512FB510FD, 0xA2F7530CB6AB223B, 0x209A7701168542AC, 0x00000000060BE5DC, },
{ 0xCA648F717E57DDB4, 0x28EF10AC96891E24, 0xED2F8A9ECF4CB3EB, 0x181380E42B1EA5F8, 0x0000000004514125, },
{ 0x0C60675A8BAEC55D, 0xD6A5964EF28873CB, 0x33140B08727651F1, 0x77CD531C43586D28, 0x00000000025AA0D9, },
{ 0x0FADF01FE0E39989, 0x9BBCE69820F26949, 0xC55C12771FB351EB, 0x78C17453585C7E47, 0x000000000514B98E, },
{ 0xA42B5F91101BF886, 0x017595B0440723FF, 0x555C2F7AD34EC0C3, 0xD07F934F4AB96CB6, 0x00000000039755D0, },
{ 0xC0454E448790E9D0, 0x8B09F4CA11FC122F, 0x278017DF4DAE4053, 0xE04FE8FBF4FCF27B, 0x00000000018C7003, },
{ 0x28F640B2758A33F0, 0x49831FE2C62A2061, 0xD2FCB6B7D20340BA, 0xB27617C1DAFAE4BB, 0x00000000018C0FEA, },
{ 0x17B2189B64E8A1E5, 0xB785AA8B91FD7154, 0x89E9E78327D191BC, 0xF499A43E21DFF11C, 0x0000000003D6D18C, },
{ 0xD00F135545E34443, 0x2E309C06578922A2, 0xDAF19BECA2873345, 0x4B81FC4D88FABA9E, 0x00000000064AE4AA, },
{ 0x8E170CFD119BC3E4, 0x31BD26721EE17DD4, 0x49180893638591F2, 0xBB354432E2D3C247, 0x0000000003D646EF, },
{ 0xEF2A81DCC2C613BC, 0x3494AEDDEFB1C7C8, 0xE7611E8DBC68809A, 0x01521192732A23C7, 0x00000000074E70C2, },
{ 0x3B1A2EB2E8654079, 0xCFE376FA113E1FE1, 0x914234A1FA0C1117, 0xBBE311C655A493F2, 0x000000000498A46C, },
{ 0x0A46692449EAF051, 0xE2CBF082A7568CBC, 0x1197F1F6BED4803D, 0xCEA7A283C2F34BF4, 0x000000000397AE05, },
{ 0x790580162CC96B1F, 0x1153F93BD1AF9270, 0x8189B2AA29CD6249, 0x22F3DDFD2BC5471D, 0x000000000410BFA3, },
{ 0x4786EFD001332B07, 0x75780EF24CC3E2B3, 0x31EE648BD75800ED, 0x8DF6C86EF053434B, 0x00000000018C99CA, },
{ 0xB4E228CAA5C8B9E9, 0xE8EE839A961F3267, 0x6E2BFA25FC3A2221, 0x6E92476A5D9110AD, 0x000000000410A9DE, },
{ 0x6CF79FE291580DBE, 0xCB43B1EF024F0122, 0xDC628F50FE7BC029, 0x3B579ACE8ADCF564, 0x0000000000000460, },
{ 0xF1EFD4E5D9F10FCF, 0xE0BCA5EE46908BDD, 0x997D4FF04D9A40AE, 0xC1B7C7B8DF565695, 0x000000000397C697, },
{ 0xCB304201BBBB9029, 0x1DFD93B941BF1518, 0x1A6698D74DC891DE, 0x1BFAFFCA83261361, 0x00000000070FF1F8, },
{ 0x2D2E1F71D8FC73D2, 0x6BF4D9534503C3FC, 0x8B2D2ACC04BCA238, 0xA927766FC51ABC8A, 0x0000000002D256BF, },
{ 0x482A8760EC9D983E, 0xF9EF9F7030BE12A2, 0x920701231888A23F, 0x7970F974D6731B89, 0x00000000060B60E7, },
{ 0xEA6067F768A30F23, 0xBAEC44ABB4C80895, 0xF82A82FFA3E28098, 0x609BE162178384FD, 0x000000000555B8A9, },
{ 0xA574A92427D0A517, 0x952D14582BC6CF02, 0xBC8B9FBA0C695160, 0x3DA8763372EDB26F, 0x00000000070F9D1A, },
{ 0x4A428AD87D8311E9, 0xC77E667E20ACC25F, 0x23C195642AC22261, 0x18F747459231929D, 0x000000000410BBC2, },
{ 0x882CDFDB7A661B8F, 0x9C05C79FA5CD6BEC, 0x4AE1F943B5A39191, 0xCC8F38DF9FB34534, 0x00000000068380A9, },
{ 0xA6EA70CE59368BB1, 0xF9F9B45016F0A941, 0xEFA2697AA1A3337C, 0x8989C4EEDCBFA94B, 0x0000000000889AC1, },
{ 0x94E1729B12B52409, 0x2037957E2728FF23, 0x560ECEB681183321, 0x24F67DE42D368C74, 0x00000000031FA7D2, },
{ 0xEF01F6528719BF75, 0xADB6E4F90AF9F195, 0xDD4BE76D6402C0AE, 0x3DC175760E786A44, 0x000000000555BD9E, },
{ 0x86D7C6153285DAFE, 0xF68ED9E192461097, 0xD3DE7058F396D153, 0x290B6E23CDEE311F, 0x00000000070F1D17, },
{ 0xF54AC3543736C4D0, 0x1A9CBC274AFCA2F1, 0x39D9BA2B3CA7227D, 0x9955406B5A055377, 0x00000000078711E7, },
{ 0xFBC5767D11D8CB7F, 0xD2AD35FBE3E9693D, 0xBD2ACDCF6BA411F4, 0x5FDD5B898D4908BC, 0x000000000514B8D9, },
{ 0xC2A720E10DC8B303, 0xCB1926B991EF8B97, 0xF14A93D2043A22D0, 0x089581C48B2BB66B, 0x0000000001458220, },
{ 0x0B52A27CE5A77657, 0x0AA7EF24CBECD64A, 0x00BC62BB3A25E22E, 0x19E30A26C465C03D, 0x000000000410A98B, },
{ 0x57BA429FFC82767A, 0x20C1D7113602B150, 0xD70DF7C01B8751C3, 0xE44CA21AB2F3C651, 0x0000000003D643CD, },
{ 0xC9A85F5700F54392, 0xFA7E4B75235862B2, 0x960A747FCE34D10F, 0xFF71D9F495E107E8, 0x0000000003D63814, },
{ 0xC720A7023DA86325, 0x6BF6C3028519E6BA, 0x838CEC24406FE20A, 0xA9833C6B49274E44, 0x0000000002D2D6B3, },
{ 0x849348FDA0F48CA8, 0xBA84EE68FA9FBA28, 0x4BD4A4194BE333EB, 0x7301891CB0F685EF, 0x00000000031F5934, },
{ 0xA2E5C7E5177CE4B8, 0xEE4800D308424569, 0x3DD65FA21447C025, 0xDA213E9370D2CFCD, 0x00000000018C6728, },
{ 0x79D87EB1E3C9863C, 0x666B45686ED2CE07, 0xFD8F8F57205BE298, 0x414913A525F40A7E, 0x0000000001451557, },
{ 0x19D60B60145AEA69, 0x0149AD2851A469A1, 0xEDBA8631F3CCE2A1, 0x5E8F3D1BFB770002, 0x00000000060B8D0F, },
{ 0xDDB6DAE813852343, 0x6FB89EE31031013E, 0x545552E626825162, 0x42DB6AAAB705113A, 0x000000000041850F, },
{ 0x1C49DF3D1CD8903F, 0x7FD4F6724E87E2A5, 0xE6A351672A80A203, 0x1AB7FD29A2F31D0C, 0x00000000060BE0BF, },
{ 0xCE54E147D14CDE57, 0xCC82638EBD55A114, 0x13AE795597DDE200, 0x20D2F2D432539ED2, 0x000000000410ADFE, },
{ 0x283520B6C9A6C811, 0x846164E36C3DF080, 0x5C16922CFE54F392, 0xE391043157AE6004, 0x000000000293A879, },
{ 0x9EBF3B2D3235842D, 0x5E7AB7CBEEA1501C, 0xEC4D3666EDE311C6, 0xADF13E1A3539EE8D, 0x0000000003D6C6F7, },
{ 0x137BA1EA37B8CD19, 0x8E4141A6F0DFD089, 0x392F36CCFCAC00AB, 0xD7F5A4F4988C3F4D, 0x000000000397C686, },
{ 0xC393E5D79CD18C3A, 0x1345D2B405A8D58A, 0x9A6717C6D2E3229B, 0xED09A62D8FA3D441, 0x0000000002D23B0E, },
{ 0x96E64E809D95930A, 0x5AAFCC5D6D51976A, 0x3A8ABD689AC3B371, 0x5C0097273A509666, 0x00000000064A64B2, },
{ 0xAE336BADC9D2E96E, 0x36EB0826311DCE36, 0x78A03521F94CE2EA, 0x9005057920635217, 0x0000000007877965, },
{ 0x00BD54AA2D09ADC0, 0x5BDE3D8B792732CA, 0xDC150F32C473119F, 0x272343AF8BABA5AD, 0x00000000070F66CE, },
{ 0xD84ABB9395A3F740, 0x8B519E1A461B10C5, 0xD05241A56C3D1164, 0x6017AC33C36BAA18, 0x00000000070F1821, },
{ 0x65B5520B0396EF8C, 0x629713638FE73308, 0xDEC64B61954CD15F, 0xA76AD6E6AE3A6AF2, 0x0000000001CD664E, },
{ 0x7EDFF078C2F10EAF, 0x5F89A839F73D0E57, 0x4FE997275BF3F334, 0x9EEFB9D1D274042A, 0x000000000088889D, },
{ 0xAF8391F02C7A279D, 0x293A311A35143FD5, 0x95142858EFD822B6, 0x198559F7BC0A74B5, 0x00000000035ED94D, },
{ 0x158BB11DF4C97946, 0xFACFBD122D6E8692, 0xABC8BBE453847359, 0x9F37AF67619E2A52, 0x0000000000881BDA, },
{ 0x6DBDE77CADB94B85, 0x27B8600336C03375, 0x5C28F7B016B4E25A, 0xDFCB3D909E654647, 0x0000000002D2C5AD, },
{ 0x0FA22DC06599224B, 0xC42A0DA6E62A70D7, 0x83D8299B045B0008, 0x7AF8954F565A6B2B, 0x000000000555D03E, },
{ 0x8FC9889DAEA64D22, 0x7771CD73C04A8076, 0x9FFC746B06E680F1, 0x771784ACF4CEB68E, 0x0000000005552BFE, },
{ 0x86392EA8BC14D236, 0x41F8204B9D2EF1AD, 0x7E5EB447636D33CD, 0x116001761932904F, 0x0000000001041045, },
{ 0xD40B1B610A5E917B, 0xAB7A875158714D35, 0x926D92C81462337D, 0xCDDAC788B8E6CDC0, 0x0000000005DDCF95, },
{ 0x95AA1A0F23243D20, 0x72D92BC90114A115, 0x882041891708627A, 0x4913A8041A7BB9BC, 0x00000000060B72EA, },
{ 0xD83AE4CD0A980053, 0xE3CA6AC31AA4594B, 0x74EF9DD0881A62A8, 0xC7ECF285BE5A3603, 0x0000000000C9F647, },
{ 0xB17863CF49921A27, 0xFE6F823CF7983A80, 0x53942867C439C0FC, 0xA6DAC7047457D1B1, 0x000000000397D58D, },
{ 0x9DA8F64A0B68BEF1, 0xBEB4D5BFE23AE0ED, 0xA97206B4033A2287, 0x958C12AFA29D2D49, 0x000000000787EA22, },
{ 0x7EDE53BB92800EF4, 0xEE8A859E9E494188, 0xC0B0C95E66000077, 0x503F8FB26AFBEA52, 0x00000000074E0F3B, },
{ 0x7EC198D2235B33AA, 0x6DADCAD9914F3410, 0xDDF4923068F0B376, 0x5B22E12834BE2DD9, 0x00000000064A64A7, },
{ 0x697D88E9145A6CE3, 0x380153EFABA40854, 0xEC4D143677DC332F, 0x539447FDF290173C, 0x00000000064AF2D3, },
{ 0x9DB3BEEEB89D9DFF, 0x36403D0A86B8F6E6, 0xF44FE2256A43B3BA, 0x74F7792749548D65, 0x0000000001048244, },
{ 0x853107D99634B8FF, 0x183D9AA22F225413, 0x78975CF7C582D108, 0x64D9AAC2251DF5F1, 0x00000000070F8B67, },
{ 0xC54E5814C38F83C7, 0x9C6C45035A501094, 0xAB9E7146387A73CA, 0xDAC87623CE5E232A, 0x000000000088F663, },
{ 0x6260D105ABEFC732, 0x5A4473F4CB2D974C, 0x51F15708A2767318, 0x8313A7925BBBBCC3, 0x0000000007C611D6, },
{ 0xF9BFC5CA2A5C2DEC, 0xD953188DDA5D839A, 0x5FCDAD5AE0F1A2F8, 0xFA4F4F06F82C6F1D, 0x0000000000C96072, },
{ 0x85F213F063C66566, 0x594810BE7F83014D, 0x9D0D36544D6CD1AB, 0xC23B2022DB4BA1A4, 0x0000000004984DA1, },
{ 0x34F470E2257C1196, 0x0FAA7B3F590C6794, 0xF4F19E349F3AF315, 0x2232149ECF89F7E0, 0x00000000031F27CA, },
{ 0x5E03237E2474BE99, 0xCAD8ECDC9C468251, 0xD9C68A19338AC065, 0xF2FED1EE0A724D8C, 0x00000000018CF01F, },
{ 0x12F466E0B9E9F9B5, 0x2FA66A3CF84A7C58, 0x8CD0229604FD1110, 0x7EB08D9E218820FE, 0x0000000000419234, },
{ 0x4E9C3FADDA533172, 0xD0EEE8E4D1BE2580, 0x92C4595F02BBA271, 0xBF120BB6F8FC241F, 0x0000000002D244E2, },
{ 0x42AD335D8B2011E1, 0x048ACFD0B34A327C, 0x86C877C157EBB3F2, 0x5DC20BB48A37010F, 0x00000000031FDD5C, },
{ 0x889F215A7D4D06F5, 0x7E0F43B5CD74C9ED, 0x3C55F94E7A880067, 0x5BE85B0CD03AEEC8, 0x00000000074E8B12, },
{ 0xE062D1ED9D5F1040, 0x98F280264DFE346E, 0x012BE8641ED87306, 0x086F69A161BCA321, 0x0000000001046B89, },
{ 0x769C2BCA4D64E4EA, 0x64AFFA66EF261A35, 0x6C4424C95E5DA27E, 0x600521E7D5674A66, 0x0000000001456AEB, },
{ 0xB9C498501C68FD02, 0xD0DD53EADD136368, 0xA125C1EF1C578049, 0x57277A2C3FDEF96F, 0x0000000005554708, },
{ 0xE8E3B0F06023AB19, 0x78AC00C58697D767, 0xC397CAC6D719A20A, 0xFDDB787858F11732, 0x00000000078783E6, },
{ 0x72E80A609D17BC56, 0x75E6046C9DF1A9CE, 0xF1694E67AA09E28E, 0x0324361E4CC1DC3D, 0x0000000004104114, },
{ 0x3DE1A83FFDB0203A, 0xD50C20356E2FA145, 0x10371C1C95BA80A6, 0xEECE30C63A6615D5, 0x0000000006C216A9, },
{ 0x9CF60311500BB6D4, 0xCD4A7927BB9F5489, 0xE66280AFAEB90055, 0x1C4928745E8410E0, 0x00000000074E0B1E, },
{ 0x2C1C11833EF09FAA, 0xF5E34650DCFA96A0, 0x82A5084305691155, 0x766E4DAA8B2AAA64, 0x00000000025A4856, },
{ 0xBEC71D7D6237F490, 0x682F09D592E273B5, 0xBE64CFC63EAF519F, 0xC41792BE407EF0A5, 0x00000000068305D6, },
{ 0x923B2B10C812A3D1, 0x530B60D6C6E37696, 0x9BF293D810E2407F, 0x06F43C4CA8AFB9F4, 0x00000000018CF159, },
{ 0x6457194F93C5B1F7, 0x32C1FA88E6EF4E5E, 0x948D075C52D3802C, 0x4DB41BE58409A0DB, 0x00000000021BCC1C, },
{ 0x819B20014BC297D4, 0x6215C7B71F66406C, 0xDE4C36520819C064, 0x7BA28A9831E51010, 0x0000000005554370, },
{ 0xF7C7DA2B1521D6E9, 0x8BBA371DF589BC27, 0x80C9C2D2FCF74043, 0x1BBA755FE674D2F4, 0x00000000021BDA56, },
{ 0x060C4FAA9E8891AD, 0xC931DD7423C74352, 0x8E60935F42B0738B, 0x69B6E03442140B8A, 0x0000000005DDB1AB, },
{ 0x06311841739E9889, 0xC4E69BC99AA91EF3, 0xC1B8DE6D9603917A, 0x49E717D1F154D4DE, 0x00000000070F9E54, },
{ 0x80E6DE54411B4171, 0x3268422808EF0E64, 0x1266AE35659540A9, 0x60EC79F23CBAE5C1, 0x00000000018C8343, },
{ 0x18FB7B927F2E67A0, 0x2BDB9559461E1013, 0x125A688D4C46623C, 0x062AF7CC5B4C67E4, 0x00000000060B4837, },
{ 0x56C05FB23AB5BA17, 0x2CAB2E7A71B58635, 0x23C39A71FA969ED1, 0x09D7A6C2BE01BE95, 0x000000000530D774, },
{ 0x76CD15728F2CA17F, 0xF627B10FDF39E3D8, 0x52FD2EE183B8101C, 0x69C0E7807D6BAC64, 0x000000000515D12C, },
{ 0x76CD15728F2CAC8D, 0xF627B10FDF39E3D8, 0x52FD2EE183B8101C, 0x69C0E7807D6BAC64, 0x0000000003D5D12C, },
{ 0x9B7CADB4C73408E5, 0xC7609871D3DB513A, 0x797EFC47F359525D, 0xF6BF50277C2298F7, 0x0000000001C988FC, },
{ 0xEDB1B8C64818A76E, 0x3147297E0CE2B2E2, 0x2B83D2A670E14241, 0x9F7FB7A701493493, 0x00000000039C59D0, },
{ 0xEDB1B8C64818A370, 0x3147297E0CE2B2E2, 0x2B83D2A670E14241, 0x9F7FB7A701493493, 0x00000000019C59D0, },
};
Додаток В
Лістинг файлу ecchash.h
#include <stdio.h>
#include <memory.h>
#include <time.h>
#ifndef _ECOH_H_
#define _ECOH_H_
#define ECOH224_DATASIZE 16
#define ECOH224_DIGESTSIZE 28
#define ECOH256_DATASIZE 16
#define ECOH256_DIGESTSIZE 32
#define ECOH384_DATASIZE 24
#define ECOH384_DIGESTSIZE 48
#define ECOH512_DATASIZE 32
#define ECOH512_DIGESTSIZE 64
#define YP_BIT_T283 255
#define ECOH224 224
#define ECOH256 256
#define ECOH384 384
#define ECOH512 512
#define uchar unsigned char
#define DATASTART (16/sizeof(uint))
#define COUNTERSIZE (8/sizeof(uint))
#define TRACET409(OP) ((OP)[0]&0x01)
typedef struct
{
uint x[MAX_SIZE];
uint y[MAX_SIZE];
}point;
typedef struct
{
uint sz;
uint a;
uint *b;
uint *N;
uint *f;
point *G;
}curve;
typedef unsigned char BitSequence;
typedef unsigned long long DataLength;
typedef enum { SUCCESS = 0, FAIL = 1, BAD_HASHBITLEN = 2} HashReturn;
typedef struct
{
uint type;
uint DATASIZE;
uint DIGESTSIZE;
uint blen;
uint clen;
DataLength counter[2];
DataLength mlen[2];
uint N[MAX_DATASIZE];
point P;
point Q;
curve *T;
}hashState;
HashReturn Init(hashState *state, int hashbitlen);
HashReturn Update(hashState *state, const BitSequence *data, DataLength databitlen);
HashReturn Final(hashState *state, BitSequence *hashval);
HashReturn Hash(int hashbitlen, const BitSequence *data, DataLength databitlen, BitSequence *hashval);
#endif
Додаток Г
Лістинг файлу ecchash.c
#include "ecchash.h"
extern curve sect283r1;
extern uchar TBIT[];
extern uchar BMASK[];
extern uint BIT[];
extern uint F2X2[];
extern uint F2X22[];
extern uint HT283[][SECT283_SIZE];
extern uint W_MASK[];
#ifdef _DEBUG
void PrintInt2(uint sz, uint *op)
{
uint i;
for(i=sz-1;i!=-1;i--){ printf(SZ_PRINTINT, op[i]); }
}
#endif
int IsInt(uint sz, uint *op, uint ui)
{
uint i;
if(op[0]!=ui) return 0;
for(i=sz-1;i>0;i--){ if(op[i]) return 0; }
return 1;
}
uint GetBitLength(uint sz, uint *op)
{
sint i, d;
uint n;
if(sz == 0) return 0;
d = sz-1;
while(op[d]==0){ --d; }
if(d<0) return 0;
n = op[d];
i = 0;
while(n){ n>>=1; ++i; }
return (d*(LIMB_BIT_SIZE)) + i;
}
void PolyShiftRight(uint *rop, uint sz, uint *op)
{
uint t1, t2;
--sz;
t2 = 0;
do{
if(op[sz]&0x01) t1 = TOPBIT;
else t1 = 0;
rop[sz] = (op[sz]>>1)|t2;
t2 = t1;
}while(--sz!=(-1));
}
void PolyAdd(uint *rop, uint sz, uint *op1, uint *op2)
{
uint i;
i = -sz; op1 -=i; op2 -=i; rop -=i;
do{
rop[i] = op1[i]^op2[i];
}while(++i!=0);
}
void PolyMulZ(uint *rop, uint sz, uint *op, uint deg)
{
uint big, r, l, size, n;
uint t;
size = sz + (deg/LIMB_BIT_SIZE); big = size - sz;
l = deg - big*LIMB_BIT_SIZE;
if(l==0){
memcpy(rop+big, op, sizeof(uint)*sz);
--big;
while(big!=-1){ rop[big--] = 0; }
return;
}
r = LIMB_BIT_SIZE - l;
--sz;
n = 0;
rop[sz+big+1] = 0;
while(sz!=-1){
t = op[sz]; rop[sz+big] = (t<<l);
t>>=r; rop[sz+big+1]|= t;
--sz;
}
--big;
while(big!=-1){ rop[big--] = 0; }
}
void PolyModT283(uint *rop, uint *op)
{
uint j, h1;
#ifdef _x64_
for(j=8;j>4;j--){
h1 = op[j];
op[j-5]^=(h1<<37)^(h1<<42)^(h1<<44)^(h1<<49);
op[j-4]^=(h1>>27)^(h1>>22)^(h1>>20)^(h1>>15);
}
h1 = op[4]>>27;
op[0] ^= h1^(h1<<5)^(h1<<7)^(h1<<12);
op[4] &=0x0000000007FFFFFF;
#else
for(j=17;j>8;j--){
h1 = op[j];
op[j-9]^=(h1<<5)^(h1<<10)^(h1<<12)^(h1<<17);
op[j-8]^=(h1>>27)^(h1>>22)^(h1>>20)^(h1>>15);
}
h1 = op[8]>>27;
op[0] ^= h1^(h1<<5)^(h1<<7)^(h1<<12);
op[8] &=0x07FFFFFF;
#endif
memcpy(rop, op, sizeof(uint)*SECT283_SIZE);
}
void PolyMulMod(uint *rop, uint sz, uint *op1, uint *op2)
{
uint k, j, d[3*MAX_SIZE + 2], *out;
memset(d, 0, sizeof(uint)*(3*MAX_SIZE+ 2));
out = d + MAX_SIZE + 2;
memcpy(d, op2, sizeof(uint)*sz);
for(k=0;k<LIMB_BIT_SIZE;k++){
for(j=0;j<sz;j++){
if(BIT[k]&op1[j]) { PolyAdd(&out[j], sz+1, &out[j], d); }
}
if(k!=(LIMB_BIT_SIZE-1)){ PolyMulZ(d, sz+1, d, 1); }
}
switch(sz)
{
case SECT283_SIZE: PolyModT283(rop, out); break;
default: break;
}
}
void PolySqrMod(uint *rop, uint sz, uint *op)
{
uint j, out[2*MAX_SIZE];
for(j=0;j<sz;j++){
#ifdef _x64_
out[2*j] = F2X2[op[j]&0xFF]|(F2X22[(op[j]&0xFF00)>>8]);;
out[2*j] |= F2X22[(op[j]&0xFF0000)>>16]<<16|(F2X22[(op[j]&0xFF000000)>>24]<<32);
out[2*j+1] = F2X2[(op[j]&0xFF00000000)>>32]|(F2X22[(op[j]&0xFF0000000000)>>40]);;
out[2*j+1] |= F2X22[(op[j]&0xFF000000000000)>>48]<<16|(F2X22[(op[j]&0xFF00000000000000)>>56]<<32);
#else
out[2*j] = F2X2[op[j]&0xFF]|(F2X22[(op[j]&0xFF00)>>8]);;
out[2*j+1] = F2X2[(op[j]&0xFF0000)>>16]|(F2X22[(op[j]&0xFF000000)>>24]);
#endif
}
switch(sz)
{
case SECT283_SIZE: PolyModT283(rop, out); break;
default: break;
}
}
void PolyInv(uint *rop, uint sz, uint *op, uint *fx)
{
uint scratch[8*(MAX_SIZE+1)], *u, *v, *g1, *g2, *t;
sint j;
t = scratch;
if(op[0]==0) {
if(IsInt(sz, op, 0)){
memset(rop, 0, sizeof(uint)*sz); return;
}
}
memset(t, 0, sizeof(uint)*8*(MAX_SIZE+1));
u = t + 2*(MAX_SIZE+1); v = u + 2*(MAX_SIZE+1);
g1 = v + (MAX_SIZE+1); g2 = g1 + (MAX_SIZE+1);
memcpy(u, op, sizeof(uint)*sz); memcpy(v, fx, sizeof(uint)*sz);
g1[0] = 1;
while(!IsInt(sz, u, 1)){
j = GetBitLength(sz, u) - GetBitLength(sz, v);
if(j<0){
t = u; u = v; v = t;
t = g1; g1 = g2; g2 = t;
j = -j; t = scratch;
}
PolyMulZ(t, sz, v, j); PolyAdd(u, sz, u, t);
PolyMulZ(t, sz, g2, j); PolyAdd(g1, sz, g1, t);
};
memcpy(rop, g1, sizeof(uint)*sz);
}
void PointDouble(point *rop, point *op, curve *T)
{
uint l[2*MAX_SIZE], l2[2*MAX_SIZE], px[MAX_SIZE];
if(op->x[0]==0){
if(IsInt(T->sz, op->x, 0)){
memset(rop->x, 0, sizeof(uint)*T->sz);
memset(rop->y, 0, sizeof(uint)*T->sz);
return;
}
}
PolyInv(l, T->sz, op->x, T->f); /* l = x^-1 */
PolyMulMod(l, T->sz, l, op->y); /* l = y/x in f2m */
PolyAdd(l, T->sz, l, op->x); /* l = x + y/x in f2m */
PolySqrMod(l2, T->sz, l); /* l2 = l^2 in f2m */
l[0]^=T->a; /* l = l + 1 in f2m */
PolyAdd(px, T->sz, l2, l); /* px = l^2 + l + a in f2m */
PolySqrMod(l2, T->sz, op->x); /* l2 = x^2 */
PolyMulMod(l, T->sz, l, px); /* l = px(l + 1) */
PolyAdd(rop->y, T->sz, l2, l); /* py = x^2 + px(l + 1) in f2m */
memcpy(rop->x, px, sizeof(uint)*T->sz);
}
void PointAdd(point *rop, point *op1, point *op2, curve *T)
{
uint l[2*MAX_SIZE], l2[2*MAX_SIZE], px[MAX_SIZE], py[MAX_SIZE];
uint opx0, opy0;
opx0 = IsInt(T->sz, op1->x, 0); opy0 = IsInt(T->sz, op1->y, 0);
if(opx0 && opy0) { /* rop = O + op2 */
memcpy(rop->x, op2->x, sizeof(uint)*T->sz);
memcpy(rop->y, op2->y, sizeof(uint)*T->sz);
return;
}
opx0 = IsInt(T->sz, op2->x, 0); opy0 = IsInt(T->sz, op2->y, 0);
if(opx0 && opy0) { /* rop = op1 + O */
memcpy(rop->x, op1->x, sizeof(uint)*T->sz);
memcpy(rop->y, op1->y, sizeof(uint)*T->sz);
return;
}/* rop = op1 + op1 or rop = op1 + (-op1) = O */
if(memcmp(op1->x, op2->x, sizeof(uint)*T->sz)==0){
if(memcmp(op1->y, op2->y, sizeof(uint)*T->sz)==0){
PointDouble(rop, op1, T); return;
}
else{
memset(rop->x, 0, sizeof(uint)*T->sz);
memset(rop->y, 0, sizeof(uint)*T->sz);
return;
}
}
PolyAdd(l2, T->sz, op1->x, op2->x); /* l2 = x1 + x2 */
PolyInv(l, T->sz, l2, T->f); /* l = 1/(x1 + x2) */
PolyAdd(l2, T->sz, op1->y, op2->y); /* l2 = y1 + y2 */
PolyMulMod(l, T->sz, l, l2); /* l = (y1 + y2)/(x1 + x2) */
PolySqrMod(l2, T->sz, l); /* l2 = l^2 */
PolyAdd(px, T->sz, l2, l); /* px = l^2 + l */
PolyAdd(px, T->sz, px, op1->x); /* px = l^2 + l + x1 */
PolyAdd(px, T->sz, px, op2->x); /* px = l^2 + l + x1 + x2 */
px[0]^=T->a; /* px = l^2 + l + x1 + x2 + a */
PolyAdd(l2, T->sz, px, op1->x); /* l2 = x3 + x1 */
PolyMulMod(l2, T->sz, l2, l); /* l2 = l(x3 + x1) */
PolyAdd(py, T->sz, l2, px); /* py = l(x3 + x1) + x3 */
PolyAdd(py, T->sz, py, op1->y); /* py = l(x3 + x1) + x3 + y1 */
memcpy(rop->x, px, sizeof(uint)*T->sz);
memcpy(rop->y, py, sizeof(uint)*T->sz);
}
void BasePointMultiply(point *rop, uint sz, uint *k, curve *T)
{
uint i, j, n;
point B, A;
n = GetBitLength(sz, k); n = (n + 3) >> 2;
memset(A.x, 0, MAX_SIZE*sizeof(uint)); memset(A.y, 0, MAX_SIZE*sizeof(uint));
memset(B.x, 0, MAX_SIZE*sizeof(uint)); memset(B.y, 0, MAX_SIZE*sizeof(uint));
for(j=15;j>0;j--){
for(i=0;i<n;i++){
if(((k[i/LIMB_W_LEN]&W_MASK[i%LIMB_W_LEN])>>(4*(i%LIMB_W_LEN)))==j){
PointAdd(&B, &B, &T->G[i], T); /* B = B + 2^{4*i}G */
}
}
PointAdd(&A, &A, &B, T);
}
memcpy(rop->x, A.x, sizeof(uint)*T->sz);
memcpy(rop->y, A.y, sizeof(uint)*T->sz);
}
void SolveQuadratic(uint *rop, uint sz, uint *op)
{
uint i, g[MAX_SIZE], b, qsz, *H;
memset(g, 0, sizeof(uint)*sz);
if(sz==SECT283_SIZE) { qsz = 141; H = (uint*)HT283; }
for(i=qsz;i>0;i--){
if(GETBIT(op, 2*i)){
b = BIT[i%LIMB_BIT_SIZE];
op[i/LIMB_BIT_SIZE]^= b;
g[i/LIMB_BIT_SIZE]^= b;
}
}
for(i=0;i<qsz;i++){
if(GETBIT(op, 2*i + 1)){
PolyAdd(g, sz, g, &H[i*sz]);
}
}
memcpy(rop, g, sizeof(uint)*sz);
}
uint PointDecompress(point *rop, curve *T)
{
uint yp, a[2*MAX_SIZE], b[MAX_SIZE], loop = 1;
/* compute a = x + T->a + T->b*x^{-2} in F_{2^m} */
PolyInv(b, T->sz, rop->x, T->f); /* a = x^-1 */
PolySqrMod(a, T->sz, b); /* b = x^-2 */
PolyMulMod(a, T->sz, a, T->b); /* a = T->b*(x^-2) */
switch(T->sz) {
case SECT283_SIZE: if(TRACET283(a)) return -1;
yp = GETBIT(rop->x, YP_BIT_T283); break;
default:
return -1;
}
PolyAdd(a, T->sz, a, rop->x); /* a = x + T->b*(x^-2) */
a[0]^=T->a; /* a = x + T->a + T->b*(x^-2) */
SolveQuadratic(b, T->sz, a); /* solve quadratic z^2 + z = a */
if(yp!=(b[0]&0x01)) { b[0]^=0x01; }
PolyMulMod(a, T->sz, b, rop->x);
memcpy(rop->y, a, sizeof(uint)*T->sz);
return 0;
}
void Unload(uchar *rop, uint sz, uint *op)
{
uint i;
uchar bval;
memcpy(rop, (uchar*)op, sz);
for(i=0;i<(sz/2);i++){
bval = rop[i]; rop[i] = rop[sz-(i+1)]; rop[sz-(i+1)] = bval;
}
}
void FormatData(uint *rop, uint sz)
{
uint value, ctr, i = 0;
ctr = sz;
while((--ctr)>(i)){
value = rop[i]; rop[i++]=rop[ctr]; rop[ctr] = value;
}
while( sz-- ){
value = *rop;
#ifdef _x64_
value = ((value&0xFF00FF00FF00FF00L)>>8)|((value&0x00FF00FF00FF00FFL)<<8);
value =((value&0x0000FFFF0000FFFF)<<16)|((value&0xFFFF0000FFFF0000)>>16);
*rop++= (value>>32)|(value<<32);
#else
value = ((value&0xFF00FF00L)>>8)|((value&0x00FF00FFL)<<8);
*rop++ =(value<<16)|(value>>16);
#endif
}
}
HashReturn Init(hashState *state, int hashbitlen)
{
state->blen = 0;
state->counter[0] = 0; state->counter[1] = 0;
state->mlen[0] = 0; state->mlen[1] = 0;
switch(hashbitlen)
{
case ECOH224:
state->type = ECOH224; state->DATASIZE = ECOH224_DATASIZE;
state->clen = ECOH224_CLEN; state->DIGESTSIZE = ECOH224_DIGESTSIZE;
state->T = §283r1;
break;
case ECOH256:
state->type = ECOH256; state->DATASIZE = ECOH256_DATASIZE;
state->clen = ECOH256_CLEN; state->DIGESTSIZE = ECOH256_DIGESTSIZE;
state->T = §283r1;
break;
default:
return BAD_HASHBITLEN;
}
memset(state->N, 0, MAX_DATASIZE*LIMB_SIZE);
memset(state->Q.x, 0, MAX_SIZE*LIMB_SIZE);
memset(state->Q.y, 0, MAX_SIZE*LIMB_SIZE);
memset(state->P.x, 0, MAX_SIZE*LIMB_SIZE);
memset(state->P.y, 0, MAX_SIZE*LIMB_SIZE);
return SUCCESS;
}
uint _Transform(hashState *state)
{
SET(state->P.x, 1, state->clen);
SETCTR(&state->P.x[state->clen], state->counter, state->clen);
while(PointDecompress(&state->P, state->T)) {
ADD(state->P.x, 2, state->clen);
}/* Q = Q + P, up counter, zeroize blen */
PointAdd(&state->Q, &state->Q, &state->P, state->T);
#ifdef _DEBUG
{
printf("P_%d\t(", (unsigned int)state->counter[0]);
PrintInt2(state->T->sz, state->P.x);
printf(",\n \t ");
PrintInt2(state->T->sz, state->P.y);
printf(")\n\nQ_%d\t(", (unsigned int)state->counter[0]);
PrintInt2(state->T->sz, state->Q.x);
printf(",\n \t ");
PrintInt2(state->T->sz, state->Q.y);
printf(")\n\nN\t ");
PrintInt2(state->DATASIZE/sizeof(uint), state->N);
printf("\n\n");
}
#endif
INCCTR(state->counter, state->clen);
state->blen = 0;
return SUCCESS;
}
HashReturn Update(hashState *state, const BitSequence *data, DataLength databitlen)
{
DataLength free, used;
uint datastart;
uchar *ptr;
if(databitlen&0x7) { return BAD_HASHBITLEN; }
if(state->type == ECOH512) { datastart = DATASTART*2; }
else { datastart = DATASTART; }
/* add in the bit count */
state->mlen[0]+=(databitlen);
if(state->mlen[0]<databitlen) if((++state->mlen[1])==0) return BAD_HASHBITLEN;
databitlen>>=3;
used = state->blen;
ptr = ((unsigned char*)(&state->P.x[datastart])) + used;
if(used){ /* handle the case where partial data is in the buffer */
free = state->DATASIZE - used;
if(databitlen>=free){
memcpy(ptr, data, (uint)free); /* copy into the buffer */
databitlen-=free; databitlen+=free;
/* format the data */
FormatData(&state->P.x[datastart], (uint)state->DATASIZE/sizeof(uint));
/* compute N value */
PolyAdd(state->N, state->DATASIZE/sizeof(uint), state->N, &state->P.x[datastart]);
/* transform */
if(_Transform(state)) return FAIL;
}
else{/* copy remaining data in buffer and exit */
memcpy(ptr, data, (uint)databitlen);
state->blen += (uint)databitlen;
return SUCCESS;
}
}/* loop over the rest of the data, transforming every ECOH_DATASIZE */
while(databitlen>=state->DATASIZE){
memcpy(&state->P.x[datastart], data, (uint)state->DATASIZE);
/* format the data */
FormatData(&state->P.x[datastart], (uint)state->DATASIZE/sizeof(uint));
/* compute N value */
PolyAdd(state->N, state->DATASIZE/sizeof(uint), state->N, &state->P.x[datastart]);
/* transform */
if(_Transform(state)) return FAIL;
databitlen-=state->DATASIZE;
data+=state->DATASIZE;
}/* Load any remaining data */
if(databitlen>0){/* copy any residual data */
memcpy(&state->P.x[datastart], data, (uint)databitlen);
state->blen = (uint)databitlen;
}
return SUCCESS;
}
HashReturn Final(hashState *state, BitSequence *hashval)
{
uint cnt, datastart;
uchar *ptr;
if(state->type == ECOH512) { datastart = DATASTART*2; }
else { datastart = DATASTART; }
cnt = state->blen;
ptr = ((unsigned char*)(&state->P.x[datastart])) + cnt;
*ptr++ = 0x80;
cnt = state->DATASIZE - 1 - cnt;
memset(ptr, 0, cnt );
/* format data */
FormatData(&state->P.x[datastart], (uint)state->DATASIZE/sizeof(uint));
/* compute N value */
PolyAdd(state->N, state->DATASIZE/sizeof(uint), state->N, &state->P.x[datastart]);
/* transform */
if(_Transform(state)) return FAIL;
memcpy(&state->P.x[datastart], state->N, state->DATASIZE);
SET(state->P.x, 1, state->clen);
SETCTR(&state->P.x[state->clen], state->mlen, state->clen);
while(PointDecompress(&state->P, state->T)) {
ADD(state->P.x, 2, state->clen);
}/* Q = Q + P, up counter, zeroize blen */
PointAdd(&state->Q, &state->Q, &state->P, state->T);
/* Q = Q + [Q.x/2]G where[Q.x/2] interpreted as an integer and divided by
/* 2, and G is the base point */
PolyShiftRight(state->P.x, state->T->sz, state->Q.x);
BasePointMultiply(&state->P, state->T->sz, state->P.x, state->T);
PointAdd(&state->Q, &state->Q, &state->P, state->T);
PolyShiftRight(state->Q.x, state->T->sz, state->Q.x);
/* unload and return */
Unload(hashval, state->DIGESTSIZE, state->Q.x);
return SUCCESS;
}
HashReturn Hash(int hashbitlen, const BitSequence *data, DataLength databitlen, BitSequence *hashval)
{
hashState state;
DataLength blen, dblen, cnt;
uchar *ptr;
uint datastart;
if(Init(&state, hashbitlen)) { return BAD_HASHBITLEN; }
if(state.type == ECOH512) { datastart = DATASTART*2; }
else { datastart = DATASTART; }
/* set mlen, and the byte length blen, and the databitlength remainder */
state.mlen[0]=(databitlen);
blen = (databitlen>>3);
dblen = (databitlen&7);
while(blen>=state.DATASIZE){
memcpy(&state.P.x[datastart], data, (uint)state.DATASIZE);
FormatData(&state.P.x[datastart], (uint)state.DATASIZE/sizeof(uint));
PolyAdd(state.N, state.DATASIZE/sizeof(uint), state.N, &state.P.x[datastart]);
if(_Transform(&state)) return FAIL;
blen-=state.DATASIZE;
data+=state.DATASIZE;
} if(blen>0){
memcpy(&state.P.x[datastart], data, (uint)blen);
state.blen = blen; data+=blen;
}
cnt = state.blen;
ptr = ((unsigned char*)(&state.P.x[datastart])) + cnt;
if(dblen) { *ptr++ = ((*data)&BMASK[dblen])|TBIT[dblen]; }
else { *ptr++ = 0x80; }
cnt = state.DATASIZE - 1 - cnt;
memset(ptr, 0, cnt );
FormatData(&state.P.x[datastart], (uint)state.DATASIZE/sizeof(uint));
PolyAdd(state.N, state.DATASIZE/sizeof(uint), state.N, &state.P.x[datastart]);
if(_Transform(&state)) return FAIL;
memcpy(&state.P.x[datastart], state.N, state.DATASIZE);
SET(state.P.x, 1, state.clen);
SETCTR(&state.P.x[state.clen], state.mlen, state.clen);
while(PointDecompress(&state.P, state.T)) {
ADD(state.P.x, 2, state.clen);
}
PointAdd(&state.Q, &state.Q, &state.P, state.T);
#ifdef _DEBUG
{
printf("P_%d\t(", (unsigned int)state.counter[0]);
PrintInt2(state.T->sz, state.P.x);
printf(",\n \t ");
PrintInt2(state.T->sz, state.P.y);
printf(")\n\nQ_%d\t(", (unsigned int)state.counter[0]);
PrintInt2(state.T->sz, state.Q.x);
printf(",\n \t ");
PrintInt2(state.T->sz, state.Q.y);
printf(")\n\nN \t ");
PrintInt2(state.DATASIZE/sizeof(uint), state.N);
}
#endif
PolyShiftRight(state.P.x, state.T->sz, state.Q.x);
#ifdef _DEBUG
{
printf("\n\nQ_%d.x/2\t ", (unsigned int)state.counter[0]);
PrintInt2(state.T->sz, state.P.x);
}
#endif
BasePointMultiply(&state.P, state.T->sz, state.P.x, state.T);
PointAdd(&state.Q, &state.Q, &state.P, state.T);
#ifdef _DEBUG
{
printf("\n\n(Q_%d.x/2)*G\t(", (unsigned int)state.counter[0]);
PrintInt2(state.T->sz, state.P.x);
printf(",\n \t ");
PrintInt2(state.T->sz, state.P.y);
printf(")\n\nQ_%d + (Q_%d.x/2)*G\t(", (unsigned int)state.counter[0], (unsigned int)state.counter[0]);
PrintInt2(state.T->sz, state.Q.x);
printf(",\n \t ");
PrintInt2(state.T->sz, state.Q.y);
}
#endif
PolyShiftRight(state.Q.x, state.T->sz, state.Q.x);
#ifdef _DEBUG
{
printf(")\n\n(Q + (Q_%d.x/2)*G).x/2\t ", (unsigned int)state.counter[0]);
PrintInt2(state.T->sz, state.Q.x);
printf("\n\n");
}
#endif
/* unload and return */
Unload(hashval, state.DIGESTSIZE, state.Q.x);
return SUCCESS;
}