diff --git a/crypto/signify/signify.go b/crypto/signify/signify.go deleted file mode 100644 index ff8113caf98edfb471c4355e47767a0ba7ac908f..0000000000000000000000000000000000000000 --- a/crypto/signify/signify.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. - -// signFile reads the contents of an input file and signs it (in armored format) -// with the key provided, placing the signature into the output file. - -package signify - -import ( - "bytes" - "crypto/ed25519" - "encoding/base64" - "errors" - "fmt" - "io/ioutil" - "strings" - "time" -) - -var ( - errInvalidKeyHeader = errors.New("incorrect key header") - errInvalidKeyLength = errors.New("invalid, key length != 104") -) - -func parsePrivateKey(key string) (k ed25519.PrivateKey, header []byte, keyNum []byte, err error) { - keydata, err := base64.StdEncoding.DecodeString(key) - if err != nil { - return nil, nil, nil, err - } - if len(keydata) != 104 { - return nil, nil, nil, errInvalidKeyLength - } - if string(keydata[:2]) != "Ed" { - return nil, nil, nil, errInvalidKeyHeader - } - return keydata[40:], keydata[:2], keydata[32:40], nil -} - -// SignFile creates a signature of the input file. -// -// This accepts base64 keys in the format created by the 'signify' tool. -// The signature is written to the 'output' file. -func SignFile(input string, output string, key string, untrustedComment string, trustedComment string) error { - // Pre-check comments and ensure they're set to something. - if strings.IndexByte(untrustedComment, '\n') >= 0 { - return errors.New("untrusted comment must not contain newline") - } - if strings.IndexByte(trustedComment, '\n') >= 0 { - return errors.New("trusted comment must not contain newline") - } - if untrustedComment == "" { - untrustedComment = "verify with " + input + ".pub" - } - if trustedComment == "" { - trustedComment = fmt.Sprintf("timestamp:%d", time.Now().Unix()) - } - - filedata, err := ioutil.ReadFile(input) - if err != nil { - return err - } - skey, header, keyNum, err := parsePrivateKey(key) - if err != nil { - return err - } - - // Create the main data signature. - rawSig := ed25519.Sign(skey, filedata) - var dataSig []byte - dataSig = append(dataSig, header...) - dataSig = append(dataSig, keyNum...) - dataSig = append(dataSig, rawSig...) - - // Create the comment signature. - var commentSigInput []byte - commentSigInput = append(commentSigInput, rawSig...) - commentSigInput = append(commentSigInput, []byte(trustedComment)...) - commentSig := ed25519.Sign(skey, commentSigInput) - - // Create the output file. - var out = new(bytes.Buffer) - fmt.Fprintln(out, "untrusted comment:", untrustedComment) - fmt.Fprintln(out, base64.StdEncoding.EncodeToString(dataSig)) - fmt.Fprintln(out, "trusted comment:", trustedComment) - fmt.Fprintln(out, base64.StdEncoding.EncodeToString(commentSig)) - return ioutil.WriteFile(output, out.Bytes(), 0644) //nolint:gosec -} diff --git a/crypto/signify/signify_fuzz.go b/crypto/signify/signify_fuzz.go deleted file mode 100644 index f9167900ad655bc0f78a7e843e0f73fbadd77515..0000000000000000000000000000000000000000 --- a/crypto/signify/signify_fuzz.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. - -// +build gofuzz - -package signify - -import ( - "bufio" - "fmt" - "io/ioutil" - "log" - "os" - "os/exec" - - fuzz "github.com/google/gofuzz" - "github.com/jedisct1/go-minisign" -) - -func Fuzz(data []byte) int { - if len(data) < 32 { - return -1 - } - tmpFile, err := ioutil.TempFile("", "") - if err != nil { - panic(err) - } - defer os.Remove(tmpFile.Name()) - defer tmpFile.Close() - - testSecKey, testPubKey := createKeyPair() - // Create message - tmpFile.Write(data) - if err = tmpFile.Close(); err != nil { - panic(err) - } - // Fuzz comments - var untrustedComment string - var trustedComment string - f := fuzz.NewFromGoFuzz(data) - f.Fuzz(&untrustedComment) - f.Fuzz(&trustedComment) - fmt.Printf("untrusted: %v\n", untrustedComment) - fmt.Printf("trusted: %v\n", trustedComment) - - err = SignifySignFile(tmpFile.Name(), tmpFile.Name()+".sig", testSecKey, untrustedComment, trustedComment) - if err != nil { - panic(err) - } - defer os.Remove(tmpFile.Name() + ".sig") - - signify := "signify" - path := os.Getenv("SIGNIFY") - if path != "" { - signify = path - } - - _, err := exec.LookPath(signify) - if err != nil { - panic(err) - } - - // Write the public key into the file to pass it as - // an argument to signify-openbsd - pubKeyFile, err := ioutil.TempFile("", "") - if err != nil { - panic(err) - } - defer os.Remove(pubKeyFile.Name()) - defer pubKeyFile.Close() - pubKeyFile.WriteString("untrusted comment: signify public key\n") - pubKeyFile.WriteString(testPubKey) - pubKeyFile.WriteString("\n") - - cmd := exec.Command(signify, "-V", "-p", pubKeyFile.Name(), "-x", tmpFile.Name()+".sig", "-m", tmpFile.Name()) - if output, err := cmd.CombinedOutput(); err != nil { - panic(fmt.Sprintf("could not verify the file: %v, output: \n%s", err, output)) - } - - // Verify the signature using a golang library - sig, err := minisign.NewSignatureFromFile(tmpFile.Name() + ".sig") - if err != nil { - panic(err) - } - - pKey, err := minisign.NewPublicKey(testPubKey) - if err != nil { - panic(err) - } - - valid, err := pKey.VerifyFromFile(tmpFile.Name(), sig) - if err != nil { - panic(err) - } - if !valid { - panic("invalid signature") - } - return 1 -} - -func getKey(fileS string) (string, error) { - file, err := os.Open(fileS) - if err != nil { - log.Fatal(err) - } - defer file.Close() - - scanner := bufio.NewScanner(file) - // Discard the first line - scanner.Scan() - scanner.Scan() - return scanner.Text(), scanner.Err() -} - -func createKeyPair() (string, string) { - // Create key and put it in correct format - tmpKey, err := ioutil.TempFile("", "") - if err != nil { - panic(err) - } - defer os.Remove(tmpKey.Name()) - defer os.Remove(tmpKey.Name() + ".pub") - defer os.Remove(tmpKey.Name() + ".sec") - cmd := exec.Command("signify", "-G", "-n", "-p", tmpKey.Name()+".pub", "-s", tmpKey.Name()+".sec") - if output, err := cmd.CombinedOutput(); err != nil { - panic(fmt.Sprintf("could not verify the file: %v, output: \n%s", err, output)) - } - secKey, err := getKey(tmpKey.Name() + ".sec") - if err != nil { - panic(err) - } - pubKey, err := getKey(tmpKey.Name() + ".pub") - if err != nil { - panic(err) - } - return secKey, pubKey -} diff --git a/crypto/signify/signify_test.go b/crypto/signify/signify_test.go deleted file mode 100644 index c064de73cb11d85ca10338bb40ba79300c1b6de7..0000000000000000000000000000000000000000 --- a/crypto/signify/signify_test.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. - -// signFile reads the contents of an input file and signs it (in armored format) -// with the key provided, placing the signature into the output file. - -package signify - -import ( - "io/ioutil" - "math/rand" - "os" - "testing" - "time" - - "github.com/jedisct1/go-minisign" -) - -var ( - testSecKey = "RWRCSwAAAABVN5lr2JViGBN8DhX3/Qb/0g0wBdsNAR/APRW2qy9Fjsfr12sK2cd3URUFis1jgzQzaoayK8x4syT4G3Gvlt9RwGIwUYIQW/0mTeI+ECHu1lv5U4Wa2YHEPIesVPyRm5M=" - testPubKey = "RWTAPRW2qy9FjsBiMFGCEFv9Jk3iPhAh7tZb+VOFmtmBxDyHrFT8kZuT" -) - -func TestSignify(t *testing.T) { - tmpFile, err := ioutil.TempFile("", "") - if err != nil { - t.Fatal(err) - } - defer os.Remove(tmpFile.Name()) - defer tmpFile.Close() - - rand.Seed(time.Now().UnixNano()) - - data := make([]byte, 1024) - rand.Read(data) - if _, err = tmpFile.Write(data); err != nil { - t.Fatal(err) - } - - if err = tmpFile.Close(); err != nil { - t.Fatal(err) - } - - err = SignFile(tmpFile.Name(), tmpFile.Name()+".sig", testSecKey, "clé", "croissants") - if err != nil { - t.Fatal(err) - } - defer os.Remove(tmpFile.Name() + ".sig") - - // Verify the signature using a golang library - sig, err := minisign.NewSignatureFromFile(tmpFile.Name() + ".sig") - if err != nil { - t.Fatal(err) - } - - pKey, err := minisign.NewPublicKey(testPubKey) - if err != nil { - t.Fatal(err) - } - - valid, err := pKey.VerifyFromFile(tmpFile.Name(), sig) - if err != nil { - t.Fatal(err) - } - if !valid { - t.Fatal("invalid signature") - } -} - -func TestSignifyTrustedCommentTooManyLines(t *testing.T) { - tmpFile, err := ioutil.TempFile("", "") - if err != nil { - t.Fatal(err) - } - defer os.Remove(tmpFile.Name()) - defer tmpFile.Close() - - rand.Seed(time.Now().UnixNano()) - - data := make([]byte, 1024) - rand.Read(data) - if _, err = tmpFile.Write(data); err != nil { - t.Fatal(err) - } - - if err = tmpFile.Close(); err != nil { - t.Fatal(err) - } - - err = SignFile(tmpFile.Name(), tmpFile.Name()+".sig", testSecKey, "", "crois\nsants") - if err == nil || err.Error() == "" { - t.Fatalf("should have errored on a multi-line trusted comment, got %v", err) - } - defer os.Remove(tmpFile.Name() + ".sig") -} - -func TestSignifyTrustedCommentTooManyLinesLF(t *testing.T) { - tmpFile, err := ioutil.TempFile("", "") - if err != nil { - t.Fatal(err) - } - defer os.Remove(tmpFile.Name()) - defer tmpFile.Close() - - rand.Seed(time.Now().UnixNano()) - - data := make([]byte, 1024) - rand.Read(data) - if _, err = tmpFile.Write(data); err != nil { - t.Fatal(err) - } - - if err = tmpFile.Close(); err != nil { - t.Fatal(err) - } - - err = SignFile(tmpFile.Name(), tmpFile.Name()+".sig", testSecKey, "crois\rsants", "") - if err != nil { - t.Fatal(err) - } - defer os.Remove(tmpFile.Name() + ".sig") -} - -func TestSignifyTrustedCommentEmpty(t *testing.T) { - tmpFile, err := ioutil.TempFile("", "") - if err != nil { - t.Fatal(err) - } - defer os.Remove(tmpFile.Name()) - defer tmpFile.Close() - - rand.Seed(time.Now().UnixNano()) - - data := make([]byte, 1024) - rand.Read(data) - if _, err = tmpFile.Write(data); err != nil { - t.Fatal(err) - } - - if err = tmpFile.Close(); err != nil { - t.Fatal(err) - } - - err = SignFile(tmpFile.Name(), tmpFile.Name()+".sig", testSecKey, "", "") - if err != nil { - t.Fatal(err) - } - defer os.Remove(tmpFile.Name() + ".sig") -} diff --git a/go.mod b/go.mod index 13e789854e0ff8389c386255562f20f9d23556ad..36764c78b3f6f2861058136269a35591a7398e2b 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,6 @@ require ( github.com/holiman/uint256 v1.2.0 github.com/huin/goupnp v1.0.1-0.20210626160114-33cdcbb30dda github.com/jackpal/go-nat-pmp v1.0.2 - github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e github.com/json-iterator/go v1.1.11 github.com/julienschmidt/httprouter v1.3.0 github.com/kevinburke/go-bindata v3.21.0+incompatible diff --git a/go.sum b/go.sum index 26d5f5b11026115ee6e6e359f638c9a6fe029124..b1932ced9995b78b55d34f87ec8aed445635f126 100644 --- a/go.sum +++ b/go.sum @@ -578,7 +578,6 @@ github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e h1:UvSe12bq+Uj2hWd8aOlwPmoZ+CITRFrdit+sDGfAg8U= github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=