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