forked from argoproj/argo-cd
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Use encrypted cookie to store OAuth2 state nonce (instead of re…
…dis) (argoproj#8241) feat: Use encrypted cookie to store OAuth2 state nonce (instead of redis) (argoproj#8241) Signed-off-by: Alexander Matyushentsev <[email protected]>
- Loading branch information
Alexander Matyushentsev
authored
Jan 26, 2022
1 parent
0aeda43
commit ecc3ab3
Showing
9 changed files
with
247 additions
and
80 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
package crypto | ||
|
||
import ( | ||
"crypto/aes" | ||
"crypto/cipher" | ||
"crypto/rand" | ||
"crypto/sha256" | ||
"errors" | ||
"io" | ||
|
||
"golang.org/x/crypto/scrypt" | ||
) | ||
|
||
// KeyFromPassphrase generates 32 byte key from the passphrase | ||
func KeyFromPassphrase(passphrase string) ([]byte, error) { | ||
// salt is just a hash of a passphrase (effectively no salt) | ||
salt := sha256.Sum256([]byte(passphrase)) | ||
// These defaults will consume approximately 16MB of memory (128 * r * N) | ||
const N = 16384 | ||
const r = 8 | ||
return scrypt.Key([]byte(passphrase), salt[:], N, r, 1, 32) | ||
} | ||
|
||
// Encrypt encrypts the given data with the given passphrase. | ||
func Encrypt(data []byte, key []byte) ([]byte, error) { | ||
block, err := aes.NewCipher(key) | ||
if err != nil { | ||
return nil, err | ||
} | ||
gcm, err := cipher.NewGCM(block) | ||
if err != nil { | ||
return nil, err | ||
} | ||
nonce := make([]byte, gcm.NonceSize()) | ||
if _, err = io.ReadFull(rand.Reader, nonce); err != nil { | ||
return nil, err | ||
} | ||
ciphertext := gcm.Seal(nonce, nonce, data, nil) | ||
return ciphertext, nil | ||
} | ||
|
||
// Decrypt decrypts the given data using the given passphrase. | ||
func Decrypt(data []byte, key []byte) ([]byte, error) { | ||
block, err := aes.NewCipher(key) | ||
if err != nil { | ||
return nil, err | ||
} | ||
gcm, err := cipher.NewGCM(block) | ||
if err != nil { | ||
return nil, err | ||
} | ||
nonceSize := gcm.NonceSize() | ||
if len(data) < nonceSize { | ||
return nil, errors.New("data length is less than nonce size") | ||
} | ||
nonce, ciphertext := data[:nonceSize], data[nonceSize:] | ||
plaintext, err := gcm.Open(nil, nonce, ciphertext, nil) | ||
if err != nil { | ||
return nil, err | ||
} | ||
return plaintext, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
package crypto | ||
|
||
import ( | ||
"crypto/rand" | ||
"testing" | ||
|
||
"github.com/stretchr/testify/assert" | ||
"github.com/stretchr/testify/require" | ||
) | ||
|
||
func newKey() ([]byte, error) { | ||
b := make([]byte, 32) | ||
_, err := rand.Read(b) | ||
if err != nil { | ||
b = nil | ||
} | ||
return b, err | ||
} | ||
|
||
func TestEncryptDecrypt_Successful(t *testing.T) { | ||
key, err := newKey() | ||
require.NoError(t, err) | ||
encrypted, err := Encrypt([]byte("test"), key) | ||
require.NoError(t, err) | ||
|
||
decrypted, err := Decrypt(encrypted, key) | ||
require.NoError(t, err) | ||
|
||
assert.Equal(t, "test", string(decrypted)) | ||
} | ||
|
||
func TestEncryptDecrypt_Failed(t *testing.T) { | ||
key, err := newKey() | ||
require.NoError(t, err) | ||
encrypted, err := Encrypt([]byte("test"), key) | ||
require.NoError(t, err) | ||
|
||
wrongKey, err := newKey() | ||
require.NoError(t, err) | ||
|
||
_, err = Decrypt(encrypted, wrongKey) | ||
assert.Error(t, err) | ||
} |
Oops, something went wrong.