Files
br c8df9d7651 erste module drin.
zwischenstand: Architektur aktualisiert, TOFU implementiert,
2026-10-01 22:22:13 +02:00

45 lines
958 B
Go

package auth
import (
"sync"
"time"
)
// nonceCache merkt sich verwendete Nonces, solange ihr Zeitstempel noch
// akzeptiert würde. Danach verhindert schon die Zeitprüfung jede
// Wiederverwendung, der Eintrag kann weg.
type nonceCache struct {
mu sync.Mutex
seen map[string]time.Time // Schlüssel+Nonce -> Ablauf
lastPurge time.Time
}
// add vermerkt nonce für key und meldet false, wenn sie schon bekannt ist.
func (c *nonceCache) add(key, nonce string, expires, now time.Time) bool {
c.mu.Lock()
defer c.mu.Unlock()
if c.seen == nil {
c.seen = map[string]time.Time{}
}
if now.Sub(c.lastPurge) > time.Minute {
for k, exp := range c.seen {
if !now.Before(exp) {
delete(c.seen, k)
}
}
c.lastPurge = now
}
id := key + "\x00" + nonce
if _, dup := c.seen[id]; dup {
return false
}
c.seen[id] = expires
return true
}
func (c *nonceCache) len() int {
c.mu.Lock()
defer c.mu.Unlock()
return len(c.seen)
}