選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

sike_test.go 25 KiB

5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  1. package sike
  2. import (
  3. "bufio"
  4. "bytes"
  5. "crypto/rand"
  6. "encoding/hex"
  7. "io"
  8. "math/big"
  9. "os"
  10. "strings"
  11. "testing"
  12. )
  13. var tdata = struct {
  14. name string
  15. katFile string
  16. PrB_sidh string
  17. PkB_sidh string
  18. PkB_sike string
  19. PrB_sike string
  20. PrA_sike string
  21. PkA_sike string
  22. }{
  23. name: "SIKEp503",
  24. katFile: "etc/PQCkemKAT_434.rsp",
  25. PrB_sidh: "8626ED79D451140800E03B59B956F8210E556067407D13DC90FA9E8B872BFB0F",
  26. PkB_sidh: "BB066F920803D8A481A09CD6398DCAE8D330AE2035245A92491228D6AC86A7E024D6318CC3FAC233A90F086EF663A74CD102D7A33BE96F726E084F3C8C630DD1CAD79289B68275962C90A29E061A8C5C266D4A9DE1D94FAA8E539A7A4FD5487905A1FAD75CBEF0B2BF298645C26D6A904EBA9B468B43B66B3CE579EF140379C4B0F06B2005B345A677590FB1A6C6B73D90D953383621EE667B9E9B3254403AF1C66D8FA8F0A9A3B06B1B6D81C661BCD0FCD09D96FF6A9AF52C4F68DB2E12DFB16319F6F24B7B206E94331F26165F501179F956AED2DC42679CAD539E32D9BF36F1764D5F3A596ADC504E0FF1F25A544FA139E0ACB516D6D5A15F0A0C4F03C0CF363086184E462035CA87BF21393DC8918E21258029A0DC7295FB7F04E363F0A63EE299AD9E638324E5A2027BF38C868AF49A591BDEA9D7C376981D015E55FBE641010C70AB08809AAE335B4B97081FB95621469F9B92F637A41BCBB7DC3D1D7242E3E5FD7CA8E3381057AAB9F948498AF438B5F8D2E157B5A318",
  27. PrA_sike: "003271531CF27285B8721ED5CB46853043B346A66CBA6CF765F1B0EAA40BF602",
  28. PkA_sike: "BE0CB724207D42075EC1569F43FFB8178C64E1F3EAF9D914879B3B3CAD1D12048CBB72861CA0B72C16F65FB4DA98778D9F37CF1442147AE179A8D1099D77028740BD72DFC873A8D2F293A603E5C4A13F7668E8F5C363602A490D47F4F95B269706BDC8DFDEAD77026D9842BB8B5CC4BFB99AF75ED8E4A6994DD4BD5BA606D9EF21A38E26CC35AE5C57324CFE6C16B53D61AD985B37F4B1E2F11234C52A869E184008999358EC0D2B4F2F163A09D3BA9B83D7E5647B5BE92014286D5F0BCE0CA14417226462191D3F0D8587A3ADA2C561FBA5DFE938606476882472C64C9E07D6BDB6C51D59B7978C792383C0CCC28337192A30340742C82EFCB3693FE93FBDA870554CF40F2B176C831628FF339739EC87389A2DD261EE9C6AAFF09ECEFF6C5074D7755ACA4A9D937A1F3A7C31D82E606E6CC6AC90189C17899B13EB759761EEA35AAF74D0B7F2411031AF81B9B946AE2E154FC08F3BB3E2DDE5F52DBC0E1164DCE028EFA45B1D58F4B32EF016D4F995909D3E0F3F69B8115D35",
  29. PrB_sike: "4B622DE1350119C45A9F2E2EF3DC5DF50A759D138CDFBD64E82FCC97CA60CCB27BF6938C975658AEB8B4D37CFFBDE25D97E561F36C219A0E",
  30. PkB_sike: "4EC46509AB1C547BDF2311B3AF82FCD25A83D154D9649C0D1A7F1E4D174BE9ED44F4B8AD2160FF43D4B94E65BE5A64DA3B8D5B63A02C3DCD376BB24122E03C3F09F4253E6F117999D0359F6BAB94F38BDB4B681EE09351483380EA4839E7808F8DF11C9A01DBC9D4C61075F3FF39B444679A8F3BEAE4BD47BE5B3A4D4B0F44F44BC8AB1B40E91852605F92860F6B4E627E8F7B00168CED2BA9D86865A5314E32E39B15E2021790CECA67A47959915E5C9717C96A055ADA061921F15306E4600751E984DA5FBC72E5F4E7B1182F60109DDD50C04A7A8D4281121AECD824730F38BE81A9D59B480DE44EB6CFC93436000C6E302B710FE3C24E6E6E0A371DF2B81CFBB37EDBD739926DBBE95A81D90DA22A7A5DF0DEE13031B7DE91504F45E20F0F15B24931A5D41EE48FA84F11D9F33B1F5BF315B355FAC0AB40C702190C190489DDA7B8715E680CE0DE4BFB50D78290C1A4C29F7C776597D9FB6C1DE65E150FAD46DF3CF38BDB22493697A2307A121B67C90B04C0809E1C8CA916",
  31. }
  32. /* -------------------------------------------------------------------------
  33. Helpers
  34. -------------------------------------------------------------------------*/
  35. // Fail if err !=nil. Display msg as an error message
  36. func checkErr(t testing.TB, err error, msg string) {
  37. t.Helper()
  38. if err != nil {
  39. t.Error(msg)
  40. }
  41. }
  42. // Utility used for running same test with all registered prime fields
  43. type MultiIdTestingFunc func(testing.TB)
  44. // Converts string to private key
  45. func convToPrv(s string, v KeyVariant) *PrivateKey {
  46. key := NewPrivateKey(v)
  47. hex, e := hex.DecodeString(s)
  48. if e != nil {
  49. panic("non-hex number provided")
  50. }
  51. e = key.Import(hex)
  52. if e != nil {
  53. panic("Can't import private key")
  54. }
  55. return key
  56. }
  57. // Converts string to public key
  58. func convToPub(s string, v KeyVariant) *PublicKey {
  59. key := NewPublicKey(v)
  60. hex, e := hex.DecodeString(s)
  61. if e != nil {
  62. panic("non-hex number provided")
  63. }
  64. e = key.Import(hex)
  65. if e != nil {
  66. panic("Can't import public key")
  67. }
  68. return key
  69. }
  70. /* -------------------------------------------------------------------------
  71. Unit tests
  72. -------------------------------------------------------------------------*/
  73. func TestKeygen(t *testing.T) {
  74. var keyExp, keyGot [63 * 2 * 3]byte
  75. alicePrivate := convToPrv(tdata.PrA_sike, KeyVariant_SIDH_A)
  76. bobPrivate := convToPrv(tdata.PrB_sidh, KeyVariant_SIDH_B)
  77. expPubA := convToPub(tdata.PkA_sike, KeyVariant_SIDH_A)
  78. expPubB := convToPub(tdata.PkB_sidh, KeyVariant_SIDH_B)
  79. pubA := NewPublicKey(KeyVariant_SIDH_A)
  80. alicePrivate.GeneratePublicKey(pubA)
  81. pubB := NewPublicKey(KeyVariant_SIDH_B)
  82. bobPrivate.GeneratePublicKey(pubB)
  83. pubA.Export(keyExp[:])
  84. expPubA.Export(keyGot[:])
  85. if !bytes.Equal(keyExp[:], keyGot[:]) {
  86. t.Fatalf("unexpected value of public key A [\nGot: %X\nExp: %X]\n",
  87. keyGot, keyExp)
  88. }
  89. for i, _ := range keyExp {
  90. keyExp[i] = 0
  91. keyGot[i] = 0
  92. }
  93. pubB.Export(keyExp[:])
  94. expPubB.Export(keyGot[:])
  95. if !bytes.Equal(keyExp[:], keyGot[:]) {
  96. t.Fatalf("unexpected value of public key B [\nGot: %X\nExp: %X]\n",
  97. keyGot, keyExp)
  98. }
  99. }
  100. func TestImportExport(t *testing.T) {
  101. var err error
  102. var aBytes, bBytes [126 * 3]byte
  103. a := NewPublicKey(KeyVariant_SIDH_A)
  104. b := NewPublicKey(KeyVariant_SIDH_B)
  105. // Import keys
  106. aHex, err := hex.DecodeString(tdata.PkA_sike)
  107. checkErr(t, err, "invalid hex-number provided")
  108. err = a.Import(aHex)
  109. checkErr(t, err, "import failed")
  110. bHex, err := hex.DecodeString(tdata.PkB_sike)
  111. checkErr(t, err, "invalid hex-number provided")
  112. err = b.Import(bHex)
  113. checkErr(t, err, "import failed")
  114. a.Export(aBytes[:])
  115. b.Export(bBytes[:])
  116. // Export and check if same
  117. if !bytes.Equal(bBytes[:], bHex) || !bytes.Equal(aBytes[:], aHex) {
  118. t.Fatalf("export/import failed")
  119. }
  120. if (len(bBytes) != b.Size()) || (len(aBytes) != a.Size()) {
  121. t.Fatalf("wrong size of exported keys")
  122. }
  123. }
  124. func testPrivateKeyBelowMax(t testing.TB) {
  125. for variant, keySz := range map[KeyVariant]*DomainParams{
  126. KeyVariant_SIDH_A: &Params.A,
  127. KeyVariant_SIDH_B: &Params.B} {
  128. func(v KeyVariant, dp *DomainParams) {
  129. var blen = int(dp.SecretByteLen)
  130. var prv = NewPrivateKey(v)
  131. var secretBytes = make([]byte, prv.Size())
  132. // Calculate either (2^e2 - 1) or (2^s - 1); where s=ceil(log_2(3^e3)))
  133. maxSecertVal := big.NewInt(int64(dp.SecretBitLen))
  134. maxSecertVal.Exp(big.NewInt(int64(2)), maxSecertVal, nil)
  135. maxSecertVal.Sub(maxSecertVal, big.NewInt(1))
  136. // Do same test 1000 times
  137. for i := 0; i < 1000; i++ {
  138. err := prv.Generate(rand.Reader)
  139. checkErr(t, err, "Private key generation")
  140. // Convert to big-endian, as that's what expected by (*Int)SetBytes()
  141. prv.Export(secretBytes)
  142. for i := 0; i < int(blen/2); i++ {
  143. tmp := secretBytes[i] ^ secretBytes[blen-i-1]
  144. secretBytes[i] = tmp ^ secretBytes[i]
  145. secretBytes[blen-i-1] = tmp ^ secretBytes[blen-i-1]
  146. }
  147. prvBig := new(big.Int).SetBytes(secretBytes)
  148. // Check if generated key is bigger then acceptable
  149. if prvBig.Cmp(maxSecertVal) == 1 {
  150. t.Error("Generated private key is wrong")
  151. }
  152. }
  153. }(variant, keySz)
  154. }
  155. }
  156. func testKeyAgreement(t *testing.T, pkA, prA, pkB, prB string) {
  157. var e error
  158. var s1, s2 [126 * 3]byte
  159. // KeyPairs
  160. alicePublic := convToPub(pkA, KeyVariant_SIDH_A)
  161. bobPublic := convToPub(pkB, KeyVariant_SIDH_B)
  162. alicePrivate := convToPrv(prA, KeyVariant_SIDH_A)
  163. bobPrivate := convToPrv(prB, KeyVariant_SIDH_B)
  164. // Do actual test
  165. e = DeriveSecret(s1[:], bobPrivate, alicePublic)
  166. checkErr(t, e, "derivation s1")
  167. e = DeriveSecret(s2[:], alicePrivate, bobPublic)
  168. checkErr(t, e, "derivation s1")
  169. if !bytes.Equal(s1[:], s2[:]) {
  170. t.Fatalf("two shared keys: %d, %d do not match", s1, s2)
  171. }
  172. // Negative case
  173. dec, e := hex.DecodeString(tdata.PkA_sike)
  174. if e != nil {
  175. t.FailNow()
  176. }
  177. dec[0] = ^dec[0]
  178. e = alicePublic.Import(dec)
  179. if e != nil {
  180. t.FailNow()
  181. }
  182. e = DeriveSecret(s1[:], bobPrivate, alicePublic)
  183. checkErr(t, e, "derivation of s1 failed")
  184. e = DeriveSecret(s2[:], alicePrivate, bobPublic)
  185. checkErr(t, e, "derivation of s2 failed")
  186. if bytes.Equal(s1[:], s2[:]) {
  187. t.Fatalf("The two shared keys: %d, %d match", s1, s2)
  188. }
  189. }
  190. func TestDerivationRoundTrip(t *testing.T) {
  191. var err error
  192. var s1, s2 [126 * 3]byte
  193. pubA := NewPublicKey(KeyVariant_SIDH_A)
  194. prvA := NewPrivateKey(KeyVariant_SIDH_A)
  195. pubB := NewPublicKey(KeyVariant_SIDH_B)
  196. prvB := NewPrivateKey(KeyVariant_SIDH_B)
  197. // Generate private keys
  198. err = prvA.Generate(rand.Reader)
  199. checkErr(t, err, "key generation failed")
  200. err = prvB.Generate(rand.Reader)
  201. checkErr(t, err, "key generation failed")
  202. // Generate public keys
  203. prvA.GeneratePublicKey(pubA)
  204. prvB.GeneratePublicKey(pubB)
  205. // Derive shared secret
  206. err = DeriveSecret(s1[:], prvB, pubA)
  207. checkErr(t, err, "")
  208. err = DeriveSecret(s2[:], prvA, pubB)
  209. checkErr(t, err, "")
  210. if !bytes.Equal(s1[:], s2[:]) {
  211. t.Fatalf("Two shared keys: \n%X, \n%X do not match", s1, s2)
  212. }
  213. }
  214. // encrypt, decrypt, check if input/output plaintext is the same
  215. func TestPKERoundTrip(t *testing.T) {
  216. // Message to be encrypted
  217. var msg = make([]byte, Params.MsgLen)
  218. var ct = make([]byte, kemSikeP503.CiphertextSize())
  219. for i, _ := range msg {
  220. msg[i] = byte(i)
  221. }
  222. // Import keys
  223. pkB := NewPublicKey(KeyVariant_SIKE)
  224. skB := NewPrivateKey(KeyVariant_SIKE)
  225. pk_hex, err := hex.DecodeString(tdata.PkB_sike)
  226. if err != nil {
  227. t.Fatal(err)
  228. }
  229. sk_hex, err := hex.DecodeString(tdata.PrB_sike)
  230. if err != nil {
  231. t.Fatal(err)
  232. }
  233. if pkB.Import(pk_hex) != nil || skB.Import(sk_hex) != nil {
  234. t.Error("Import")
  235. }
  236. err = encrypt(ct, rand.Reader, pkB, msg[:])
  237. if err != nil {
  238. t.Fatal(err)
  239. }
  240. var pt [40]byte
  241. pt_len, err := decrypt(pt[:], skB, ct)
  242. if err != nil {
  243. t.Fatal(err)
  244. }
  245. if !bytes.Equal(pt[:pt_len], msg[:]) {
  246. t.Errorf("Decryption failed \n got : %X\n exp : %X", pt, msg)
  247. }
  248. }
  249. // Generate key and check if can encrypt
  250. func TestPKEKeyGeneration(t *testing.T) {
  251. // Message to be encrypted
  252. var msg = make([]byte, Params.MsgLen)
  253. var ct = make([]byte, kemSikeP503.CiphertextSize())
  254. var err error
  255. for i, _ := range msg {
  256. msg[i] = byte(i)
  257. }
  258. sk := NewPrivateKey(KeyVariant_SIKE)
  259. err = sk.Generate(rand.Reader)
  260. checkErr(t, err, "PEK key generation")
  261. pk := NewPublicKey(KeyVariant_SIKE)
  262. sk.GeneratePublicKey(pk)
  263. // Try to encrypt
  264. err = encrypt(ct, rand.Reader, pk, msg[:])
  265. checkErr(t, err, "PEK encryption")
  266. var pt [40]byte
  267. pt_len, err := decrypt(pt[:], sk, ct)
  268. checkErr(t, err, "PEK key decryption")
  269. if !bytes.Equal(pt[:pt_len], msg[:]) {
  270. t.Fatalf("Decryption failed \n got : %X\n exp : %X", pt, msg)
  271. }
  272. }
  273. func TestNegativePKE(t *testing.T) {
  274. var msg [40]byte
  275. var err error
  276. var ct = make([]byte, kemSikeP503.CiphertextSize())
  277. // Generate key
  278. pk := NewPublicKey(KeyVariant_SIKE)
  279. sk := NewPrivateKey(KeyVariant_SIKE)
  280. err = sk.Generate(rand.Reader)
  281. checkErr(t, err, "key generation")
  282. sk.GeneratePublicKey(pk)
  283. // bytelen(msg) - 1
  284. err = encrypt(ct, rand.Reader, pk, msg[:Params.KemSize+8-1])
  285. if err == nil {
  286. t.Fatal("Error hasn't been returned")
  287. }
  288. for _, v := range ct {
  289. if v != 0 {
  290. t.Fatal("Returned ciphertext must be not changed")
  291. }
  292. }
  293. // KemSize - 1
  294. var pt [40]byte
  295. pt_len, err := decrypt(pt[:], sk, msg[:Params.KemSize+8-1])
  296. if err == nil {
  297. t.Fatal("Error hasn't been returned")
  298. }
  299. if pt_len != 0 {
  300. t.Fatal("Ciphertext must be nil")
  301. }
  302. }
  303. func testKEMRoundTrip(t *testing.T, pkB, skB []byte) {
  304. ct := make([]byte, kemSikeP503.CiphertextSize())
  305. ss_e := make([]byte, kemSikeP503.SharedSecretSize())
  306. ss_d := make([]byte, kemSikeP503.SharedSecretSize())
  307. // Import keys
  308. pk := NewPublicKey(KeyVariant_SIKE)
  309. sk := NewPrivateKey(KeyVariant_SIKE)
  310. if pk.Import(pkB) != nil || sk.Import(skB) != nil {
  311. t.Error("Import failed")
  312. }
  313. checkErr(t, kemSikeP503.Encapsulate(ct, ss_e, pk),
  314. "error: Encapsulation during round-trip")
  315. checkErr(t, kemSikeP503.Decapsulate(ss_d, sk, pk, ct),
  316. "error: Decapsulation during round-trip")
  317. if !bytes.Equal(ss_e, ss_d) {
  318. t.Error("Shared secrets from decapsulation and encapsulation differ")
  319. }
  320. }
  321. func TestKEMRoundTrip(t *testing.T) {
  322. pk, err := hex.DecodeString(tdata.PkB_sike)
  323. checkErr(t, err, "public key B not a number")
  324. sk, err := hex.DecodeString(tdata.PrB_sike)
  325. checkErr(t, err, "private key B not a number")
  326. testKEMRoundTrip(t, pk, sk)
  327. }
  328. func TestKEMKeyGeneration(t *testing.T) {
  329. ct := make([]byte, kemSikeP503.CiphertextSize())
  330. ss_e := make([]byte, kemSikeP503.SharedSecretSize())
  331. ss_d := make([]byte, kemSikeP503.SharedSecretSize())
  332. // Generate key
  333. pk := NewPublicKey(KeyVariant_SIKE)
  334. sk := NewPrivateKey(KeyVariant_SIKE)
  335. checkErr(t, sk.Generate(rand.Reader), "error: key generation")
  336. sk.GeneratePublicKey(pk)
  337. // calculated shared secret
  338. checkErr(t, kemSikeP503.Encapsulate(ct, ss_e, pk),
  339. "encapsulation failed")
  340. checkErr(t, kemSikeP503.Decapsulate(ss_d, sk, pk, ct),
  341. "decapsulation failed")
  342. if !bytes.Equal(ss_e, ss_d) {
  343. t.Fatalf("KEM failed \n encapsulated: %X\n decapsulated: %X", ss_d, ss_e)
  344. }
  345. }
  346. func TestNegativeKEM(t *testing.T) {
  347. ct := make([]byte, kemSikeP503.CiphertextSize())
  348. ss_e := make([]byte, kemSikeP503.SharedSecretSize())
  349. ss_d := make([]byte, kemSikeP503.SharedSecretSize())
  350. pk := NewPublicKey(KeyVariant_SIKE)
  351. sk := NewPrivateKey(KeyVariant_SIKE)
  352. checkErr(t, sk.Generate(rand.Reader), "error: key generation")
  353. sk.GeneratePublicKey(pk)
  354. checkErr(t, kemSikeP503.Encapsulate(ct, ss_e, pk),
  355. "pre-requisite for a test failed")
  356. ct[0] = ct[0] - 1
  357. checkErr(t, kemSikeP503.Decapsulate(ss_d, sk, pk, ct),
  358. "decapsulation returns error when invalid ciphertext provided")
  359. if bytes.Equal(ss_e[:], ss_d) {
  360. // no idea how this could ever happen, but it would be very bad
  361. t.Error("critical error")
  362. }
  363. // Try encapsulating with SIDH key
  364. pkSidh := NewPublicKey(KeyVariant_SIDH_B)
  365. prSidh := NewPrivateKey(KeyVariant_SIDH_B)
  366. err := kemSikeP503.Encapsulate(ct, ss_e, pkSidh)
  367. if err == nil {
  368. t.Error("encapsulation accepts SIDH public key")
  369. }
  370. // Try decapsulating with SIDH key
  371. err = kemSikeP503.Decapsulate(ss_e, prSidh, pk, ct)
  372. if err == nil {
  373. t.Error("decapsulation accepts SIDH private key key")
  374. }
  375. }
  376. // In case invalid ciphertext is provided, SIKE's decapsulation must
  377. // return same (but unpredictable) result for a given key.
  378. func TestNegativeKEMSameWrongResult(t *testing.T) {
  379. ct := make([]byte, kemSikeP503.CiphertextSize())
  380. ss_e := make([]byte, kemSikeP503.SharedSecretSize())
  381. ss_d1 := make([]byte, kemSikeP503.SharedSecretSize())
  382. ss_d2 := make([]byte, kemSikeP503.SharedSecretSize())
  383. sk := NewPrivateKey(KeyVariant_SIKE)
  384. pk := NewPublicKey(KeyVariant_SIKE)
  385. // generate keys
  386. checkErr(t, sk.Generate(rand.Reader), "error: key generation")
  387. sk.GeneratePublicKey(pk)
  388. checkErr(t, kemSikeP503.Encapsulate(ct, ss_e, pk),
  389. "pre-requisite for a test failed")
  390. // make ciphertext wrong
  391. ct[0] = ct[0] - 1
  392. checkErr(t, kemSikeP503.Decapsulate(ss_d1, sk, pk, ct),
  393. "pre-requisite for a test failed")
  394. // second decapsulation must be done with same, but imported private key
  395. var expSk = make([]byte, sk.Size())
  396. sk.Export(expSk)
  397. // creat new private key
  398. sk = NewPrivateKey(KeyVariant_SIKE)
  399. checkErr(t, sk.Import(expSk),
  400. "import failed")
  401. // try decapsulating again. ss2 must be same as ss1 and different than
  402. // original plaintext
  403. checkErr(t, kemSikeP503.Decapsulate(ss_d2, sk, pk, ct),
  404. "pre-requisite for a test failed")
  405. if !bytes.Equal(ss_d1, ss_d2) {
  406. t.Error("decapsulation is insecure")
  407. }
  408. if bytes.Equal(ss_e, ss_d1) || bytes.Equal(ss_e, ss_d2) {
  409. // this test requires that decapsulation returns wrong result
  410. t.Errorf("test implementation error")
  411. }
  412. }
  413. func testKeygen(t *testing.T, pk, sk []byte) {
  414. var pubKeyBytes [126 * 3]byte
  415. // Import provided private key
  416. var prvKey = NewPrivateKey(KeyVariant_SIKE)
  417. if prvKey.Import(sk) != nil {
  418. panic("sike test: can't load KAT")
  419. }
  420. // Generate public key
  421. pubKey := NewPublicKey(KeyVariant_SIKE)
  422. prvKey.GeneratePublicKey(pubKey)
  423. pubKey.Export(pubKeyBytes[:])
  424. if !bytes.Equal(pubKeyBytes[:], pk) {
  425. t.Fatalf("KAT keygen form private failed\nExp: %X\nGot: %X\n", pubKeyBytes[:], pk)
  426. }
  427. }
  428. func TestKeyAgreement(t *testing.T) {
  429. testKeyAgreement(t, tdata.PkA_sike, tdata.PrA_sike, tdata.PkB_sidh, tdata.PrB_sidh)
  430. }
  431. // Same values as in sike_test.cc
  432. func TestDecapsulation(t *testing.T) {
  433. var sk = [56]byte{
  434. 0xDB, 0xAF, 0x2C, 0x89, 0xCA, 0x5A, 0xD4, 0x9D, 0x4F, 0x13,
  435. 0x40, 0xDF, 0x2D, 0xB1, 0x5F, 0x4C, 0x91, 0xA7, 0x1F, 0x0B,
  436. 0x29, 0x15, 0x01, 0x59, 0xBC, 0x5F, 0x0B, 0x4A, 0x03, 0x27,
  437. 0x6F, 0x18}
  438. var pk = []byte{
  439. 0xCA, 0x38, 0x7A, 0x45, 0xF8, 0xA7, 0xFB, 0xE5, 0x97, 0xB0,
  440. 0x5B, 0xE4, 0x95, 0xDC, 0x38, 0xFA, 0xFC, 0x9B, 0xB3, 0xD1,
  441. 0x79, 0xF8, 0x7D, 0x54, 0x0A, 0xD9, 0xE0, 0x64, 0xE3, 0xED,
  442. 0x4D, 0x23, 0xD2, 0x86, 0x0D, 0x84, 0x0C, 0x44, 0x14, 0xE4,
  443. 0x6B, 0xB9, 0x35, 0xBA, 0x70, 0x2A, 0x90, 0x92, 0xAA, 0x90,
  444. 0x34, 0x81, 0x9F, 0xC7, 0x99, 0xD5, 0xB2, 0x2D, 0xD0, 0xBE,
  445. 0xC9, 0x3B, 0x25, 0x8F, 0x49, 0x18, 0xFE, 0xDB, 0xE3, 0x60,
  446. 0x04, 0x89, 0xB3, 0xC8, 0x8D, 0x2C, 0xC3, 0x35, 0x79, 0x45,
  447. 0x56, 0x03, 0x3C, 0xA2, 0x93, 0xDC, 0xE1, 0x1E, 0x98, 0x50,
  448. 0xB1, 0x65, 0xB9, 0x71, 0x8E, 0xB2, 0xBF, 0x93, 0x06, 0xDF,
  449. 0x55, 0xE3, 0xC9, 0xF9, 0x53, 0xB4, 0x05, 0x70, 0xF3, 0x7D,
  450. 0xE1, 0xE8, 0x78, 0x46, 0x93, 0x80, 0xBD, 0xBA, 0x7A, 0xE7,
  451. 0x66, 0x67, 0x6D, 0x99, 0xAD, 0x02, 0x5E, 0xD2, 0xFE, 0x59,
  452. 0x09, 0xB5, 0xF7, 0xB1, 0x60, 0x04, 0x59, 0x74, 0x21, 0x09,
  453. 0x66, 0x6A, 0x2C, 0x94, 0xAC, 0x78, 0x7F, 0xA5, 0x4E, 0x58,
  454. 0x07, 0xC4, 0xF2, 0x3F, 0x9C, 0x3E, 0xAB, 0x68, 0x83, 0xC4,
  455. 0x8C, 0x3C, 0xBB, 0x1B, 0x41, 0xBE, 0x26, 0x7C, 0xD0, 0xB1,
  456. 0xA8, 0xED, 0x3B, 0xA5, 0xD2, 0xAE, 0x4A, 0x44, 0xF8, 0xD6,
  457. 0x31, 0xB4, 0x06, 0x78, 0x61, 0x3C, 0xBA, 0xE8, 0x1A, 0x20,
  458. 0xF7, 0xE8, 0x11, 0x7D, 0x2C, 0xBC, 0xE6, 0x29, 0xD1, 0x73,
  459. 0xCC, 0x68, 0x5A, 0x4A, 0x6F, 0x43, 0x4C, 0x6E, 0xEC, 0xB8,
  460. 0x16, 0x9A, 0xE1, 0x82, 0x37, 0xC2, 0xAE, 0xD7, 0x2A, 0xD6,
  461. 0xCC, 0x19, 0x6C, 0x9E, 0xD1, 0xBD, 0x6C, 0x74, 0x9A, 0x4C,
  462. 0xA3, 0x6C, 0x4A, 0xAA, 0xB5, 0x99, 0x5F, 0xE9, 0x68, 0x0F,
  463. 0x73, 0x2B, 0x44, 0x7D, 0x66, 0x4E, 0x63, 0x3C, 0x32, 0xEC,
  464. 0x20, 0x03, 0xFF, 0xBE, 0xF3, 0x08, 0x0F, 0x11, 0xE2, 0x4B,
  465. 0xF1, 0xD5, 0x12, 0xE2, 0x52, 0x66, 0x19, 0xE4, 0x8B, 0xA4,
  466. 0x7E, 0x7F, 0x60, 0x27, 0x3B, 0x78, 0x6C, 0xC5, 0xBF, 0x58,
  467. 0x6F, 0xFE, 0x05, 0xFC, 0x25, 0xF4, 0x12, 0x68, 0xAB, 0xA3,
  468. 0x32, 0x75, 0x6A, 0x6A, 0xA6, 0x4E, 0x36, 0x42, 0x20, 0x17,
  469. 0x2E, 0xBE, 0x7A, 0x0F, 0x78, 0x63, 0x3E, 0x5D, 0xBC, 0xB4,
  470. 0xA0, 0xAC, 0xF3, 0xFE, 0x33, 0x49, 0x08, 0x62, 0xDC, 0x39,
  471. 0xFF, 0xFD, 0x83, 0x02, 0x10, 0x8A, 0x86, 0xD7, 0x62, 0xE5,
  472. 0xF2, 0x98, 0x7F, 0x8D, 0x79, 0x6A, 0xC4, 0x88, 0xD2, 0x84,
  473. 0xC7, 0x3B, 0xEB, 0xC1, 0x6A, 0xE0, 0x7F, 0x42, 0x92, 0x25,
  474. 0x0F, 0xA0, 0x35, 0xA5, 0xEF, 0x98, 0x4D, 0x41, 0xC5, 0x25,
  475. 0x77, 0x35, 0x36, 0xA9, 0x0B, 0xAB, 0x43, 0x0C, 0x6C, 0xF1,
  476. 0x31, 0x56, 0x17, 0x82, 0xD7, 0x00, 0x62, 0x1F,
  477. }
  478. var ct = []byte{
  479. 0x7B, 0x1B, 0x9E, 0xFC, 0x2B, 0x63, 0x7A, 0x71, 0x19, 0x3A,
  480. 0xAE, 0xC3, 0xDB, 0xEC, 0x20, 0x18, 0x27, 0x16, 0x64, 0xBF,
  481. 0xE5, 0x5F, 0x48, 0x75, 0xA1, 0xAE, 0xF1, 0x92, 0x40, 0x77,
  482. 0xB5, 0xF0, 0x85, 0x69, 0x8E, 0x02, 0x1A, 0x64, 0x94, 0x89,
  483. 0xA0, 0xEE, 0xDA, 0xDB, 0x07, 0xE5, 0xE5, 0xFF, 0xE7, 0x01,
  484. 0x5F, 0x5E, 0xC7, 0xD3, 0x3B, 0x27, 0xE1, 0x13, 0x9C, 0x01,
  485. 0x33, 0x44, 0x35, 0x67, 0xEA, 0x14, 0xFE, 0x74, 0x03, 0x9F,
  486. 0xD5, 0xE9, 0x3E, 0x58, 0x4A, 0xE3, 0xC2, 0x32, 0x22, 0x7A,
  487. 0x80, 0xA0, 0x18, 0x3A, 0x31, 0xAB, 0xBE, 0x63, 0xD0, 0xA2,
  488. 0xAB, 0x22, 0x28, 0x93, 0x17, 0x70, 0x79, 0x37, 0x4C, 0x55,
  489. 0xC4, 0xCB, 0x0F, 0x0D, 0x21, 0xBC, 0x35, 0x6F, 0x35, 0x04,
  490. 0x03, 0x5C, 0x23, 0xF6, 0x93, 0x4C, 0x98, 0x2D, 0x28, 0xB2,
  491. 0x4D, 0x43, 0xA4, 0x27, 0xFD, 0x38, 0x70, 0x27, 0x2F, 0x46,
  492. 0xA1, 0x25, 0x07, 0x86, 0x3A, 0x85, 0x50, 0x2E, 0x6B, 0x51,
  493. 0x58, 0x8D, 0xE5, 0x52, 0xA4, 0x44, 0x1E, 0x7D, 0x3A, 0x9B,
  494. 0x64, 0x89, 0xC8, 0x4F, 0x1C, 0x18, 0x98, 0xF5, 0xFE, 0x7F,
  495. 0xCA, 0x3A, 0x84, 0x7C, 0x53, 0xA7, 0xA1, 0xF6, 0xB1, 0xB2,
  496. 0xB5, 0xBC, 0xA5, 0x58, 0x31, 0xD4, 0xB2, 0x2E, 0x1D, 0xDE,
  497. 0x3A, 0xD5, 0xB9, 0x70, 0xA3, 0xE6, 0xE9, 0x2C, 0x39, 0xF6,
  498. 0xB5, 0x89, 0xDD, 0x14, 0x91, 0x31, 0x26, 0xE0, 0xAE, 0x66,
  499. 0x30, 0x3A, 0x59, 0x57, 0xA3, 0xFF, 0xC1, 0x1F, 0x3B, 0xB8,
  500. 0xA9, 0x9A, 0xB0, 0xAE, 0x2D, 0x70, 0x43, 0x38, 0x58, 0xF1,
  501. 0xD5, 0xFC, 0x29, 0x6A, 0x49, 0xD3, 0x2E, 0x57, 0xA7, 0x16,
  502. 0x7A, 0x2A, 0x06, 0x00, 0x39, 0x67, 0xCB, 0xA8, 0xB4, 0x26,
  503. 0xC3, 0x4B, 0xD5, 0x15, 0x83, 0x95, 0xD9, 0xCC, 0x50, 0x1A,
  504. 0x23, 0x00, 0xFF, 0xFE, 0x00, 0xFC, 0x99, 0x28, 0x38, 0xE8,
  505. 0x60, 0xF0, 0xFD, 0x12, 0xD3, 0x22, 0x26, 0x8E, 0x1F, 0xED,
  506. 0x11, 0x23, 0xB3, 0x56, 0x2A, 0x94, 0xE0, 0x1A, 0xE1, 0x25,
  507. 0x6B, 0x1C, 0x5A, 0xB0, 0x15, 0xA8, 0xA5, 0xF8, 0x76, 0xA9,
  508. 0x1F, 0x4E, 0xF1, 0x01, 0xC5, 0x12, 0x25, 0x8C, 0x1C, 0x10,
  509. 0x02, 0xAF, 0x0E, 0x5E, 0xAC, 0x67, 0x84, 0x35, 0x98, 0xDD,
  510. 0x99, 0x44, 0x15, 0x3B, 0x03, 0x41, 0x37, 0x10, 0x1F, 0x3A,
  511. 0x36, 0xFF, 0x0A, 0x47, 0xCA, 0x22, 0xA4, 0x36, 0xEB, 0x4C,
  512. 0x7D, 0x9B, 0x9A, 0xBD, 0x13, 0x4C, 0x5A, 0x0E, 0xCD, 0x35,
  513. 0xB3, 0x3A, 0xA7, 0x15, 0xFD, 0xEC, 0xEE, 0x37, 0x21, 0x25,
  514. 0xB4, 0xCC, 0x20, 0x07, 0x7F, 0xA7, 0x9F, 0x0F, 0x97, 0x3C,
  515. 0x26, 0x10, 0xE1, 0xE9, 0x3A, 0xF7, 0x53, 0x43, 0xC4, 0xCA,
  516. 0x97, 0x54, 0x13, 0x59, 0x24, 0x72, 0xE3, 0x1D, 0xE7, 0x00,
  517. 0x09, 0x61, 0x29, 0x5A, 0x53, 0x14, 0x5F, 0xAA, 0xF6, 0x6A,
  518. 0xFA, 0x72, 0xCA, 0x79, 0xC6, 0xA4, 0x9B, 0xEF, 0xE5, 0x69,
  519. 0x9E, 0x66,
  520. }
  521. var ss_exp = [24]byte{
  522. 0x0F, 0x7E, 0x5A, 0x52, 0x19, 0x9E, 0x77, 0x87, 0x2E, 0x93,
  523. 0x3A, 0xCB, 0x13, 0xD7, 0x96, 0xD6, 0x76, 0x27, 0xA6, 0x27,
  524. 0xE9, 0x1D, 0xD4, 0x2A,
  525. }
  526. var prvObj = NewPrivateKey(KeyVariant_SIKE)
  527. var pubObj = NewPublicKey(KeyVariant_SIKE)
  528. if pubObj.Import(pk) != nil || prvObj.Import(sk[:]) != nil {
  529. t.Error("Can't import one of the keys")
  530. }
  531. res := make([]byte, kemSikeP503.SharedSecretSize())
  532. checkErr(t, kemSikeP503.Decapsulate(res, prvObj, pubObj, ct),
  533. "error: Decapsulation failed")
  534. if !bytes.Equal(ss_exp[:], res) {
  535. t.Error("Wrong decapsulation result")
  536. }
  537. }
  538. func readAndCheckLine(r *bufio.Reader) []byte {
  539. // Read next line from buffer
  540. line, isPrefix, err := r.ReadLine()
  541. if err != nil || isPrefix {
  542. panic("Wrong format of input file")
  543. }
  544. // Function expects that line is in format "KEY = HEX_VALUE". Get
  545. // value, which should be a hex string
  546. hexst := strings.Split(string(line), "=")[1]
  547. hexst = strings.TrimSpace(hexst)
  548. // Convert value to byte string
  549. ret, err := hex.DecodeString(hexst)
  550. if err != nil {
  551. panic("Wrong format of input file")
  552. }
  553. return ret
  554. }
  555. func TestKAT(t *testing.T) {
  556. ssGot := make([]byte, kemSikeP503.SharedSecretSize())
  557. testDecapsulation := func(t *testing.T, pk, sk, ct, ssExpected []byte) {
  558. var pubKey = NewPublicKey(KeyVariant_SIKE)
  559. var prvKey = NewPrivateKey(KeyVariant_SIKE)
  560. if pubKey.Import(pk) != nil || prvKey.Import(sk) != nil {
  561. panic("sike test: can't load KAT")
  562. }
  563. err := kemSikeP503.Decapsulate(ssGot, prvKey, pubKey, ct)
  564. if err != nil {
  565. panic("sike test: can't perform degcapsulation KAT")
  566. }
  567. if (err != nil) || !bytes.Equal(ssGot, ssExpected) {
  568. t.Fatalf("KAT decapsulation failed\n")
  569. }
  570. }
  571. f, err := os.Open(tdata.katFile)
  572. if err != nil {
  573. t.Fatal(err)
  574. }
  575. r := bufio.NewReader(f)
  576. for {
  577. line, isPrefix, err := r.ReadLine()
  578. if err != nil || isPrefix {
  579. if err == io.EOF {
  580. break
  581. } else {
  582. t.Fatal(err)
  583. }
  584. }
  585. if len(strings.TrimSpace(string(line))) == 0 || line[0] == '#' {
  586. continue
  587. }
  588. // count
  589. _ = strings.Split(string(line), "=")[1]
  590. // seed
  591. _ = readAndCheckLine(r)
  592. // pk
  593. pk := readAndCheckLine(r)
  594. // sk (secret key in test vector is concatenation of
  595. // MSG + SECRET_BOB_KEY + PUBLIC_BOB_KEY. We use only MSG+SECRET_BOB_KEY
  596. sk := readAndCheckLine(r)
  597. sk = sk[:Params.MsgLen+int(Params.B.SecretByteLen)]
  598. // ct
  599. ct := readAndCheckLine(r)
  600. // ss
  601. ss := readAndCheckLine(r)
  602. testKeygen(t, pk, sk)
  603. testDecapsulation(t, pk, sk, ct, ss)
  604. testKEMRoundTrip(t, pk, sk)
  605. }
  606. }
  607. /* -------------------------------------------------------------------------
  608. Benchmarking
  609. -------------------------------------------------------------------------*/
  610. func BenchmarkKeygen(b *testing.B) {
  611. pk := NewPublicKey(KeyVariant_SIKE)
  612. prv := NewPrivateKey(KeyVariant_SIKE)
  613. prv.Generate(rand.Reader)
  614. for n := 0; n < b.N; n++ {
  615. prv.GeneratePublicKey(pk)
  616. }
  617. }
  618. func BenchmarkEncaps(b *testing.B) {
  619. pub := NewPublicKey(KeyVariant_SIKE)
  620. prv := NewPrivateKey(KeyVariant_SIKE)
  621. if prv.Generate(rand.Reader) != nil {
  622. b.FailNow()
  623. }
  624. prv.GeneratePublicKey(pub)
  625. var ct [24 + 378]byte
  626. var ss [16]byte
  627. for n := 0; n < b.N; n++ {
  628. kemSikeP503.Reset()
  629. kemSikeP503.Encapsulate(ct[:], ss[:], pub)
  630. }
  631. }
  632. func BenchmarkDecaps(b *testing.B) {
  633. var ct [24 + 378]byte
  634. var ss [16]byte
  635. pkA := NewPublicKey(KeyVariant_SIKE)
  636. prvA := NewPrivateKey(KeyVariant_SIKE)
  637. pkB := NewPublicKey(KeyVariant_SIKE)
  638. prvB := NewPrivateKey(KeyVariant_SIKE)
  639. if prvA.Generate(rand.Reader) != nil || prvB.Generate(rand.Reader) != nil {
  640. b.FailNow()
  641. }
  642. prvA.GeneratePublicKey(pkA)
  643. prvB.GeneratePublicKey(pkB)
  644. err := kemSikeP503.Encapsulate(ct[:], ss[:], pkA)
  645. if err != nil {
  646. b.FailNow()
  647. }
  648. for n := 0; n < b.N; n++ {
  649. kemSikeP503.Decapsulate(ss[:], prvA, pkB, ct[:])
  650. }
  651. }
  652. var kemSikeP503 KEM
  653. func init() {
  654. kemSikeP503.Allocate(rand.Reader)
  655. }