commit
35ffc1ab09
@ -0,0 +1,9 @@ |
||||
*~ |
||||
*.bak |
||||
*.key |
||||
**/.DS_Store |
||||
|
||||
/salty |
||||
/salty-keygen |
||||
/cmd/salty/salty |
||||
/cmd/salty-keygen/salty-keygen |
@ -0,0 +1,22 @@ |
||||
Copyright (C) 2022-present James Mills |
||||
|
||||
salty is covered by the MIT license:: |
||||
|
||||
Permission is hereby granted, free of charge, to any person |
||||
obtaining a copy of this software and associated documentation |
||||
files (the "Software"), to deal in the Software without restriction, |
||||
including without limitation the rights to use, copy, modify, merge, |
||||
publish, distribute, sublicense, and/or sell copies of the Software, |
||||
and to permit persons to whom the Software is furnished to do so, |
||||
subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included |
||||
in all copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE |
||||
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@ -0,0 +1,49 @@ |
||||
# salty |
||||
|
||||
A command-line tool using the [saltpack](https://saltpack.org) messaging |
||||
format and the [keys.pub](https://keys.pub) Go library. |
||||
|
||||
## Install |
||||
|
||||
```#!sh |
||||
$ go install go.mills.io/salty@latest |
||||
``` |
||||
|
||||
## Usage |
||||
|
||||
### Generating Keys |
||||
|
||||
Alice: |
||||
```#!sh |
||||
$ salty-keygen -o alice.key |
||||
Public key: kex1jszw7x5yc8509rssv9avmkjk749m5r0zjt6twtmtmtrq8wyt662q680s99 |
||||
``` |
||||
|
||||
Bob: |
||||
```#!sh |
||||
$ salty-keygen -o bob.key |
||||
Public key: kex1gsjmjud9fpyc39hczyugxeg29ljesnxlja44lk2xlg6cu8tlpfkqdppaw4 |
||||
``` |
||||
|
||||
### Encrypting Messages |
||||
|
||||
From Alice to Bob: |
||||
```#!sh |
||||
$ salty -i alice -r kex1gsjmjud9fpyc39hczyugxeg29ljesnxlja44lk2xlg6cu8tlpfkqdppaw4 |
||||
Hello bob! |
||||
BEGIN SALTPACK ENCRYPTED MESSAGE. keDIDMQWYvVR58B FTfTeDQNHuepdES xwnHuwnSTNQAils We53yO0JGG4aOeO gvFnsz1bwz8y1vY 2Qg6HCqX78YKwl1 D2QzLdY4rKG3Zd3 sHVWVs731LISwgH DTy0zz3dTmAZKHq nmwniEVfs432K38 PRlNWhp1AgvHL6h 98KtaudNLc876A3 5PMHnSlHTRVaQuX US1W4tS3R18ib0b CVIib7v9lT95jeg B6isCaISrRNgl3q VQjjgTWkG271jG3 7WwD6OJbAqdtkeF N50CcS8OLzFvcwM tCv88fBw5XJNKWB KyQXxu9kztR2nnb WtkhCNSPle4lH0E QqRkYN7lLvZieB8 mahEMNopC0vtNSa HE72KIr9wkkG13m 9bP. END SALTPACK ENCRYPTED MESSAGE. |
||||
``` |
||||
|
||||
### Decrypting Messages |
||||
|
||||
Bob (from Alice): |
||||
```#!sh |
||||
$ salty -i bob -d |
||||
BEGIN SALTPACK ENCRYPTED MESSAGE. keDIDMQWYvVR58B FTfTeDQNHuepdES xwnHuwnSTNQAils We53yO0JGG4aOeO gvFnsz1bwz8y1vY 2Qg6HCqX78YKwl1 D2QzLdY4rKG3Zd3 sHVWVs731LISwgH DTy0zz3dTmAZKHq nmwniEVfs432K38 PRlNWhp1AgvHL6h 98KtaudNLc876A3 5PMHnSlHTRVaQuX US1W4tS3R18ib0b CVIib7v9lT95jeg B6isCaISrRNgl3q VQjjgTWkG271jG3 7WwD6OJbAqdtkeF N50CcS8OLzFvcwM tCv88fBw5XJNKWB KyQXxu9kztR2nnb WtkhCNSPle4lH0E QqRkYN7lLvZieB8 mahEMNopC0vtNSa HE72KIr9wkkG13m 9bP. END SALTPACK ENCRYPTED MESSAGE. |
||||
# signed by: kex1jszw7x5yc8509rssv9avmkjk749m5r0zjt6twtmtmtrq8wyt662q680s99 |
||||
Hello bob! |
||||
``` |
||||
|
||||
## License |
||||
|
||||
`salty` is licensed under the terms of the [MIT License](/LICENSE) |
@ -0,0 +1,81 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"encoding/base64" |
||||
"fmt" |
||||
"os" |
||||
"path/filepath" |
||||
"time" |
||||
|
||||
"github.com/keys-pub/keys" |
||||
log "github.com/sirupsen/logrus" |
||||
flag "github.com/spf13/pflag" |
||||
"golang.org/x/term" |
||||
|
||||
"go.mills.io/salty" |
||||
) |
||||
|
||||
var ( |
||||
debug bool |
||||
version bool |
||||
|
||||
output string |
||||
) |
||||
|
||||
func init() { |
||||
flag.Usage = func() { |
||||
fmt.Fprintf(os.Stderr, "Usage: %s [options]\n", filepath.Base(os.Args[0])) |
||||
flag.PrintDefaults() |
||||
} |
||||
|
||||
flag.BoolVarP(&debug, "debug", "D", false, "enable debug logging") |
||||
flag.BoolVarP(&version, "version", "v", false, "display version information") |
||||
|
||||
flag.StringVarP(&output, "output", "o", "", "Write the result to the file") |
||||
} |
||||
|
||||
func generate(out *os.File) { |
||||
k := keys.GenerateEdX25519Key() |
||||
|
||||
if !term.IsTerminal(int(out.Fd())) { |
||||
fmt.Fprintf(os.Stderr, "Public key: %s\n", k.PublicKey().ID().String()) |
||||
} |
||||
|
||||
fmt.Fprintf(out, "# created: %s\n", time.Now().Format(time.RFC3339)) |
||||
fmt.Fprintf(out, "# public key: %s\n", k.PublicKey().ID().String()) |
||||
fmt.Fprintf(out, "%s\n", base64.StdEncoding.EncodeToString(k.Private())) |
||||
} |
||||
|
||||
func main() { |
||||
flag.Parse() |
||||
|
||||
if version { |
||||
fmt.Printf("saltpack %s", salty.FullVersion()) |
||||
os.Exit(0) |
||||
} |
||||
|
||||
if debug { |
||||
log.SetLevel(log.DebugLevel) |
||||
} else { |
||||
log.SetLevel(log.InfoLevel) |
||||
} |
||||
|
||||
out := os.Stdout |
||||
if output != "" { |
||||
f, err := os.OpenFile(output, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600) |
||||
if err != nil { |
||||
log.WithError(err).Fatalf("failed to open output file %q for writing", output) |
||||
} |
||||
defer func() { |
||||
if err := f.Close(); err != nil { |
||||
log.WithError(err).Fatalf("failed to close output file %q", output) |
||||
} |
||||
}() |
||||
out = f |
||||
} |
||||
|
||||
if fi, err := out.Stat(); err == nil && fi.Mode().IsRegular() && fi.Mode().Perm()&0004 != 0 { |
||||
log.Warn("writing secret key to a world-readable file") |
||||
} |
||||
generate(out) |
||||
} |
Binary file not shown.
@ -0,0 +1,160 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"bufio" |
||||
"encoding/base64" |
||||
"fmt" |
||||
"io" |
||||
"os" |
||||
"path/filepath" |
||||
"strings" |
||||
|
||||
"github.com/keys-pub/keys" |
||||
"github.com/keys-pub/keys/saltpack" |
||||
log "github.com/sirupsen/logrus" |
||||
flag "github.com/spf13/pflag" |
||||
"go.mills.io/salty" |
||||
) |
||||
|
||||
var ( |
||||
debug bool |
||||
version bool |
||||
|
||||
encrypt bool |
||||
decrypt bool |
||||
output string |
||||
identity string |
||||
recipients []string |
||||
) |
||||
|
||||
func init() { |
||||
flag.Usage = func() { |
||||
fmt.Fprintf(os.Stderr, "Usage: %s [options]\n", filepath.Base(os.Args[0])) |
||||
flag.PrintDefaults() |
||||
} |
||||
|
||||
flag.BoolVarP(&debug, "debug", "D", false, "enable debug logging") |
||||
flag.BoolVarP(&version, "version", "v", false, "display version information") |
||||
|
||||
flag.BoolVarP(&encrypt, "encrypt", "e", false, "Encrypt the input to the output (Default if omitted)") |
||||
flag.BoolVarP(&decrypt, "decrypt", "d", false, "Decrypt the input to the output") |
||||
flag.StringVarP(&output, "output", "o", "", "Write the result to the file") |
||||
flag.StringSliceVarP(&recipients, "recipient", "r", []string{}, "Encrypt to the specified RECIPIENT (Can be repeated)") |
||||
flag.StringVarP(&identity, "identity", "i", "", "Use the identity file at PATH. Can be repeated.") |
||||
} |
||||
|
||||
func parseIdentity(f io.Reader) (*keys.EdX25519Key, error) { |
||||
const privateKeySizeLimit = 1 << 8 // 256 bytes
|
||||
scanner := bufio.NewScanner(io.LimitReader(f, privateKeySizeLimit)) |
||||
var n int |
||||
for scanner.Scan() { |
||||
n++ |
||||
line := scanner.Text() |
||||
if strings.HasPrefix(line, "#") || line == "" { |
||||
continue |
||||
} |
||||
bs, err := base64.StdEncoding.DecodeString(line) |
||||
if err != nil { |
||||
return nil, fmt.Errorf("error at line %d: %v", n, err) |
||||
} |
||||
return keys.NewEdX25519KeyFromPrivateKey(keys.Bytes64(bs)), nil |
||||
} |
||||
if err := scanner.Err(); err != nil { |
||||
return nil, fmt.Errorf("failed to read identity file: %v", err) |
||||
} |
||||
|
||||
return nil, fmt.Errorf("no key found") |
||||
} |
||||
|
||||
func main() { |
||||
flag.Parse() |
||||
|
||||
if version { |
||||
fmt.Printf("saltpack %s", salty.FullVersion()) |
||||
os.Exit(0) |
||||
} |
||||
|
||||
if debug { |
||||
log.SetLevel(log.DebugLevel) |
||||
} else { |
||||
log.SetLevel(log.InfoLevel) |
||||
} |
||||
|
||||
if !(encrypt || decrypt) { |
||||
encrypt = true |
||||
} |
||||
|
||||
id, err := os.Open(identity) |
||||
if err != nil { |
||||
log.WithError(err).Fatalf("error opening identity file: %q", identity) |
||||
} |
||||
defer id.Close() |
||||
|
||||
key, err := parseIdentity(id) |
||||
if err != nil { |
||||
log.WithError(err).Fatalf("error reading private key: %q", identity) |
||||
} |
||||
|
||||
var ids []keys.ID |
||||
|
||||
for _, recipient := range recipients { |
||||
ids = append(ids, keys.ID(recipient)) |
||||
} |
||||
|
||||
in := os.Stdin |
||||
if flag.NArg() == 1 { |
||||
input := flag.Arg(0) |
||||
f, err := os.Open(flag.Arg(0)) |
||||
if err != nil { |
||||
log.WithError(err).Fatalf("failed to open input file %q for writing", input) |
||||
} |
||||
defer func() { |
||||
if err := f.Close(); err != nil { |
||||
log.WithError(err).Fatalf("failed to close input file %q", input) |
||||
} |
||||
}() |
||||
in = f |
||||
} |
||||
|
||||
out := os.Stdout |
||||
if output != "" { |
||||
f, err := os.OpenFile(output, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0600) |
||||
if err != nil { |
||||
log.WithError(err).Fatalf("failed to open output file %q for writing", output) |
||||
} |
||||
defer func() { |
||||
if err := f.Close(); err != nil { |
||||
log.WithError(err).Fatalf("failed to close output file %q", output) |
||||
} |
||||
}() |
||||
out = f |
||||
} |
||||
|
||||
message, err := io.ReadAll(in) |
||||
if err != nil { |
||||
log.WithError(err).Fatalf("error reading input") |
||||
} |
||||
|
||||
var result []byte |
||||
|
||||
if encrypt { |
||||
encrypted, err := saltpack.Signcrypt(message, true, key, ids...) |
||||
if err != nil { |
||||
log.WithError(err).Fatalf("error encrypting input") |
||||
} |
||||
result = encrypted[:] |
||||
} else if decrypt { |
||||
out, sender, err := saltpack.SigncryptOpen(message, true, saltpack.NewKeyring(key)) |
||||
if err != nil { |
||||
log.WithError(err).Fatalf("error decrypting input") |
||||
} |
||||
if sender != nil { |
||||
fmt.Fprintf(os.Stderr, "# signed by: %s\n", sender) |
||||
} |
||||
result = out[:] |
||||
} else { |
||||
log.Fatalf("one of -e/--encrypt or -d/--decrypt modes not spplied") |
||||
} |
||||
|
||||
out.Write(result) |
||||
} |
@ -0,0 +1,30 @@ |
||||
module go.mills.io/salty |
||||
|
||||
go 1.17 |
||||
|
||||
require ( |
||||
github.com/keys-pub/keys v0.1.22 |
||||
github.com/sirupsen/logrus v1.8.1 |
||||
github.com/spf13/pflag v1.0.5 |
||||
golang.org/x/term v0.0.0-20210317153231-de623e64d2a6 |
||||
) |
||||
|
||||
require ( |
||||
github.com/ScaleFT/sshkeys v0.0.0-20200327173127-6142f742bca5 // indirect |
||||
github.com/davecgh/go-spew v1.1.1 // indirect |
||||
github.com/dchest/bcrypt_pbkdf v0.0.0-20150205184540-83f37f9c154a // indirect |
||||
github.com/dchest/blake2b v1.0.0 // indirect |
||||
github.com/golang/protobuf v1.5.1 // indirect |
||||
github.com/google/go-cmp v0.5.5 // indirect |
||||
github.com/keybase/go-codec v0.0.0-20180928230036-164397562123 // indirect |
||||
github.com/keybase/saltpack v0.0.0-20200430135328-e19b1910c0c5 // indirect |
||||
github.com/pkg/errors v0.9.1 // indirect |
||||
github.com/tyler-smith/go-bip39 v1.1.0 // indirect |
||||
github.com/vmihailenco/msgpack/v4 v4.3.12 // indirect |
||||
github.com/vmihailenco/tagparser v0.1.2 // indirect |
||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect |
||||
golang.org/x/net v0.0.0-20210326060303-6b1517762897 // indirect |
||||
golang.org/x/sys v0.0.0-20210324051608-47abb6519492 // indirect |
||||
google.golang.org/appengine v1.6.7 // indirect |
||||
google.golang.org/protobuf v1.26.0 // indirect |
||||
) |
@ -0,0 +1,104 @@ |
||||
github.com/ScaleFT/sshkeys v0.0.0-20200327173127-6142f742bca5 h1:VauE2GcJNZFun2Och6tIT2zJZK1v6jxALQDA9BIji/E= |
||||
github.com/ScaleFT/sshkeys v0.0.0-20200327173127-6142f742bca5/go.mod h1:gxOHeajFfvGQh/fxlC8oOKBe23xnnJTif00IFFbiT+o= |
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= |
||||
github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= |
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= |
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
||||
github.com/dchest/bcrypt_pbkdf v0.0.0-20150205184540-83f37f9c154a h1:saTgr5tMLFnmy/yg3qDTft4rE5DY2uJ/cCxCe3q0XTU= |
||||
github.com/dchest/bcrypt_pbkdf v0.0.0-20150205184540-83f37f9c154a/go.mod h1:Bw9BbhOJVNR+t0jCqx2GC6zv0TGBsShs56Y3gfSCvl0= |
||||
github.com/dchest/blake2b v1.0.0 h1:KK9LimVmE0MjRl9095XJmKqZ+iLxWATvlcpVFRtaw6s= |
||||
github.com/dchest/blake2b v1.0.0/go.mod h1:U034kXgbJpCle2wSk5ybGIVhOSHCVLMDqOzcPEA0F7s= |
||||
github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= |
||||
github.com/godbus/dbus v4.1.0+incompatible/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= |
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= |
||||
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= |
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= |
||||
github.com/golang/protobuf v1.5.1 h1:jAbXjIeW2ZSW2AwFxlGTDoc2CjI2XujLkV3ArsZFCvc= |
||||
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= |
||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= |
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= |
||||
github.com/keybase/go-codec v0.0.0-20180928230036-164397562123 h1:yg56lYPqh9suJepqxOMd/liFgU/x+maRPiB30JNYykM= |
||||
github.com/keybase/go-codec v0.0.0-20180928230036-164397562123/go.mod h1:r/eVVWCngg6TsFV/3HuS9sWhDkAzGG8mXhiuYA+Z/20= |
||||
github.com/keybase/go-keychain v0.0.0-20201121013009-976c83ec27a6/go.mod h1:N83iQ9rnnzi2KZuTu+0xBcD1JNWn1jSN140ggAF7HeE= |
||||
github.com/keybase/go.dbus v0.0.0-20200324223359-a94be52c0b03/go.mod h1:a8clEhrrGV/d76/f9r2I41BwANMihfZYV9C223vaxqE= |
||||
github.com/keybase/saltpack v0.0.0-20200430135328-e19b1910c0c5 h1:X6nYzCVURqxDv0GuyptaCcRFTXPM0rSGNUrTeQ2NKUQ= |
||||
github.com/keybase/saltpack v0.0.0-20200430135328-e19b1910c0c5/go.mod h1:FNSq71OhXv/Z1W9M37nnHxJVhXitc03z6qshCbAten8= |
||||
github.com/keys-pub/keys v0.1.22 h1:bO0nx7c3HuC8dqjmjZ8njC8DzpuKWnOZQ5njaO5+A+o= |
||||
github.com/keys-pub/keys v0.1.22/go.mod h1:+41yREqLkYyGfGf4OkhUn/ljwe/+kwhrlTq1/46Jj8c= |
||||
github.com/keys-pub/secretservice v0.0.0-20200519003656-26e44b8df47f/go.mod h1:YRHMiVbZqh7u8xRm77CvwJNAZdDlNXwWvQ4DK0N9mYg= |
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= |
||||
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= |
||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= |
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= |
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= |
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= |
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= |
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= |
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= |
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= |
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= |
||||
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= |
||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= |
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= |
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= |
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= |
||||
github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= |
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= |
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= |
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= |
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= |
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= |
||||
github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= |
||||
github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= |
||||
github.com/vmihailenco/msgpack/v4 v4.3.12 h1:07s4sz9IReOgdikxLTKNbBdqDMLsjPKXwvCazn8G65U= |
||||
github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= |
||||
github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= |
||||
github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= |
||||
github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= |
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= |
||||
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= |
||||
golang.org/x/crypto v0.0.0-20200427165652-729f1e841bcc/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= |
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= |
||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= |
||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= |
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= |
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= |
||||
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= |
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= |
||||
golang.org/x/net v0.0.0-20210326060303-6b1517762897 h1:KrsHThm5nFk34YtATK1LsThyGhGbGe1olrte/HInHvs= |
||||
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= |
||||
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= |
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= |
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= |
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= |
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
||||
golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
||||
golang.org/x/sys v0.0.0-20210324051608-47abb6519492 h1:Paq34FxTluEPvVyayQqMPgHm+vTOrIifmcYxFBx9TLg= |
||||
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= |
||||
golang.org/x/term v0.0.0-20210317153231-de623e64d2a6 h1:EC6+IGYTjPpRfv9a2b/6Puw0W+hLtAhkV1tPsXhutqs= |
||||
golang.org/x/term v0.0.0-20210317153231-de623e64d2a6/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= |
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= |
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= |
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= |
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= |
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= |
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |
||||
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= |
||||
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= |
||||
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= |
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= |
||||
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= |
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= |
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= |
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= |
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= |
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= |
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= |
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= |
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
@ -0,0 +1,18 @@ |
||||
package salty |
||||
|
||||
import ( |
||||
"fmt" |
||||
) |
||||
|
||||
var ( |
||||
// Version release version
|
||||
Version = "0.0.1" |
||||
|
||||
// Commit will be overwritten automatically by the build system
|
||||
Commit = "HEAD" |
||||
) |
||||
|
||||
// FullVersion display the full version and build
|
||||
func FullVersion() string { |
||||
return fmt.Sprintf("%s@%s", Version, Commit) |
||||
} |
Loading…
Reference in new issue