示例#1
0
/*
 *  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;
}
示例#2
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);
}