ssh/agent: support parallel signing using request pipelining Make NewClient automatically pipeline concurrent requests over its connection when the supplied io.ReadWriter also implements io.Closer. In this mode the client writes requests to the wire as soon as the write path is available and dispatches responses back to callers in FIFO order via a dedicated reader goroutine, instead of fully serializing each call. Up to 32 requests may be in flight on a single connection. This lets an agent that load-balances signing across multiple backend devices keep several of them busy concurrently without forcing callers to maintain their own connection pool. Aggregate throughput scales roughly linearly with the number of backend devices up to the in-flight cap; the protocol's in-order response requirement means slow requests still delay subsequent ones on the same connection, which is unchanged. The pipelined path requires io.Closer because, on a Write error, the background reader goroutine must be unblocked by closing the underlying connection; otherwise it would remain parked forever waiting for a response that will never arrive, leaking the goroutine and desynchronising the FIFO routing of responses for subsequent successful writes. When the supplied transport does not implement io.Closer, NewClient falls back to the previous fully-serialized behavior: a single in-flight call at a time, with no background goroutine. Fixes golang/go#78473 Change-Id: Icf14e5e8ca897506d68fb32c14fc72c774cd97b2 Reviewed-on: https://go-review.googlesource.com/c/crypto/+/768483 Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Filippo Valsorda <filippo@golang.org> LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This repository holds supplementary Go cryptography packages.
This repository uses Gerrit for code changes. To learn how to submit changes to this repository, see https://go.dev/doc/contribute.
The git repository is https://go.googlesource.com/crypto.
The main issue tracker for the crypto repository is located at https://go.dev/issues. Prefix your issue with “x/crypto:” in the subject line, so it is easy to find.
Note that contributions to the cryptography package receive additional scrutiny due to their sensitive nature. Patches may take longer than normal to receive feedback.