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