package main
|
|
|
|
import (
|
|
"crypto/rsa"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/cryptoballot/rsablind"
|
|
"gopkg.in/mgo.v2/bson"
|
|
)
|
|
|
|
type User struct {
|
|
Id bson.ObjectId `json:"id" bson:"_id,omitempty"`
|
|
Email string `json:"email"`
|
|
Password string `json:"password"`
|
|
Token string `json:"token"`
|
|
}
|
|
|
|
func Index(w http.ResponseWriter, r *http.Request) {
|
|
// return server public key, to allow others verifign signed strings by this server
|
|
jResp, err := json.Marshal(serverKey.PublicKey)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Fprintln(w, string(jResp))
|
|
}
|
|
|
|
func Signup(w http.ResponseWriter, r *http.Request) {
|
|
|
|
decoder := json.NewDecoder(r.Body)
|
|
var user User
|
|
err := decoder.Decode(&user)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer r.Body.Close()
|
|
|
|
fmt.Print("user signup: ")
|
|
fmt.Println(user)
|
|
|
|
//save the new project to mongodb
|
|
rUser := User{}
|
|
err = userCollection.Find(bson.M{"email": user.Email}).One(&rUser)
|
|
if err != nil {
|
|
//user not exists
|
|
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
|
|
err = userCollection.Find(bson.M{"email": user.Email}).One(&user)
|
|
} else {
|
|
//user exists
|
|
fmt.Fprintln(w, "User already registered")
|
|
return
|
|
}
|
|
|
|
jResp, err := json.Marshal(user)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Fprintln(w, string(jResp))
|
|
}
|
|
|
|
func Login(w http.ResponseWriter, r *http.Request) {
|
|
|
|
decoder := json.NewDecoder(r.Body)
|
|
var user User
|
|
err := decoder.Decode(&user)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer r.Body.Close()
|
|
//TODO check if the user password exists in the database
|
|
|
|
fmt.Print("user login: ")
|
|
fmt.Println(user)
|
|
token, err := newToken()
|
|
check(err)
|
|
user.Token = token
|
|
|
|
//save the new project to mongodb
|
|
rUser := User{}
|
|
err = userCollection.Find(bson.M{"email": user.Email}).One(&rUser)
|
|
if err != nil {
|
|
} else {
|
|
//user exists, update with the token
|
|
err = userCollection.Update(bson.M{"_id": rUser.Id}, user)
|
|
check(err)
|
|
}
|
|
|
|
jResp, err := json.Marshal(user)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Fprintln(w, string(jResp))
|
|
}
|
|
|
|
type Sign struct {
|
|
M string `json:"m"`
|
|
C string `json:"c"`
|
|
}
|
|
|
|
type AskBlindSign struct {
|
|
M []byte `json:"m"`
|
|
}
|
|
type SignResponse struct {
|
|
Sig []byte `json:"sig"`
|
|
PubK rsa.PublicKey `json:"pubK"`
|
|
}
|
|
|
|
func BlindSign(w http.ResponseWriter, r *http.Request) {
|
|
decoder := json.NewDecoder(r.Body)
|
|
var askBlindSign AskBlindSign
|
|
err := decoder.Decode(&askBlindSign)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer r.Body.Close()
|
|
fmt.Println(askBlindSign)
|
|
blinded := askBlindSign.M
|
|
|
|
/*privK := openPEMKey(keysDir + "/server_private.pem")
|
|
pubK := openPublicPEMKey(keysDir + "/server_public.pem")*/
|
|
sig, err := rsablind.BlindSign(serverKey, blinded)
|
|
check(err)
|
|
var signResponse SignResponse
|
|
signResponse.Sig = sig
|
|
signResponse.PubK = serverKey.PublicKey
|
|
|
|
jResp, err := json.Marshal(signResponse)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Fprintln(w, string(jResp))
|
|
}
|
|
|
|
//TODO verifysign will not be necessary in this server
|
|
type PetitionVerifySign struct {
|
|
M string `json:"m"`
|
|
MSigned string `json:"mSigned"`
|
|
}
|
|
|
|
func VerifySign(w http.ResponseWriter, r *http.Request) {
|
|
decoder := json.NewDecoder(r.Body)
|
|
var petitionVerifySign PetitionVerifySign
|
|
err := decoder.Decode(&petitionVerifySign)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer r.Body.Close()
|
|
|
|
fmt.Println(petitionVerifySign)
|
|
|
|
//convert M to []int
|
|
var mOriginal []int
|
|
mBytes := []byte(petitionVerifySign.M)
|
|
for _, byte := range mBytes {
|
|
mOriginal = append(mOriginal, int(byte))
|
|
}
|
|
|
|
//convert MSigned to []int
|
|
var mSignedInts []int
|
|
mSignedString := strings.Split(petitionVerifySign.MSigned, " ")
|
|
for _, s := range mSignedString {
|
|
i, err := strconv.Atoi(s)
|
|
check(err)
|
|
mSignedInts = append(mSignedInts, i)
|
|
}
|
|
|
|
//verified := ownrsa.Verify(mOriginal, mSignedInts, serverRSA.PubK)
|
|
verified := false
|
|
fmt.Fprintln(w, verified)
|
|
}
|