package main import ( "crypto/rand" "crypto/sha512" "encoding/hex" "flag" "fmt" "io" "go.cypherpunks.ru/balloon" ) func main() { s := flag.Int("s", 1<<18, "Space cost, number of hash-sized blocks") t := flag.Int("t", 2, "Time cost, rounds") p := flag.Int("p", 4, "Number of threads") saltHex := flag.String("salt", "", "Salt, hexadecimal, optional") passwd := flag.String("passwd", "", "Password") flag.Parse() var salt []byte var err error if len(*saltHex) == 0 { salt = make([]byte, 8) _, err = io.ReadFull(rand.Reader, salt) } else { salt, err = hex.DecodeString(*saltHex) } if err != nil { panic(err) } fmt.Println(hex.EncodeToString(balloon.H(sha512.New, []byte(*passwd), salt, *s, *t, *p))) }