Index: generic/tls.c ================================================================== --- generic/tls.c +++ generic/tls.c @@ -948,34 +948,36 @@ HashCalc(Tcl_Interp *interp, int objc, Tcl_Obj *const objv[], const EVP_MD *type) { char *data; int len; unsigned int mdlen; unsigned char mdbuf[EVP_MAX_MD_SIZE]; - unsigned char hashbuf[EVP_MAX_MD_SIZE*2+1]; const char *hex = "0123456789ABCDEF"; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "data"); return TCL_ERROR; } + /* Get data */ data = Tcl_GetByteArrayFromObj(objv[1], &len); - if (data == NULL) { + if (data == NULL || len == 0) { + Tcl_SetResult(interp, "No data", NULL); return TCL_ERROR; } - /* Calc hash, convert to hex string, and write to result */ + /* Calc hash value, create hex representation, and write to result */ if (EVP_Digest(data, (size_t) len, mdbuf, &mdlen, type, NULL)) { - unsigned char *mptr = mdbuf; - unsigned char *hptr = &hashbuf[0]; + Tcl_Obj *resultObj; + unsigned char *ptr; + resultObj = Tcl_NewObj(); + ptr = Tcl_SetByteArrayLength(resultObj, mdlen*2); for (unsigned int i = 0; i < mdlen; i++) { - *hptr++ = hex[(*mptr>>4)&0xF]; - *hptr++ = hex[(*mptr++)&0xF]; + *ptr++ = hex[(mdbuf[i] >> 4) & 0x0F]; + *ptr++ = hex[mdbuf[i] & 0x0F]; } - *hptr = 0; - Tcl_SetObjResult(interp, Tcl_NewStringObj(hashbuf, mdlen*2)); + Tcl_SetObjResult(interp, resultObj); } else { Tcl_SetResult(interp, "Hash calculation error", NULL); return TCL_ERROR; } return TCL_OK; Index: generic/tlsX509.c ================================================================== --- generic/tlsX509.c +++ generic/tlsX509.c @@ -18,17 +18,21 @@ /* * Binary string to hex string */ -int String_to_Hex(char* input, int ilen, char *output, int olen) { +int String_to_Hex(unsigned char* input, int ilen, unsigned char *output, int olen) { int count = 0; + unsigned char *iptr = input; + unsigned char *optr = &output[0]; + const char *hex = "0123456789ABCDEF"; for (int i = 0; i < ilen && count < olen - 1; i++, count += 2) { - sprintf(output + count, "%02X", input[i] & 0xff); + *optr++ = hex[(*iptr>>4)&0xF]; + *optr++ = hex[(*iptr++)&0xF]; } - output[count] = 0; + *optr = 0; return count; } /* * BIO to Buffer @@ -77,11 +81,11 @@ Tcl_Obj *resultPtr = NULL; int len = 0; char buffer[1024]; if (astring != NULL) { - len = String_to_Hex((char *)ASN1_STRING_get0_data(astring), + len = String_to_Hex(ASN1_STRING_get0_data(astring), ASN1_STRING_length(astring), buffer, 1024); } resultPtr = Tcl_NewStringObj(buffer, len); return resultPtr; }