quarter = src_length / 4; for (i=0; i<4; i++) {
quarter = (src_length + 3)/ 4; for (i=0; i < 4 && src_length > 0; i++) {
md5_restart(unsigned char *dest, const unsigned char *src, uint32 src_length){    SECStatus rv = SECSuccess;    MD5Context *cx, *cx_cpy;    unsigned char *cxbytes;    unsigned int len;    unsigned int i, quarter;    cx = MD5_NewContext();    /* divide message by 4, restarting 3 times */    quarter = src_length / 4;    for (i=0; i<4; i++) {	MD5_Update(cx, src + i*quarter, PR_MIN(quarter, src_length));	len = MD5_FlattenSize(cx);	cxbytes = PORT_Alloc(len);	MD5_Flatten(cx, cxbytes);	cx_cpy = MD5_Resurrect(cxbytes, NULL);	if (!cx_cpy) {	    PR_fprintf(PR_STDERR, "%s: MD5_Resurrect failed!\n", progName);	    rv = SECFailure;	    goto finish;	}	rv = PORT_Memcmp(cx, cx_cpy, len);	if (rv) {	    MD5_DestroyContext(cx_cpy, PR_TRUE);	    PR_fprintf(PR_STDERR, "%s: MD5_Resurrect failed!\n", progName);	    goto finish;	}	MD5_DestroyContext(cx_cpy, PR_TRUE);	PORT_Free(cxbytes);	src_length -= quarter;    }    MD5_End(cx, dest, &len, MD5_LENGTH);finish:    MD5_DestroyContext(cx, PR_TRUE);    return rv;}