tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

respcli.c (3959B)


      1 /* -*- Mode: C; tab-width: 8 -*-*/
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 /*
      7 * This file will contain all routines needed by a client that has
      8 * to parse a CMMFCertRepContent structure and retirieve the appropriate
      9 * data.
     10 */
     11 
     12 #include "cmmf.h"
     13 #include "cmmfi.h"
     14 #include "crmf.h"
     15 #include "crmfi.h"
     16 #include "secitem.h"
     17 #include "secder.h"
     18 #include "secasn1.h"
     19 
     20 CMMFCertRepContent *
     21 CMMF_CreateCertRepContentFromDER(CERTCertDBHandle *db, const char *buf,
     22                                 long len)
     23 {
     24    PLArenaPool *poolp;
     25    CMMFCertRepContent *certRepContent;
     26    SECStatus rv;
     27    int i;
     28 
     29    poolp = PORT_NewArena(CRMF_DEFAULT_ARENA_SIZE);
     30    if (poolp == NULL) {
     31        return NULL;
     32    }
     33    certRepContent = PORT_ArenaZNew(poolp, CMMFCertRepContent);
     34    if (certRepContent == NULL) {
     35        goto loser;
     36    }
     37    certRepContent->poolp = poolp;
     38    rv = SEC_ASN1Decode(poolp, certRepContent, CMMFCertRepContentTemplate,
     39                        buf, len);
     40    if (rv != SECSuccess) {
     41        goto loser;
     42    }
     43    if (certRepContent->response != NULL) {
     44        for (i = 0; certRepContent->response[i] != NULL; i++) {
     45            rv = cmmf_decode_process_cert_response(poolp, db,
     46                                                   certRepContent->response[i]);
     47            if (rv != SECSuccess) {
     48                goto loser;
     49            }
     50        }
     51    }
     52    certRepContent->isDecoded = PR_TRUE;
     53    return certRepContent;
     54 loser:
     55    PORT_FreeArena(poolp, PR_FALSE);
     56    return NULL;
     57 }
     58 
     59 long
     60 CMMF_CertResponseGetCertReqId(CMMFCertResponse *inCertResp)
     61 {
     62    PORT_Assert(inCertResp != NULL);
     63    if (inCertResp == NULL) {
     64        return -1;
     65    }
     66    return DER_GetInteger(&inCertResp->certReqId);
     67 }
     68 
     69 PRBool
     70 cmmf_CertRepContentIsIndexValid(CMMFCertRepContent *inCertRepContent,
     71                                int inIndex)
     72 {
     73    int numResponses;
     74 
     75    PORT_Assert(inCertRepContent != NULL);
     76    numResponses = CMMF_CertRepContentGetNumResponses(inCertRepContent);
     77    return (PRBool)(inIndex >= 0 && inIndex < numResponses);
     78 }
     79 
     80 CMMFCertResponse *
     81 CMMF_CertRepContentGetResponseAtIndex(CMMFCertRepContent *inCertRepContent,
     82                                      int inIndex)
     83 {
     84    CMMFCertResponse *certResponse;
     85    SECStatus rv;
     86 
     87    PORT_Assert(inCertRepContent != NULL &&
     88                cmmf_CertRepContentIsIndexValid(inCertRepContent, inIndex));
     89    if (inCertRepContent == NULL ||
     90        !cmmf_CertRepContentIsIndexValid(inCertRepContent, inIndex)) {
     91        return NULL;
     92    }
     93    certResponse = PORT_ZNew(CMMFCertResponse);
     94    if (certResponse) {
     95        rv = cmmf_CopyCertResponse(NULL, certResponse,
     96                                   inCertRepContent->response[inIndex]);
     97        if (rv != SECSuccess) {
     98            CMMF_DestroyCertResponse(certResponse);
     99            certResponse = NULL;
    100        }
    101    }
    102    return certResponse;
    103 }
    104 
    105 CMMFPKIStatus
    106 CMMF_CertResponseGetPKIStatusInfoStatus(CMMFCertResponse *inCertResp)
    107 {
    108    PORT_Assert(inCertResp != NULL);
    109    if (inCertResp == NULL) {
    110        return cmmfNoPKIStatus;
    111    }
    112    return cmmf_PKIStatusInfoGetStatus(&inCertResp->status);
    113 }
    114 
    115 CERTCertificate *
    116 CMMF_CertResponseGetCertificate(CMMFCertResponse *inCertResp,
    117                                CERTCertDBHandle *inCertdb)
    118 {
    119    PORT_Assert(inCertResp != NULL);
    120    if (inCertResp == NULL || inCertResp->certifiedKeyPair == NULL) {
    121        return NULL;
    122    }
    123 
    124    return cmmf_CertOrEncCertGetCertificate(
    125        &inCertResp->certifiedKeyPair->certOrEncCert, inCertdb);
    126 }
    127 
    128 CERTCertList *
    129 CMMF_CertRepContentGetCAPubs(CMMFCertRepContent *inCertRepContent)
    130 {
    131    PORT_Assert(inCertRepContent != NULL);
    132    if (inCertRepContent == NULL || inCertRepContent->caPubs == NULL) {
    133        return NULL;
    134    }
    135    return cmmf_MakeCertList(inCertRepContent->caPubs);
    136 }