main.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // Copyright (C) 2015 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at https://mozilla.org/MPL/2.0/.
  6. package main
  7. import (
  8. "flag"
  9. "io"
  10. "log"
  11. "os"
  12. "github.com/syncthing/syncthing/lib/signature"
  13. "github.com/syncthing/syncthing/lib/upgrade"
  14. )
  15. func main() {
  16. log.SetFlags(0)
  17. log.SetOutput(os.Stdout)
  18. flag.Parse()
  19. if flag.NArg() < 1 {
  20. log.Print(`Usage:
  21. stsigtool <command>
  22. Where command is one of:
  23. gen
  24. - generate a new key pair
  25. sign <privkeyfile> [datafile]
  26. - sign a file
  27. verify <signaturefile> <datafile>
  28. - verify a signature, using the built in public key
  29. verify <signaturefile> <datafile> <pubkeyfile>
  30. - verify a signature, using the specified public key file
  31. `)
  32. }
  33. switch flag.Arg(0) {
  34. case "gen":
  35. gen()
  36. case "sign":
  37. sign(flag.Arg(1), flag.Arg(2))
  38. case "verify":
  39. if flag.NArg() == 4 {
  40. verifyWithFile(flag.Arg(1), flag.Arg(2), flag.Arg(3))
  41. } else {
  42. verifyWithKey(flag.Arg(1), flag.Arg(2), upgrade.SigningKey)
  43. }
  44. }
  45. }
  46. func gen() {
  47. priv, pub, err := signature.GenerateKeys()
  48. if err != nil {
  49. log.Fatal(err)
  50. }
  51. os.Stdout.Write(priv)
  52. os.Stdout.Write(pub)
  53. }
  54. func sign(keyname, dataname string) {
  55. privkey, err := os.ReadFile(keyname)
  56. if err != nil {
  57. log.Fatal(err)
  58. }
  59. var input io.Reader
  60. if dataname == "-" || dataname == "" {
  61. input = os.Stdin
  62. } else {
  63. fd, err := os.Open(dataname)
  64. if err != nil {
  65. log.Fatal(err)
  66. }
  67. defer fd.Close()
  68. input = fd
  69. }
  70. sig, err := signature.Sign(privkey, input)
  71. if err != nil {
  72. log.Fatal(err)
  73. }
  74. os.Stdout.Write(sig)
  75. }
  76. func verifyWithFile(signame, dataname, keyname string) {
  77. pubkey, err := os.ReadFile(keyname)
  78. if err != nil {
  79. log.Fatal(err)
  80. }
  81. verifyWithKey(signame, dataname, pubkey)
  82. }
  83. func verifyWithKey(signame, dataname string, pubkey []byte) {
  84. sig, err := os.ReadFile(signame)
  85. if err != nil {
  86. log.Fatal(err)
  87. }
  88. fd, err := os.Open(dataname)
  89. if err != nil {
  90. log.Fatal(err)
  91. }
  92. defer fd.Close()
  93. err = signature.Verify(pubkey, sig, fd)
  94. if err != nil {
  95. log.Fatal(err)
  96. }
  97. log.Println("correct signature")
  98. }