Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

109 řádky
2.0 KiB

  1. package mkem
  2. import (
  3. "github.com/henrydcase/nobs/dh/csidh"
  4. "github.com/henrydcase/nobs/drbg"
  5. "github.com/henrydcase/nobs/hash/sha3"
  6. )
  7. const (
  8. SharedSecretSz = 64
  9. PublicKeySz = 64
  10. )
  11. // Used for storing cipertext
  12. type ciphertext struct {
  13. // public key
  14. U [64]byte
  15. // private key
  16. V [64]byte
  17. }
  18. type PKE struct {
  19. Rng *drbg.CtrDrbg
  20. H sha3.ShakeHash
  21. }
  22. type MultiPKE struct {
  23. PKE
  24. // stores ephemeral/internal public key
  25. Ct0 [PublicKeySz]byte
  26. // stores list of ciphertexts ct[i]
  27. Cts [][SharedSecretSz]byte
  28. }
  29. // Allocates PKE
  30. func (c *PKE) Allocate(rng *drbg.CtrDrbg) {
  31. c.Rng = rng
  32. // Function H used in Algorithm 16 and 18
  33. c.H = sha3.NewShake128()
  34. }
  35. // Allocates MultiPKE
  36. func (c *MultiPKE) Allocate(recipients_nb uint, rng *drbg.CtrDrbg) {
  37. c.PKE.Allocate(rng)
  38. c.Cts = make([][SharedSecretSz]byte, recipients_nb)
  39. }
  40. // PKE encryption
  41. func (c *PKE) Enc(pk *csidh.PublicKey, pt *[16]byte) (ct ciphertext) {
  42. var ss [64]byte
  43. var pkA csidh.PublicKey
  44. var skA csidh.PrivateKey
  45. csidh.GeneratePrivateKey(&skA, c.Rng)
  46. csidh.DeriveSecret(&ss, pk, &skA, c.Rng)
  47. c.H.Reset()
  48. c.H.Write(ss[:])
  49. c.H.Read(ss[:16])
  50. for i := 0; i < 16; i++ {
  51. ct.V[i] = pt[i] ^ ss[i]
  52. }
  53. csidh.GeneratePublicKey(&pkA, &skA, c.Rng)
  54. pkA.Export(ct.U[:])
  55. return
  56. }
  57. // PKE decryption
  58. func (c *PKE) Dec(sk *csidh.PrivateKey, ct *ciphertext) (pt [16]byte) {
  59. var ss [64]byte
  60. var pk csidh.PublicKey
  61. pk.Import(ct.U[:])
  62. csidh.DeriveSecret(&ss, &pk, sk, c.Rng)
  63. c.H.Reset()
  64. c.H.Write(ss[:])
  65. c.H.Read(ss[:16])
  66. for i := 0; i < 16; i++ {
  67. pt[i] = ct.V[i] ^ ss[i]
  68. }
  69. return
  70. }
  71. // mPKE encryption
  72. func (c *MultiPKE) Encrypt(keys []csidh.PublicKey, pt *[16]byte) {
  73. var ss [64]byte
  74. var pkA csidh.PublicKey
  75. var skA csidh.PrivateKey
  76. csidh.GeneratePrivateKey(&skA, c.Rng)
  77. for i, pk := range keys {
  78. csidh.DeriveSecret(&ss, &pk, &skA, c.Rng)
  79. c.H.Write(ss[:])
  80. c.H.Read(ss[:16])
  81. c.H.Reset()
  82. for j := 0; j < 16; j++ {
  83. c.Cts[i][j] = pt[j] ^ ss[j]
  84. }
  85. }
  86. csidh.GeneratePublicKey(&pkA, &skA, c.Rng)
  87. pkA.Export(c.Ct0[:])
  88. return
  89. }