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