Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 

335 rader
9.2 KiB

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