1package idp
2
3import (
4 "crypto/rand"
5 "crypto/sha256"
6 "crypto/subtle"
7 "encoding/base64"
8 "time"
9)
10
11func (v *Verifier) newValue(requestExpiry time.Time) (string, []byte, int64) {
12 value := make([]byte, valueLength)
13 rand.Read(value)
14 digest := sha256.Sum256(value)
15 expiry := v.deps.now().Add(ValueTTL)
16 if requestExpiry.Before(expiry) {
17 expiry = requestExpiry
18 }
19 return base64.RawURLEncoding.EncodeToString(value), digest[:], expiry.UnixMicro()
20}
21
22func checkValue(value, wantDigest []byte, expiry int64, now time.Time) error {
23 if !now.Before(time.UnixMicro(expiry)) {
24 return ErrValueExpired
25 }
26 digest := sha256.Sum256(value)
27 if subtle.ConstantTimeCompare(digest[:], wantDigest) != 1 {
28 return ErrValueMismatch
29 }
30 return nil
31}