arnaucube
arnaucube/darkID-prototypePublic Self-hosted repository
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}