You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
12 months ago
|
package argon2
|
||
|
|
||
|
import (
|
||
|
// Standard
|
||
|
"crypto/subtle"
|
||
|
"encoding/base64"
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
|
||
|
// Standard Extended
|
||
|
"golang.org/x/crypto/argon2"
|
||
|
)
|
||
|
|
||
|
// Check Hash
|
||
|
func (algorithm Algorithm) CheckHash(data []byte, hashToCheck string) (bool, error) {
|
||
|
// Hash Information
|
||
|
var version int
|
||
|
var memory uint32
|
||
|
var threads uint8
|
||
|
var time uint32
|
||
|
// Hash Parts
|
||
|
hashParts := strings.Split(hashToCheck, "$")
|
||
|
// Validate Hash Parts
|
||
|
if len(hashParts) != 6 {
|
||
|
return false, errors.New("the hash is invalid")
|
||
|
}
|
||
|
// Get Version
|
||
|
_, err := fmt.Sscanf(hashParts[2], "v=%d", &version)
|
||
|
// Handle Error
|
||
|
if err != nil {
|
||
|
return false, err
|
||
|
}
|
||
|
// Validate Version
|
||
|
if version != argon2.Version {
|
||
|
return false, errors.New("incompatible version")
|
||
|
}
|
||
|
// Get Other Hash Information
|
||
|
_, err = fmt.Sscanf(hashParts[3], "m=%d,t=%d,p=%d", &memory, &time, &threads)
|
||
|
// Handle Error
|
||
|
if err != nil {
|
||
|
return false, err
|
||
|
}
|
||
|
// Salt
|
||
|
salt, err := base64.RawStdEncoding.Strict().DecodeString(hashParts[4])
|
||
|
// Handle Error
|
||
|
if err != nil {
|
||
|
return false, err
|
||
|
}
|
||
|
// Hash
|
||
|
hash, err := base64.RawStdEncoding.Strict().DecodeString(hashParts[5])
|
||
|
// Handle Error
|
||
|
if err != nil {
|
||
|
return false, err
|
||
|
}
|
||
|
// Return Match
|
||
|
return subtle.ConstantTimeCompare(argon2.IDKey(data, salt, time, memory, threads, uint32(len(hash))), hash) == 1, err
|
||
|
}
|