Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 

379 lignes
13 KiB

  1. package sike
  2. import (
  3. "testing"
  4. "bufio"
  5. "bytes"
  6. "encoding/hex"
  7. "io"
  8. "os"
  9. "strings"
  10. "fmt"
  11. rand "crypto/rand"
  12. . "github.com/henrydcase/nobs/dh/sidh"
  13. )
  14. const (
  15. PkB = "7C55E268665504B9A11A1B30B4363A4957960AD015A7B74DF39FB0141A95CC51A4BEBBB48452EF0C881220D68CB5FF904C0549F05F06BF49A520E684DD610A7E121B420C751B789BDCDB8B6EC136BA0CE74EB6904906057EA7343839EA35FAF2C3D7BE76C81DCA4DF0850CE5F111FF9FF97242EC5520310D7F90A004BACFD75408CBFE8948232A9CCF035136DE3691D9BEF110C3081AADF0D2328CE2CC94998D8AE94D6575083FAFA045F50201FCE841D01C214CC8BBEFCC701484215EA70518204C76A0DA89BEAF0B066F6FD9E78A2C908CF0AFF74E0B55477190F918397F0CF3A537B7911DA846196AD914114A15C2F3C1062D78B19D23348C3D3D4A9C2B2018B382CC44544DA2FA263EB6212D2D13F254216DE002D4AEA55C75C5349A681D7A809BCC29C4CAE1168AC790321FF7429FAAC2FC09465F93E10B9DD970901A1B1D045DDAC9D7B901E00F29AA9F2C87C8EF848E80B7B290ECF85D6BB4C7E975A939A7AFB63069F900A75C9B7B71C2E7472C21A87AB604B6372D4EBEC5974A711281A819636D8FA3E6608F2B81F35599BBB4A1EB5CBD8F743587550F8CE3A809F5C9C399DD52B2D15F217A36F3218C772FD4E67F67D526DEBE1D31FEC4634927A873A1A6CFE55FF1E35AB72EBBD22E3CDD9D2640813345015BB6BD25A6977D0391D4D78998DD178155FEBF247BED3A9F83EAF3346BA90098B908B2359B60491C94330626709D235D1CFB7C87DCA779CFBA23DA280DC06FAEA0FDB3773B0C6391F889D803B7C04AC6AB27375B440336789823176C57"
  16. PrB = "00010203040506070809000102030405060708090001020304050607080901028626ED79D451140800E03B59B956F8210E556067407D13DC90FA9E8B872BFB8FAB0A7289852106E40538D3575C500201"
  17. )
  18. var params = Params(FP_751)
  19. type MultiIdTestingFunc func(*testing.T, uint8)
  20. func Do(f MultiIdTestingFunc, t *testing.T) {
  21. for id, val := range tdata {
  22. params = Params(id)
  23. fmt.Printf("\tTesting: %s\n", val.name)
  24. f(t, id)
  25. }
  26. }
  27. var tdata = map[uint8]struct {
  28. name string
  29. KatFile string
  30. PkB string
  31. PrB string
  32. }{
  33. FP_503: {
  34. "P-503",
  35. "../../etc/PQCkemKAT_434.rsp",
  36. "F11CF893CE4F794216B11A75B0B2981F8DB3FC8550A75C86DB2279FD4CB445E2F4D21F7380570832963F1445AB898267EC1B84196CAC1A84566D7C4D334505C5AB98D638B2E1A5766F5F716FDF1177AB864D2E2CE10BF8DC3D0A3CAFA05B587D746F5CC78E32F283C035886A96698BDCF0F2CAE0B5D4B9C725A3EB2EA13AA43AEC99488962F8B9A5038DD655C0237023CF21002E3E19B1A993C9118DDC74A07B4F9585C0BCEA6E401A384C4F411A5A6E97DA4E53DA6C8F39F62304F201EC93EDFA76FDA6CE557C4389D5ACE744ED5578A391B6AF01F00F93F4EC7CE41F5C5D1FB11D367C0F2CEB4DD9A92BD8948D777F4285EEBB0870C9C39BD0523804A9FDDFCDE61810D8B958E172702EB97D10A98E9FDDFBE1FC2146230AA26B7FFF48B70ECFDBEF9E7CBBCC12308992FDEF8CA0CD9F0A387F1B68D661A46C37D7FAB9A4ECDE63BEF0A3D7732CA7A8E18C88EBEDF546E842E27CC04FA78A8C03DF22A747E2D627FC9EB3FD8A57337BE759D1957C1D31FCA3FEE6D171192B0C",
  37. "9BC5315580207C6C16DCF3A30C48DAF278DE12E8C27DF6735A4D0A8A41C4F666854E9B13673071CEB2FD61DEF9A850C211E7C50071B1DD0D"},
  38. FP_751: {
  39. "P-751",
  40. "../../etc/PQCkemKAT_644.rsp",
  41. "7C55E268665504B9A11A1B30B4363A4957960AD015A7B74DF39FB0141A95CC51A4BEBBB48452EF0C881220D68CB5FF904C0549F05F06BF49A520E684DD610A7E121B420C751B789BDCDB8B6EC136BA0CE74EB6904906057EA7343839EA35FAF2C3D7BE76C81DCA4DF0850CE5F111FF9FF97242EC5520310D7F90A004BACFD75408CBFE8948232A9CCF035136DE3691D9BEF110C3081AADF0D2328CE2CC94998D8AE94D6575083FAFA045F50201FCE841D01C214CC8BBEFCC701484215EA70518204C76A0DA89BEAF0B066F6FD9E78A2C908CF0AFF74E0B55477190F918397F0CF3A537B7911DA846196AD914114A15C2F3C1062D78B19D23348C3D3D4A9C2B2018B382CC44544DA2FA263EB6212D2D13F254216DE002D4AEA55C75C5349A681D7A809BCC29C4CAE1168AC790321FF7429FAAC2FC09465F93E10B9DD970901A1B1D045DDAC9D7B901E00F29AA9F2C87C8EF848E80B7B290ECF85D6BB4C7E975A939A7AFB63069F900A75C9B7B71C2E7472C21A87AB604B6372D4EBEC5974A711281A819636D8FA3E6608F2B81F35599BBB4A1EB5CBD8F743587550F8CE3A809F5C9C399DD52B2D15F217A36F3218C772FD4E67F67D526DEBE1D31FEC4634927A873A1A6CFE55FF1E35AB72EBBD22E3CDD9D2640813345015BB6BD25A6977D0391D4D78998DD178155FEBF247BED3A9F83EAF3346BA90098B908B2359B60491C94330626709D235D1CFB7C87DCA779CFBA23DA280DC06FAEA0FDB3773B0C6391F889D803B7C04AC6AB27375B440336789823176C57",
  42. "00010203040506070809000102030405060708090001020304050607080901028626ED79D451140800E03B59B956F8210E556067407D13DC90FA9E8B872BFB8FAB0A7289852106E40538D3575C500201"},
  43. }
  44. // Fail if err !=nil. Display msg as an error message
  45. func checkErr(t testing.TB, err error, msg string) {
  46. if err != nil {
  47. t.Errorf("%s [%s]", msg, err)
  48. }
  49. }
  50. // Encrypt, Decrypt, check if input/output plaintext is the same
  51. func testPKERoundTrip(t *testing.T, id uint8) {
  52. // Message to be encrypted
  53. var params = Params(id)
  54. var msg = make([]byte, params.MsgLen)
  55. for i, _ := range msg {
  56. msg[i] = byte(i)
  57. }
  58. // Import keys
  59. pkB := NewPublicKey(params.Id, KeyVariant_SIKE)
  60. skB := NewPrivateKey(params.Id, KeyVariant_SIKE)
  61. pk_hex, err := hex.DecodeString(tdata[id].PkB)
  62. if err != nil {
  63. t.Fatal(err)
  64. }
  65. sk_hex, err := hex.DecodeString(tdata[id].PrB)
  66. if err != nil {
  67. t.Fatal(err)
  68. }
  69. if pkB.Import(pk_hex) != nil || skB.Import(sk_hex) != nil {
  70. t.Error("Import")
  71. }
  72. ct, err := Encrypt(rand.Reader, pkB, msg[:])
  73. if err != nil {
  74. t.Fatal(err)
  75. }
  76. pt, err := Decrypt(skB, ct)
  77. if err != nil {
  78. t.Fatal(err)
  79. }
  80. if !bytes.Equal(pt[:], msg[:]) {
  81. t.Errorf("Decryption failed \n got : %X\n exp : %X", pt, msg)
  82. }
  83. }
  84. // Generate key and check if can encrypt
  85. func testPKEKeyGeneration(t *testing.T, id uint8) {
  86. // Message to be encrypted
  87. var params = Params(id)
  88. var msg = make([]byte, params.MsgLen)
  89. var err error
  90. for i, _ := range msg {
  91. msg[i] = byte(i)
  92. }
  93. sk := NewPrivateKey(id, KeyVariant_SIKE)
  94. err = sk.Generate(rand.Reader)
  95. checkErr(t, err, "PEK key generation")
  96. pk := sk.GeneratePublicKey()
  97. // Try to encrypt
  98. ct, err := Encrypt(rand.Reader, pk, msg[:])
  99. checkErr(t, err, "PEK encryption")
  100. pt, err := Decrypt(sk, ct)
  101. checkErr(t, err, "PEK key decryption")
  102. if !bytes.Equal(pt[:], msg[:]) {
  103. t.Fatalf("Decryption failed \n got : %X\n exp : %X", pt, msg)
  104. }
  105. }
  106. func testNegativePKE(t *testing.T, id uint8) {
  107. var msg [40]byte
  108. var err error
  109. var params = Params(id)
  110. // Generate key
  111. sk := NewPrivateKey(params.Id, KeyVariant_SIKE)
  112. err = sk.Generate(rand.Reader)
  113. checkErr(t, err, "key generation")
  114. pk := sk.GeneratePublicKey()
  115. // bytelen(msg) - 1
  116. ct, err := Encrypt(rand.Reader, pk, msg[:params.KemSize+8-1])
  117. if err == nil {
  118. t.Fatal("Error hasn't been returned")
  119. }
  120. if ct != nil {
  121. t.Fatal("Ciphertext must be nil")
  122. }
  123. // KemSize - 1
  124. pt, err := Decrypt(sk, msg[:params.KemSize+8-1])
  125. if err == nil {
  126. t.Fatal("Error hasn't been returned")
  127. }
  128. if pt != nil {
  129. t.Fatal("Ciphertext must be nil")
  130. }
  131. }
  132. func testKEMRoundTrip(t *testing.T, pkB, skB []byte, id uint8) {
  133. // Import keys
  134. pk := NewPublicKey(id, KeyVariant_SIKE)
  135. sk := NewPrivateKey(id, KeyVariant_SIKE)
  136. if pk.Import(pkB) != nil || sk.Import(skB) != nil {
  137. t.Error("Import failed")
  138. }
  139. ct, ss_e, err := Encapsulate(rand.Reader, pk)
  140. if err != nil {
  141. t.Error("Encapsulate failed")
  142. }
  143. ss_d, err := Decapsulate(sk, pk, ct)
  144. if err != nil {
  145. t.Error("Decapsulate failed")
  146. }
  147. if !bytes.Equal(ss_e, ss_d) {
  148. t.Error("Shared secrets from decapsulation and encapsulation differ")
  149. }
  150. }
  151. func TestKEMRoundTrip(t *testing.T) {
  152. for id, val := range tdata {
  153. fmt.Printf("\tTesting: %s\n", val.name)
  154. pk, err := hex.DecodeString(tdata[id].PkB)
  155. checkErr(t, err, "public key B not a number")
  156. sk, err := hex.DecodeString(tdata[id].PrB)
  157. checkErr(t, err, "private key B not a number")
  158. testKEMRoundTrip(t, pk, sk, id)
  159. }
  160. }
  161. func testKEMKeyGeneration(t *testing.T, id uint8) {
  162. // Generate key
  163. sk := NewPrivateKey(id, KeyVariant_SIKE)
  164. checkErr(t, sk.Generate(rand.Reader), "error: key generation")
  165. pk := sk.GeneratePublicKey()
  166. // calculated shared secret
  167. ct, ss_e, err := Encapsulate(rand.Reader, pk)
  168. checkErr(t, err, "encapsulation failed")
  169. ss_d, err := Decapsulate(sk, pk, ct)
  170. checkErr(t, err, "decapsulation failed")
  171. if !bytes.Equal(ss_e, ss_d) {
  172. t.Fatalf("KEM failed \n encapsulated: %X\n decapsulated: %X", ss_d, ss_e)
  173. }
  174. }
  175. func testNegativeKEM(t *testing.T, id uint8) {
  176. sk := NewPrivateKey(id, KeyVariant_SIKE)
  177. checkErr(t, sk.Generate(rand.Reader), "error: key generation")
  178. pk := sk.GeneratePublicKey()
  179. ct, ss_e, err := Encapsulate(rand.Reader, pk)
  180. checkErr(t, err, "pre-requisite for a test failed")
  181. ct[0] = ct[0] - 1
  182. ss_d, err := Decapsulate(sk, pk, ct)
  183. checkErr(t, err, "decapsulation returns error when invalid ciphertext provided")
  184. if bytes.Equal(ss_e, ss_d) {
  185. // no idea how this could ever happen, but it would be very bad
  186. t.Error("critical error")
  187. }
  188. // Try encapsulating with SIDH key
  189. pkSidh := NewPublicKey(params.Id, KeyVariant_SIDH_B)
  190. prSidh := NewPrivateKey(params.Id, KeyVariant_SIDH_B)
  191. _, _, err = Encapsulate(rand.Reader, pkSidh)
  192. if err == nil {
  193. t.Error("encapsulation accepts SIDH public key")
  194. }
  195. // Try decapsulating with SIDH key
  196. _, err = Decapsulate(prSidh, pk, ct)
  197. if err == nil {
  198. t.Error("decapsulation accepts SIDH private key key")
  199. }
  200. }
  201. // In case invalid ciphertext is provided, SIKE's decapsulation must
  202. // return same (but unpredictable) result for a given key.
  203. func testNegativeKEMSameWrongResult(t *testing.T, id uint8) {
  204. sk := NewPrivateKey(id, KeyVariant_SIKE)
  205. checkErr(t, sk.Generate(rand.Reader), "error: key generation")
  206. pk := sk.GeneratePublicKey()
  207. ct, encSs, err := Encapsulate(rand.Reader, pk)
  208. checkErr(t, err, "pre-requisite for a test failed")
  209. // make ciphertext wrong
  210. ct[0] = ct[0] - 1
  211. decSs1, err := Decapsulate(sk, pk, ct)
  212. checkErr(t, err, "pre-requisite for a test failed")
  213. // second decapsulation must be done with same, but imported private key
  214. expSk := sk.Export()
  215. // creat new private key
  216. sk = NewPrivateKey(params.Id, KeyVariant_SIKE)
  217. err = sk.Import(expSk)
  218. checkErr(t, err, "import failed")
  219. // try decapsulating again. ss2 must be same as ss1 and different than
  220. // original plaintext
  221. decSs2, err := Decapsulate(sk, pk, ct)
  222. checkErr(t, err, "pre-requisite for a test failed")
  223. if !bytes.Equal(decSs1, decSs2) {
  224. t.Error("decapsulation is insecure")
  225. }
  226. if bytes.Equal(encSs, decSs1) || bytes.Equal(encSs, decSs2) {
  227. // this test requires that decapsulation returns wrong result
  228. t.Errorf("test implementation error")
  229. }
  230. }
  231. func readAndCheckLine(r *bufio.Reader) []byte {
  232. // Read next line from buffer
  233. line, isPrefix, err := r.ReadLine()
  234. if err != nil || isPrefix {
  235. panic("Wrong format of input file")
  236. }
  237. // Function expects that line is in format "KEY = HEX_VALUE". Get
  238. // value, which should be a hex string
  239. hexst := strings.Split(string(line), "=")[1]
  240. hexst = strings.TrimSpace(hexst)
  241. // Convert value to byte string
  242. ret, err := hex.DecodeString(hexst)
  243. if err != nil {
  244. panic("Wrong format of input file")
  245. }
  246. return ret
  247. }
  248. func testKeygen(pk, sk []byte) bool {
  249. // Import provided private key
  250. var prvKey = NewPrivateKey(params.Id, KeyVariant_SIKE)
  251. if prvKey.Import(sk) != nil {
  252. panic("sike test: can't load KAT")
  253. }
  254. // Generate public key
  255. pubKey := prvKey.GeneratePublicKey()
  256. return bytes.Equal(pubKey.Export(), pk)
  257. }
  258. func testDecapsulation(pk, sk, ct, ssExpected []byte) bool {
  259. var pubKey = NewPublicKey(params.Id, KeyVariant_SIKE)
  260. var prvKey = NewPrivateKey(params.Id, KeyVariant_SIKE)
  261. if pubKey.Import(pk) != nil || prvKey.Import(sk) != nil {
  262. panic("sike test: can't load KAT")
  263. }
  264. ssGot, err := Decapsulate(prvKey, pubKey, ct)
  265. if err != nil {
  266. panic("sike test: can't perform decapsulation KAT")
  267. }
  268. if err != nil {
  269. return false
  270. }
  271. return bytes.Equal(ssGot, ssExpected)
  272. }
  273. func testSIKE_KAT(t *testing.T, id uint8) {
  274. f, err := os.Open(tdata[id].KatFile)
  275. if err != nil {
  276. t.Fatal(err)
  277. }
  278. r := bufio.NewReader(f)
  279. for {
  280. line, isPrefix, err := r.ReadLine()
  281. if err != nil || isPrefix {
  282. if err == io.EOF {
  283. break
  284. } else {
  285. t.Fatal(err)
  286. }
  287. }
  288. if len(strings.TrimSpace(string(line))) == 0 || line[0] == '#' {
  289. continue
  290. }
  291. // count
  292. count := strings.Split(string(line), "=")[1]
  293. // seed
  294. _ = readAndCheckLine(r)
  295. // pk
  296. pk := readAndCheckLine(r)
  297. // sk (secret key in test vector is concatenation of
  298. // MSG + SECRET_BOB_KEY + PUBLIC_BOB_KEY. We use only MSG+SECRET_BOB_KEY
  299. sk := readAndCheckLine(r)
  300. sk = sk[:params.MsgLen+uint(params.B.SecretByteLen)]
  301. // ct
  302. ct := readAndCheckLine(r)
  303. // ss
  304. ss := readAndCheckLine(r)
  305. if !testKeygen(pk, sk) {
  306. t.Fatalf("KAT keygen form private failed at %s\n", count)
  307. }
  308. if !testDecapsulation(pk, sk, ct, ss) {
  309. t.Fatalf("KAT decapsulation failed at %s\n", count)
  310. }
  311. // aditionally test roundtrip with a keypair
  312. testKEMRoundTrip(t, pk, sk, id)
  313. }
  314. }
  315. // Interface to "testing"
  316. func TestPKEKeyGeneration(t *testing.T) { Do(testPKEKeyGeneration, t) }
  317. func TestPKERoundTrip(t *testing.T) { Do(testPKERoundTrip, t) }
  318. func TestNegativePKE(t *testing.T) { Do(testNegativePKE, t) }
  319. func TestKEMKeyGeneration(t *testing.T) { Do(testKEMKeyGeneration, t) }
  320. func TestNegativeKEM(t *testing.T) { Do(testNegativeKEM, t) }
  321. func TestSIKE_KAT(t *testing.T) { Do(testSIKE_KAT, t) }
  322. func TestNegativeKEMSameWrongResult(t *testing.T) { Do(testNegativeKEMSameWrongResult, t) }