/* User must call after all calls to matrixX509ParseCert (we violate the coding standard a bit here for clarity) */ void matrixX509FreeCert(sslRsaCert_t *cert) { sslRsaCert_t *curr, *next; sslSubjectAltName_t *active, *inc; curr = cert; while (curr) { psFreeDNStruct(&curr->issuer); psFreeDNStruct(&curr->subject); if (curr->serialNumber) psFree(curr->serialNumber); if (curr->notBefore) psFree(curr->notBefore); if (curr->notAfter) psFree(curr->notAfter); if (curr->publicKey.N.dp) mp_clear(&(curr->publicKey.N)); if (curr->publicKey.e.dp) mp_clear(&(curr->publicKey.e)); if (curr->signature) psFree(curr->signature); if (curr->uniqueUserId) psFree(curr->uniqueUserId); if (curr->uniqueSubjectId) psFree(curr->uniqueSubjectId); if (curr->extensions.san) { active = curr->extensions.san; while (active != NULL) { inc = active->next; psFree(active->data); psFree(active); active = inc; } } #ifdef USE_FULL_CERT_PARSE if (curr->extensions.keyUsage) psFree(curr->extensions.keyUsage); if (curr->extensions.sk.id) psFree(curr->extensions.sk.id); if (curr->extensions.ak.keyId) psFree(curr->extensions.ak.keyId); if (curr->extensions.ak.serialNum) psFree(curr->extensions.ak.serialNum); if (curr->extensions.ak.attribs.commonName) psFree(curr->extensions.ak.attribs.commonName); if (curr->extensions.ak.attribs.country) psFree(curr->extensions.ak.attribs.country); if (curr->extensions.ak.attribs.state) psFree(curr->extensions.ak.attribs.state); if (curr->extensions.ak.attribs.locality) psFree(curr->extensions.ak.attribs.locality); if (curr->extensions.ak.attribs.organization) psFree(curr->extensions.ak.attribs.organization); if (curr->extensions.ak.attribs.orgUnit) psFree(curr->extensions.ak.attribs.orgUnit); #endif /* SSL_FULL_CERT_PARSE */ next = curr->next; psFree(curr); curr = next; } }
/* User must call after all calls to matrixX509ParseCert (we violate the coding standard a bit here for clarity) */ void matrixX509FreeCert(sslRsaCert_t *cert) { sslRsaCert_t *curr, *next; curr = cert; while (curr) { psFreeDNStruct(&curr->issuer); psFreeDNStruct(&curr->subject); if (curr->serialNumber) psFree(curr->serialNumber); if (curr->notBefore) psFree(curr->notBefore); if (curr->notAfter) psFree(curr->notAfter); if (curr->publicKey.N.dp) mp_clear(&(curr->publicKey.N)); if (curr->publicKey.e.dp) mp_clear(&(curr->publicKey.e)); if (curr->signature) psFree(curr->signature); if (curr->uniqueUserId) psFree(curr->uniqueUserId); if (curr->uniqueSubjectId) psFree(curr->uniqueSubjectId); if (curr->extensions.san.dns) psFree(curr->extensions.san.dns); if (curr->extensions.san.uri) psFree(curr->extensions.san.uri); if (curr->extensions.san.email) psFree(curr->extensions.san.email); #ifdef USE_FULL_CERT_PARSE if (curr->extensions.sk.id) psFree(curr->extensions.sk.id); if (curr->extensions.ak.keyId) psFree(curr->extensions.ak.keyId); if (curr->extensions.ak.serialNum) psFree(curr->extensions.ak.serialNum); if (curr->extensions.ak.attribs.commonName) psFree(curr->extensions.ak.attribs.commonName); if (curr->extensions.ak.attribs.country) psFree(curr->extensions.ak.attribs.country); if (curr->extensions.ak.attribs.state) psFree(curr->extensions.ak.attribs.state); if (curr->extensions.ak.attribs.locality) psFree(curr->extensions.ak.attribs.locality); if (curr->extensions.ak.attribs.organization) psFree(curr->extensions.ak.attribs.organization); if (curr->extensions.ak.attribs.orgUnit) psFree(curr->extensions.ak.attribs.orgUnit); #endif /* SSL_FULL_CERT_PARSE */ next = curr->next; psFree(curr); curr = next; } }