@@ -52,6 +52,7 @@ func (k *EncryptionKey) UnmarshalText(text []byte) error {
|
||||
}
|
||||
|
||||
copy(k[:], decoded)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -94,6 +95,7 @@ func Decrypt(data []byte, key EncryptionKey) ([]byte, error) {
|
||||
if len(data) < 12 {
|
||||
return nil, fmt.Errorf("ciphertext too short")
|
||||
}
|
||||
|
||||
nonce, ciphertext := data[:12], data[12:]
|
||||
|
||||
plaintext, err := aesgcm.Open(nil, nonce, ciphertext, nil)
|
||||
|
||||
@@ -87,6 +87,7 @@ func SignJWT(privateKey *rsa.PrivateKey, kid string, claims any) (string, error)
|
||||
signingInput := headerB64 + "." + claimsB64
|
||||
|
||||
h := sha256.Sum256([]byte(signingInput))
|
||||
|
||||
signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, h[:])
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("cannot sign jwt: %w", err)
|
||||
|
||||
@@ -140,6 +140,7 @@ func TestSignJWT(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
var header jose.JWTHeader
|
||||
|
||||
err = json.Unmarshal(headerJSON, &header)
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -168,6 +169,7 @@ func TestSignJWT(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
var decoded map[string]any
|
||||
|
||||
err = json.Unmarshal(claimsJSON, &decoded)
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -215,6 +217,7 @@ func TestJWK_JSON(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
var raw map[string]string
|
||||
|
||||
err = json.Unmarshal(data, &raw)
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -251,6 +254,7 @@ func TestJWKS_JSON(t *testing.T) {
|
||||
var raw struct {
|
||||
Keys []json.RawMessage `json:"keys"`
|
||||
}
|
||||
|
||||
err = json.Unmarshal(data, &raw)
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -277,6 +281,7 @@ func TestJWTHeader_JSON(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
var raw map[string]string
|
||||
|
||||
err = json.Unmarshal(data, &raw)
|
||||
require.NoError(t, err)
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@ func TestGenerate(t *testing.T) {
|
||||
checkFunc: func(t *testing.T, key any) {
|
||||
rsaKey, ok := key.(*rsa.PrivateKey)
|
||||
require.True(t, ok, "expected *rsa.PrivateKey, got %T", key)
|
||||
|
||||
bitSize := rsaKey.N.BitLen()
|
||||
assert.GreaterOrEqual(t, bitSize, 2047, "RSA key too small")
|
||||
assert.LessOrEqual(t, bitSize, 2048, "RSA key too large")
|
||||
@@ -68,6 +69,7 @@ func TestGenerate(t *testing.T) {
|
||||
checkFunc: func(t *testing.T, key any) {
|
||||
rsaKey, ok := key.(*rsa.PrivateKey)
|
||||
require.True(t, ok, "expected *rsa.PrivateKey, got %T", key)
|
||||
|
||||
bitSize := rsaKey.N.BitLen()
|
||||
assert.GreaterOrEqual(t, bitSize, 4095, "RSA key too small")
|
||||
assert.LessOrEqual(t, bitSize, 4096, "RSA key too large")
|
||||
@@ -116,6 +118,7 @@ func TestGenerateConcurrency(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
const numGoroutines = 10
|
||||
|
||||
errorsChan := make(chan error, numGoroutines)
|
||||
|
||||
for range numGoroutines {
|
||||
@@ -125,10 +128,12 @@ func TestGenerateConcurrency(t *testing.T) {
|
||||
errorsChan <- err
|
||||
return
|
||||
}
|
||||
|
||||
if key == nil {
|
||||
errorsChan <- errors.New("generated key is nil")
|
||||
return
|
||||
}
|
||||
|
||||
errorsChan <- nil
|
||||
}()
|
||||
}
|
||||
|
||||
@@ -61,6 +61,7 @@ func NewProfile(pepper []byte, iterations uint32) (*Profile, error) {
|
||||
func (hp Profile) applyPepper(input []byte) []byte {
|
||||
mac := hmac.New(sha256.New, hp.pepper)
|
||||
mac.Write(input)
|
||||
|
||||
return mac.Sum(nil)
|
||||
}
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ func EncodeCertificate(der []byte) []byte {
|
||||
Type: BlockTypeCertificate,
|
||||
Bytes: der,
|
||||
}
|
||||
|
||||
return pem.EncodeToMemory(block)
|
||||
}
|
||||
|
||||
@@ -44,12 +45,15 @@ func EncodeCertificateChain(derCerts [][]byte) []byte {
|
||||
for _, der := range derCerts {
|
||||
chain = append(chain, EncodeCertificate(der)...)
|
||||
}
|
||||
|
||||
return chain
|
||||
}
|
||||
|
||||
func EncodePrivateKey(key crypto.Signer) ([]byte, error) {
|
||||
var keyDER []byte
|
||||
var keyType string
|
||||
var (
|
||||
keyDER []byte
|
||||
keyType string
|
||||
)
|
||||
|
||||
switch k := key.(type) {
|
||||
case *ecdsa.PrivateKey:
|
||||
@@ -57,6 +61,7 @@ func EncodePrivateKey(key crypto.Signer) ([]byte, error) {
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot marshal EC private key: %w", err)
|
||||
}
|
||||
|
||||
keyDER = der
|
||||
keyType = BlockTypeECPrivateKey
|
||||
case *rsa.PrivateKey:
|
||||
@@ -67,6 +72,7 @@ func EncodePrivateKey(key crypto.Signer) ([]byte, error) {
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot marshal ED25519 private key: %w", err)
|
||||
}
|
||||
|
||||
keyDER = der
|
||||
keyType = BlockTypePKCS8PrivateKey
|
||||
default:
|
||||
@@ -97,10 +103,12 @@ func DecodePrivateKey(pemData []byte) (crypto.Signer, error) {
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot parse PKCS8 private key: %w", err)
|
||||
}
|
||||
|
||||
signer, ok := key.(crypto.Signer)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("key is not a crypto.Signer")
|
||||
}
|
||||
|
||||
return signer, nil
|
||||
default:
|
||||
return nil, fmt.Errorf("unsupported PEM block type: %s", block.Type)
|
||||
|
||||
@@ -122,10 +122,12 @@ func TestEncodePrivateKey(t *testing.T) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
signer, ok := key.(crypto.Signer)
|
||||
if !ok {
|
||||
return nil, errors.New("key is not a crypto.Signer")
|
||||
}
|
||||
|
||||
return signer, nil
|
||||
},
|
||||
},
|
||||
@@ -205,6 +207,7 @@ func TestRoundTrip(t *testing.T) {
|
||||
|
||||
// Parse key based on type
|
||||
var parsedKey crypto.Signer
|
||||
|
||||
switch block.Type {
|
||||
case "EC PRIVATE KEY":
|
||||
parsedKey, err = x509.ParseECPrivateKey(block.Bytes)
|
||||
@@ -228,8 +231,10 @@ func TestRoundTrip(t *testing.T) {
|
||||
h.Write(testData)
|
||||
hashed := h.Sum(nil)
|
||||
|
||||
var dataToSign []byte
|
||||
var hashFunc crypto.Hash
|
||||
var (
|
||||
dataToSign []byte
|
||||
hashFunc crypto.Hash
|
||||
)
|
||||
|
||||
switch originalKey.(type) {
|
||||
case *rsa.PrivateKey:
|
||||
@@ -309,6 +314,7 @@ func BenchmarkEncodeCertificate(b *testing.B) {
|
||||
certDER, _ := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv)
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = pem.EncodeCertificate(certDER)
|
||||
}
|
||||
@@ -344,5 +350,6 @@ func mustGenerateKey(gen func() (crypto.Signer, error)) crypto.Signer {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return key
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user