| 253 | } |
| 254 | |
| 255 | func (c *client) decryptPipe(ciphertext chan []byte) (out chan []byte) { |
| 256 | out = make(chan []byte) |
| 257 | |
| 258 | go func() { |
| 259 | defer close(out) |
| 260 | for { |
| 261 | var result []byte |
| 262 | select { |
| 263 | case <-c.ctx.Done(): |
| 264 | return |
| 265 | case text, ok := <-ciphertext: |
| 266 | if ok { |
| 267 | var block cipher.Block |
| 268 | var aesgcm cipher.AEAD |
| 269 | var err error |
| 270 | if block, err = aes.NewCipher(c.dhKey); err != nil { |
| 271 | c.reportError(errors.Errorf("client decryptPipe: %w", err)) |
| 272 | continue |
| 273 | } |
| 274 | |
| 275 | if aesgcm, err = cipher.NewGCM(block); err != nil { |
| 276 | c.reportError(errors.Errorf("client decryptPipe: %w", err)) |
| 277 | continue |
| 278 | } |
| 279 | |
| 280 | if result, err = aesgcm.Open(nil, c.dhNonce, text, nil); err != nil { |
| 281 | c.reportError(errors.Errorf("client decryptPipe: %w", err)) |
| 282 | continue |
| 283 | } |
| 284 | select { |
| 285 | case out <- result: |
| 286 | case <-c.ctx.Done(): |
| 287 | } |
| 288 | } |
| 289 | } |
| 290 | } |
| 291 | }() |
| 292 | return out |
| 293 | } |
| 294 | |
| 295 | func (c *client) dispatch(replyMsg, receivedMsg chan P2PMessage) (out chan p2pRequest) { |
| 296 | out = make(chan p2pRequest) |