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.

183 lines
3.9 KiB

  1. package main
  2. import (
  3. "crypto/rsa"
  4. "crypto/x509"
  5. "encoding/asn1"
  6. "encoding/json"
  7. "encoding/pem"
  8. "errors"
  9. "fmt"
  10. "io/ioutil"
  11. "os"
  12. "time"
  13. "github.com/fatih/color"
  14. )
  15. type Key struct {
  16. ID string `json:"id"`
  17. PrivK string `json:"privK"` //path of the PrivK file
  18. PubK string `json:"pubK"` //path of the PubK file
  19. Date time.Time `json:"date"`
  20. Hashed []byte `json:"hashed"`
  21. UnblindedSig []byte `json:"unblindedsig"`
  22. Verified bool `json:"verified"`
  23. ServerVerifier *rsa.PublicKey `json:"serververifier"`
  24. SignerID string `json:"signerid"`
  25. BlockchainRef string `json:"blockchainref"`
  26. }
  27. func ExportRsaPrivateKeyAsPemStr(privkey *rsa.PrivateKey) string {
  28. privkey_bytes := x509.MarshalPKCS1PrivateKey(privkey)
  29. privkey_pem := pem.EncodeToMemory(
  30. &pem.Block{
  31. Type: "RSA PRIVATE KEY",
  32. Bytes: privkey_bytes,
  33. },
  34. )
  35. return string(privkey_pem)
  36. }
  37. func ParseRsaPrivateKeyFromPemStr(privPEM string) (*rsa.PrivateKey, error) {
  38. block, _ := pem.Decode([]byte(privPEM))
  39. if block == nil {
  40. return nil, errors.New("failed to parse PEM block containing the key")
  41. }
  42. priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
  43. if err != nil {
  44. return nil, err
  45. }
  46. return priv, nil
  47. }
  48. func ExportRsaPublicKeyAsPemStr(pubkey rsa.PublicKey) (string, error) {
  49. asn1Bytes, err := asn1.Marshal(pubkey)
  50. check(err)
  51. pubkey_pem := pem.EncodeToMemory(
  52. &pem.Block{
  53. Type: "PUBLIC KEY",
  54. Bytes: asn1Bytes,
  55. },
  56. )
  57. color.Red("pubkey_pem")
  58. fmt.Println(pubkey_pem)
  59. return string(pubkey_pem), nil
  60. }
  61. func ParseRsaPublicKeyFromPemStr(pubPEM string) (pub rsa.PublicKey, err error) {
  62. pemBlock, _ := pem.Decode([]byte(pubPEM))
  63. _, err = asn1.Unmarshal(pemBlock.Bytes, &pub)
  64. return
  65. }
  66. func savePEMKey(fileName string, key *rsa.PrivateKey) {
  67. outFile, err := os.Create(fileName)
  68. check(err)
  69. defer outFile.Close()
  70. var privateKey = &pem.Block{
  71. Type: "PRIVATE KEY",
  72. Bytes: x509.MarshalPKCS1PrivateKey(key),
  73. }
  74. err = pem.Encode(outFile, privateKey)
  75. check(err)
  76. }
  77. func savePublicPEMKey(fileName string, pubkey rsa.PublicKey) {
  78. asn1Bytes, err := asn1.Marshal(pubkey)
  79. check(err)
  80. var pemkey = &pem.Block{
  81. Type: "PUBLIC KEY",
  82. Bytes: asn1Bytes,
  83. }
  84. pemfile, err := os.Create(fileName)
  85. check(err)
  86. defer pemfile.Close()
  87. err = pem.Encode(pemfile, pemkey)
  88. check(err)
  89. }
  90. func openPEMKey(path string) (key *rsa.PrivateKey, err error) {
  91. b, err := ioutil.ReadFile(path)
  92. if err != nil {
  93. fmt.Print(err)
  94. }
  95. key, err = ParseRsaPrivateKeyFromPemStr(string(b))
  96. return
  97. }
  98. func openPublicPEMKey(path string) (key rsa.PublicKey, err error) {
  99. b, err := ioutil.ReadFile(path)
  100. if err != nil {
  101. fmt.Print(err)
  102. }
  103. key, err = ParseRsaPublicKeyFromPemStr(string(b))
  104. return
  105. }
  106. func readKeys() []Key {
  107. path := keysDir + "/keys.json"
  108. var keys []Key
  109. file, err := ioutil.ReadFile(path)
  110. check(err)
  111. content := string(file)
  112. json.Unmarshal([]byte(content), &keys)
  113. return keys
  114. }
  115. func saveKeys(keys []Key) {
  116. jsonKeys, err := json.Marshal(keys)
  117. check(err)
  118. err = ioutil.WriteFile(keysDir+"/keys.json", jsonKeys, 0644)
  119. check(err)
  120. }
  121. func saveKey(k Key) {
  122. fmt.Println(k)
  123. keys := readKeys()
  124. for i, key := range keys {
  125. if key.ID == k.ID {
  126. keys[i] = k
  127. }
  128. }
  129. saveKeys(keys)
  130. }
  131. func getKeyByKeyID(keyID string) (k Key) {
  132. keys := readKeys()
  133. for _, key := range keys {
  134. if key.ID == keyID {
  135. k = key
  136. }
  137. }
  138. return k
  139. }
  140. func removeKey(keyID string, originalKeys []Key) (keys []Key) {
  141. for _, key := range originalKeys {
  142. if key.ID != keyID {
  143. keys = append(keys, key)
  144. }
  145. }
  146. return
  147. }
  148. /*
  149. func getServerPubK(url string) ownrsa.RSAPublicKey {
  150. r, err := http.Get(url + "/")
  151. check(err)
  152. fmt.Println(r)
  153. decoder := json.NewDecoder(r.Body)
  154. //var sigmaString string
  155. var pubK ownrsa.RSAPublicKey
  156. err = decoder.Decode(&pubK)
  157. if err != nil {
  158. panic(err)
  159. }
  160. defer r.Body.Close()
  161. color.Blue("received server pubK:")
  162. fmt.Println(pubK)
  163. return pubK
  164. }
  165. */