Index: nss/lib/certhigh/ocspsig.c |
=================================================================== |
--- nss/lib/certhigh/ocspsig.c (revision 195639) |
+++ nss/lib/certhigh/ocspsig.c (working copy) |
@@ -355,6 +355,8 @@ |
return ocsp_CreateSingleResponse(arena, id, cs, thisUpdate, nextUpdate); |
} |
+/* responderCert == 0 means: |
+ * create a response with an invalid signature (for testing purposes) */ |
SECItem* |
CERT_CreateEncodedOCSPSuccessResponse( |
PLArenaPool *arena, |
@@ -377,7 +379,7 @@ |
SECKEYPrivateKey *privKey = NULL; |
SECItem *result = NULL; |
- if (!arena || !responderCert || !responses) { |
+ if (!arena || !responses) { |
PORT_SetError(SEC_ERROR_INVALID_ARGS); |
return NULL; |
} |
@@ -414,58 +416,106 @@ |
if (DER_TimeToGeneralizedTimeArena(tmpArena, &rd->producedAt, producedAt) |
!= SECSuccess) |
goto done; |
- rid->responderIDType = responderIDType; |
- if (responderIDType == ocspResponderID_byName) { |
- responderIDTemplate = ocsp_ResponderIDByNameTemplate; |
- if (CERT_CopyName(tmpArena, &rid->responderIDValue.name, |
- &responderCert->subject) != SECSuccess) |
- goto done; |
+ |
+ if (!responderCert) { |
+ /* use invalid signature for testing purposes */ |
+ unsigned char dummyChar = 'd'; |
+ SECItem dummy; |
+ |
+ dummy.len = 1; |
+ dummy.data = &dummyChar; |
+ |
+ /* it's easier to produdce a keyHash out of nowhere, |
+ * than to produce an encoded subject, |
+ * so for our dummy response we always use byKey |
+ */ |
+ |
+ rid->responderIDType = ocspResponderID_byKey; |
+ if (!ocsp_DigestValue(tmpArena, SEC_OID_SHA1, &rid->responderIDValue.keyHash, |
+ &dummy)) |
+ goto done; |
+ |
+ if (!SEC_ASN1EncodeItem(tmpArena, &rd->derResponderID, rid, |
+ ocsp_ResponderIDByKeyTemplate)) |
+ goto done; |
+ |
+ br->tbsResponseData = rd; |
+ |
+ if (!SEC_ASN1EncodeItem(tmpArena, &br->tbsResponseDataDER, br->tbsResponseData, |
+ ocsp_myResponseDataTemplate)) |
+ goto done; |
+ |
+ br->responseSignature.derCerts = PORT_ArenaNewArray(tmpArena, SECItem*, 1); |
+ if (!br->responseSignature.derCerts) |
+ goto done; |
+ br->responseSignature.derCerts[0] = NULL; |
+ |
+ algID = SEC_GetSignatureAlgorithmOidTag(rsaKey, SEC_OID_SHA1); |
+ if (algID == SEC_OID_UNKNOWN) |
+ goto done; |
+ |
+ /* match the regular signature code, which doesn't use the arena */ |
+ if (!SECITEM_AllocItem(NULL, &br->responseSignature.signature, 1)) |
+ goto done; |
+ PORT_Memcpy(br->responseSignature.signature.data, &dummyChar, 1); |
+ |
+ /* convert len-in-bytes to len-in-bits */ |
+ br->responseSignature.signature.len = br->responseSignature.signature.len << 3; |
} |
else { |
- responderIDTemplate = ocsp_ResponderIDByKeyTemplate; |
- if (!CERT_GetSPKIDigest(tmpArena, responderCert, SEC_OID_SHA1, |
- &rid->responderIDValue.keyHash)) |
- goto done; |
- } |
+ rid->responderIDType = responderIDType; |
+ if (responderIDType == ocspResponderID_byName) { |
+ responderIDTemplate = ocsp_ResponderIDByNameTemplate; |
+ if (CERT_CopyName(tmpArena, &rid->responderIDValue.name, |
+ &responderCert->subject) != SECSuccess) |
+ goto done; |
+ } |
+ else { |
+ responderIDTemplate = ocsp_ResponderIDByKeyTemplate; |
+ if (!CERT_GetSPKIDigest(tmpArena, responderCert, SEC_OID_SHA1, |
+ &rid->responderIDValue.keyHash)) |
+ goto done; |
+ } |
- if (!SEC_ASN1EncodeItem(tmpArena, &rd->derResponderID, rid, |
- responderIDTemplate)) |
- goto done; |
+ if (!SEC_ASN1EncodeItem(tmpArena, &rd->derResponderID, rid, |
+ responderIDTemplate)) |
+ goto done; |
- br->tbsResponseData = rd; |
- |
- if (!SEC_ASN1EncodeItem(tmpArena, &br->tbsResponseDataDER, br->tbsResponseData, |
- ocsp_myResponseDataTemplate)) |
- goto done; |
+ br->tbsResponseData = rd; |
- br->responseSignature.derCerts = PORT_ArenaNewArray(tmpArena, SECItem*, 1); |
- if (!br->responseSignature.derCerts) |
- goto done; |
- br->responseSignature.derCerts[0] = NULL; |
+ if (!SEC_ASN1EncodeItem(tmpArena, &br->tbsResponseDataDER, br->tbsResponseData, |
+ ocsp_myResponseDataTemplate)) |
+ goto done; |
- privKey = PK11_FindKeyByAnyCert(responderCert, wincx); |
- if (!privKey) |
- goto done; |
+ br->responseSignature.derCerts = PORT_ArenaNewArray(tmpArena, SECItem*, 1); |
+ if (!br->responseSignature.derCerts) |
+ goto done; |
+ br->responseSignature.derCerts[0] = NULL; |
- algID = SEC_GetSignatureAlgorithmOidTag(privKey->keyType, SEC_OID_SHA1); |
- if (algID == SEC_OID_UNKNOWN) |
- goto done; |
+ privKey = PK11_FindKeyByAnyCert(responderCert, wincx); |
+ if (!privKey) |
+ goto done; |
- if (SEC_SignData(&br->responseSignature.signature, |
- br->tbsResponseDataDER.data, br->tbsResponseDataDER.len, |
- privKey, algID) |
- != SECSuccess) |
- goto done; |
+ algID = SEC_GetSignatureAlgorithmOidTag(privKey->keyType, SEC_OID_SHA1); |
+ if (algID == SEC_OID_UNKNOWN) |
+ goto done; |
- /* convert len-in-bytes to len-in-bits */ |
- br->responseSignature.signature.len = br->responseSignature.signature.len << 3; |
+ if (SEC_SignData(&br->responseSignature.signature, |
+ br->tbsResponseDataDER.data, br->tbsResponseDataDER.len, |
+ privKey, algID) |
+ != SECSuccess) |
+ goto done; |
- /* br->responseSignature.signature wasn't allocated from arena, |
- * we must free it when done. */ |
+ /* convert len-in-bytes to len-in-bits */ |
+ br->responseSignature.signature.len = br->responseSignature.signature.len << 3; |
+ /* br->responseSignature.signature wasn't allocated from arena, |
+ * we must free it when done. */ |
+ } |
+ |
if (SECOID_SetAlgorithmID(tmpArena, &br->responseSignature.signatureAlgorithm, algID, 0) |
- != SECSuccess) |
- goto done; |
+ != SECSuccess) |
+ goto done; |
if (!SEC_ASN1EncodeItem(tmpArena, &rb->response, br, |
ocsp_EncodeBasicOCSPResponseTemplate)) |