
SECStatus rv;
CERTCertificate *cert = NULL;
SECKEYPrivateKey *pvtkey = NULL;
SECItem signature = { siBuffer, NULL, 0 };
SECOidTag algTag;
int r = 1;
unsigned char buf[] = "test data to sign";
const char *cert_name;
unsigned i;

if (argc < 3) {
  fprintf(stderr, "usage: %s [cert name] [PIN]\n\n", argv[0]);
  exit(1);
}

cert_name = argv[1];
pin = argv[2];

PK11_SetPasswordFunc(passwdcb);
NSS_InitializePRErrorTable();
rv = NSS_Init(".");
if (rv != SECSuccess) {
  fprintf(stderr, "NSS initialization failed (err %d)\n", PR_GetError());
  goto cleanup;
}

cert = PK11_FindCertFromNickname(cert_name, NULL);
if (cert == NULL) {
  fprintf(stderr, "Couldn't find cert %s in NSS db (err %d: %s)\n",
	    cert_name, PR_GetError(), PORT_ErrorToString(PR_GetError()));
  goto cleanup;
}

fprintf(stderr, "Buffer being signed = \n%s\n", buf);

pvtkey = PK11_FindKeyByAnyCert(cert, NULL);
if (pvtkey == NULL) {
  fprintf(stderr, "Couldn't find private key for cert %s (err %d: %s)\n",
	    cert_name, PR_GetError(), PORT_ErrorToString(PR_GetError()));
  goto cleanup;
}

/* get the algtag. Pick the default hash algorithm */
algTag = SEC_GetSignatureAlgorithmOidTag(pvtkey->keyType, SEC_OID_UNKNOWN);

fprintf(stderr, "Signing with alg = %s (%d)\n",
	  SECOID_FindOIDTagDescription(algTag), algTag);

rv = SEC_SignData(&signature, buf, sizeof(buf)-1, pvtkey, algTag);
if (rv != SECSuccess) {
  fprintf(stderr, "sign with Private Key failed (err %d: %s)\n",
	    PR_GetError(), PORT_ErrorToString(PR_GetError()));
  goto cleanup;
}

