You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
3.8 KiB

  1. package main
  2. import (
  3. "bytes"
  4. "crypto"
  5. "crypto/rand"
  6. "crypto/rsa"
  7. "crypto/sha1"
  8. "encoding/json"
  9. "fmt"
  10. "io/ioutil"
  11. "net/http"
  12. "os/exec"
  13. "time"
  14. "github.com/cryptoballot/fdh"
  15. "github.com/cryptoballot/rsablind"
  16. "github.com/fatih/color"
  17. )
  18. func IDs() []Key {
  19. //read the keys stored in /keys directory
  20. keys := readKeys()
  21. return keys
  22. }
  23. func NewID() []Key {
  24. //generate RSA keys pair
  25. reader := rand.Reader
  26. k, err := rsa.GenerateKey(reader, keysize)
  27. check(err)
  28. id := hash(time.Now().String())
  29. savePEMKey(keysDir+"/"+id+"private.pem", k)
  30. savePublicPEMKey(keysDir+"/"+id+"public.pem", k.PublicKey)
  31. var key Key
  32. key.ID = id
  33. key.PrivK = id + "private.pem"
  34. key.PubK = id + "public.pem"
  35. time.Sleep(time.Second * 2)
  36. b, err := ioutil.ReadFile(keysDir + "/" + key.PubK)
  37. if err != nil {
  38. fmt.Print(err)
  39. }
  40. key.PublicKey = string(b)
  41. key.Date = time.Now()
  42. fmt.Println(key.PublicKey)
  43. keys := readKeys()
  44. keys = append(keys, key)
  45. saveKeys(keys)
  46. return keys
  47. }
  48. type AskBlindSign struct {
  49. M []byte `json:"m"`
  50. }
  51. type SignResponse struct {
  52. Sig []byte `json:"sig"`
  53. PubK rsa.PublicKey `json:"pubK"`
  54. }
  55. func BlindAndSendToSign(keyID string) []Key {
  56. //get the key
  57. key := getKeyByKeyID(keyID)
  58. pubK, err := openPublicPEMKey(keysDir + "/" + key.PubK)
  59. check(err)
  60. //pubK to string
  61. m, err := ExportRsaPublicKeyAsPemStr(pubK)
  62. check(err)
  63. mB := []byte(m)
  64. //get serverPubK
  65. var serverPubK *rsa.PublicKey
  66. res, err := http.Get(config.Server)
  67. check(err)
  68. decoder := json.NewDecoder(res.Body)
  69. err = decoder.Decode(&serverPubK)
  70. if err != nil {
  71. panic(err)
  72. }
  73. defer res.Body.Close()
  74. //blind the hashed message
  75. hashed := fdh.Sum(crypto.SHA256, hashize, mB)
  76. blinded, unblinder, err := rsablind.Blind(serverPubK, hashed)
  77. if err != nil {
  78. panic(err)
  79. }
  80. var askBlindSign AskBlindSign
  81. askBlindSign.M = blinded
  82. //send blinded to serverIDsigner
  83. body := new(bytes.Buffer)
  84. json.NewEncoder(body).Encode(askBlindSign)
  85. res, err = http.Post(config.Server+"blindsign", "application/json", body)
  86. check(err)
  87. var signResponse SignResponse
  88. decoder = json.NewDecoder(res.Body)
  89. err = decoder.Decode(&signResponse)
  90. if err != nil {
  91. panic(err)
  92. }
  93. defer res.Body.Close()
  94. sig := signResponse.Sig
  95. //unblind the signedblind
  96. unblindedSig := rsablind.Unblind(serverPubK, sig, unblinder)
  97. color.Green("unblindedSig")
  98. fmt.Println(unblindedSig)
  99. // Verify the original hashed message against the unblinded signature
  100. if err := rsablind.VerifyBlindSignature(serverPubK, hashed, unblindedSig); err != nil {
  101. fmt.Println(err)
  102. } else {
  103. color.Green("blind signature verified")
  104. key.Verified = true
  105. }
  106. key.UnblindedSig = unblindedSig
  107. key.Hashed = hashed
  108. key.ServerVerifier = serverPubK
  109. saveKey(key)
  110. keys := readKeys()
  111. return keys
  112. }
  113. func Verify(packPubK string) {
  114. return
  115. }
  116. func Delete(keyID string) []Key {
  117. originalKeys := readKeys()
  118. //remove key .pem files
  119. key := getKeyByKeyID(keyID)
  120. _, err := exec.Command("rm", keysDir+"/"+key.PrivK).CombinedOutput()
  121. check(err)
  122. _, err = exec.Command("rm", keysDir+"/"+key.PubK).CombinedOutput()
  123. check(err)
  124. //remove key from keys.json
  125. keys := removeKey(keyID, originalKeys)
  126. saveKeys(keys)
  127. return keys
  128. }
  129. func Encrypt(keyID string, encryptData EncryptData) EncryptData {
  130. key := getKeyByKeyID(keyID)
  131. pubK, err := openPublicPEMKey(keysDir + "/" + key.PubK)
  132. check(err)
  133. out, err := rsa.EncryptOAEP(sha1.New(), rand.Reader, &pubK, []byte(encryptData.M), []byte("orders"))
  134. check(err)
  135. fmt.Println(string(out))
  136. encryptData.C = out
  137. return encryptData
  138. }
  139. func Decrypt(keyID string, encryptData EncryptData) EncryptData {
  140. key := getKeyByKeyID(keyID)
  141. privK, err := openPEMKey(keysDir + "/" + key.PrivK)
  142. check(err)
  143. out, err := rsa.DecryptOAEP(sha1.New(), rand.Reader, privK, []byte(encryptData.C), []byte("orders"))
  144. check(err)
  145. fmt.Println(string(out))
  146. encryptData.M = string(out)
  147. return encryptData
  148. }