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 //privK := openPEMKey(key.PrivK)
70 pubK, err := openPublicPEMKey(keysDir + "/" + key.PubK)
71 check(err)
72
73 //pubK to string
74 m, err := ExportRsaPublicKeyAsPemStr(pubK)
75 check(err)
76 mB := []byte(m)
77
78 //get serverPubK
79 var serverPubK *rsa.PublicKey
80 res, err := http.Get(config.Server)
81 check(err)
82 decoder := json.NewDecoder(res.Body)
83 err = decoder.Decode(&serverPubK)
84 if err != nil {
85 panic(err)
86 }
87 defer res.Body.Close()
88
89 //blind the hashed message
90 // We do a SHA256 full-domain-hash expanded to 1536 bits (3/4 the key size)
91 hashed := fdh.Sum(crypto.SHA256, hashize, mB)
92 blinded, unblinder, err := rsablind.Blind(serverPubK, hashed)
93 if err != nil {
94 panic(err)
95 }
96 var askBlindSign AskBlindSign
97 askBlindSign.M = blinded
98 //send blinded to serverIDsigner
99 body := new(bytes.Buffer)
100 json.NewEncoder(body).Encode(askBlindSign)
101 res, err = http.Post(config.Server+"blindsign", "application/json", body)
102 check(err)
103 var signResponse SignResponse
104 decoder = json.NewDecoder(res.Body)
105 err = decoder.Decode(&signResponse)
106 if err != nil {
107 panic(err)
108 }
109 defer res.Body.Close()
110
111 sig := signResponse.Sig
112 //serverPubK := signResponse.PubK
113
114 //unblind the signedblind
115 unblindedSig := rsablind.Unblind(serverPubK, sig, unblinder)
116 color.Green("unblindedSig")
117 fmt.Println(unblindedSig)
118
119 // Verify the original hashed message against the unblinded signature
120 if err := rsablind.VerifyBlindSignature(serverPubK, hashed, unblindedSig); err != nil {
121 fmt.Println(err)
122 } else {
123 color.Green("blind signature verified")
124 key.Verified = true
125 }
126 key.UnblindedSig = unblindedSig
127 key.Hashed = hashed
128 key.ServerVerifier = serverPubK
129 saveKey(key)
130 keys := readKeys()
131 return keys
132}
133
134func Verify(packPubK string) {
135
136 return
137}
138
139func Delete(keyID string) []Key {
140 originalKeys := readKeys()
141 //remove key .pem files
142 key := getKeyByKeyID(keyID)
143 _, err := exec.Command("rm", keysDir+"/"+key.PrivK).CombinedOutput()
144 check(err)
145 _, err = exec.Command("rm", keysDir+"/"+key.PubK).CombinedOutput()
146 check(err)
147
148 //remove key from keys.json
149 keys := removeKey(keyID, originalKeys)
150 saveKeys(keys)
151 return keys
152}
153
154func Encrypt(keyID string, encryptData EncryptData) EncryptData {
155 key := getKeyByKeyID(keyID)
156 pubK, err := openPublicPEMKey(keysDir + "/" + key.PubK)
157 check(err)
158 out, err := rsa.EncryptOAEP(sha1.New(), rand.Reader, &pubK, []byte(encryptData.M), []byte("orders"))
159 check(err)
160 fmt.Println(string(out))
161 encryptData.C = out
162 return encryptData
163}
164
165func Decrypt(keyID string, encryptData EncryptData) EncryptData {
166 key := getKeyByKeyID(keyID)
167 privK, err := openPEMKey(keysDir + "/" + key.PrivK)
168 check(err)
169 out, err := rsa.DecryptOAEP(sha1.New(), rand.Reader, privK, []byte(encryptData.C), []byte("orders"))
170 check(err)
171 fmt.Println(string(out))
172 encryptData.M = string(out)
173 return encryptData
174}