/* * J A R _ d i g e s t _ f i l e * * Calculates the MD5 and SHA1 digests for a file * present on disk, and returns these in JAR_Digest struct. * */ int JAR_digest_file (char *filename, JAR_Digest *dig) { JAR_FILE fp; PK11Context *md5 = 0; PK11Context *sha1 = 0; unsigned char *buf = (unsigned char *) PORT_ZAlloc (FILECHUNQ); int num; unsigned int md5_length, sha1_length; if (buf == NULL) { /* out of memory */ return JAR_ERR_MEMORY; } if ((fp = JAR_FOPEN (filename, "rb")) == 0) { /* perror (filename); FIX XXX XXX XXX XXX XXX XXX */ PORT_Free (buf); return JAR_ERR_FNF; } md5 = PK11_CreateDigestContext (SEC_OID_MD5); sha1 = PK11_CreateDigestContext (SEC_OID_SHA1); if (md5 == NULL || sha1 == NULL) { /* can't generate digest contexts */ PORT_Free (buf); JAR_FCLOSE (fp); return JAR_ERR_GENERAL; } PK11_DigestBegin (md5); PK11_DigestBegin (sha1); while (1) { if ((num = JAR_FREAD (fp, buf, FILECHUNQ)) == 0) break; PK11_DigestOp (md5, buf, num); PK11_DigestOp (sha1, buf, num); } PK11_DigestFinal (md5, dig->md5, &md5_length, MD5_LENGTH); PK11_DigestFinal (sha1, dig->sha1, &sha1_length, SHA1_LENGTH); PK11_DestroyContext (md5, PR_TRUE); PK11_DestroyContext (sha1, PR_TRUE); PORT_Free (buf); JAR_FCLOSE (fp); return 0; }
/* * J A R _ d e s t r o y */ void PR_CALLBACK JAR_destroy(JAR *jar) { PORT_Assert(jar != NULL); if (jar == NULL) return; if (jar->fp) JAR_FCLOSE((PRFileDesc *)jar->fp); if (jar->url) PORT_Free(jar->url); if (jar->filename) PORT_Free(jar->filename); if (jar->globalmeta) PORT_Free(jar->globalmeta); /* Free the linked list elements */ jar_destroy_list(jar->manifest); ZZ_DestroyList(jar->manifest); jar_destroy_list(jar->hashes); ZZ_DestroyList(jar->hashes); jar_destroy_list(jar->phy); ZZ_DestroyList(jar->phy); jar_destroy_list(jar->metainfo); ZZ_DestroyList(jar->metainfo); jar_destroy_list(jar->signers); ZZ_DestroyList(jar->signers); PORT_Free(jar); }