|
8 | 8 | "sync" |
9 | 9 |
|
10 | 10 | "github.com/btcsuite/btcd/btcec/v2" |
| 11 | + "github.com/btcsuite/btcd/btcec/v2/ecdsa" |
| 12 | + "github.com/btcsuite/btcd/chaincfg/chainhash" |
11 | 13 | "github.com/lightninglabs/lightning-terminal/autopilotserverrpc" |
12 | 14 | "github.com/lightninglabs/lightning-terminal/rules" |
13 | 15 | "github.com/lightningnetwork/lnd/lntest/node" |
@@ -44,6 +46,7 @@ type ClientState uint8 |
44 | 46 | const ( |
45 | 47 | ClientStateActive = iota |
46 | 48 | ClientStateInactive |
| 49 | + ClientStateRevoked |
47 | 50 | ) |
48 | 51 |
|
49 | 52 | type clientSession struct { |
@@ -172,6 +175,32 @@ func (m *Server) RegisterSession(_ context.Context, |
172 | 175 | return nil, err |
173 | 176 | } |
174 | 177 |
|
| 178 | + // If linked session, check that signature is valid. |
| 179 | + if len(req.GroupResponderKey) != 0 { |
| 180 | + // Check that the group key is a known key. |
| 181 | + _, ok := m.sessions[hex.EncodeToString(req.GroupResponderKey)] |
| 182 | + if !ok { |
| 183 | + return nil, fmt.Errorf("unknown group key") |
| 184 | + } |
| 185 | + |
| 186 | + // Check that the signature provided is valid. |
| 187 | + sig, err := ecdsa.ParseDERSignature(req.GroupResponderSig) |
| 188 | + if err != nil { |
| 189 | + return nil, err |
| 190 | + } |
| 191 | + |
| 192 | + msg := chainhash.HashB(req.ResponderPubKey) |
| 193 | + |
| 194 | + groupKey, err := btcec.ParsePubKey(req.GroupResponderKey) |
| 195 | + if err != nil { |
| 196 | + return nil, err |
| 197 | + } |
| 198 | + |
| 199 | + if !sig.Verify(msg, groupKey) { |
| 200 | + return nil, fmt.Errorf("invalid signature") |
| 201 | + } |
| 202 | + } |
| 203 | + |
175 | 204 | m.sessions[hex.EncodeToString(req.ResponderPubKey)] = &clientSession{ |
176 | 205 | key: priv, |
177 | 206 | state: ClientStateActive, |
@@ -209,7 +238,12 @@ func (m *Server) RevokeSession(_ context.Context, |
209 | 238 | m.sessMu.Lock() |
210 | 239 | defer m.sessMu.Unlock() |
211 | 240 |
|
212 | | - delete(m.sessions, hex.EncodeToString(req.ResponderPubKey)) |
| 241 | + sess, ok := m.sessions[hex.EncodeToString(req.ResponderPubKey)] |
| 242 | + if !ok { |
| 243 | + return nil, nil |
| 244 | + } |
| 245 | + |
| 246 | + sess.state = ClientStateRevoked |
213 | 247 |
|
214 | 248 | return &autopilotserverrpc.RevokeSessionResponse{}, nil |
215 | 249 | } |
|
0 commit comments