summaryrefslogtreecommitdiff
path: root/src/ltc/encauth/gcm/gcm_memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ltc/encauth/gcm/gcm_memory.c')
-rw-r--r--src/ltc/encauth/gcm/gcm_memory.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/ltc/encauth/gcm/gcm_memory.c b/src/ltc/encauth/gcm/gcm_memory.c
index b318f7cf..a9c6ac63 100644
--- a/src/ltc/encauth/gcm/gcm_memory.c
+++ b/src/ltc/encauth/gcm/gcm_memory.c
@@ -93,7 +93,24 @@ int gcm_memory( int cipher,
if ((err = gcm_process(gcm, pt, ptlen, ct, direction)) != CRYPT_OK) {
goto LTC_ERR;
}
- err = gcm_done(gcm, tag, taglen);
+ if (direction == GCM_ENCRYPT) {
+ if ((err = gcm_done(gcm, tag, taglen)) != CRYPT_OK) {
+ goto LTC_ERR;
+ }
+ }
+ else if (direction == GCM_DECRYPT) {
+ unsigned char buf[MAXBLOCKSIZE];
+ unsigned long buflen = sizeof(buf);
+ if ((err = gcm_done(gcm, buf, &buflen)) != CRYPT_OK) {
+ goto LTC_ERR;
+ }
+ if (buflen != *taglen || XMEM_NEQ(buf, tag, buflen) != 0) {
+ err = CRYPT_ERROR;
+ }
+ }
+ else {
+ err = CRYPT_INVALID_ARG;
+ }
LTC_ERR:
XFREE(orig);
return err;