24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
+
|
#define BUFFER_SIZE 65536
#define CHAN_EOF 0x10
#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
/*
* This structure defines the per-instance state of a digest operation.
*/
|
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
|
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
|
+
-
+
+
+
+
+
+
|
int Tls_DigestFinialize(Tcl_Interp *interp, DigestState *statePtr, Tcl_Obj **resultObj) {
unsigned char md_buf[EVP_MAX_MD_SIZE];
unsigned int md_len;
int res = 0;
/* Finalize hash function and calculate message digest */
if (statePtr->format & 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, &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;
}
if (!res) {
|
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
|
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
|
-
+
|
*
* Callback to clean-up when digest instance command is deleted.
*
* Returns:
* Nothing
*
* Side effects:
* Destroys struct
* Destroys state info structure
*
*-------------------------------------------------------------------
*/
void InstanceDelCallback(ClientData clientData) {
DigestState *statePtr = (DigestState *) clientData;
/* Clean-up */
|
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
|
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
|
+
+
|
/* Get digest */
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;
}
/* Get key */
|