summaryrefslogtreecommitdiff
path: root/internal/stupidgcm/stupidchacha.go
diff options
context:
space:
mode:
authorJakob Unterwurzacher2021-09-03 18:44:41 +0200
committerJakob Unterwurzacher2021-09-07 18:14:05 +0200
commitbf572aef88963732849b8e5ae679e63c6be4aa46 (patch)
treed19debcb4c435dfda435c0497c33247bfc7006b0 /internal/stupidgcm/stupidchacha.go
parent3e27acb989614f82a25d50ab19a0a4419f19aa27 (diff)
stupidgcm: stupidChacha20poly1305.Open: batch C calls in aead_open
Gets the decryption speed to the same level as the encryption speed. internal/speed$ benchstat old.txt new.txt name old time/op new time/op delta StupidXchacha-4 732MB/s ± 0% 740MB/s ± 0% ~ (p=1.000 n=1+1) StupidXchachaDecrypt-4 602MB/s ± 0% 741MB/s ± 0% ~ (p=1.000 n=1+1)
Diffstat (limited to 'internal/stupidgcm/stupidchacha.go')
-rw-r--r--internal/stupidgcm/stupidchacha.go68
1 files changed, 17 insertions, 51 deletions
diff --git a/internal/stupidgcm/stupidchacha.go b/internal/stupidgcm/stupidchacha.go
index 18037c6..5073aa3 100644
--- a/internal/stupidgcm/stupidchacha.go
+++ b/internal/stupidgcm/stupidchacha.go
@@ -6,7 +6,6 @@ import (
"crypto/cipher"
"fmt"
"log"
- "unsafe"
"golang.org/x/crypto/chacha20poly1305"
)
@@ -118,59 +117,26 @@ func (g *stupidChacha20poly1305) Open(dst, iv, in, authData []byte) ([]byte, err
ciphertext := in[:len(in)-tagLen]
tag := in[len(in)-tagLen:]
- // https://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption#Authenticated_Encryption_using_GCM_mode
-
- // Create scratch space "context"
- ctx := C.EVP_CIPHER_CTX_new()
- if ctx == nil {
- log.Panic("EVP_CIPHER_CTX_new failed")
- }
-
- // Set cipher to AES-256
- if C.EVP_DecryptInit_ex(ctx, C.EVP_chacha20_poly1305(), nil, nil, nil) != 1 {
- log.Panic("EVP_DecryptInit_ex I failed")
- }
-
- // Set key and IV
- if C.EVP_DecryptInit_ex(ctx, nil, nil, (*C.uchar)(&g.key[0]), (*C.uchar)(&iv[0])) != 1 {
- log.Panic("EVP_DecryptInit_ex II failed")
- }
-
- // Set expected MAC tag
- if C.EVP_CIPHER_CTX_ctrl(ctx, C.EVP_CTRL_AEAD_SET_TAG, tagLen, (unsafe.Pointer)(&tag[0])) != 1 {
- log.Panic("EVP_CIPHER_CTX_ctrl EVP_CTRL_AEAD_SET_TAG failed")
- }
-
- // Provide authentication data
- var resultLen C.int
- if C.EVP_DecryptUpdate(ctx, nil, &resultLen, (*C.uchar)(&authData[0]), C.int(len(authData))) != 1 {
- log.Panic("EVP_DecryptUpdate authData failed")
- }
- if int(resultLen) != len(authData) {
- log.Panicf("Unexpected length %d", resultLen)
- }
-
- // Decrypt "ciphertext" into "buf"
- if C.EVP_DecryptUpdate(ctx, (*C.uchar)(&buf[0]), &resultLen, (*C.uchar)(&ciphertext[0]), C.int(len(ciphertext))) != 1 {
- log.Panic("EVP_DecryptUpdate failed")
- }
- if int(resultLen) != len(ciphertext) {
- log.Panicf("Unexpected length %d", resultLen)
- }
-
- // Check MAC
- dummy := make([]byte, 16)
- res := C.EVP_DecryptFinal_ex(ctx, (*C.uchar)(&dummy[0]), &resultLen)
- if resultLen != 0 {
- log.Panicf("Unexpected length %d", resultLen)
- }
-
- // Free scratch space
- C.EVP_CIPHER_CTX_free(ctx)
+ res := int(C.aead_open(C.aeadTypeChacha,
+ (*C.uchar)(&ciphertext[0]),
+ C.int(len(ciphertext)),
+ (*C.uchar)(&authData[0]),
+ C.int(len(authData)),
+ (*C.uchar)(&tag[0]),
+ C.int(len(tag)),
+ (*C.uchar)(&g.key[0]),
+ C.int(len(g.key)),
+ (*C.uchar)(&iv[0]),
+ C.int(len(iv)),
+ (*C.uchar)(&buf[0]),
+ C.int(len(buf))))
- if res != 1 {
+ if res < 0 {
return nil, ErrAuth
}
+ if res != outLen {
+ log.Panicf("unexpected length %d", res)
+ }
if inplace {
return dst[:len(dst)+outLen], nil