bool_t pfokTest() { pfok_params params[1]; octet combo_state[128]; octet ua[O_OF_B(130)]; octet xa[O_OF_B(130)]; octet vb[O_OF_B(638)]; octet yb[O_OF_B(638)]; octet key[32]; // тест PFOK.GENG.1 if (pfokStdParams(params, 0, "test") != ERR_OK || pfokValParams(params) != ERR_OK || (params->g[0] += 2) == 0 || pfokValParams(params) == ERR_OK) return FALSE; // тест PFOK.GENG.2 if (pfokStdParams(params, 0, "1.2.112.0.2.0.1176.2.3.3.2") != ERR_OK || pfokValParams(params) != ERR_OK || (params->g[0] += 3) == 0 || pfokValParams(params) == ERR_OK) return FALSE; // тест PFOK.GENG.3 if (pfokStdParams(params, 0, "1.2.112.0.2.0.1176.2.3.6.2") != ERR_OK || pfokValParams(params) != ERR_OK || (params->g[0] += 1) == 0 || pfokValParams(params) == ERR_OK) return FALSE; // тест PFOK.GENG.4 if (pfokStdParams(params, 0, "1.2.112.0.2.0.1176.2.3.10.2") != ERR_OK || pfokValParams(params) != ERR_OK || (params->g[0] += 1) == 0 || pfokValParams(params) == ERR_OK) return FALSE; // загрузить параметры "test" if (pfokStdParams(params, 0, "test") != ERR_OK) return FALSE; // сгенерировать ключи ASSERT(prngCOMBO_keep() <= sizeof(combo_state)); prngCOMBOStart(combo_state, utilNonce32()); if (pfokGenKeypair(ua, vb, params, prngCOMBOStepG, combo_state) != ERR_OK || pfokValPubkey(params, vb) != ERR_OK || pfokCalcPubkey(yb, params, ua) != ERR_OK || !memEq(vb, yb, O_OF_B(params->l))) return FALSE; // тест PFOK.ANON.1 hexToRev(ua, "01" "1D4665B357DB361D106E32E353CD534B"); hexToRev(vb, "0739539C2AE25B53A05C8D16A14351D8" "EA86A1DD1893E08EE4A266F970E0243F" "8DF27F738F64E99E262E337792E5DD84" "7CF2A83362C6EC3C024E47313AA49A1E" "0A2E637AD35E31EB5F034D889B666701"); if (pfokValPubkey(params, vb) != ERR_OK || pfokDH(key, params, ua, vb) != ERR_OK || !hexEqRev(key, "777BB35E950D3080C1E896BE4172DBD0" "61423D3BFEF78F15E3F7A7F2FF7A242B")) return FALSE; // тест PFOK.ANON.2 hexToRev(ua, "00" "0530110167E1443819A8662A0FAB7AC0"); hexToRev(vb, "1590312CBACB7B21FC0B173DC100AC5D" "8692E04813CA2F87A5763E3F4940B10C" "DF3F2B3ECDF28BE4BEA9363B07A8A8A3" "BFDDE074DCF36D669A56931D083FC3BE" "46D02CC8EF719EF66AE47F57BEAE8E02"); if (pfokValPubkey(params, vb) != ERR_OK || pfokDH(key, params, ua, vb) != ERR_OK || !hexEqRev(key, "46FA834B28D5E5D4183E28646AFFE806" "803E4C865CB99B1C423B0F1C78DE758D")) return FALSE; // тест PFOK.AUTH.1 hexToRev(xa, "00" "78E7101B4A8F421D2AF5740D6ED27680"); hexToRev(yb, "193E5E1E0839091BC7ABBDD09E8D2298" "8812D37EDEB39E077130A244888BE1A7" "53337AB5743C898D1CFC947430813448" "16AF5189A4E84D5B6EA310F72534D2E5" "E531B579CEA862EAB0251A3C20F0EC1D"); hexToRev(ua, "01" "27E33C0D7595566570936FEF0AA53A24"); hexToRev(vb, "0947264BEFA107E99616F347B6A05C62" "D7F5F26804D848FC4A7D81915F4546DD" "22949C07131D84F8B5A73A60ED61BC6E" "158E9B83F38C1EE6AD97F2BF771AA4FF" "B10A38298498D943995697FD0F65284C"); if (pfokValPubkey(params, yb) != ERR_OK || pfokValPubkey(params, vb) != ERR_OK || pfokMTI(key, params, xa, ua, yb, vb) != ERR_OK || !hexEqRev(key, "EA92D5BCEC18BB44514E096748DB3E21" "D6E7B9C97D604699BEA7D3B96C87E18B")) return FALSE; // тест PFOK.AUTH.2 hexToRev(xa, "00" "05773C812D6F2A002D4E3EAC643C2CF3"); hexToRev(yb, "221CBFEB62F4AA3204D349B3D57E45E4" "C9BA601483CF9DDE4DD1AE1CC2694149" "F08765C5CCAEBD44B7B7D0F1783F9FDD" "2929523E1CEF2A46FBD419C5E5E2E712" "4099B405E0B90A5FB15A56F439DA47D1"); hexToRev(ua, "01" "3BB0377B3C0E55577A0D4A43627C6EC2"); hexToRev(vb, "2740ECD0631257DD8124DC38CFAC3DEF" "7162503B7F7C8DEC6478408B225D4C05" "56E566AF50661CE2F46662FC66DC429A" "CCF65D95E4F90BDCD08A11957C898EE2" "C2B77231929ACE9649B2C184CC9D8104"); if (pfokValPubkey(params, yb) != ERR_OK || pfokValPubkey(params, vb) != ERR_OK || pfokMTI(key, params, xa, ua, yb, vb) != ERR_OK || !hexEqRev(key, "5A4C323604206C8898BF6C234F75A537" "DF75E9A249D87F1E55CBD7B40C4FDAFA")) return FALSE; // все нормально return TRUE; }
bool_t g12sTest() { g12s_params params[1]; octet buf[G12S_ORDER_SIZE]; octet privkey[G12S_ORDER_SIZE]; octet pubkey[2 * G12S_FIELD_SIZE]; octet hash[64]; octet sig[2 * G12S_ORDER_SIZE]; octet echo[64]; // тест A.1 [загрузка параметров] if (g12sStdParams(params, "1.2.643.2.2.35.0") != ERR_OK || g12sValParams(params) != ERR_OK) return FALSE; // тест A.1 [генерация ключей] hexToRev(buf, "7A929ADE789BB9BE10ED359DD39A72C1" "1B60961F49397EEE1D19CE9891EC3B28"); ASSERT(sizeof(echo) >= prngEcho_keep()); prngEchoStart(echo, buf, 32); if (g12sGenKeypair(privkey, pubkey, params, prngEchoStepR, echo) != ERR_OK || !hexEqRev(privkey, "7A929ADE789BB9BE10ED359DD39A72C1" "1B60961F49397EEE1D19CE9891EC3B28") || !hexEqRev(pubkey, "26F1B489D6701DD185C8413A977B3CBB" "AF64D1C593D26627DFFB101A87FF77DA" "7F2B49E270DB6D90D8595BEC458B50C5" "8585BA1D4E9B788F6689DBD8E56FD80B")) return FALSE; // тест A.1 [выработка ЭЦП] hexTo(hash, "2DFBC1B372D89A1188C09C52E0EEC61F" "CE52032AB1022E8E67ECE6672B043EE5"); hexToRev(buf, "77105C9B20BCD3122823C8CF6FCC7B95" "6DE33814E95B7FE64FED924594DCEAB3"); if (g12sSign(sig, params, hash, privkey, prngEchoStepR, echo) != ERR_OK || !hexEq(sig, "41AA28D2F1AB148280CD9ED56FEDA419" "74053554A42767B83AD043FD39DC0493" "01456C64BA4642A1653C235A98A60249" "BCD6D3F746B631DF928014F6C5BF9C40")) return FALSE; // тест A.1 [проверка ЭЦП] if (g12sVerify(params, hash, sig, pubkey) != ERR_OK || (sig[0] ^= 1, g12sVerify(params, hash, sig, pubkey) == ERR_OK)) return FALSE; // тест A.2 [загрузка параметров] if (g12sStdParams(params, "1.2.643.7.1.2.1.2.0") != ERR_OK || g12sValParams(params) != ERR_OK) return FALSE; // тест A.2 [генерация ключей] hexToRev(buf, "0BA6048AADAE241BA40936D47756D7C9" "3091A0E8514669700EE7508E508B1020" "72E8123B2200A0563322DAD2827E2714" "A2636B7BFD18AADFC62967821FA18DD4"); ASSERT(sizeof(echo) >= prngEcho_keep()); prngEchoStart(echo, buf, 64); if (g12sGenKeypair(privkey, pubkey, params, prngEchoStepR, echo) != ERR_OK || !hexEqRev(privkey, "0BA6048AADAE241BA40936D47756D7C9" "3091A0E8514669700EE7508E508B1020" "72E8123B2200A0563322DAD2827E2714" "A2636B7BFD18AADFC62967821FA18DD4") || !hexEqRev(pubkey, "37C7C90CD40B0F5621DC3AC1B751CFA0" "E2634FA0503B3D52639F5D7FB72AFD61" "EA199441D943FFE7F0C70A2759A3CDB8" "4C114E1F9339FDF27F35ECA93677BEEC" "115DC5BC96760C7B48598D8AB9E740D4" "C4A85A65BE33C1815B5C320C854621DD" "5A515856D13314AF69BC5B924C8B4DDF" "F75C45415C1D9DD9DD33612CD530EFE1")) return FALSE; // тест A.2 [выработка ЭЦП] hexTo(hash, "3754F3CFACC9E0615C4F4A7C4D8DAB53" "1B09B6F9C170C533A71D147035B0C591" "7184EE536593F4414339976C647C5D5A" "407ADEDB1D560C4FC6777D2972075B8C"); hexToRev(buf, "0359E7F4B1410FEACC570456C6801496" "946312120B39D019D455986E364F3658" "86748ED7A44B3E794434006011842286" "212273A6D14CF70EA3AF71BB1AE679F1"); if (g12sSign(sig, params, hash, privkey, prngEchoStepR, echo) != ERR_OK || !hexEq(sig, "2F86FA60A081091A23DD795E1E3C689E" "E512A3C82EE0DCC2643C78EEA8FCACD3" "5492558486B20F1C9EC197C906998502" "60C93BCBCD9C5C3317E19344E173AE36" "1081B394696FFE8E6585E7A9362D26B6" "325F56778AADBC081C0BFBE933D52FF5" "823CE288E8C4F362526080DF7F70CE40" "6A6EEB1F56919CB92A9853BDE73E5B4A")) return FALSE; // тест A.2 [проверка ЭЦП] if (g12sVerify(params, hash, sig, pubkey) != ERR_OK || (sig[0] ^= 1, g12sVerify(params, hash, sig, pubkey) == ERR_OK)) return FALSE; // проверить кривую cryptoproA if (g12sStdParams(params, "1.2.643.2.2.35.1") != ERR_OK || g12sValParams(params) != ERR_OK) return FALSE; // проверить кривую cryptoproB if (g12sStdParams(params, "1.2.643.2.2.35.2") != ERR_OK || g12sValParams(params) != ERR_OK) return FALSE; // проверить кривую cryptoproC if (g12sStdParams(params, "1.2.643.2.2.35.3") != ERR_OK || g12sValParams(params) != ERR_OK) return FALSE; // проверить кривую cryptocom if (g12sStdParams(params, "1.2.643.2.9.1.8.1") != ERR_OK || g12sValParams(params) != ERR_OK) return FALSE; // проверить кривую paramsetA512 if (g12sStdParams(params, "1.2.643.7.1.2.1.2.1") != ERR_OK || g12sValParams(params) != ERR_OK) return FALSE; // проверить кривую paramsetB512 if (g12sStdParams(params, "1.2.643.7.1.2.1.2.2") != ERR_OK || g12sValParams(params) != ERR_OK) return FALSE; // все нормально return TRUE; }