arnaucube
arnaucube/darkID-prototypePublic Self-hosted repository
darkID-prototype/serverIDsigner/userRESTFunctions.go
serverIDsigner/userRESTFunctions.goRaw
  1package main
  2
  3import (
  4	"crypto/rsa"
  5	"encoding/json"
  6	"fmt"
  7	"net/http"
  8	"strconv"
  9	"strings"
 10
 11	"github.com/cryptoballot/rsablind"
 12	"gopkg.in/mgo.v2/bson"
 13)
 14
 15type User struct {
 16	Id       bson.ObjectId `json:"id" bson:"_id,omitempty"`
 17	Email    string        `json:"email"`
 18	Password string        `json:"password"`
 19	Token    string        `json:"token"`
 20}
 21
 22func Index(w http.ResponseWriter, r *http.Request) {
 23	// return server public key, to allow others verifign signed strings by this server
 24	jResp, err := json.Marshal(serverKey.PublicKey)
 25	if err != nil {
 26		panic(err)
 27	}
 28	fmt.Fprintln(w, string(jResp))
 29}
 30
 31func Signup(w http.ResponseWriter, r *http.Request) {
 32
 33	decoder := json.NewDecoder(r.Body)
 34	var user User
 35	err := decoder.Decode(&user)
 36	if err != nil {
 37		panic(err)
 38	}
 39	defer r.Body.Close()
 40
 41	fmt.Print("user signup: ")
 42	fmt.Println(user)
 43
 44	//save the new project to mongodb
 45	rUser := User{}
 46	err = userCollection.Find(bson.M{"email": user.Email}).One(&rUser)
 47	if err != nil {
 48		//user not exists
 49		err = userCollection.Insert(user) //TODO find a way to get the object result when inserting in one line, without need of the two mgo petitions
 50		err = userCollection.Find(bson.M{"email": user.Email}).One(&user)
 51	} else {
 52		//user exists
 53		fmt.Fprintln(w, "User already registered")
 54		return
 55	}
 56
 57	jResp, err := json.Marshal(user)
 58	if err != nil {
 59		panic(err)
 60	}
 61	fmt.Fprintln(w, string(jResp))
 62}
 63
 64func Login(w http.ResponseWriter, r *http.Request) {
 65
 66	decoder := json.NewDecoder(r.Body)
 67	var user User
 68	err := decoder.Decode(&user)
 69	if err != nil {
 70		panic(err)
 71	}
 72	defer r.Body.Close()
 73	//TODO check if the user password exists in the database
 74
 75	fmt.Print("user login: ")
 76	fmt.Println(user)
 77	token, err := newToken()
 78	check(err)
 79	user.Token = token
 80
 81	//save the new project to mongodb
 82	rUser := User{}
 83	err = userCollection.Find(bson.M{"email": user.Email}).One(&rUser)
 84	if err != nil {
 85	} else {
 86		//user exists, update with the token
 87		err = userCollection.Update(bson.M{"_id": rUser.Id}, user)
 88		check(err)
 89	}
 90
 91	jResp, err := json.Marshal(user)
 92	if err != nil {
 93		panic(err)
 94	}
 95	fmt.Fprintln(w, string(jResp))
 96}
 97
 98type Sign struct {
 99	M string `json:"m"`
100	C string `json:"c"`
101}
102
103type AskBlindSign struct {
104	M []byte `json:"m"`
105}
106type SignResponse struct {
107	Sig  []byte        `json:"sig"`
108	PubK rsa.PublicKey `json:"pubK"`
109}
110
111func BlindSign(w http.ResponseWriter, r *http.Request) {
112	decoder := json.NewDecoder(r.Body)
113	var askBlindSign AskBlindSign
114	err := decoder.Decode(&askBlindSign)
115	if err != nil {
116		panic(err)
117	}
118	defer r.Body.Close()
119	fmt.Println(askBlindSign)
120	blinded := askBlindSign.M
121
122	/*privK := openPEMKey(keysDir + "/server_private.pem")
123	pubK := openPublicPEMKey(keysDir + "/server_public.pem")*/
124	sig, err := rsablind.BlindSign(serverKey, blinded)
125	check(err)
126	var signResponse SignResponse
127	signResponse.Sig = sig
128	signResponse.PubK = serverKey.PublicKey
129
130	jResp, err := json.Marshal(signResponse)
131	if err != nil {
132		panic(err)
133	}
134	fmt.Fprintln(w, string(jResp))
135}
136
137//TODO verifysign will not be necessary in this server
138type PetitionVerifySign struct {
139	M       string `json:"m"`
140	MSigned string `json:"mSigned"`
141}
142
143func VerifySign(w http.ResponseWriter, r *http.Request) {
144	decoder := json.NewDecoder(r.Body)
145	var petitionVerifySign PetitionVerifySign
146	err := decoder.Decode(&petitionVerifySign)
147	if err != nil {
148		panic(err)
149	}
150	defer r.Body.Close()
151
152	fmt.Println(petitionVerifySign)
153
154	//convert M to []int
155	var mOriginal []int
156	mBytes := []byte(petitionVerifySign.M)
157	for _, byte := range mBytes {
158		mOriginal = append(mOriginal, int(byte))
159	}
160
161	//convert MSigned to []int
162	var mSignedInts []int
163	mSignedString := strings.Split(petitionVerifySign.MSigned, " ")
164	for _, s := range mSignedString {
165		i, err := strconv.Atoi(s)
166		check(err)
167		mSignedInts = append(mSignedInts, i)
168	}
169
170	//verified := ownrsa.Verify(mOriginal, mSignedInts, serverRSA.PubK)
171	verified := false
172	fmt.Fprintln(w, verified)
173}