Skip to content

Commit be99dc4

Browse files
authored
retry v value, and and deviceID in require param (#766)
1 parent 6015a93 commit be99dc4

File tree

2 files changed

+30
-11
lines changed

2 files changed

+30
-11
lines changed

e2e/util.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727

2828
func signMesssage(data []byte, projectID uint64, key *ecdsa.PrivateKey) ([]byte, error) {
2929
req := &api.CreateTaskReq{
30+
DeviceID: "did:io:" + crypto.PubkeyToAddress(key.PublicKey).String(),
3031
Nonce: uint64(time.Now().Unix()),
3132
ProjectID: strconv.Itoa(int(projectID)),
3233
Payloads: []string{hexutil.Encode(data)},
@@ -42,6 +43,7 @@ func signMesssage(data []byte, projectID uint64, key *ecdsa.PrivateKey) ([]byte,
4243
if err != nil {
4344
return nil, err
4445
}
46+
sig = sig[:len(sig)-1]
4547

4648
req.Signature = hexutil.Encode(sig)
4749

service/apinode/api/http.go

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ func newErrResp(err error) *errResp {
3535

3636
type CreateTaskReq struct {
3737
Nonce uint64 `json:"nonce" binding:"required"`
38+
DeviceID string `json:"deviceID" binding:"required"`
3839
ProjectID string `json:"projectID" binding:"required"`
3940
ProjectVersion string `json:"projectVersion,omitempty"`
4041
Payloads []string `json:"payloads" binding:"required"`
@@ -88,13 +89,13 @@ func (s *httpServer) createTask(c *gin.Context) {
8889
c.JSON(http.StatusBadRequest, newErrResp(errors.Wrap(err, "failed to decode signature from hex format")))
8990
return
9091
}
91-
pubkey, alg, err := recoverPubkey(*req, sig)
92+
deviceAddr := common.HexToAddress(strings.TrimPrefix(req.DeviceID, "did:io:"))
93+
addr, sig, alg, err := recoverAddr(*req, sig, deviceAddr)
9294
if err != nil {
9395
slog.Error("failed to recover public key", "error", err)
9496
c.JSON(http.StatusBadRequest, newErrResp(errors.Wrap(err, "invalid signature; could not recover public key")))
9597
return
9698
}
97-
addr := crypto.PubkeyToAddress(*pubkey)
9899

99100
ok, err := s.db.IsDeviceApproved(pid, addr)
100101
if err != nil {
@@ -174,24 +175,40 @@ func (s *httpServer) createTask(c *gin.Context) {
174175
})
175176
}
176177

177-
func recoverPubkey(req CreateTaskReq, sig []byte) (*ecdsa.PublicKey, string, error) {
178+
func recoverAddr(req CreateTaskReq, sig []byte, deviceAddr common.Address) (common.Address, []byte, string, error) {
178179
req.Signature = ""
179180
reqJson, err := json.Marshal(req)
180181
if err != nil {
181-
return nil, "", errors.Wrap(err, "failed to marshal request into json format")
182+
return common.Address{}, nil, "", errors.Wrap(err, "failed to marshal request into json format")
182183
}
183184

184185
switch req.Algorithm {
185186
default:
186-
hash := sha256.New()
187-
hash.Write(reqJson)
188-
h := hash.Sum(nil)
187+
h := sha256.Sum256(reqJson)
188+
res := []struct {
189+
pk *ecdsa.PublicKey
190+
sig []byte
191+
}{}
192+
rID := []uint8{0, 1}
193+
for _, id := range rID {
194+
ns := append(sig, byte(id))
195+
if pk, err := crypto.SigToPub(h[:], ns); err != nil {
196+
slog.Debug("failed to recover public key from signature", "error", err, "recover_id", id, "signature", hexutil.Encode(sig))
197+
} else {
198+
res = append(res, struct {
199+
pk *ecdsa.PublicKey
200+
sig []byte
201+
}{pk: pk, sig: ns})
202+
}
203+
}
189204

190-
pk, err := crypto.SigToPub(h, sig)
191-
if err != nil {
192-
return nil, "", errors.Wrap(err, "failed to recover public key from signature")
205+
for _, r := range res {
206+
addr := crypto.PubkeyToAddress(*r.pk)
207+
if bytes.Equal(addr.Bytes(), deviceAddr.Bytes()) {
208+
return addr, r.sig, "ES256", nil
209+
}
193210
}
194-
return pk, "ES256", nil
211+
return common.Address{}, nil, "", errors.New("failed to recover public key from signature")
195212
}
196213
}
197214

0 commit comments

Comments
 (0)