char *shName = freebl_GetLibraryFilePathname(name, addr);
char *shName = PR_GetLibraryFilePathname(name, addr);
BLAPI_SHVerify(const char *name, PRFuncPtr addr){    /* find our shared library name */    char *shName = freebl_GetLibraryFilePathname(name, addr);    char *checkName = NULL;    PRFileDesc *checkFD = NULL;    PRFileDesc *shFD = NULL;    SHA1Context *hashcx = NULL;    SECItem signature = { 0, NULL, 0 };    SECItem hash;    int bytesRead, offset;    SECStatus rv;    DSAPublicKey key;    int count;    PRBool result = PR_FALSE; /* if anything goes wrong,			       * the signature does not verify */    unsigned char buf[512];    unsigned char hashBuf[SHA1_LENGTH];    PORT_Memset(&key,0,sizeof(key));    hash.data = hashBuf;    hash.len = sizeof(hashBuf);    if (!shName) {	goto loser;    }    /* figure out the name of our check file */    checkName = mkCheckFileName(shName);    if (!checkName) {	goto loser;    }    /* open the check File */    checkFD = PR_Open(checkName, PR_RDONLY, 0);    if (checkFD == NULL) {	goto loser;    }    /* read and Verify the headerthe header */    bytesRead = PR_Read(checkFD, buf, 12);    if (bytesRead != 12) {	goto loser;    }    if ((buf[0] != NSS_SIGN_CHK_MAGIC1) || (buf[1] != NSS_SIGN_CHK_MAGIC2)) {	goto loser;    }    if ((buf[2] != NSS_SIGN_CHK_MAJOR_VERSION) || 				(buf[3] < NSS_SIGN_CHK_MINOR_VERSION)) {	goto loser;    }#ifdef notdef    if (decodeInt(&buf[8]) != CKK_DSA) {	goto loser;    }#endif    /* seek past any future header extensions */    offset = decodeInt(&buf[4]);    PR_Seek(checkFD, offset, PR_SEEK_SET);    /* read the key */    rv = readItem(checkFD,&key.params.prime);    if (rv != SECSuccess) {	goto loser;    }    rv = readItem(checkFD,&key.params.subPrime);    if (rv != SECSuccess) {	goto loser;    }    rv = readItem(checkFD,&key.params.base);    if (rv != SECSuccess) {	goto loser;    }    rv = readItem(checkFD,&key.publicValue);    if (rv != SECSuccess) {	goto loser;    }    /* read the siganture */    rv = readItem(checkFD,&signature);    if (rv != SECSuccess) {	goto loser;    }    /* done with the check file */    PR_Close(checkFD);    checkFD = NULL;    /* open our library file */    shFD = PR_Open(shName, PR_RDONLY, 0);    if (shFD == NULL) {	goto loser;    }    /* hash our library file with SHA1 */    hashcx = SHA1_NewContext();    if (hashcx == NULL) {	goto loser;    }    SHA1_Begin(hashcx);    count = 0;    while ((bytesRead = PR_Read(shFD, buf, sizeof(buf))) > 0) {	SHA1_Update(hashcx, buf, bytesRead);	count += bytesRead;    }    PR_Close(shFD);    shFD = NULL;    SHA1_End(hashcx, hash.data, &hash.len, hash.len);    /* verify the hash against the check file */    if (DSA_VerifyDigest(&key, &signature, &hash) == SECSuccess) {	result = PR_TRUE;    }#ifdef DEBUG_SHVERIFY  {        int i,j;        fprintf(stderr,"File %s: %d bytes\n",shName, count);        fprintf(stderr,"  hash: %d bytes\n", hash.len);#define STEP 10        for (i=0; i < hash.len; i += STEP) {           fprintf(stderr,"   ");           for (j=0; j < STEP && (i+j) < hash.len; j++) {                fprintf(stderr," %02x", hash.data[i+j]);           }           fprintf(stderr,"\n");        }        fprintf(stderr,"  signature: %d bytes\n", signature.len);        for (i=0; i < signature.len; i += STEP) {           fprintf(stderr,"   ");           for (j=0; j < STEP && (i+j) < signature.len; j++) {                fprintf(stderr," %02x", signature.data[i+j]);           }           fprintf(stderr,"\n");        }	fprintf(stderr,"Verified : %s\n",result?"TRUE": "FALSE");    }#endif /* DEBUG_SHVERIFY */loser:    if (shName != NULL) {	PR_Free(shName);    }    if (checkName != NULL) {	PORT_Free(checkName);    }    if (checkFD != NULL) {	PR_Close(checkFD);    }    if (shFD != NULL) {	PR_Close(shFD);    }    if (hashcx != NULL) {	SHA1_DestroyContext(hashcx,PR_TRUE);    }    if (signature.data != NULL) {	PORT_Free(signature.data);    }    if (key.params.prime.data != NULL) {	PORT_Free(key.params.prime.data);    }    if (key.params.subPrime.data != NULL) {	PORT_Free(key.params.subPrime.data);    }    if (key.params.base.data != NULL) {	PORT_Free(key.params.base.data);    }    if (key.publicValue.data != NULL) {	PORT_Free(key.publicValue.data);    }    return result;}