Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
full-2.doc
Скачиваний:
11
Добавлен:
10.11.2018
Размер:
936.96 Кб
Скачать

Додатки

Додаток А

Блок-схема алгоритму функції хешування 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 = &sect283r1;

break;

case ECOH256:

state->type = ECOH256; state->DATASIZE = ECOH256_DATASIZE;

state->clen = ECOH256_CLEN; state->DIGESTSIZE = ECOH256_DIGESTSIZE;

state->T = &sect283r1;

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;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]