Back to index

lightning-sunbird  0.9+nobinonly
Functions
cmsreclist.c File Reference
#include "cmslocal.h"
#include "cert.h"
#include "key.h"
#include "secasn1.h"
#include "secitem.h"
#include "secoid.h"
#include "pk11func.h"
#include "prtime.h"
#include "secerr.h"

Go to the source code of this file.

Functions

static int nss_cms_recipients_traverse (NSSCMSRecipientInfo **recipientinfos, NSSCMSRecipient **recipient_list)
NSSCMSRecipient ** nss_cms_recipient_list_create (NSSCMSRecipientInfo **recipientinfos)
void nss_cms_recipient_list_destroy (NSSCMSRecipient **recipient_list)
NSSCMSRecipientEncryptedKey * NSS_CMSRecipientEncryptedKey_Create (PLArenaPool *poolp)

Function Documentation

NSSCMSRecipient** nss_cms_recipient_list_create ( NSSCMSRecipientInfo **  recipientinfos)

Definition at line 147 of file cmsreclist.c.

{
    int count, rv;
    NSSCMSRecipient **recipient_list;

    /* count the number of recipient identifiers */
    count = nss_cms_recipients_traverse(recipientinfos, NULL);
    if (count <= 0) {
       /* no recipients? */
       PORT_SetError(SEC_ERROR_BAD_DATA);
#if 0
       PORT_SetErrorString("Cannot find recipient data in envelope.");
#endif
       return NULL;
    }

    /* allocate an array of pointers */
    recipient_list = (NSSCMSRecipient **)
                  PORT_ZAlloc((count + 1) * sizeof(NSSCMSRecipient *));
    if (recipient_list == NULL)
       return NULL;

    /* now fill in the recipient_list */
    rv = nss_cms_recipients_traverse(recipientinfos, recipient_list);
    if (rv < 0) {
       nss_cms_recipient_list_destroy(recipient_list);
       return NULL;
    }
    return recipient_list;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void nss_cms_recipient_list_destroy ( NSSCMSRecipient **  recipient_list)

Definition at line 179 of file cmsreclist.c.

{
    int i;
    NSSCMSRecipient *recipient;

    for (i=0; recipient_list[i] != NULL; i++) {
       recipient = recipient_list[i];
       if (recipient->cert)
           CERT_DestroyCertificate(recipient->cert);
       if (recipient->privkey)
           SECKEY_DestroyPrivateKey(recipient->privkey);
       if (recipient->slot)
           PK11_FreeSlot(recipient->slot);
       PORT_Free(recipient);
    }
    PORT_Free(recipient_list);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int nss_cms_recipients_traverse ( NSSCMSRecipientInfo **  recipientinfos,
NSSCMSRecipient **  recipient_list 
) [static]

Definition at line 55 of file cmsreclist.c.

{
    int count = 0;
    int rlindex = 0;
    int i, j;
    NSSCMSRecipient *rle;
    NSSCMSRecipientInfo *ri;
    NSSCMSRecipientEncryptedKey *rek;

    for (i = 0; recipientinfos[i] != NULL; i++) {
       ri = recipientinfos[i];
       switch (ri->recipientInfoType) {
       case NSSCMSRecipientInfoID_KeyTrans:
           if (recipient_list) {
              NSSCMSRecipientIdentifier *recipId =
                 &ri->ri.keyTransRecipientInfo.recipientIdentifier;

              if (recipId->identifierType != NSSCMSRecipientID_IssuerSN &&
                    recipId->identifierType != NSSCMSRecipientID_SubjectKeyID) {
                  PORT_SetError(SEC_ERROR_INVALID_ARGS);
                  return -1;
              }                
              /* alloc one & fill it out */
              rle = (NSSCMSRecipient *)PORT_ZAlloc(sizeof(NSSCMSRecipient));
              if (!rle)
                  return -1;
              
              rle->riIndex = i;
              rle->subIndex = -1;
              switch (recipId->identifierType) {
              case NSSCMSRecipientID_IssuerSN:
                  rle->kind = RLIssuerSN;
                  rle->id.issuerAndSN = recipId->id.issuerAndSN;
                  break;
              case NSSCMSRecipientID_SubjectKeyID:
                  rle->kind = RLSubjKeyID;
                  rle->id.subjectKeyID = recipId->id.subjectKeyID;
                  break;
              default: /* we never get here because of identifierType check
                            we done before. Leaving it to kill compiler warning */
                  break;
              }
              recipient_list[rlindex++] = rle;
           } else {
              count++;
           }
           break;
       case NSSCMSRecipientInfoID_KeyAgree:
           if (ri->ri.keyAgreeRecipientInfo.recipientEncryptedKeys == NULL)
              break;
           for (j=0; ri->ri.keyAgreeRecipientInfo.recipientEncryptedKeys[j] != NULL; j++) {
              if (recipient_list) {
                  rek = ri->ri.keyAgreeRecipientInfo.recipientEncryptedKeys[j];
                  /* alloc one & fill it out */
                  rle = (NSSCMSRecipient *)PORT_ZAlloc(sizeof(NSSCMSRecipient));
                  if (!rle)
                     return -1;
                  
                  rle->riIndex = i;
                  rle->subIndex = j;
                  switch (rek->recipientIdentifier.identifierType) {
                  case NSSCMSKeyAgreeRecipientID_IssuerSN:
                     rle->kind = RLIssuerSN;
                     rle->id.issuerAndSN = rek->recipientIdentifier.id.issuerAndSN;
                     break;
                  case NSSCMSKeyAgreeRecipientID_RKeyID:
                     rle->kind = RLSubjKeyID;
                     rle->id.subjectKeyID = rek->recipientIdentifier.id.recipientKeyIdentifier.subjectKeyIdentifier;
                     break;
                  }
                  recipient_list[rlindex++] = rle;
              } else {
                  count++;
              }
           }
           break;
       case NSSCMSRecipientInfoID_KEK:
           /* KEK is not implemented */
           break;
       }
    }
    /* if we have a recipient list, we return on success (-1, above, on failure) */
    /* otherwise, we return the count. */
    if (recipient_list) {
       recipient_list[rlindex] = NULL;
       return 0;
    } else {
       return count;
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

NSSCMSRecipientEncryptedKey* NSS_CMSRecipientEncryptedKey_Create ( PLArenaPool poolp)

Definition at line 198 of file cmsreclist.c.

{
    return (NSSCMSRecipientEncryptedKey *)PORT_ArenaZAlloc(poolp, sizeof(NSSCMSRecipientEncryptedKey));
}

Here is the call graph for this function:

Here is the caller graph for this function: