Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
G
go-common
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
ai3
go-common
Compare revisions
b75c8e6d117825a8eeee209a137b96e63eadf714 to 62b40adde91d2767809e41d53478d620e232e65f
Compare revisions
Changes are shown as if the
source
revision was being merged into the
target
revision.
Learn more about comparing revisions.
Source
ai3/go-common
Select target project
No results found
62b40adde91d2767809e41d53478d620e232e65f
Select Git revision
Branches
master
renovate/github.com-duo-labs-webauthn-digest
renovate/github.com-go-ldap-ldap-v3-3.x
renovate/github.com-go-webauthn-webauthn-0.x
renovate/github.com-google-go-cmp-0.x
renovate/github.com-lunixbochs-struc-digest
renovate/github.com-mattn-go-sqlite3-1.x
renovate/github.com-prometheus-client_golang-1.x
renovate/go-1.x
renovate/golang.org-x-crypto-0.x
renovate/golang.org-x-sync-0.x
renovate/opentelemetry-go-monorepo
12 results
Swap
Target
ai3/go-common
Select target project
ai3/go-common
1 result
b75c8e6d117825a8eeee209a137b96e63eadf714
Select Git revision
Branches
master
renovate/github.com-duo-labs-webauthn-digest
renovate/github.com-go-ldap-ldap-v3-3.x
renovate/github.com-go-webauthn-webauthn-0.x
renovate/github.com-google-go-cmp-0.x
renovate/github.com-lunixbochs-struc-digest
renovate/github.com-mattn-go-sqlite3-1.x
renovate/github.com-prometheus-client_golang-1.x
renovate/go-1.x
renovate/golang.org-x-crypto-0.x
renovate/golang.org-x-sync-0.x
renovate/opentelemetry-go-monorepo
12 results
Show changes
Only incoming changes from source
Include changes to target since source was created
Compare
Commits on Source (3)
Remove debugging log statement
· 811dad51
ale
authored
4 months ago
811dad51
Add Argon2id support
· 3d4cd358
ale
authored
4 months ago
3d4cd358
Switch new password default to Argon2id
· 62b40add
ale
authored
4 months ago
62b40add
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
cmd/pwtool/main.go
+1
-1
1 addition, 1 deletion
cmd/pwtool/main.go
pwhash/argon2.go
+93
-27
93 additions, 27 deletions
pwhash/argon2.go
pwhash/password.go
+12
-11
12 additions, 11 deletions
pwhash/password.go
pwhash/password_test.go
+13
-4
13 additions, 4 deletions
pwhash/password_test.go
with
119 additions
and
43 deletions
cmd/pwtool/main.go
View file @
62b40add
...
@@ -86,7 +86,7 @@ func mkhash() (pwhash.PasswordHash, string, error) {
...
@@ -86,7 +86,7 @@ func mkhash() (pwhash.PasswordHash, string, error) {
name
:=
*
algo
name
:=
*
algo
switch
*
algo
{
switch
*
algo
{
case
"argon2"
:
case
"argon2"
:
h
=
pwhash
.
NewArgon2WithParams
(
uint32
(
*
argon2Time
),
uint32
(
*
argon2Mem
*
1024
),
uint8
(
*
argon2Threads
))
h
=
pwhash
.
NewArgon2
Std
WithParams
(
uint32
(
*
argon2Time
),
uint32
(
*
argon2Mem
*
1024
),
uint8
(
*
argon2Threads
))
name
=
fmt
.
Sprintf
(
"%s(%d/%d/%d)"
,
*
algo
,
*
argon2Time
,
*
argon2Mem
,
*
argon2Threads
)
name
=
fmt
.
Sprintf
(
"%s(%d/%d/%d)"
,
*
algo
,
*
argon2Time
,
*
argon2Mem
,
*
argon2Threads
)
case
"scrypt"
:
case
"scrypt"
:
h
=
pwhash
.
NewScryptWithParams
(
*
scryptN
,
*
scryptR
,
*
scryptP
)
h
=
pwhash
.
NewScryptWithParams
(
*
scryptN
,
*
scryptR
,
*
scryptP
)
...
...
This diff is collapsed.
Click to expand it.
pwhash/argon2.go
View file @
62b40add
...
@@ -6,15 +6,15 @@ import (
...
@@ -6,15 +6,15 @@ import (
"encoding/hex"
"encoding/hex"
"errors"
"errors"
"fmt"
"fmt"
"log"
"strconv"
"strconv"
"strings"
"strings"
"golang.org/x/crypto/argon2"
"golang.org/x/crypto/argon2"
)
)
var
(
const
(
argonKeyLen
uint32
=
32
argonLegacyKeySize
=
32
argonDefaultKeySize
=
16
argonSaltLen
=
16
argonSaltLen
=
16
)
)
...
@@ -29,9 +29,11 @@ type argon2PasswordHash struct {
...
@@ -29,9 +29,11 @@ type argon2PasswordHash struct {
// newArgon2PasswordHash returns an Argon2i-based PasswordHash using the
// newArgon2PasswordHash returns an Argon2i-based PasswordHash using the
// specified parameters for time, memory, and number of threads.
// specified parameters for time, memory, and number of threads.
func
newArgon2PasswordHash
(
time
,
mem
uint32
,
threads
uint8
,
codec
argon2Codec
)
PasswordHash
{
func
newArgon2PasswordHash
(
kind
string
,
keySize
int
,
time
,
mem
uint32
,
threads
uint8
,
codec
argon2Codec
)
PasswordHash
{
return
&
argon2PasswordHash
{
return
&
argon2PasswordHash
{
params
:
argon2Params
{
params
:
argon2Params
{
KeySize
:
keySize
,
Kind
:
kind
,
Time
:
time
,
Time
:
time
,
Memory
:
mem
,
Memory
:
mem
,
Threads
:
threads
,
Threads
:
threads
,
...
@@ -41,8 +43,8 @@ func newArgon2PasswordHash(time, mem uint32, threads uint8, codec argon2Codec) P
...
@@ -41,8 +43,8 @@ func newArgon2PasswordHash(time, mem uint32, threads uint8, codec argon2Codec) P
}
}
// NewArgon2 returns an Argon2i-based PasswordHash using the default parameters.
// NewArgon2 returns an Argon2i-based PasswordHash using the default parameters.
func
NewArgon2
()
PasswordHash
{
func
NewArgon2
Legacy
()
PasswordHash
{
return
NewArgon2WithParams
(
return
NewArgon2
Legacy
WithParams
(
defaultArgon2Params
.
Time
,
defaultArgon2Params
.
Time
,
defaultArgon2Params
.
Memory
,
defaultArgon2Params
.
Memory
,
defaultArgon2Params
.
Threads
,
defaultArgon2Params
.
Threads
,
...
@@ -51,8 +53,8 @@ func NewArgon2() PasswordHash {
...
@@ -51,8 +53,8 @@ func NewArgon2() PasswordHash {
// NewArgon2WithParams returns an Argon2i-based PasswordHash using the
// NewArgon2WithParams returns an Argon2i-based PasswordHash using the
// specified parameters for time, memory, and number of threads.
// specified parameters for time, memory, and number of threads.
func
NewArgon2WithParams
(
time
,
mem
uint32
,
threads
uint8
)
PasswordHash
{
func
NewArgon2
Legacy
WithParams
(
time
,
mem
uint32
,
threads
uint8
)
PasswordHash
{
return
newArgon2PasswordHash
(
time
,
mem
,
threads
,
&
a2Codec
{})
return
newArgon2PasswordHash
(
kindArgon2I
,
argonLegacyKeySize
,
time
,
mem
,
threads
,
&
a2
Legacy
Codec
{})
}
}
// NewArgon2Std returns an Argon2i-based PasswordHash that conforms
// NewArgon2Std returns an Argon2i-based PasswordHash that conforms
...
@@ -65,12 +67,12 @@ func NewArgon2Std() PasswordHash {
...
@@ -65,12 +67,12 @@ func NewArgon2Std() PasswordHash {
)
)
}
}
// NewArgon2StdWithParams returns an Argon2i-based PasswordHash using
// NewArgon2StdWithParams returns an Argon2i
d
-based PasswordHash using
// the specified parameters for time, memory, and number of
// the specified parameters for time, memory, and number of
// threads. This will use the string encoding ("$argon2$") documented
// threads. This will use the string encoding ("$argon2
id
$") documented
// in the argon2 reference implementation.
// in the argon2 reference implementation.
func
NewArgon2StdWithParams
(
time
,
mem
uint32
,
threads
uint8
)
PasswordHash
{
func
NewArgon2StdWithParams
(
time
,
mem
uint32
,
threads
uint8
)
PasswordHash
{
return
newArgon2PasswordHash
(
time
,
mem
,
threads
,
&
argon2StdCodec
{})
return
newArgon2PasswordHash
(
kindArgon2ID
,
argonDefaultKeySize
,
time
,
mem
,
threads
,
&
argon2StdCodec
{})
}
}
// ComparePassword returns true if the given password matches the
// ComparePassword returns true if the given password matches the
...
@@ -80,28 +82,53 @@ func (s *argon2PasswordHash) ComparePassword(encrypted, password string) bool {
...
@@ -80,28 +82,53 @@ func (s *argon2PasswordHash) ComparePassword(encrypted, password string) bool {
if
err
!=
nil
{
if
err
!=
nil
{
return
false
return
false
}
}
dk2
:=
argon2
.
Key
([]
byte
(
password
),
salt
,
params
.
Time
,
params
.
Memory
,
params
.
Threads
,
argonKeyLen
)
dk2
:=
params
.
hash
(
password
,
salt
)
return
subtle
.
ConstantTimeCompare
(
dk
,
dk2
)
==
1
return
subtle
.
ConstantTimeCompare
(
dk
,
dk2
)
==
1
}
}
// Encrypt the given password with the Argon2 algorithm.
// Encrypt the given password with the Argon2 algorithm.
func
(
s
*
argon2PasswordHash
)
Encrypt
(
password
string
)
string
{
func
(
s
*
argon2PasswordHash
)
Encrypt
(
password
string
)
string
{
salt
:=
getRandomBytes
(
argonSaltLen
)
salt
:=
getRandomBytes
(
argonSaltLen
)
dk
:=
argon2
.
Key
([]
byte
(
password
),
salt
,
s
.
params
.
Time
,
s
.
params
.
Memory
,
s
.
params
.
Threads
,
argonKeyLen
)
dk
:=
s
.
params
.
hash
(
password
,
salt
)
return
s
.
codec
.
encodeArgon2Hash
(
s
.
params
,
salt
,
dk
)
return
s
.
codec
.
encodeArgon2Hash
(
s
.
params
,
salt
,
dk
)
}
}
const
(
kindArgon2I
=
"argon2i"
kindArgon2ID
=
"argon2id"
)
type
argon2Params
struct
{
type
argon2Params
struct
{
Kind
string
KeySize
int
Time
uint32
Time
uint32
Memory
uint32
Memory
uint32
Threads
uint8
Threads
uint8
}
}
func
(
p
argon2Params
)
hash
(
password
string
,
salt
[]
byte
)
[]
byte
{
if
p
.
KeySize
==
0
{
panic
(
"key size is 0"
)
}
switch
p
.
Kind
{
case
kindArgon2I
:
return
argon2
.
Key
([]
byte
(
password
),
salt
,
p
.
Time
,
p
.
Memory
,
p
.
Threads
,
uint32
(
p
.
KeySize
))
case
kindArgon2ID
:
return
argon2
.
IDKey
([]
byte
(
password
),
salt
,
p
.
Time
,
p
.
Memory
,
p
.
Threads
,
uint32
(
p
.
KeySize
))
default
:
panic
(
"unknown argon2 hash kind"
)
}
}
// Default Argon2 parameters are tuned for a high-traffic
// Default Argon2 parameters are tuned for a high-traffic
// authentication service (<1ms per operation).
// authentication service (<1ms per operation).
var
defaultArgon2Params
=
argon2Params
{
var
defaultArgon2Params
=
argon2Params
{
Kind
:
kindArgon2ID
,
KeySize
:
16
,
Time
:
1
,
Time
:
1
,
Memory
:
4
*
1024
,
Memory
:
6
4
*
1024
,
Threads
:
4
,
Threads
:
4
,
}
}
...
@@ -110,13 +137,14 @@ type argon2Codec interface {
...
@@ -110,13 +137,14 @@ type argon2Codec interface {
decodeArgon2Hash
(
string
)
(
argon2Params
,
[]
byte
,
[]
byte
,
error
)
decodeArgon2Hash
(
string
)
(
argon2Params
,
[]
byte
,
[]
byte
,
error
)
}
}
type
a2Codec
struct
{}
// Argon2i legacy encoding, do not use.
type
a2LegacyCodec
struct
{}
func
(
*
a2Codec
)
encodeArgon2Hash
(
params
argon2Params
,
salt
,
dk
[]
byte
)
string
{
func
(
*
a2
Legacy
Codec
)
encodeArgon2Hash
(
params
argon2Params
,
salt
,
dk
[]
byte
)
string
{
return
fmt
.
Sprintf
(
"$a2$%d$%d$%d$%x$%x"
,
params
.
Time
,
params
.
Memory
,
params
.
Threads
,
salt
,
dk
)
return
fmt
.
Sprintf
(
"$a2$%d$%d$%d$%x$%x"
,
params
.
Time
,
params
.
Memory
,
params
.
Threads
,
salt
,
dk
)
}
}
func
(
*
a2Codec
)
decodeArgon2Hash
(
s
string
)
(
params
argon2Params
,
salt
[]
byte
,
dk
[]
byte
,
err
error
)
{
func
(
*
a2
Legacy
Codec
)
decodeArgon2Hash
(
s
string
)
(
params
argon2Params
,
salt
[]
byte
,
dk
[]
byte
,
err
error
)
{
if
!
strings
.
HasPrefix
(
s
,
"$a2$"
)
{
if
!
strings
.
HasPrefix
(
s
,
"$a2$"
)
{
err
=
errors
.
New
(
"not an Argon2 password hash"
)
err
=
errors
.
New
(
"not an Argon2 password hash"
)
return
return
...
@@ -128,6 +156,8 @@ func (*a2Codec) decodeArgon2Hash(s string) (params argon2Params, salt []byte, dk
...
@@ -128,6 +156,8 @@ func (*a2Codec) decodeArgon2Hash(s string) (params argon2Params, salt []byte, dk
return
return
}
}
params
.
Kind
=
kindArgon2I
var
i
uint64
var
i
uint64
if
i
,
err
=
strconv
.
ParseUint
(
parts
[
0
],
10
,
32
);
err
!=
nil
{
if
i
,
err
=
strconv
.
ParseUint
(
parts
[
0
],
10
,
32
);
err
!=
nil
{
...
@@ -149,16 +179,36 @@ func (*a2Codec) decodeArgon2Hash(s string) (params argon2Params, salt []byte, dk
...
@@ -149,16 +179,36 @@ func (*a2Codec) decodeArgon2Hash(s string) (params argon2Params, salt []byte, dk
if
err
!=
nil
{
if
err
!=
nil
{
return
return
}
}
dk
,
err
=
hex
.
DecodeString
(
parts
[
4
])
dk
,
err
=
hex
.
DecodeString
(
parts
[
4
])
if
err
!=
nil
{
return
}
params
.
KeySize
=
len
(
dk
)
switch
len
(
dk
)
{
case
16
,
24
,
32
:
default
:
err
=
errors
.
New
(
"bad key size"
)
}
return
return
}
}
// Standard Argon2 encoding as per the reference implementation in
// https://github.com/P-H-C/phc-winner-argon2/blob/4ac8640c2adc1257677d27d3f833c8d1ee68c7d2/src/encoding.c#L242-L252
type
argon2StdCodec
struct
{}
type
argon2StdCodec
struct
{}
const
argon2HashVersionStr
=
"v=19"
func
(
*
argon2StdCodec
)
encodeArgon2Hash
(
params
argon2Params
,
salt
,
dk
[]
byte
)
string
{
func
(
*
argon2StdCodec
)
encodeArgon2Hash
(
params
argon2Params
,
salt
,
dk
[]
byte
)
string
{
encSalt
:=
base64
.
RawStdEncoding
.
EncodeToString
(
salt
)
encSalt
:=
base64
.
RawStdEncoding
.
EncodeToString
(
salt
)
encDK
:=
base64
.
RawStdEncoding
.
EncodeToString
(
dk
)
encDK
:=
base64
.
RawStdEncoding
.
EncodeToString
(
dk
)
return
fmt
.
Sprintf
(
"$argon2i$v=19$m=%d,t=%d,p=%d$%s$%s"
,
params
.
Memory
,
params
.
Time
,
params
.
Threads
,
encSalt
,
encDK
)
return
fmt
.
Sprintf
(
"$%s$%s$m=%d,t=%d,p=%d$%s$%s"
,
params
.
Kind
,
argon2HashVersionStr
,
params
.
Memory
,
params
.
Time
,
params
.
Threads
,
encSalt
,
encDK
)
}
}
func
parseArgon2HashParams
(
s
string
)
(
params
argon2Params
,
err
error
)
{
func
parseArgon2HashParams
(
s
string
)
(
params
argon2Params
,
err
error
)
{
...
@@ -182,7 +232,7 @@ func parseArgon2HashParams(s string) (params argon2Params, err error) {
...
@@ -182,7 +232,7 @@ func parseArgon2HashParams(s string) (params argon2Params, err error) {
i
,
err
=
strconv
.
ParseUint
(
kv
[
1
],
10
,
8
)
i
,
err
=
strconv
.
ParseUint
(
kv
[
1
],
10
,
8
)
params
.
Threads
=
uint8
(
i
)
params
.
Threads
=
uint8
(
i
)
default
:
default
:
err
=
errors
.
New
(
"unknown parameter in hash"
)
err
=
fmt
.
Errorf
(
"unknown parameter
'%s'
in hash"
,
kv
[
0
]
)
}
}
if
err
!=
nil
{
if
err
!=
nil
{
return
return
...
@@ -192,30 +242,46 @@ func parseArgon2HashParams(s string) (params argon2Params, err error) {
...
@@ -192,30 +242,46 @@ func parseArgon2HashParams(s string) (params argon2Params, err error) {
}
}
func
(
*
argon2StdCodec
)
decodeArgon2Hash
(
s
string
)
(
params
argon2Params
,
salt
[]
byte
,
dk
[]
byte
,
err
error
)
{
func
(
*
argon2StdCodec
)
decodeArgon2Hash
(
s
string
)
(
params
argon2Params
,
salt
[]
byte
,
dk
[]
byte
,
err
error
)
{
if
!
strings
.
HasPrefix
(
s
,
"$argon2i$"
)
{
var
kind
string
switch
{
case
strings
.
HasPrefix
(
s
,
"$argon2i$"
)
:
kind
=
kindArgon2I
case
strings
.
HasPrefix
(
s
,
"$argon2id$"
)
:
kind
=
kindArgon2ID
default
:
err
=
errors
.
New
(
"not an Argon2 password hash"
)
err
=
errors
.
New
(
"not an Argon2 password hash"
)
return
return
}
}
parts
:=
strings
.
SplitN
(
s
[
9
:
]
,
"$"
,
4
)
parts
:=
strings
.
SplitN
(
s
,
"$"
,
6
)
if
len
(
parts
)
!=
4
{
if
len
(
parts
)
!=
6
{
err
=
errors
.
New
(
"bad encoding"
)
err
=
errors
.
New
(
"bad encoding"
)
return
return
}
}
if
parts
[
0
]
!=
"v=19"
{
if
parts
[
2
]
!=
argon2HashVersionStr
{
err
=
errors
.
New
(
"bad argon2 hash version"
)
err
=
errors
.
New
(
"bad argon2 hash version"
)
return
return
}
}
params
,
err
=
parseArgon2HashParams
(
parts
[
1
])
params
,
err
=
parseArgon2HashParams
(
parts
[
3
])
if
err
!=
nil
{
if
err
!=
nil
{
return
return
}
}
if
salt
,
err
=
base64
.
RawStdEncoding
.
DecodeString
(
parts
[
2
]);
err
!=
nil
{
params
.
Kind
=
kind
if
salt
,
err
=
base64
.
RawStdEncoding
.
DecodeString
(
parts
[
4
]);
err
!=
nil
{
return
}
if
dk
,
err
=
base64
.
RawStdEncoding
.
DecodeString
(
parts
[
5
]);
err
!=
nil
{
return
return
}
}
dk
,
err
=
base64
.
RawStdEncoding
.
DecodeString
(
parts
[
3
])
log
.
Printf
(
"params: %+v"
,
params
)
params
.
KeySize
=
len
(
dk
)
switch
len
(
dk
)
{
case
16
,
24
,
32
:
default
:
err
=
errors
.
New
(
"bad key size"
)
}
return
return
}
}
This diff is collapsed.
Click to expand it.
pwhash/password.go
View file @
62b40add
...
@@ -18,7 +18,6 @@
...
@@ -18,7 +18,6 @@
//
//
// go test -bench=Argon2 -run=none . 2>&1 | \
// go test -bench=Argon2 -run=none . 2>&1 | \
// awk '/^Bench/ {ops=1000000000 / $3; print $1 " " ops " ops/sec"}'
// awk '/^Bench/ {ops=1000000000 / $3; print $1 " " ops " ops/sec"}'
//
package
pwhash
package
pwhash
import
(
import
(
...
@@ -53,8 +52,9 @@ var prefixRegistry = map[string]PasswordHash{
...
@@ -53,8 +52,9 @@ var prefixRegistry = map[string]PasswordHash{
"$5$"
:
NewSystemCrypt
(),
"$5$"
:
NewSystemCrypt
(),
"$6$"
:
NewSystemCrypt
(),
"$6$"
:
NewSystemCrypt
(),
"$s$"
:
NewScrypt
(),
"$s$"
:
NewScrypt
(),
"$a2$"
:
NewArgon2
(),
"$a2$"
:
NewArgon2
Legacy
(),
"$argon2i$"
:
NewArgon2Std
(),
"$argon2i$"
:
NewArgon2Std
(),
"$argon2id$"
:
NewArgon2Std
(),
}
}
// ComparePassword returns true if the given password matches the
// ComparePassword returns true if the given password matches the
...
@@ -65,6 +65,7 @@ func ComparePassword(encrypted, password string) bool {
...
@@ -65,6 +65,7 @@ func ComparePassword(encrypted, password string) bool {
return
h
.
ComparePassword
(
encrypted
,
password
)
return
h
.
ComparePassword
(
encrypted
,
password
)
}
}
}
}
return
false
return
false
}
}
...
@@ -73,7 +74,7 @@ func ComparePassword(encrypted, password string) bool {
...
@@ -73,7 +74,7 @@ func ComparePassword(encrypted, password string) bool {
var
DefaultEncryptAlgorithm
PasswordHash
var
DefaultEncryptAlgorithm
PasswordHash
func
init
()
{
func
init
()
{
DefaultEncryptAlgorithm
=
NewArgon2
()
DefaultEncryptAlgorithm
=
NewArgon2
Std
()
}
}
// Encrypt will encrypt a password with the default algorithm.
// Encrypt will encrypt a password with the default algorithm.
...
...
This diff is collapsed.
Click to expand it.
pwhash/password_test.go
View file @
62b40add
...
@@ -5,8 +5,8 @@ import (
...
@@ -5,8 +5,8 @@ import (
"testing"
"testing"
)
)
func
TestArgon2
(
t
*
testing
.
T
)
{
func
TestArgon2
Legacy
(
t
*
testing
.
T
)
{
testImpl
(
t
,
NewArgon2
())
testImpl
(
t
,
NewArgon2
Legacy
())
}
}
func
TestArgon2Std
(
t
*
testing
.
T
)
{
func
TestArgon2Std
(
t
*
testing
.
T
)
{
...
@@ -65,7 +65,7 @@ func testImpl(t *testing.T, h PasswordHash) {
...
@@ -65,7 +65,7 @@ func testImpl(t *testing.T, h PasswordHash) {
}
}
}
}
func
TestStandardArgon2Password
(
t
*
testing
.
T
)
{
func
TestStandardArgon2
I
Password
(
t
*
testing
.
T
)
{
enc
:=
"$argon2i$v=19$m=32768,t=4,p=1$DG0B56zlrrx+VMVaM6wvsw$8iV+HwTKmofjrb+q9I2zZGQnGXzXtiIXv8VdHdvbbX8"
enc
:=
"$argon2i$v=19$m=32768,t=4,p=1$DG0B56zlrrx+VMVaM6wvsw$8iV+HwTKmofjrb+q9I2zZGQnGXzXtiIXv8VdHdvbbX8"
pw
:=
"idontmindbirds"
pw
:=
"idontmindbirds"
if
!
ComparePassword
(
enc
,
pw
)
{
if
!
ComparePassword
(
enc
,
pw
)
{
...
@@ -73,6 +73,15 @@ func TestStandardArgon2Password(t *testing.T) {
...
@@ -73,6 +73,15 @@ func TestStandardArgon2Password(t *testing.T) {
}
}
}
}
func
TestStandardArgon2IDPassword
(
t
*
testing
.
T
)
{
// python3 -c 'from argon2 import PasswordHasher ; print(PasswordHasher().hash("idontmindbirds"))'
enc
:=
"$argon2id$v=19$m=102400,t=2,p=8$7hQLBrHoxYxRO0R8km62pA$Dv5+BCctW4nCrxsy5C9JBg"
pw
:=
"idontmindbirds"
if
!
ComparePassword
(
enc
,
pw
)
{
t
.
Fatal
(
"comparison failed"
)
}
}
func
BenchmarkArgon2
(
b
*
testing
.
B
)
{
func
BenchmarkArgon2
(
b
*
testing
.
B
)
{
var
testParams
[]
argon2Params
var
testParams
[]
argon2Params
for
iTime
:=
1
;
iTime
<=
5
;
iTime
++
{
for
iTime
:=
1
;
iTime
<=
5
;
iTime
++
{
...
@@ -93,7 +102,7 @@ func BenchmarkArgon2(b *testing.B) {
...
@@ -93,7 +102,7 @@ func BenchmarkArgon2(b *testing.B) {
for
_
,
tp
:=
range
testParams
{
for
_
,
tp
:=
range
testParams
{
name
:=
fmt
.
Sprintf
(
"%d/%d/%d"
,
tp
.
Time
,
tp
.
Memory
,
tp
.
Threads
)
name
:=
fmt
.
Sprintf
(
"%d/%d/%d"
,
tp
.
Time
,
tp
.
Memory
,
tp
.
Threads
)
b
.
Run
(
name
,
func
(
b
*
testing
.
B
)
{
b
.
Run
(
name
,
func
(
b
*
testing
.
B
)
{
h
:=
NewArgon2WithParams
(
tp
.
Time
,
tp
.
Memory
,
tp
.
Threads
)
h
:=
NewArgon2
Std
WithParams
(
tp
.
Time
,
tp
.
Memory
,
tp
.
Threads
)
encPw
:=
h
.
Encrypt
(
goodPw
)
encPw
:=
h
.
Encrypt
(
goodPw
)
b
.
ResetTimer
()
b
.
ResetTimer
()
...
...
This diff is collapsed.
Click to expand it.