Skip to content

Commit

Permalink
libtomcrypt fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
karel-m committed Oct 26, 2018
1 parent 4663dbe commit 23f7541
Show file tree
Hide file tree
Showing 7 changed files with 33 additions and 24 deletions.
13 changes: 3 additions & 10 deletions src/ltc/encauth/ccm/ccm_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ int ccm_init(ccm_state *ccm, int cipher,

LTC_ARGCHK(ccm != NULL);
LTC_ARGCHK(key != NULL);
LTC_ARGCHK(taglen != 0);

XMEMSET(ccm, 0, sizeof(ccm_state));

Expand All @@ -41,17 +40,11 @@ int ccm_init(ccm_state *ccm, int cipher,
return CRYPT_INVALID_CIPHER;
}

/* make sure the taglen is even and <= 16 */
ccm->taglen = taglen;
ccm->taglen &= ~1;
if (ccm->taglen > 16) {
ccm->taglen = 16;
}

/* can't use < 4 */
if (ccm->taglen < 4) {
/* make sure the taglen is valid */
if (taglen < 4 || taglen > 16 || (taglen % 2) == 1) {
return CRYPT_INVALID_ARG;
}
ccm->taglen = taglen;

/* schedule key */
if ((err = cipher_descriptor[cipher].setup(key, keylen, 0, &ccm->K)) != CRYPT_OK) {
Expand Down
10 changes: 2 additions & 8 deletions src/ltc/encauth/ccm/ccm_memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,14 +80,8 @@ int ccm_memory(int cipher,
return CRYPT_INVALID_CIPHER;
}

/* make sure the taglen is even and <= 16 */
*taglen &= ~1;
if (*taglen > 16) {
*taglen = 16;
}

/* can't use < 4 */
if (*taglen < 4) {
/* make sure the taglen is valid */
if (*taglen < 4 || *taglen > 16 || (*taglen % 2) == 1) {
return CRYPT_INVALID_ARG;
}

Expand Down
1 change: 0 additions & 1 deletion src/ltc/encauth/chachapoly/chacha20poly1305_decrypt.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ int chacha20poly1305_decrypt(chacha20poly1305_state *st, const unsigned char *in
unsigned long padlen;
int err;

if (inlen == 0) return CRYPT_OK; /* nothing to do */
LTC_ARGCHK(st != NULL);

if (st->aadflg) {
Expand Down
1 change: 0 additions & 1 deletion src/ltc/encauth/chachapoly/chacha20poly1305_encrypt.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ int chacha20poly1305_encrypt(chacha20poly1305_state *st, const unsigned char *in
unsigned long padlen;
int err;

if (inlen == 0) return CRYPT_OK; /* nothing to do */
LTC_ARGCHK(st != NULL);

if ((err = chacha_crypt(&st->chacha, in, inlen, out)) != CRYPT_OK) return err;
Expand Down
10 changes: 9 additions & 1 deletion src/ltc/encauth/chachapoly/chacha20poly1305_memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ int chacha20poly1305_memory(const unsigned char *key, unsigned long keylen,
LTC_ARGCHK(in != NULL);
LTC_ARGCHK(out != NULL);
LTC_ARGCHK(tag != NULL);
LTC_ARGCHK(taglen != NULL);

if ((err = chacha20poly1305_init(&st, key, keylen)) != CRYPT_OK) { goto LBL_ERR; }
if ((err = chacha20poly1305_setiv(&st, iv, ivlen)) != CRYPT_OK) { goto LBL_ERR; }
Expand All @@ -51,15 +52,22 @@ int chacha20poly1305_memory(const unsigned char *key, unsigned long keylen,
}
if (direction == CHACHA20POLY1305_ENCRYPT) {
if ((err = chacha20poly1305_encrypt(&st, in, inlen, out)) != CRYPT_OK) { goto LBL_ERR; }
if ((err = chacha20poly1305_done(&st, tag, taglen)) != CRYPT_OK) { goto LBL_ERR; }
}
else if (direction == CHACHA20POLY1305_DECRYPT) {
unsigned char buf[MAXBLOCKSIZE];
unsigned long buflen = sizeof(buf);
if ((err = chacha20poly1305_decrypt(&st, in, inlen, out)) != CRYPT_OK) { goto LBL_ERR; }
if ((err = chacha20poly1305_done(&st, buf, &buflen)) != CRYPT_OK) { goto LBL_ERR; }
if (buflen != *taglen || XMEM_NEQ(buf, tag, buflen) != 0) {
err = CRYPT_ERROR;
goto LBL_ERR;
}
}
else {
err = CRYPT_INVALID_ARG;
goto LBL_ERR;
}
err = chacha20poly1305_done(&st, tag, taglen);
LBL_ERR:
#ifdef LTC_CLEAN_STACK
zeromem(&st, sizeof(chacha20poly1305_state));
Expand Down
19 changes: 18 additions & 1 deletion src/ltc/encauth/gcm/gcm_memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 1 addition & 2 deletions src/ltc/misc/copy_or_zeromem.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ void copy_or_zeromem(const unsigned char* src, unsigned char* dest, unsigned lon
#endif
unsigned char mask = 0xff; /* initialize mask at all ones */

LTC_ARGCHK(src != NULL);
LTC_ARGCHK(dest != NULL);
if (src == NULL || dest == NULL) return;

if (coz != 0) coz = 1;
y = 0;
Expand Down

0 comments on commit 23f7541

Please sign in to comment.