]> Cypherpunks.ru repositories - balloon.git/blob - cmd/balloon/main.go
Output also in encoded form
[balloon.git] / cmd / balloon / main.go
1 /*
2 balloon -- Balloon password hashing function
3 Copyright (C) 2016-2019 Sergey Matveev <stargrave@stargrave.org>
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as
7 the Free Software Foundation, version 3 of the License.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this program.  If not, see
16 <http://www.gnu.org/licenses/>.
17 */
18
19 package main
20
21 import (
22         "crypto/rand"
23         "crypto/sha512"
24         "encoding/base64"
25         "encoding/hex"
26         "flag"
27         "fmt"
28         "io"
29         "os"
30
31         "go.cypherpunks.ru/balloon"
32 )
33
34 func main() {
35         s := flag.Int("s", 1<<18, "Space cost, number of hash-sized blocks")
36         t := flag.Int("t", 2, "Time cost, rounds")
37         p := flag.Int("p", 4, "Number of threads")
38         saltHex := flag.String("salt", "", "Salt, hexadecimal, optional")
39         passwd := flag.String("passwd", "", "Password")
40         flag.Usage = func() {
41                 fmt.Fprintf(os.Stderr, "balloon -- Strengthen password with Balloon+SHA512\n\n")
42                 flag.PrintDefaults()
43         }
44         flag.Parse()
45         var salt []byte
46         var err error
47         if len(*saltHex) == 0 {
48                 salt = make([]byte, 8)
49                 _, err = io.ReadFull(rand.Reader, salt)
50         } else {
51                 salt, err = hex.DecodeString(*saltHex)
52         }
53         if err != nil {
54                 panic(err)
55         }
56         fmt.Println("Salt:", hex.EncodeToString(salt))
57         h := balloon.H(sha512.New, []byte(*passwd), salt, *s, *t, *p)
58         fmt.Println("Hash:", hex.EncodeToString(h))
59         fmt.Printf(
60                 "Encoded: $balloon$h=sha512,s=%d,t=%d,p=%d$%s$%s\n",
61                 *s, *t, *p,
62                 base64.RawStdEncoding.EncodeToString(salt),
63                 base64.RawStdEncoding.EncodeToString(h),
64         )
65 }