package kdbx import "errors" // argon2 variants, filled in by argon2impl.go. const ( argon2d = 0 argon2i = 1 argon2id = 2 ) // argon2KDF derives the transformed key for a file that uses Argon2. func argon2KDF(kdf variantDict, composite []byte, variant int) ([]byte, error) { salt := kdf.bytes("S") par, okP := kdf.uint64("P") mem, okM := kdf.uint64("M") iter, okI := kdf.uint64("I") if len(salt) == 0 || !okP || !okM || !okI { return nil, errors.New("kdbx: Argon2 parameters are missing or malformed") } if ver, ok := kdf.uint64("V"); ok && ver != 0x13 { return nil, unsupported("Argon2 version %#x", ver) } if len(kdf.bytes("K")) != 0 || len(kdf.bytes("A")) != 0 { return nil, unsupported("Argon2 secret key or associated data") } // M is in bytes in KDBX, in kibibytes in Argon2 itself. return argon2Key(composite, salt, uint32(iter), uint32(mem/1024), uint8(par), 32, variant) }