Back to index

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

Go to the source code of this file.

Functions

SECStatus NSS_CMSArray_SortByDER (void **objs, const SEC_ASN1Template *objtemplate, void **objs2)
int NSS_CMSUtil_DERCompare (void *a, void *b)
int NSS_CMSAlgArray_GetIndexByAlgID (SECAlgorithmID **algorithmArray, SECAlgorithmID *algid)
int NSS_CMSAlgArray_GetIndexByAlgTag (SECAlgorithmID **algorithmArray, SECOidTag algtag)
const SECHashObject * NSS_CMSUtil_GetHashObjByAlgID (SECAlgorithmID *algid)
SECOidTag NSS_CMSUtil_MakeSignatureAlgorithm (SECOidTag hashalg, SECOidTag encalg)
const SEC_ASN1TemplateNSS_CMSUtil_GetTemplateByTypeTag (SECOidTag type)
size_t NSS_CMSUtil_GetSizeByTypeTag (SECOidTag type)
NSSCMSContentInfo * NSS_CMSContent_GetContentInfo (void *msg, SECOidTag type)
const char * NSS_CMSUtil_VerificationStatusToString (NSSCMSVerificationStatus vs)
SECStatus NSS_CMSDEREncode (NSSCMSMessage *cmsg, SECItem *input, SECItem *derOut, PLArenaPool *arena)

Function Documentation

int NSS_CMSAlgArray_GetIndexByAlgID ( SECAlgorithmID **  algorithmArray,
SECAlgorithmID *  algid 
)

Definition at line 155 of file cmsutil.c.

