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}