/* cook up a Binary key */
void BSafe::BSafeKeyInfoProvider::CssmKeyToBinary(
	CssmKey				*paramKey,		// optional, ignored
	CSSM_KEYATTR_FLAGS	&attrFlags,		// IN/OUT
	BinaryKey 			**binKey)
{
	*binKey = NULL;
	
	const CSSM_KEYHEADER *hdr = &mKey.KeyHeader;
	assert(hdr->BlobType == CSSM_KEYBLOB_RAW); 
	
	B_INFO_TYPE 		bsType;
	CSSM_KEYBLOB_FORMAT	format;
	bool 				isPub;
	
	switch(hdr->KeyClass) {
		case CSSM_KEYCLASS_PUBLIC_KEY:
			isPub = true;
			break;
		case CSSM_KEYCLASS_PRIVATE_KEY:
			isPub = false;
			break;
		default:
			// someone else's key
		CssmError::throwMe(CSSMERR_CSP_INVALID_KEY_CLASS);
	}
	if(!bsafeAlgToInfoType(hdr->AlgorithmId, isPub, bsType, format)) {
		// someone else's key
		CssmError::throwMe(CSSMERR_CSP_INVALID_ALGORITHM);
	}
	if(hdr->Format != format) {	
		dprintf0("BSafe::cssmKeyToBinary: format mismatch\n");
		CssmError::throwMe(CSSMERR_CSP_INVALID_KEY_FORMAT);
	}
		
	BSafeBinaryKey *bsBinKey = new BSafeBinaryKey(isPub,
		hdr->AlgorithmId);
		
	// set up key material as appropriate
	if(format == CSSM_KEYBLOB_RAW_FORMAT_PKCS1) {
		/* special case, decode the PKCS1 format blob */
		BS_setKeyPkcs1(mKey, bsBinKey->bsKey());
	}
	else {
		/* normal case, use key blob as is */
		BSafeItem item(mKey.KeyData);
		BSafe::check(
			B_SetKeyInfo(bsBinKey->bsKey(), bsType, POINTER(&item)), true);
	}
	*binKey = bsBinKey;
}
/* read PLN weights text file. 
Instead of reading from text file, the values can be directly coded into the structure */
void readPlnWeights(char *fname, struct PlnWeights *pln) {
        int cnt = 0;
        int n, m, k;
        
        FILE *fp = NULL;
        
        fp = fopen(fname, "r");
        if(!fp) {
            printf("Unable to open file to load PLN.\n");
            exit(0);
        }
        
        cnt = fscanf(fp, "PLN\n");
        
        cnt = fscanf(fp, "K\n%d\n", &pln->Nc);
        
        cnt = fscanf(fp, "N\n%d\n", &pln->N);

        cnt = fscanf(fp, "M\n%d\n", &pln->M);
        
        pln->distanceMeasure = mallocArray(pln->N);
        cnt = fscanf(fp, "DistanceMeasure\n");
        dprintf0("DistanceMeasure\n");
        for(n=0; n<pln->N; n++) {
            cnt = fscanf(fp, "%lf ", &pln->distanceMeasure[n]);
            dprintf("%e ", pln->distanceMeasure[n]);
        }
        dprintf0("\n");
        
        pln->inputMeans = mallocArray(pln->N);
        cnt = fscanf(fp, "InputMeans\n");
        dprintf0("InputMeans\n");
        for(n=0; n<pln->N; n++) {
            cnt = fscanf(fp, "%lf ", &pln->inputMeans[n]);
            dprintf("%e ", pln->inputMeans[n]);
        }
        dprintf0("\n");
        
        pln->inputStd = mallocArray(pln->N);
        cnt = fscanf(fp, "InputStd\n");
        dprintf0("InputStd\n");
        for(n=0; n<pln->N; n++) {
            cnt = fscanf(fp, "%lf ", &pln->inputStd[n]);
            dprintf("%e ", pln->inputStd[n]);
        }
        dprintf0("\n");
        
        pln->Nv = (int*)malloc(pln->Nc*sizeof(int));
        
        pln->clusterCenters = mallocMatrix(pln->Nc, pln->N);
        
        pln->R = (double***)malloc(pln->Nc*sizeof(double**));
        pln->C = (double***)malloc(pln->Nc*sizeof(double**));
        pln->W = (double***)malloc(pln->Nc*sizeof(double**));
        
        pln->Et = mallocMatrix(pln->Nc, pln->M);
        pln->lambda = mallocArray(pln->Nc);
        
        for(k=0; k<pln->Nc; k++) {
            int idx;
            cnt = fscanf(fp, "ClusterIndex\n%d\n", &idx);
            dprintf("Reading cluster %d\n", idx);
            if(k!=idx) {
                printf("Invalid file.\n");
                exit(0);
            }
            
            cnt = fscanf(fp, "Nv\n%d\n", &pln->Nv[k]);
            dprintf("Nv =  %d\n", pln->Nv[k]);
            
            cnt = fscanf(fp, "CenterVector\n");
            dprintf0("CenterVector\n");
            for(n=0; n<pln->N; n++) {
                cnt = fscanf(fp, "%lf ", &pln->clusterCenters[k][n]);
                dprintf("%e ", pln->clusterCenters[k][n]);
            }
            cnt = fscanf(fp, "\n");
            dprintf0("\n");
            
            pln->R[k] = mallocMatrix(pln->N+1, pln->N+1);
            dprintf0("R\n");
            cnt = fscanf(fp, "R\n");
            for(n=0; n<pln->N+1; n++) {
                for(m=0; m<pln->N+1; m++) {
                    cnt = fscanf(fp, "%lf ", &pln->R[k][n][m]);
                    dprintf("%e ", pln->R[k][n][m]);
                }
                cnt = fscanf(fp, "\n");
            }
            dprintf0("\n");
            
            pln->C[k] = mallocMatrix(pln->M, pln->N+1);
            cnt = fscanf(fp, "C\n");
            dprintf0("C\n");
            for(n=0; n<pln->M; n++) {
                for(m=0; m<pln->N+1; m++) {
                    cnt = fscanf(fp, "%lf ", &pln->C[k][n][m]);
                    dprintf("%e ", pln->C[k][n][m]);
                }
                cnt = fscanf(fp, "\n");
            }
            dprintf0("\n");
            
            pln->W[k] = mallocMatrix(pln->M, pln->N+1);
            cnt = fscanf(fp, "W\n");
            dprintf0("W\n");
            for(n=0; n<pln->M; n++) {
                for(m=0; m<pln->N+1; m++) {
                    cnt = fscanf(fp, "%lf ", &pln->W[k][n][m]);
                    dprintf("%e ", pln->W[k][n][m]);
                }
                cnt = fscanf(fp, "\n");
            }
            dprintf0("\n");
            
            cnt = fscanf(fp, "Et\n");
            dprintf0("Et\n");
            for(n=0; n<pln->M; n++) {
                cnt = fscanf(fp, "%lf ", &pln->Et[k][n]);
                dprintf("%e ", pln->Et[k][n]);
            }
            cnt = fscanf(fp, "\n");
            dprintf0("\n");
            
            cnt = fscanf(fp, "lambda\n%lf\n", &pln->lambda[k]);
            dprintf("lambda\n%lf\n", pln->lambda[k]);
        }
        
        cnt = fscanf(fp, "EOF\n");
        
        fclose(fp);
}