- // Check HMAC.
- if(s->instate)
- if(!digest_verify(&s->indigest, s->inbuf, reclen + 7UL, s->inbuf + reclen + 7UL))
- error(s, EIO, "Invalid HMAC");
+ // Check HMAC and decrypt.
+ if(s->instate) {
+ if(!digest_verify(&s->indigest, s->inbuf, s->reclen + 7UL, s->inbuf + s->reclen + 7UL))
+ return error(s, EIO, "Invalid HMAC");
+
+ if(!cipher_counter_xor(&s->incipher, s->inbuf + 6UL, s->reclen + 1UL, s->inbuf + 6UL))
+ return false;
+ }
+
+ // Append a NULL byte for safety.
+ s->inbuf[s->reclen + 7UL] = 0;