package seal // The salt of each key that DeriveKeys derives. Each key has a salt of its // own, so no two uses share a key. const ( sessionHashKeySalt = "pixa-session-hash-v1" sessionBlockKeySalt = "pixa-session-block-v1" encryptedURLKeySalt = "pixa-urlenc-v1" csrfKeySalt = "pixa-csrf-v1" ) // Keys holds the keys derived from the signing key, one for each use. The // signing key itself is used for two things only: it is the HMAC key of signed // URLs and the password of the login page. type Keys struct { // SessionHashKey signs the session cookie. SessionHashKey [KeySize]byte // SessionBlockKey encrypts the session cookie. SessionBlockKey [KeySize]byte // EncryptedURLKey encrypts the token of an encrypted URL. EncryptedURLKey [KeySize]byte // CSRFKey signs the CSRF token cookie of the login and generator pages. CSRFKey [KeySize]byte } // DeriveKeys derives each key of Keys from signingKey, with DeriveKey and the // salt of that key. func DeriveKeys(signingKey string) (Keys, error) { masterKey := []byte(signingKey) sessionHashKey, err := DeriveKey(masterKey, sessionHashKeySalt) if err != nil { return Keys{}, err } sessionBlockKey, err := DeriveKey(masterKey, sessionBlockKeySalt) if err != nil { return Keys{}, err } encryptedURLKey, err := DeriveKey(masterKey, encryptedURLKeySalt) if err != nil { return Keys{}, err } csrfKey, err := DeriveKey(masterKey, csrfKeySalt) if err != nil { return Keys{}, err } return Keys{ SessionHashKey: sessionHashKey, SessionBlockKey: sessionBlockKey, EncryptedURLKey: encryptedURLKey, CSRFKey: csrfKey, }, nil }