Back to index

lightning-sunbird  0.9+nobinonly
Functions | Variables
xcrldist.c File Reference
#include "genname.h"
#include "certt.h"
#include "secerr.h"

Go to the source code of this file.

Functions

void PrepareBitStringForEncoding (SECItem *bitMap, SECItem *value)
SECStatus CERT_EncodeCRLDistributionPoints (PRArenaPool *arena, CERTCrlDistributionPoints *value, SECItem *derValue)
CERTCrlDistributionPoints * CERT_DecodeCRLDistributionPoints (PRArenaPool *arena, SECItem *encodedValue)

Variables

static const SEC_ASN1Template FullNameTemplate []
static const SEC_ASN1Template RelativeNameTemplate []
static const SEC_ASN1Template CRLDistributionPointTemplate []
const SEC_ASN1Template CERTCRLDistributionPointsTemplate []

Function Documentation

CERTCrlDistributionPoints* CERT_DecodeCRLDistributionPoints ( PRArenaPool arena,
SECItem *  encodedValue 
)

Definition at line 147 of file xcrldist.c.

{
   CERTCrlDistributionPoints *value = NULL;    
   CRLDistributionPoint **pointList, *point;    
   SECStatus rv;
   SECItem newEncodedValue;

   PORT_Assert (arena);
   do {
       value = (CERTCrlDistributionPoints*)PORT_ArenaZAlloc (arena, sizeof (*value));
       if (value == NULL) {
           rv = SECFailure;
           break;
       }

        /* copy the DER into the arena, since Quick DER returns data that points
           into the DER input, which may get freed by the caller */
        rv = SECITEM_CopyItem(arena, &newEncodedValue, encodedValue);
        if ( rv != SECSuccess ) {
           break;
        }

       rv = SEC_QuickDERDecodeItem
            (arena, &value->distPoints, CERTCRLDistributionPointsTemplate,
             &newEncodedValue);
       if (rv != SECSuccess)
           break;

       pointList = value->distPoints;
       while (*pointList) {
           point = *pointList;

           /* get the data if the distributionPointName is not omitted */
           if (point->derDistPoint.data != NULL) {
              point->distPointType = (DistributionPointTypes)
                                   ((point->derDistPoint.data[0] & 0x1f) +1);
              if (point->distPointType == generalName) {
                  SECItem innerDER;
              
                  innerDER.data = NULL;
                  rv = SEC_QuickDERDecodeItem
                      (arena, point, FullNameTemplate, &(point->derDistPoint));
                  if (rv != SECSuccess)
                     break;
                  point->distPoint.fullName = cert_DecodeGeneralNames
                     (arena, point->derFullName);

                  if (!point->distPoint.fullName)
                     break;
              }
              else if ( relativeDistinguishedName) {
                  rv = SEC_QuickDERDecodeItem
                      (arena, point, RelativeNameTemplate, &(point->derDistPoint));
                  if (rv != SECSuccess)
                     break;
              }
              else {
                  PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
                  break;
              }
           }

           /* Get the reason code if it's not omitted in the encoding */
           if (point->bitsmap.data != NULL) {
              point->reasons.data = (unsigned char*) PORT_ArenaAlloc
                                  (arena, (point->bitsmap.len + 7) >> 3);
              if (!point->reasons.data) {
                  rv = SECFailure;
                  break;
              }
              PORT_Memcpy (point->reasons.data, point->bitsmap.data,
                          point->reasons.len = ((point->bitsmap.len + 7) >> 3));
           }

           /* Get the crl issuer name if it's not omitted in the encoding */
           if (point->derCrlIssuer != NULL) {
              point->crlIssuer = cert_DecodeGeneralNames
                  (arena, point->derCrlIssuer);

              if (!point->crlIssuer)
                  break;
           }
           ++pointList;
       }
   } while (0);
   return (rv == SECSuccess ? value : NULL);
}
SECStatus CERT_EncodeCRLDistributionPoints ( PRArenaPool arena,
CERTCrlDistributionPoints *  value,
SECItem *  derValue 
)

