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