stupidgcm: Open: if "dst" is big enough, use it as the output buffer
This means we won't need any allocation for the plaintext.
This commit is contained in:
parent
b2a23e94d1
commit
e4b5005bcc
@ -139,7 +139,18 @@ func (g stupidGCM) Open(dst, iv, in, authData []byte) ([]byte, error) {
|
|||||||
if len(in) <= tagLen {
|
if len(in) <= tagLen {
|
||||||
log.Panic("Input data too short")
|
log.Panic("Input data too short")
|
||||||
}
|
}
|
||||||
buf := make([]byte, len(in)-tagLen)
|
|
||||||
|
// If the "dst" slice is large enough we can use it as our output buffer
|
||||||
|
outLen := len(in) - tagLen
|
||||||
|
var buf []byte
|
||||||
|
inplace := false
|
||||||
|
if cap(dst)-len(dst) >= outLen {
|
||||||
|
inplace = true
|
||||||
|
buf = dst[len(dst) : len(dst)+outLen]
|
||||||
|
} else {
|
||||||
|
buf = make([]byte, len(in)-tagLen)
|
||||||
|
}
|
||||||
|
|
||||||
ciphertext := in[:len(in)-tagLen]
|
ciphertext := in[:len(in)-tagLen]
|
||||||
tag := in[len(in)-tagLen:]
|
tag := in[len(in)-tagLen:]
|
||||||
|
|
||||||
@ -207,5 +218,8 @@ func (g stupidGCM) Open(dst, iv, in, authData []byte) ([]byte, error) {
|
|||||||
return nil, ErrAuth
|
return nil, ErrAuth
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if inplace {
|
||||||
|
return dst[:len(dst)+outLen], nil
|
||||||
|
}
|
||||||
return append(dst, buf...), nil
|
return append(dst, buf...), nil
|
||||||
}
|
}
|
||||||
|
@ -112,6 +112,13 @@ func TestInplaceSeal(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Open re-uses the "dst" buffer it is large enough.
|
||||||
|
// Check that this works correctly by testing different "dst" capacities from
|
||||||
|
// 5000 to 16 and "in" lengths from 1 to 5000.
|
||||||
|
func TestInplaceOpen(t *testing.T) {
|
||||||
|
t.Skipf("TODO: IMPLEMENT TEST")
|
||||||
|
}
|
||||||
|
|
||||||
// TestCorruption verifies that changes in the ciphertext result in a decryption
|
// TestCorruption verifies that changes in the ciphertext result in a decryption
|
||||||
// error
|
// error
|
||||||
func TestCorruption(t *testing.T) {
|
func TestCorruption(t *testing.T) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user