Definition at line 74 of file xcrldist.c.

{
    CRLDistributionPoint **pointList, *point;
    PRArenaPool *ourPool = NULL;
    SECStatus rv = SECSuccess;

    PORT_Assert (derValue);
    PORT_Assert (value && value->distPoints);

    do {
       ourPool = PORT_NewArena (SEC_ASN1_DEFAULT_ARENA_SIZE);
       if (ourPool == NULL) {
           rv = SECFailure;
           break;
       }    
       
       pointList = value->distPoints;
       while (*pointList) {
           point = *pointList;
           point->derFullName = NULL;
           point->derDistPoint.data = NULL;

           if (point->distPointType == generalName) {
              point->derFullName = cert_EncodeGeneralNames
                  (ourPool, point->distPoint.fullName);
              
              if (point->derFullName) {
                  rv = (SEC_ASN1EncodeItem (ourPool, &point->derDistPoint,
                       point, FullNameTemplate) == NULL) ? SECFailure : SECSuccess;
              } else {
                  rv = SECFailure;
              }
           }
           else if (point->distPointType == relativeDistinguishedName) {
              if (SEC_ASN1EncodeItem
                   (ourPool, &point->derDistPoint, 
                    point, RelativeNameTemplate) == NULL) 
                  rv = SECFailure;
           }
           /* distributionPointName is omitted */
           else if (point->distPointType != 0) {
              PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID);
              rv = SECFailure;
           }
           if (rv != SECSuccess)
              break;

           if (point->reasons.data)
              PrepareBitStringForEncoding (&point->bitsmap, &point->reasons);

           if (point->crlIssuer) {
              point->derCrlIssuer = cert_EncodeGeneralNames
                  (ourPool, point->crlIssuer);
              if (!point->crlIssuer)
                  break;
           }
           
           ++pointList;
       }
       if (rv != SECSuccess)
           break;
       if (SEC_ASN1EncodeItem
            (arena, derValue, value, CERTCRLDistributionPointsTemplate) == NULL) {
           rv = SECFailure;
           break;
       }
    } while (0);
    PORT_FreeArena (ourPool, PR_FALSE);
    return (rv);
}
void PrepareBitStringForEncoding ( SECItem *  bitMap,
SECItem *  value 
)

Definition at line 279 of file certxutl.c.

{
  unsigned char onebyte;
  unsigned int i, len = 0;

  /* to prevent warning on some platform at compile time */ 
  onebyte = '\0';   
  /* Get the position of the right-most turn-on bit */ 
  for (i = 0; i < (value->len ) * 8; ++i) {
      if (i % 8 == 0)
         onebyte = value->data[i/8];
      if (onebyte & 0x80)
         len = i;            
      onebyte <<= 1;
      
  }
  bitsmap->data = value->data;
  /* Add one here since we work with base 1 */ 
  bitsmap->len = len + 1;
}

Variable Documentation

Initial value:

Definition at line 69 of file xcrldist.c.

Initial value:
 {
    { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CRLDistributionPoint) },
       { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC |
           SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT | 0,
           offsetof(CRLDistributionPoint,derDistPoint), SEC_AnyTemplate},
       { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | 1,
           offsetof(CRLDistributionPoint,bitsmap), SEC_BitStringTemplate},
       { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC |
           SEC_ASN1_CONSTRUCTED | 2,
           offsetof(CRLDistributionPoint, derCrlIssuer), CERT_GeneralNamesTemplate},
    { 0 }
}

Definition at line 56 of file xcrldist.c.

Initial value:
 {
    {SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_CONSTRUCTED | 0,
       offsetof (CRLDistributionPoint,derFullName), CERT_GeneralNamesTemplate}
}

Definition at line 46 of file xcrldist.c.

Initial value:
 {
    {SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_CONSTRUCTED | 1, 
       offsetof (CRLDistributionPoint,distPoint.relativeName), CERT_RDNTemplate}
}

Definition at line 51 of file xcrldist.c.