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	"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}