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