@@ -26,10 +26,11 @@ #define READ_DELAY 5 /* Digest format and operation */ #define BIN_FORMAT 0x01 #define HEX_FORMAT 0x02 +#define IS_XOF 0x08 #define TYPE_MD 0x10 #define TYPE_HMAC 0x20 #define TYPE_CMAC 0x40 /* @@ -237,13 +238,19 @@ unsigned int md_len; int res = 0; /* Finalize hash function and calculate message digest */ if (statePtr->format & TYPE_MD) { - res = EVP_DigestFinal_ex(statePtr->ctx, md_buf, &md_len); + if (!(statePtr->format & IS_XOF)) { + res = EVP_DigestFinal_ex(statePtr->ctx, md_buf, &md_len); + } 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; } @@ -895,11 +902,11 @@ * * Returns: * Nothing * * Side effects: - * Destroys struct + * Destroys state info structure * *------------------------------------------------------------------- */ void InstanceDelCallback(ClientData clientData) { DigestState *statePtr = (DigestState *) clientData; @@ -1162,10 +1169,12 @@ if (digestName != NULL) { md = EVP_get_digestbyname(digestName); if (md == NULL) { Tcl_AppendResult(interp, "Invalid digest \"", digestName, "\"", NULL); return TCL_ERROR; + } else if (md == EVP_shake128() || md == EVP_shake256()) { + format |= IS_XOF; } } else if (type == TYPE_MD || type == TYPE_HMAC) { Tcl_AppendResult(interp, "No digest specified", NULL); return TCL_ERROR; }