Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

659 рядки
21 KiB

  1. package sike
  2. import (
  3. "bufio"
  4. "bytes"
  5. "crypto/rand"
  6. "encoding/hex"
  7. "math/big"
  8. "strings"
  9. "testing"
  10. )
  11. var tdata = struct {
  12. name string
  13. PrB_sidh string
  14. PkB_sidh string
  15. PkB_sike string
  16. PrB_sike string
  17. PrA_sike string
  18. PkA_sike string
  19. }{
  20. name: "P-503",
  21. PkB_sike: "68460C22466E95864CFEA7B5D9077E768FF4F9ED69AE56D7CF3F236FB06B31020EEE34B5B572CEA5DDF20B531966AA8F5F3ACC0C6D1CE04EEDC30FD1F1233E2D96FE60C6D638FC646EAF2E2246F1AEC96859CE874A1F029A78F9C978CD6B22114A0D5AB20101191FD923E80C76908B1498B9D0200065CCA09159A0C65A1E346CC6470314FE78388DAA89DD08EC67DBE63C1F606674ACC49EBF9FDBB2B898B3CE733113AA6F942DB401A76D629CE6EE6C0FDAF4CFB1A5E366DB66C17B3923A1B7FB26A3FF25B9018869C674D3DEF4AF269901D686FE4647F9D2CDB2CEB3AFA305B27C885F037ED167F595066C21E7DD467D8332B934A5102DA5F13332DFA356B82156A0BB2E7E91C6B85B7D1E381BC9E3F0FC4DB9C36016D9ECEC415D7E977E9AC29910D934BA2FE4EE49D3B387607A4E1AFABF495FB86A77194626589E802FF5167C7A25C542C1EAD25A6E0AA931D94F2F9AFD3DBDF222E651F729A90E77B20974905F1E65E041CE6C95AAB3E1F22D332E0A5DE9C5DB3D9C7A38",
  22. PrB_sike: "80FC55DA74DEFE3113487B80841E678AF9ED4E0599CF07353A4AB93971C090A0" +
  23. "A9402C9DC98AC6DC8F5FDE5E970AE22BA48A400EFC72851C",
  24. PrB_sidh: "A885A8B889520A6DBAD9FB33365E5B77FDED629440A16A533F259A510F63A822",
  25. PrA_sike: "B0AD510708F4ABCF3E0D97DC2F2FF112D9D2AAE49D97FFD1E4267F21C6E71C03",
  26. PkA_sike: "A6BADBA04518A924B20046B59AC197DCDF0EA48014C9E228C4994CCA432F360E" +
  27. "2D527AFB06CA7C96EE5CEE19BAD53BF9218A3961CAD7EC092BD8D9EBB22A3D51" +
  28. "33008895A3F1F6A023F91E0FE06A00A622FD6335DAC107F8EC4283DC2632F080" +
  29. "4E64B390DAD8A2572F1947C67FDF4F8787D140CE2C6B24E752DA9A195040EDFA" +
  30. "C27333FAE97DBDEB41DA9EEB2DB067AE7DA8C58C0EF57AEFC18A3D6BD0576FF2" +
  31. "F1CFCAEC50C958331BF631F3D2E769790C7B6DF282B74BBC02998AD10F291D47" +
  32. "C5A762FF84253D3B3278BDF20C8D4D4AA317BE401B884E26A1F02C7308AADB68" +
  33. "20EBDB0D339F5A63346F3B40CACED72F544DAF51566C6E807D0E6E1E38514342" +
  34. "432661DC9564DA07548570E256688CD9E8060D8775F95D501886D958588CACA0" +
  35. "9F2D2AE1913F996E76AF63E31A179A7A7D2A46EDA03B2BCCF9020A5AA15F9A28" +
  36. "9340B33F3AE7F97360D45F8AE1B9DD48779A57E8C45B50A02C00349CD1C58C55" +
  37. "1D68BC2A75EAFED944E8C599C288037181E997471352E24C952B",
  38. PkB_sidh: "244AF1F367C2C33912750A98497CC8214BC195BD52BD76513D32ACE4B75E31F0" +
  39. "281755C265F5565C74E3C04182B9C244071859C8588CC7F09547CEFF8F7705D2" +
  40. "60CE87D6BFF914EE7DBE4B9AF051CA420062EEBDF043AF58184495026949B068" +
  41. "98A47046BFAE8DF3B447746184AF550553BB5D266D6E1967ACA33CAC5F399F90" +
  42. "360D70867F2C71EF6F94FF915C7DA8BC9549FB7656E691DAEFC93CF56876E482" +
  43. "CA2F8BE2D6CDCC374C31AD8833CABE997CC92305F38497BEC4DFD1821B004FEC" +
  44. "E16448F9A24F965EFE409A8939EEA671633D9FFCF961283E59B8834BDF7EDDB3" +
  45. "05D6275B61DA6692325432A0BAA074FC7C1F51E76208AB193A57520D40A76334" +
  46. "EE5712BDC3E1EFB6103966F2329EDFF63082C4DFCDF6BE1C5A048630B81871B8" +
  47. "83B735748A8FD4E2D9530C272163AB18105B10015CA7456202FE1C9B92CEB167" +
  48. "5EAE1132E582C88E47ED87B363D45F05BEA714D5E9933D7AF4071CBB5D49008F" +
  49. "3E3DAD7DFF935EE509D5DE561842B678CCEB133D62E270E9AC3E",
  50. }
  51. /* -------------------------------------------------------------------------
  52. Helpers
  53. -------------------------------------------------------------------------*/
  54. // Fail if err !=nil. Display msg as an error message
  55. func checkErr(t testing.TB, err error, msg string) {
  56. if err != nil {
  57. t.Error(msg)
  58. }
  59. }
  60. // Utility used for running same test with all registered prime fields
  61. type MultiIdTestingFunc func(testing.TB)
  62. // Converts string to private key
  63. func convToPrv(s string, v KeyVariant) *PrivateKey {
  64. key := NewPrivateKey(v)
  65. hex, e := hex.DecodeString(s)
  66. if e != nil {
  67. panic("non-hex number provided")
  68. }
  69. e = key.Import(hex)
  70. if e != nil {
  71. panic("Can't import private key")
  72. }
  73. return key
  74. }
  75. // Converts string to public key
  76. func convToPub(s string, v KeyVariant) *PublicKey {
  77. key := NewPublicKey(v)
  78. hex, e := hex.DecodeString(s)
  79. if e != nil {
  80. panic("non-hex number provided")
  81. }
  82. e = key.Import(hex)
  83. if e != nil {
  84. panic("Can't import public key")
  85. }
  86. return key
  87. }
  88. /* -------------------------------------------------------------------------
  89. Unit tests
  90. -------------------------------------------------------------------------*/
  91. func TestKeygen(t *testing.T) {
  92. alicePrivate := convToPrv(tdata.PrA_sike, KeyVariant_SIDH_A)
  93. bobPrivate := convToPrv(tdata.PrB_sidh, KeyVariant_SIDH_B)
  94. expPubA := convToPub(tdata.PkA_sike, KeyVariant_SIDH_A)
  95. expPubB := convToPub(tdata.PkB_sidh, KeyVariant_SIDH_B)
  96. pubA := alicePrivate.GeneratePublicKey()
  97. pubB := bobPrivate.GeneratePublicKey()
  98. if !bytes.Equal(pubA.Export(), expPubA.Export()) {
  99. t.Fatalf("unexpected value of public key A")
  100. }
  101. if !bytes.Equal(pubB.Export(), expPubB.Export()) {
  102. t.Fatalf("unexpected value of public key B")
  103. }
  104. }
  105. func TestImportExport(t *testing.T) {
  106. var err error
  107. a := NewPublicKey(KeyVariant_SIDH_A)
  108. b := NewPublicKey(KeyVariant_SIDH_B)
  109. // Import keys
  110. a_hex, err := hex.DecodeString(tdata.PkA_sike)
  111. checkErr(t, err, "invalid hex-number provided")
  112. err = a.Import(a_hex)
  113. checkErr(t, err, "import failed")
  114. b_hex, err := hex.DecodeString(tdata.PkB_sike)
  115. checkErr(t, err, "invalid hex-number provided")
  116. err = b.Import(b_hex)
  117. checkErr(t, err, "import failed")
  118. // Export and check if same
  119. if !bytes.Equal(b.Export(), b_hex) || !bytes.Equal(a.Export(), a_hex) {
  120. t.Fatalf("export/import failed")
  121. }
  122. if (len(b.Export()) != b.Size()) || (len(a.Export()) != a.Size()) {
  123. t.Fatalf("wrong size of exported keys")
  124. }
  125. }
  126. func testPrivateKeyBelowMax(t testing.TB) {
  127. for variant, keySz := range map[KeyVariant]*DomainParams{
  128. KeyVariant_SIDH_A: &Params.A,
  129. KeyVariant_SIDH_B: &Params.B} {
  130. func(v KeyVariant, dp *DomainParams) {
  131. var blen = int(dp.SecretByteLen)
  132. var prv = NewPrivateKey(v)
  133. // Calculate either (2^e2 - 1) or (2^s - 1); where s=ceil(log_2(3^e3)))
  134. maxSecertVal := big.NewInt(int64(dp.SecretBitLen))
  135. maxSecertVal.Exp(big.NewInt(int64(2)), maxSecertVal, nil)
  136. maxSecertVal.Sub(maxSecertVal, big.NewInt(1))
  137. // Do same test 1000 times
  138. for i := 0; i < 1000; i++ {
  139. err := prv.Generate(rand.Reader)
  140. checkErr(t, err, "Private key generation")
  141. // Convert to big-endian, as that's what expected by (*Int)SetBytes()
  142. secretBytes := prv.Export()
  143. for i := 0; i < int(blen/2); i++ {
  144. tmp := secretBytes[i] ^ secretBytes[blen-i-1]
  145. secretBytes[i] = tmp ^ secretBytes[i]
  146. secretBytes[blen-i-1] = tmp ^ secretBytes[blen-i-1]
  147. }
  148. prvBig := new(big.Int).SetBytes(secretBytes)
  149. // Check if generated key is bigger then acceptable
  150. if prvBig.Cmp(maxSecertVal) == 1 {
  151. t.Error("Generated private key is wrong")
  152. }
  153. }
  154. }(variant, keySz)
  155. }
  156. }
  157. func testKeyAgreement(t *testing.T, pkA, prA, pkB, prB string) {
  158. var e error
  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. s1, e := DeriveSecret(bobPrivate, alicePublic)
  166. checkErr(t, e, "derivation s1")
  167. s2, e := DeriveSecret(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. s1, e = DeriveSecret(bobPrivate, alicePublic)
  183. checkErr(t, e, "derivation of s1 failed")
  184. s2, e = DeriveSecret(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. prvA := NewPrivateKey(KeyVariant_SIDH_A)
  193. prvB := NewPrivateKey(KeyVariant_SIDH_B)
  194. // Generate private keys
  195. err = prvA.Generate(rand.Reader)
  196. checkErr(t, err, "key generation failed")
  197. err = prvB.Generate(rand.Reader)
  198. checkErr(t, err, "key generation failed")
  199. // Generate public keys
  200. pubA := prvA.GeneratePublicKey()
  201. pubB := prvB.GeneratePublicKey()
  202. // Derive shared secret
  203. s1, err := DeriveSecret(prvB, pubA)
  204. checkErr(t, err, "")
  205. s2, err := DeriveSecret(prvA, pubB)
  206. checkErr(t, err, "")
  207. if !bytes.Equal(s1[:], s2[:]) {
  208. t.Fatalf("Two shared keys: \n%X, \n%X do not match", s1, s2)
  209. }
  210. }
  211. // Encrypt, Decrypt, check if input/output plaintext is the same
  212. func testPKERoundTrip(t testing.TB, id uint8) {
  213. // Message to be encrypted
  214. var msg = make([]byte, Params.MsgLen)
  215. for i, _ := range msg {
  216. msg[i] = byte(i)
  217. }
  218. // Import keys
  219. pkB := NewPublicKey(KeyVariant_SIKE)
  220. skB := NewPrivateKey(KeyVariant_SIKE)
  221. pk_hex, err := hex.DecodeString(tdata.PkB_sike)
  222. if err != nil {
  223. t.Fatal(err)
  224. }
  225. sk_hex, err := hex.DecodeString(tdata.PrB_sike)
  226. if err != nil {
  227. t.Fatal(err)
  228. }
  229. if pkB.Import(pk_hex) != nil || skB.Import(sk_hex) != nil {
  230. t.Error("Import")
  231. }
  232. ct, err := Encrypt(rand.Reader, pkB, msg[:])
  233. if err != nil {
  234. t.Fatal(err)
  235. }
  236. pt, err := Decrypt(skB, ct)
  237. if err != nil {
  238. t.Fatal(err)
  239. }
  240. if !bytes.Equal(pt[:], msg[:]) {
  241. t.Errorf("Decryption failed \n got : %X\n exp : %X", pt, msg)
  242. }
  243. }
  244. // Generate key and check if can encrypt
  245. func TestPKEKeyGeneration(t *testing.T) {
  246. // Message to be encrypted
  247. var msg = make([]byte, Params.MsgLen)
  248. var err error
  249. for i, _ := range msg {
  250. msg[i] = byte(i)
  251. }
  252. sk := NewPrivateKey(KeyVariant_SIKE)
  253. err = sk.Generate(rand.Reader)
  254. checkErr(t, err, "PEK key generation")
  255. pk := sk.GeneratePublicKey()
  256. // Try to encrypt
  257. ct, err := Encrypt(rand.Reader, pk, msg[:])
  258. checkErr(t, err, "PEK encryption")
  259. pt, err := Decrypt(sk, ct)
  260. checkErr(t, err, "PEK key decryption")
  261. if !bytes.Equal(pt[:], msg[:]) {
  262. t.Fatalf("Decryption failed \n got : %X\n exp : %X", pt, msg)
  263. }
  264. }
  265. func TestNegativePKE(t *testing.T) {
  266. var msg [40]byte
  267. var err error
  268. // Generate key
  269. sk := NewPrivateKey(KeyVariant_SIKE)
  270. err = sk.Generate(rand.Reader)
  271. checkErr(t, err, "key generation")
  272. pk := sk.GeneratePublicKey()
  273. // bytelen(msg) - 1
  274. ct, err := Encrypt(rand.Reader, pk, msg[:Params.KemSize+8-1])
  275. if err == nil {
  276. t.Fatal("Error hasn't been returned")
  277. }
  278. if ct != nil {
  279. t.Fatal("Ciphertext must be nil")
  280. }
  281. // KemSize - 1
  282. pt, err := Decrypt(sk, msg[:Params.KemSize+8-1])
  283. if err == nil {
  284. t.Fatal("Error hasn't been returned")
  285. }
  286. if pt != nil {
  287. t.Fatal("Ciphertext must be nil")
  288. }
  289. }
  290. func testKEMRoundTrip(t *testing.T, pkB, skB []byte) {
  291. // Import keys
  292. pk := NewPublicKey(KeyVariant_SIKE)
  293. sk := NewPrivateKey(KeyVariant_SIKE)
  294. if pk.Import(pkB) != nil || sk.Import(skB) != nil {
  295. t.Error("Import failed")
  296. }
  297. ct, ss_e, err := Encapsulate(rand.Reader, pk)
  298. if err != nil {
  299. t.Error("Encapsulate failed")
  300. }
  301. ss_d, err := Decapsulate(sk, pk, ct)
  302. if err != nil {
  303. t.Error("Decapsulate failed")
  304. }
  305. if !bytes.Equal(ss_e, ss_d) {
  306. t.Error("Shared secrets from decapsulation and encapsulation differ")
  307. }
  308. }
  309. func TestKEMRoundTrip(t *testing.T) {
  310. pk, err := hex.DecodeString(tdata.PkB_sike)
  311. checkErr(t, err, "public key B not a number")
  312. sk, err := hex.DecodeString(tdata.PrB_sike)
  313. checkErr(t, err, "private key B not a number")
  314. testKEMRoundTrip(t, pk, sk)
  315. }
  316. func TestKEMKeyGeneration(t *testing.T) {
  317. // Generate key
  318. sk := NewPrivateKey(KeyVariant_SIKE)
  319. checkErr(t, sk.Generate(rand.Reader), "error: key generation")
  320. pk := sk.GeneratePublicKey()
  321. // calculated shared secret
  322. ct, ss_e, err := Encapsulate(rand.Reader, pk)
  323. checkErr(t, err, "encapsulation failed")
  324. ss_d, err := Decapsulate(sk, pk, ct)
  325. checkErr(t, err, "decapsulation failed")
  326. if !bytes.Equal(ss_e, ss_d) {
  327. t.Fatalf("KEM failed \n encapsulated: %X\n decapsulated: %X", ss_d, ss_e)
  328. }
  329. }
  330. func TestNegativeKEM(t *testing.T) {
  331. sk := NewPrivateKey(KeyVariant_SIKE)
  332. checkErr(t, sk.Generate(rand.Reader), "error: key generation")
  333. pk := sk.GeneratePublicKey()
  334. ct, ss_e, err := Encapsulate(rand.Reader, pk)
  335. checkErr(t, err, "pre-requisite for a test failed")
  336. ct[0] = ct[0] - 1
  337. ss_d, err := Decapsulate(sk, pk, ct)
  338. checkErr(t, err, "decapsulation returns error when invalid ciphertext provided")
  339. if bytes.Equal(ss_e, ss_d) {
  340. // no idea how this could ever happen, but it would be very bad
  341. t.Error("critical error")
  342. }
  343. // Try encapsulating with SIDH key
  344. pkSidh := NewPublicKey(KeyVariant_SIDH_B)
  345. prSidh := NewPrivateKey(KeyVariant_SIDH_B)
  346. _, _, err = Encapsulate(rand.Reader, pkSidh)
  347. if err == nil {
  348. t.Error("encapsulation accepts SIDH public key")
  349. }
  350. // Try decapsulating with SIDH key
  351. _, err = Decapsulate(prSidh, pk, ct)
  352. if err == nil {
  353. t.Error("decapsulation accepts SIDH private key key")
  354. }
  355. }
  356. // In case invalid ciphertext is provided, SIKE's decapsulation must
  357. // return same (but unpredictable) result for a given key.
  358. func TestNegativeKEMSameWrongResult(t *testing.T) {
  359. sk := NewPrivateKey(KeyVariant_SIKE)
  360. checkErr(t, sk.Generate(rand.Reader), "error: key generation")
  361. pk := sk.GeneratePublicKey()
  362. ct, encSs, err := Encapsulate(rand.Reader, pk)
  363. checkErr(t, err, "pre-requisite for a test failed")
  364. // make ciphertext wrong
  365. ct[0] = ct[0] - 1
  366. decSs1, err := Decapsulate(sk, pk, ct)
  367. checkErr(t, err, "pre-requisite for a test failed")
  368. // second decapsulation must be done with same, but imported private key
  369. expSk := sk.Export()
  370. // creat new private key
  371. sk = NewPrivateKey(KeyVariant_SIKE)
  372. err = sk.Import(expSk)
  373. checkErr(t, err, "import failed")
  374. // try decapsulating again. ss2 must be same as ss1 and different than
  375. // original plaintext
  376. decSs2, err := Decapsulate(sk, pk, ct)
  377. checkErr(t, err, "pre-requisite for a test failed")
  378. if !bytes.Equal(decSs1, decSs2) {
  379. t.Error("decapsulation is insecure")
  380. }
  381. if bytes.Equal(encSs, decSs1) || bytes.Equal(encSs, decSs2) {
  382. // this test requires that decapsulation returns wrong result
  383. t.Errorf("test implementation error")
  384. }
  385. }
  386. func readAndCheckLine(r *bufio.Reader) []byte {
  387. // Read next line from buffer
  388. line, isPrefix, err := r.ReadLine()
  389. if err != nil || isPrefix {
  390. panic("Wrong format of input file")
  391. }
  392. // Function expects that line is in format "KEY = HEX_VALUE". Get
  393. // value, which should be a hex string
  394. hexst := strings.Split(string(line), "=")[1]
  395. hexst = strings.TrimSpace(hexst)
  396. // Convert value to byte string
  397. ret, err := hex.DecodeString(hexst)
  398. if err != nil {
  399. panic("Wrong format of input file")
  400. }
  401. return ret
  402. }
  403. func testKeygenSIKE(pk, sk []byte, id uint8) bool {
  404. // Import provided private key
  405. var prvKey = NewPrivateKey(KeyVariant_SIKE)
  406. if prvKey.Import(sk) != nil {
  407. panic("sike test: can't load KAT")
  408. }
  409. // Generate public key
  410. pubKey := prvKey.GeneratePublicKey()
  411. return bytes.Equal(pubKey.Export(), pk)
  412. }
  413. func testDecapsulation(pk, sk, ct, ssExpected []byte, id uint8) bool {
  414. var pubKey = NewPublicKey(KeyVariant_SIKE)
  415. var prvKey = NewPrivateKey(KeyVariant_SIKE)
  416. if pubKey.Import(pk) != nil || prvKey.Import(sk) != nil {
  417. panic("sike test: can't load KAT")
  418. }
  419. ssGot, err := Decapsulate(prvKey, pubKey, ct)
  420. if err != nil {
  421. panic("sike test: can't perform degcapsulation KAT")
  422. }
  423. if err != nil {
  424. return false
  425. }
  426. return bytes.Equal(ssGot, ssExpected)
  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. 0x07, 0xAA, 0x51, 0x45, 0x3E, 0x1F, 0x53, 0x2A, 0x0A, 0x05,
  440. 0x46, 0xF6, 0x54, 0x7F, 0x5D, 0x56, 0xD6, 0x76, 0xD3, 0xEA,
  441. 0x4B, 0x6B, 0x01, 0x9B, 0x11, 0x72, 0x6F, 0x75, 0xEA, 0x34,
  442. 0x3C, 0x28, 0x2C, 0x36, 0xFD, 0x77, 0xDA, 0xBE, 0xB6, 0x20,
  443. 0x18, 0xC1, 0x93, 0x98, 0x18, 0x86, 0x30, 0x2F, 0x2E, 0xD2,
  444. 0x00, 0x61, 0xFF, 0xAE, 0x78, 0xAE, 0xFB, 0x6F, 0x32, 0xAC,
  445. 0x06, 0xBF, 0x35, 0xF6, 0xF7, 0x5B, 0x98, 0x26, 0x95, 0xC2,
  446. 0xD8, 0xD6, 0x1C, 0x0E, 0x47, 0xDA, 0x76, 0xCE, 0xB5, 0xF1,
  447. 0x19, 0xCC, 0x01, 0xE1, 0x17, 0xA9, 0x62, 0xF7, 0x82, 0x6C,
  448. 0x25, 0x51, 0x25, 0xAE, 0xFE, 0xE3, 0xE2, 0xE1, 0x35, 0xAE,
  449. 0x2E, 0x8F, 0x38, 0xE0, 0x7C, 0x74, 0x3C, 0x1D, 0x39, 0x91,
  450. 0x1B, 0xC7, 0x9F, 0x8E, 0x33, 0x4E, 0x84, 0x19, 0xB8, 0xD9,
  451. 0xC2, 0x71, 0x35, 0x02, 0x47, 0x3E, 0x79, 0xEF, 0x47, 0xE1,
  452. 0xD8, 0x21, 0x96, 0x1F, 0x11, 0x59, 0x39, 0x34, 0x76, 0xEF,
  453. 0x3E, 0xB7, 0x4E, 0xFB, 0x7C, 0x55, 0xA1, 0x85, 0xAA, 0xAB,
  454. 0xAD, 0xF0, 0x09, 0xCB, 0xD1, 0xE3, 0x7C, 0x4F, 0x5D, 0x2D,
  455. 0xE1, 0x13, 0xF0, 0x71, 0xD9, 0xE5, 0xF6, 0xAF, 0x7F, 0xC1,
  456. 0x27, 0x95, 0x8D, 0x52, 0xD5, 0x96, 0x42, 0x38, 0x41, 0xF7,
  457. 0x24, 0x3F, 0x3A, 0xB5, 0x7E, 0x11, 0xE4, 0xF9, 0x33, 0xEE,
  458. 0x4D, 0xBE, 0x74, 0x48, 0xF9, 0x98, 0x04, 0x01, 0x16, 0xEB,
  459. 0xA9, 0x0D, 0x61, 0xC6, 0xFD, 0x4C, 0xCF, 0x98, 0x84, 0x4A,
  460. 0x94, 0xAC, 0x69, 0x2C, 0x02, 0x8B, 0xE3, 0xD1, 0x41, 0x0D,
  461. 0xF2, 0x2D, 0x46, 0x1F, 0x57, 0x1C, 0x77, 0x86, 0x18, 0xE3,
  462. 0x63, 0xDE, 0xF3, 0xE3, 0x02, 0x30, 0x54, 0x73, 0xAE, 0xC2,
  463. 0x32, 0xA2, 0xCE, 0xEB, 0xCF, 0x81, 0x46, 0x54, 0x5C, 0xF4,
  464. 0x5D, 0x2A, 0x03, 0x5D, 0x9C, 0xAE, 0xE0, 0x60, 0x03, 0x80,
  465. 0x11, 0x30, 0xA5, 0xAA, 0xD1, 0x75, 0x67, 0xE0, 0x1C, 0x2B,
  466. 0x6B, 0x5D, 0x83, 0xDE, 0x92, 0x9B, 0x0E, 0xD7, 0x11, 0x0F,
  467. 0x00, 0xC4, 0x59, 0xE4, 0x81, 0x04, 0x3B, 0xEE, 0x5C, 0x04,
  468. 0xD1, 0x0E, 0xD0, 0x67, 0xF5, 0xCC, 0xAA, 0x72, 0x73, 0xEA,
  469. 0xC4, 0x76, 0x99, 0x3B, 0x4C, 0x90, 0x2F, 0xCB, 0xD8, 0x0A,
  470. 0x5B, 0xEC, 0x0E, 0x0E, 0x1F, 0x59, 0xEA, 0x14, 0x8D, 0x34,
  471. 0x53, 0x65, 0x4C, 0x1A, 0x59, 0xA8, 0x95, 0x66, 0x60, 0xBB,
  472. 0xC4, 0xCC, 0x32, 0xA9, 0x8D, 0x2A, 0xAA, 0x14, 0x6F, 0x0F,
  473. 0x81, 0x4D, 0x32, 0x02, 0xFD, 0x33, 0x58, 0x42, 0xCF, 0xF3,
  474. 0x67, 0xD0, 0x9F, 0x0B, 0xB1, 0xCC, 0x18, 0xA5, 0xC4, 0x19,
  475. 0xB6, 0x00, 0xED, 0xFA, 0x32, 0x1A, 0x5F, 0x67, 0xC8, 0xC3,
  476. 0xEB, 0x0D, 0xB5, 0x9A, 0x36, 0x47, 0x82, 0x00,
  477. }
  478. var ct = []byte{
  479. 0xE6, 0xB7, 0xE5, 0x7B, 0xA9, 0x19, 0xD1, 0x2C, 0xB8, 0x5C,
  480. 0x7B, 0x66, 0x74, 0xB0, 0x71, 0xA1, 0xFF, 0x71, 0x7F, 0x4B,
  481. 0xB5, 0xA6, 0xAF, 0x48, 0x32, 0x52, 0xD5, 0x82, 0xEE, 0x8A,
  482. 0xBB, 0x08, 0x1E, 0xF6, 0xAC, 0x91, 0xA2, 0xCB, 0x6B, 0x6A,
  483. 0x09, 0x2B, 0xD9, 0xC6, 0x27, 0xD6, 0x3A, 0x6B, 0x8D, 0xFC,
  484. 0xB8, 0x90, 0x8F, 0x72, 0xB3, 0xFA, 0x7D, 0x34, 0x7A, 0xC4,
  485. 0x7E, 0xE3, 0x30, 0xC5, 0xA0, 0xFE, 0x3D, 0x43, 0x14, 0x4E,
  486. 0x3A, 0x14, 0x76, 0x3E, 0xFB, 0xDF, 0xE3, 0xA8, 0xE3, 0x5E,
  487. 0x38, 0xF2, 0xE0, 0x39, 0x67, 0x60, 0xFD, 0xFB, 0xB4, 0x19,
  488. 0xCD, 0xE1, 0x93, 0xA2, 0x06, 0xCC, 0x65, 0xCD, 0x6E, 0xC8,
  489. 0xB4, 0x5E, 0x41, 0x4B, 0x6C, 0xA5, 0xF4, 0xE4, 0x9D, 0x52,
  490. 0x8C, 0x25, 0x60, 0xDD, 0x3D, 0xA9, 0x7F, 0xF2, 0x88, 0xC1,
  491. 0x0C, 0xEE, 0x97, 0xE0, 0xE7, 0x3B, 0xB7, 0xD3, 0x6F, 0x28,
  492. 0x79, 0x2F, 0x50, 0xB2, 0x4F, 0x74, 0x3A, 0x0C, 0x88, 0x27,
  493. 0x98, 0x3A, 0x27, 0xD3, 0x26, 0x83, 0x59, 0x49, 0x81, 0x5B,
  494. 0x0D, 0xA7, 0x0C, 0x4F, 0xEF, 0xFB, 0x1E, 0xAF, 0xE9, 0xD2,
  495. 0x1C, 0x10, 0x25, 0xEC, 0x9E, 0xFA, 0x57, 0x36, 0xAA, 0x3F,
  496. 0xC1, 0xA3, 0x2C, 0xE9, 0xB5, 0xC9, 0xED, 0x72, 0x51, 0x4C,
  497. 0x02, 0xB4, 0x7B, 0xB3, 0xED, 0x9F, 0x45, 0x03, 0x34, 0xAC,
  498. 0x9A, 0x9E, 0x62, 0x5F, 0x82, 0x7A, 0x77, 0x34, 0xF9, 0x21,
  499. 0x94, 0xD2, 0x38, 0x3D, 0x05, 0xF0, 0x8A, 0x60, 0x1C, 0xB7,
  500. 0x1D, 0xF5, 0xB7, 0x53, 0x77, 0xD3, 0x9D, 0x3D, 0x70, 0x6A,
  501. 0xCB, 0x18, 0x20, 0x6B, 0x29, 0x17, 0x3A, 0x6D, 0xA1, 0xB2,
  502. 0x64, 0xDB, 0x6C, 0xE6, 0x1A, 0x95, 0xA7, 0xF4, 0x1A, 0x78,
  503. 0x1D, 0xA2, 0x40, 0x15, 0x41, 0x59, 0xDD, 0xEE, 0x23, 0x57,
  504. 0xCE, 0x36, 0x0D, 0x55, 0xBD, 0xB8, 0xFD, 0x0F, 0x35, 0xBD,
  505. 0x5B, 0x92, 0xD6, 0x1C, 0x84, 0x8C, 0x32, 0x64, 0xA6, 0x5C,
  506. 0x45, 0x18, 0x07, 0x6B, 0xF9, 0xA9, 0x43, 0x9A, 0x83, 0xCD,
  507. 0xB5, 0xB3, 0xD9, 0x17, 0x99, 0x2C, 0x2A, 0x8B, 0xE0, 0x8E,
  508. 0xAF, 0xA6, 0x4C, 0x95, 0xBB, 0x70, 0x60, 0x1A, 0x3A, 0x97,
  509. 0xAA, 0x2F, 0x3D, 0x22, 0x83, 0xB7, 0x4F, 0x59, 0xED, 0x3F,
  510. 0x4E, 0xF4, 0x19, 0xC6, 0x25, 0x0B, 0x0A, 0x5E, 0x21, 0xB9,
  511. 0x91, 0xB8, 0x19, 0x84, 0x48, 0x78, 0xCE, 0x27, 0xBF, 0x41,
  512. 0x89, 0xF6, 0x30, 0xFD, 0x6B, 0xD9, 0xB8, 0x1D, 0x72, 0x8A,
  513. 0x56, 0xCC, 0x2F, 0x82, 0xE4, 0x46, 0x4D, 0x75, 0xD8, 0x92,
  514. 0xE6, 0x9C, 0xCC, 0xD2, 0xCD, 0x35, 0xE4, 0xFC, 0x2A, 0x85,
  515. 0x6B, 0xA9, 0xB2, 0x27, 0xC9, 0xA1, 0xFF, 0xB3, 0x96, 0x3E,
  516. 0x59, 0xF6, 0x4C, 0x66, 0x56, 0x2E, 0xF5, 0x1B, 0x97, 0x32,
  517. 0xB0, 0x71, 0x5A, 0x9C, 0x50, 0x4B, 0x6F, 0xC4, 0xCA, 0x94,
  518. 0x75, 0x37, 0x46, 0x10, 0x12, 0x2F, 0x4F, 0xA3, 0x82, 0xCD,
  519. 0xBD, 0x7C,
  520. }
  521. var ss_exp = []byte{
  522. 0x74, 0x3D, 0x25, 0x36, 0x00, 0x24, 0x63, 0x1A, 0x39, 0x1A,
  523. 0xB4, 0xAD, 0x01, 0x17, 0x78, 0xE9}
  524. var prvObj = NewPrivateKey(KeyVariant_SIKE)
  525. var pubObj = NewPublicKey(KeyVariant_SIKE)
  526. if pubObj.Import(pk) != nil || prvObj.Import(sk[:]) != nil {
  527. t.Error("Can't import one of the keys")
  528. }
  529. res, _ := Decapsulate(prvObj, pubObj, ct)
  530. if !bytes.Equal(ss_exp, res) {
  531. t.Error("Wrong decapsulation result")
  532. }
  533. }
  534. /* -------------------------------------------------------------------------
  535. Benchmarking
  536. -------------------------------------------------------------------------*/
  537. func BenchmarkKeygen(b *testing.B) {
  538. prv := NewPrivateKey(KeyVariant_SIKE)
  539. for n := 0; n < b.N; n++ {
  540. prv.Generate(rand.Reader)
  541. }
  542. }
  543. func BenchmarkEncaps(b *testing.B) {
  544. prv := NewPrivateKey(KeyVariant_SIKE)
  545. if prv.Generate(rand.Reader) != nil {
  546. b.FailNow()
  547. }
  548. pub := prv.GeneratePublicKey()
  549. for n := 0; n < b.N; n++ {
  550. Encapsulate(rand.Reader, pub)
  551. }
  552. }
  553. func BenchmarkDecaps(b *testing.B) {
  554. prvA := NewPrivateKey(KeyVariant_SIKE)
  555. prvB := NewPrivateKey(KeyVariant_SIKE)
  556. if prvA.Generate(rand.Reader) != nil || prvB.Generate(rand.Reader) != nil {
  557. b.FailNow()
  558. }
  559. pubA := prvA.GeneratePublicKey()
  560. pubB := prvB.GeneratePublicKey()
  561. ctext, _, err := Encapsulate(rand.Reader, pubA)
  562. if err != nil {
  563. b.FailNow()
  564. }
  565. for n := 0; n < b.N; n++ {
  566. Decapsulate(prvA, pubB, ctext)
  567. }
  568. }