Raw
 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}