@@ -2,6 +2,7 @@ package main
@@ -156,17 +157,25 @@ func (o *Options) Validate() error {
156 if o.PassAccessToken || (o.CookieRefresh != time.Duration(0)) {
157 if o.PassAccessToken || (o.CookieRefresh != time.Duration(0)) {
157 valid_cookie_secret_size := false
158 valid_cookie_secret_size := false
158 for _, i := range []int{16, 24, 32} {
159 for _, i := range []int{16, 24, 32} {
159− if len(o.CookieSecret) == i {
160+ if len(secretBytes(o.CookieSecret)) == i {
160 valid_cookie_secret_size = true
161 valid_cookie_secret_size = true
165+ if string(secretBytes(o.CookieSecret)) != o.CookieSecret {
163 if valid_cookie_secret_size == false {
168 if valid_cookie_secret_size == false {
171+ suffix = fmt.Sprintf(" note: cookie secret was base64 decoded from %q", o.CookieSecret)
164 msgs = append(msgs, fmt.Sprintf(
173 msgs = append(msgs, fmt.Sprintf(
165 "cookie_secret must be 16, 24, or 32 bytes "+
174 "cookie_secret must be 16, 24, or 32 bytes "+
166 "to create an AES cipher when "+
175 "to create an AES cipher when "+
167 "pass_access_token == true or "+
176 "pass_access_token == true or "+
168− "cookie_refresh != 0, but is %d bytes",
177+ "cookie_refresh != 0, but is %d bytes.%s",
169− len(o.CookieSecret)))
178+ len(secretBytes(o.CookieSecret)), suffix))
@@ -251,3 +260,26 @@ func parseSignatureKey(o *Options, msgs []string) []string {
252 return msgs
261 return msgs
264+func addPadding(secret string) string {
265+ padding := len(secret) % 4
268+ return secret + "==="
270+ return secret + "=="
278+// secretBytes attempts to base64 decode the secret, if that fails it treats the secret as binary
279+func secretBytes(secret string) []byte {
280+ b, err := base64.URLEncoding.DecodeString(addPadding(secret))
282+ return []byte(addPadding(string(b)))
284+ return []byte(secret)