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

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