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