Index: generic/tlsDigest.c ================================================================== --- generic/tlsDigest.c +++ generic/tlsDigest.c @@ -50,12 +50,12 @@ int mode; /* Current mode of parent channel */ int format; /* Digest format and operation */ Tcl_Interp *interp; /* Current interpreter */ EVP_MD_CTX *ctx; /* MD Context */ - HMAC_CTX *hctx; /* HMAC Context */ - CMAC_CTX *cctx; /* CMAC Context */ + HMAC_CTX *hctx; /* HMAC context */ + CMAC_CTX *cctx; /* CMAC context */ Tcl_Command token; /* Command token */ } DigestState; /* *------------------------------------------------------------------- @@ -152,21 +152,26 @@ int DigestInitialize(Tcl_Interp *interp, DigestState *statePtr, const EVP_MD *md, const EVP_CIPHER *cipher, Tcl_Obj *keyObj, EVP_MAC *mac) { int key_len = 0, res = 0; const unsigned char *key = NULL; - /* Create message digest context */ - if (statePtr->format & TYPE_MD) { + /* Create contexts */ + switch(statePtr->format & 0xFF0) { + case TYPE_MD: statePtr->ctx = EVP_MD_CTX_new(); res = (statePtr->ctx != NULL); - } else if (statePtr->format & TYPE_HMAC) { + break; + case TYPE_HMAC: statePtr->hctx = HMAC_CTX_new(); res = (statePtr->hctx != NULL); - } else if (statePtr->format & TYPE_CMAC) { + break; + case TYPE_CMAC: statePtr->cctx = CMAC_CTX_new(); res = (statePtr->cctx != NULL); + break; } + if (!res) { Tcl_AppendResult(interp, "Create context failed: ", REASON(), NULL); return TCL_ERROR; } @@ -173,18 +178,23 @@ /* Get key */ if (keyObj != NULL) { key = Tcl_GetByteArrayFromObj(keyObj, &key_len); } - /* Initialize hash function */ - if (statePtr->format & TYPE_MD) { + /* Initialize cryptography function */ + switch(statePtr->format & 0xFF0) { + case TYPE_MD: res = EVP_DigestInit_ex(statePtr->ctx, md, NULL); - } else if (statePtr->format & TYPE_HMAC) { + break; + case TYPE_HMAC: res = HMAC_Init_ex(statePtr->hctx, (const void *) key, key_len, md, NULL); - } else if (statePtr->format & TYPE_CMAC) { + break; + case TYPE_CMAC: res = CMAC_Init(statePtr->cctx, (const void *) key, key_len, cipher, NULL); + break; } + if (!res) { Tcl_AppendResult(interp, "Initialize failed: ", REASON(), NULL); return TCL_ERROR; } return TCL_OK; @@ -206,17 +216,22 @@ *------------------------------------------------------------------- */ int DigestUpdate(DigestState *statePtr, char *buf, size_t read, int do_result) { int res = 0; - if (statePtr->format & TYPE_MD) { - res = EVP_DigestUpdate(statePtr->ctx, buf, read); - } else if (statePtr->format & TYPE_HMAC) { - res = HMAC_Update(statePtr->hctx, buf, read); - } else if (statePtr->format & TYPE_CMAC) { - res = CMAC_Update(statePtr->cctx, buf, read); + switch(statePtr->format & 0xFF0) { + case TYPE_MD: + res = EVP_DigestUpdate(statePtr->ctx, buf, read); + break; + case TYPE_HMAC: + res = HMAC_Update(statePtr->hctx, buf, read); + break; + case TYPE_CMAC: + res = CMAC_Update(statePtr->cctx, buf, read); + break; } + if (!res && do_result) { Tcl_AppendResult(statePtr->interp, "Update failed: ", REASON(), NULL); return TCL_ERROR; } return res; @@ -238,28 +253,33 @@ * *------------------------------------------------------------------- */ int DigestFinalize(Tcl_Interp *interp, DigestState *statePtr, Tcl_Obj **resultObj) { unsigned char md_buf[EVP_MAX_MD_SIZE]; - unsigned int md_len; - int res = 0; + unsigned int ulen; + int res = 0, md_len = 0; - /* Finalize hash function and calculate message digest */ - if (statePtr->format & TYPE_MD) { + /* Finalize cryptography function and get result */ + switch(statePtr->format & 0xFF0) { + case TYPE_MD: if (!(statePtr->format & IS_XOF)) { - res = EVP_DigestFinal_ex(statePtr->ctx, md_buf, &md_len); + res = EVP_DigestFinal_ex(statePtr->ctx, md_buf, &ulen); + md_len = (int) ulen; } else { - res = EVP_DigestFinalXOF(statePtr->ctx, md_buf, EVP_MAX_MD_SIZE); - } - - } else if (statePtr->format & TYPE_HMAC) { - res = HMAC_Final(statePtr->hctx, md_buf, &md_len); - - } else if (statePtr->format & TYPE_CMAC) { - size_t len; - res = CMAC_Final(statePtr->cctx, md_buf, &len); - md_len = (unsigned int) len; + res = EVP_DigestFinalXOF(statePtr->ctx, md_buf, (size_t) EVP_MAX_MD_SIZE); + md_len = EVP_MAX_MD_SIZE; + } + break; + case TYPE_HMAC: + res = HMAC_Final(statePtr->hctx, md_buf, &ulen); + md_len = (int) ulen; + break; + case TYPE_CMAC: + size_t size; + res = CMAC_Final(statePtr->cctx, md_buf, &size); + md_len = (int) size; + break; } if (!res) { if (resultObj == NULL) { Tcl_AppendResult(interp, "Finalize failed: ", REASON(), NULL); @@ -278,11 +298,11 @@ } else { Tcl_Obj *newObj = Tcl_NewObj(); unsigned char *ptr = Tcl_SetByteArrayLength(newObj, md_len*2); - for (unsigned int i = 0; i < md_len; i++) { + for (int i = 0; i < md_len; i++) { *ptr++ = hex[(md_buf[i] >> 4) & 0x0F]; *ptr++ = hex[md_buf[i] & 0x0F]; } if (resultObj == NULL) {