{
    int i;

    if (algorithmArray == NULL || algorithmArray[0] == NULL)
       return -1;

    for (i = 0; algorithmArray[i] != NULL; i++) {
       if (SECOID_CompareAlgorithmID(algorithmArray[i], algid) == SECEqual)
           break;    /* bingo */
    }

    if (algorithmArray[i] == NULL)
       return -1;    /* not found */

    return i;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int NSS_CMSAlgArray_GetIndexByAlgTag ( SECAlgorithmID **  algorithmArray,
SECOidTag  algtag 
)

Definition at line 185 of file cmsutil.c.

{
    SECOidData *algid;
    int i = -1;

    if (algorithmArray == NULL || algorithmArray[0] == NULL)
       return i;

#ifdef ORDER_N_SQUARED
    for (i = 0; algorithmArray[i] != NULL; i++) {
       algid = SECOID_FindOID(&(algorithmArray[i]->algorithm));
       if (algid->offset == algtag)
           break;    /* bingo */
    }
#else
    algid = SECOID_FindOIDByTag(algtag);
    if (!algid) 
       return i;
    for (i = 0; algorithmArray[i] != NULL; i++) {
       if (SECITEM_ItemsAreEqual(&algorithmArray[i]->algorithm, &algid->oid))
           break;    /* bingo */
    }
#endif

    if (algorithmArray[i] == NULL)
       return -1;    /* not found */

    return i;
}

Here is the call graph for this function:

Here is the caller graph for this function:

SECStatus NSS_CMSArray_SortByDER ( void **  objs,
const SEC_ASN1Template objtemplate,
void **  objs2 
)

Definition at line 65 of file cmsutil.c.

{
    PRArenaPool *poolp;
    int num_objs;
    SECItem **enc_objs;
    SECStatus rv = SECFailure;
    int i;

    if (objs == NULL)                                   /* already sorted */
       return SECSuccess;

    num_objs = NSS_CMSArray_Count((void **)objs);
    if (num_objs == 0 || num_objs == 1)          /* already sorted. */
       return SECSuccess;

    poolp = PORT_NewArena (1024);  /* arena for temporaries */
    if (poolp == NULL)
       return SECFailure;          /* no memory; nothing we can do... */

    /*
     * Allocate arrays to hold the individual encodings which we will use
     * for comparisons and the reordered attributes as they are sorted.
     */
    enc_objs = (SECItem **)PORT_ArenaZAlloc(poolp, (num_objs + 1) * sizeof(SECItem *));
    if (enc_objs == NULL)
       goto loser;

    /* DER encode each individual object. */
    for (i = 0; i < num_objs; i++) {
       enc_objs[i] = SEC_ASN1EncodeItem(poolp, NULL, objs[i], objtemplate);
       if (enc_objs[i] == NULL)
           goto loser;
    }
    enc_objs[num_objs] = NULL;

    /* now compare and sort objs by the order of enc_objs */
    NSS_CMSArray_Sort((void **)enc_objs, NSS_CMSUtil_DERCompare, objs, objs2);

    rv = SECSuccess;

loser:
    PORT_FreeArena (poolp, PR_FALSE);
    return rv;
}

Here is the call graph for this function:

Here is the caller graph for this function:

NSSCMSContentInfo* NSS_CMSContent_GetContentInfo ( void msg,
SECOidTag  type 
)

Definition at line 336 of file cmsutil.c.

{
    NSSCMSContent c;
    NSSCMSContentInfo *cinfo = NULL;

    if (!msg)
       return cinfo;
    c.pointer = msg;
    switch (type) {
    case SEC_OID_PKCS7_SIGNED_DATA:
       cinfo = &(c.signedData->contentInfo);
       break;
    case SEC_OID_PKCS7_ENVELOPED_DATA:
       cinfo = &(c.envelopedData->contentInfo);
       break;
    case SEC_OID_PKCS7_ENCRYPTED_DATA:
       cinfo = &(c.encryptedData->contentInfo);
       break;
    case SEC_OID_PKCS7_DIGESTED_DATA:
       cinfo = &(c.digestedData->contentInfo);
       break;
    default:
       cinfo = NULL;
    }
    return cinfo;
}

Here is the caller graph for this function:

SECStatus NSS_CMSDEREncode ( NSSCMSMessage *  cmsg,
SECItem *  input,
SECItem *  derOut,
PLArenaPool arena 
)

Definition at line 382 of file cmsutil.c.

{
    NSSCMSEncoderContext *ecx;
    SECStatus rv = SECSuccess;
    if (!cmsg || !derOut || !arena) {
       PORT_SetError(SEC_ERROR_INVALID_ARGS);
       return SECFailure;
    }
    ecx = NSS_CMSEncoder_Start(cmsg, 0, 0, derOut, arena, 0, 0, 0, 0, 0, 0);
    if (!ecx) {
       PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
       return SECFailure;
    }
    if (input) {
       rv = NSS_CMSEncoder_Update(ecx, (const char*)input->data, input->len);
       if (rv) {
           PORT_SetError(SEC_ERROR_BAD_DATA);
       }
    }
    rv |= NSS_CMSEncoder_Finish(ecx);
    if (rv) {
       PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
    }
    return rv;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int NSS_CMSUtil_DERCompare ( void a,
void b 
)

Definition at line 115 of file cmsutil.c.

{
    SECItem *der1 = (SECItem *)a;
    SECItem *der2 = (SECItem *)b;
    unsigned int j;

    /*
     * Find the lowest (lexigraphically) encoding.  One that is
     * shorter than all the rest is known to be "less" because each
     * attribute is of the same type (a SEQUENCE) and so thus the
     * first octet of each is the same, and the second octet is
     * the length (or the length of the length with the high bit
     * set, followed by the length, which also works out to always
     * order the shorter first).  Two (or more) that have the
     * same length need to be compared byte by byte until a mismatch
     * is found.
     */
    if (der1->len != der2->len)
       return (der1->len < der2->len) ? -1 : 1;

    for (j = 0; j < der1->len; j++) {
       if (der1->data[j] == der2->data[j])
           continue;
       return (der1->data[j] < der2->data[j]) ? -1 : 1;
    }
    return 0;
}

Here is the caller graph for this function:

const SECHashObject* NSS_CMSUtil_GetHashObjByAlgID ( SECAlgorithmID *  algid)

Definition at line 217 of file cmsutil.c.

{
    SECOidTag oidTag = SECOID_FindOIDTag(&(algid->algorithm));
    const SECHashObject *digobj = HASH_GetHashObjectByOidTag(oidTag);

    return digobj;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 310 of file cmsutil.c.

{
    size_t size;

    switch (type) {
    case SEC_OID_PKCS7_SIGNED_DATA:
       size = sizeof(NSSCMSSignedData);
       break;
    case SEC_OID_PKCS7_ENVELOPED_DATA:
       size = sizeof(NSSCMSEnvelopedData);
       break;
    case SEC_OID_PKCS7_ENCRYPTED_DATA:
       size = sizeof(NSSCMSEncryptedData);
       break;
    case SEC_OID_PKCS7_DIGESTED_DATA:
       size = sizeof(NSSCMSDigestedData);
       break;
    default:
    case SEC_OID_PKCS7_DATA:
       size = 0;
       break;
    }
    return size;
}

Here is the caller graph for this function:

Definition at line 280 of file cmsutil.c.

Here is the caller graph for this function:

Definition at line 364 of file cmsutil.c.

{
    switch (vs) {
    case NSSCMSVS_Unverified:                    return "Unverified";
    case NSSCMSVS_GoodSignature:          return "GoodSignature";
    case NSSCMSVS_BadSignature:                  return "BadSignature";
    case NSSCMSVS_DigestMismatch:         return "DigestMismatch";
    case NSSCMSVS_SigningCertNotFound:           return "SigningCertNotFound";
    case NSSCMSVS_SigningCertNotTrusted:  return "SigningCertNotTrusted";
    case NSSCMSVS_SignatureAlgorithmUnknown:     return "SignatureAlgorithmUnknown";
    case NSSCMSVS_SignatureAlgorithmUnsupported: return "SignatureAlgorithmUnsupported";
    case NSSCMSVS_MalformedSignature:            return "MalformedSignature";
    case NSSCMSVS_ProcessingError:        return "ProcessingError";
    default:                              return "Unknown";
    }
}

Here is the caller graph for this function: