git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 00/19] Signed push

From
Junio C Hamano <gitster@pobox.com>
Date
Aug 22, 2014, 20:30 UTC
Message-ID
<1408739424-31429-1-git-send-email-gitster@pobox.com>
The first round is found at $gmane/255520

While signed tags and commits assert that the objects thusly signed came from you, who signed these objects, there is not a good way to assert that you wanted to have a particular object at the tip of a particular branch. My signing v2.0.1 tag only means I want to call the version v2.0.1, and it does not mean I want to push it out to my 'master' branch---it is likely that I only want it in 'maint', so the signature on the object alone is insufficient.

The only assurance to you that 'maint' points at what I wanted to place there comes from your trust on the hosting site and my authentication with it, which cannot easily audited later.

This series introduces a cryptographic assurance for ref updates done by "git push" by introducing a mechanism that allows you to sign a "push certificate" (for the lack of better name) every time you push. Think of it as working on an axis orthogonal to the traditional "signed tags".

Notable changes from the first iteration are:
 - "push --signed" against a receiver that does not support push
   certificates used to downgrade to an unsigned push with a
   warning; this round makes it die.
 - The push-cert capability the receiver sends now with a value,
   <nonce>; the certificate must include this value on the "nonce"
   header to prevent a valid push certificate that was used to push
   elsewhere from being replayed to push to an unrelated repository.
And several typofixes here and there.
Junio C Hamano (19):
  receive-pack: do not overallocate command structure
  receive-pack: parse feature request a bit earlier
  receive-pack: do not reuse old_sha1[] for other things
  receive-pack: factor out queueing of command
  send-pack: move REF_STATUS_REJECT_NODELETE logic a bit higher
  send-pack: refactor decision to send update per ref
  send-pack: always send capabilities
  send-pack: factor out capability string generation
  send-pack: rename "new_refs" to "need_pack_data"
  send-pack: refactor inspecting and resetting status and sending
    commands
  send-pack: clarify that cmds_sent is a boolean
  gpg-interface: move parse_gpg_output() to where it should be
  gpg-interface: move parse_signature() to where it should be
  pack-protocol doc: typofix for PKT-LINE
  the beginning of the signed push
  receive-pack: GPG-validate push certificates
  send-pack: send feature request on push-cert packet
  signed push: signed push: remove duplicated protocol info
  signed push: fortify against replay attacks
 Documentation/git-push.txt                        |   9 +-
 Documentation/git-receive-pack.txt                |  41 ++++-
 Documentation/technical/pack-protocol.txt         |  25 ++-
 Documentation/technical/protocol-capabilities.txt |  13 +-
 builtin/push.c                                    |   1 +
 builtin/receive-pack.c                            | 199 ++++++++++++++++++----
 commit.c                                          |  36 ----
 gpg-interface.c                                   |  57 +++++++
 gpg-interface.h                                   |  18 +-
 send-pack.c                                       | 197 ++++++++++++++++-----
 send-pack.h                                       |   1 +
 t/t5534-push-signed.sh                            |  82 +++++++++
 tag.c                                             |  20 ---
 tag.h                                             |   1 -
 transport.c                                       |   4 +
 transport.h                                       |   5 +
 16 files changed, 564 insertions(+), 145 deletions(-)
 create mode 100755 t/t5534-push-signed.sh
-- 
2.1.0-304-g950f846
Next: Junio C Hamano
Message 1 of 23 in “Signed push”
  1. 00/19 Signed pushJunio C Hamano, Aug 22, 2014
  2. 01/19 receive-pack: do not overallocate command structureJunio C Hamano, Aug 22, 2014
  3. 02/19 receive-pack: parse feature request a bit earlierJunio C Hamano, Aug 22, 2014
  4. 03/19 receive-pack: do not reuse old_sha1[] for other thingsJunio C Hamano, Aug 22, 2014
  5. 04/19 receive-pack: factor out queueing of commandJunio C Hamano, Aug 22, 2014
  6. 05/19 send-pack: move REF_STATUS_REJECT_NODELETE logic a bit higherJunio C Hamano, Aug 22, 2014
  7. 06/19 send-pack: refactor decision to send update per refJunio C Hamano, Aug 22, 2014
  8. 07/19 send-pack: always send capabilitiesJunio C Hamano, Aug 22, 2014
  9. 08/19 send-pack: factor out capability string generationJunio C Hamano, Aug 22, 2014
  10. 09/19 send-pack: rename "new_refs" to "need_pack_data"Junio C Hamano, Aug 22, 2014
  11. 10/19 send-pack: refactor inspecting and resetting status and sending commandsJunio C Hamano, Aug 22, 2014
  12. 11/19 send-pack: clarify that cmds_sent is a booleanJunio C Hamano, Aug 22, 2014
  13. 12/19 gpg-interface: move parse_gpg_output() to where it should beJunio C Hamano, Aug 22, 2014
  14. 13/19 gpg-interface: move parse_signature() to where it should beJunio C Hamano, Aug 22, 2014
  15. 14/19 pack-protocol doc: typofix for PKT-LINEJunio C Hamano, Aug 22, 2014
  16. 15/19 the beginning of the signed pushJunio C Hamano, Aug 22, 2014
  17. 16/19 receive-pack: GPG-validate push certificatesJunio C Hamano, Aug 22, 2014
  18. 17/19 send-pack: send feature request on push-cert packetJunio C Hamano, Aug 22, 2014
  19. 18/19 signed push: remove duplicated protocol infoJunio C Hamano, Aug 22, 2014
  20. 19/19 signed push: fortify against replay attacksJunio C Hamano, Aug 22, 2014
  21. Eric SunshineAug 24, 2014
  22. Stefan BellerAug 30, 2014
  23. Junio C HamanoSep 2, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.