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