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