Back to index

lightning-sunbird  0.9+nobinonly
Functions | Variables
secdig.c File Reference
#include "secdig.h"
#include "secoid.h"
#include "secasn1.h"
#include "secerr.h"

Go to the source code of this file.

Functions

SECItem * SGN_EncodeDigestInfo (PRArenaPool *poolp, SECItem *dest, SGNDigestInfo *diginfo)
SGNDigestInfo * SGN_CreateDigestInfo (SECOidTag algorithm, unsigned char *sig, unsigned len)
SGNDigestInfo * SGN_DecodeDigestInfo (SECItem *didata)
void SGN_DestroyDigestInfo (SGNDigestInfo *di)
SECStatus SGN_CopyDigestInfo (PRArenaPool *poolp, SGNDigestInfo *a, SGNDigestInfo *b)
SECComparison SGN_CompareDigestInfo (SGNDigestInfo *a, SGNDigestInfo *b)

Variables

DERTemplate SGNDigestInfoTemplate []
const SEC_ASN1Template sgn_DigestInfoTemplate []

Function Documentation

SECComparison SGN_CompareDigestInfo ( SGNDigestInfo *  a,
SGNDigestInfo *  b 
)

Definition at line 231 of file secdig.c.

{
    SECComparison rv;

    /* Check signature algorithm's */
    rv = SECOID_CompareAlgorithmID(&a->digestAlgorithm, &b->digestAlgorithm);
    if (rv) return rv;

    /* Compare signature block length's */
    rv = SECITEM_CompareItem(&a->digest, &b->digest);
    return rv;
}

Here is the call graph for this function:

SECStatus SGN_CopyDigestInfo ( PRArenaPool poolp,
SGNDigestInfo *  a,
SGNDigestInfo *  b 
)

Definition at line 206 of file secdig.c.

{
    SECStatus rv;
    void *mark;

    if((poolp == NULL) || (a == NULL) || (b == NULL))
       return SECFailure;

    mark = PORT_ArenaMark(poolp);
    a->arena = poolp;
    rv = SECOID_CopyAlgorithmID(poolp, &a->digestAlgorithm, 
       &b->digestAlgorithm);
    if (rv == SECSuccess)
       rv = SECITEM_CopyItem(poolp, &a->digest, &b->digest);

    if (rv != SECSuccess) {
       PORT_ArenaRelease(poolp, mark);
    } else {
       PORT_ArenaUnmark(poolp, mark);
    }

    return rv;
}

Here is the call graph for this function:

SGNDigestInfo* SGN_CreateDigestInfo ( SECOidTag  algorithm,
unsigned char *  sig,
unsigned  len 
)

Definition at line 95 of file secdig.c.

{
    SGNDigestInfo *di;
    SECStatus rv;
    PRArenaPool *arena;
    SECItem *null_param;
    SECItem dummy_value;

    switch (algorithm) {
      case SEC_OID_MD2:
      case SEC_OID_MD5:
      case SEC_OID_SHA1:
      case SEC_OID_SHA256:
      case SEC_OID_SHA384:
      case SEC_OID_SHA512:
       break;
      default:
       PORT_SetError(SEC_ERROR_INVALID_ALGORITHM);
       return NULL;
    }

    arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
    if (arena == NULL) {
       return NULL;
    }

    di = (SGNDigestInfo *) PORT_ArenaZAlloc(arena, sizeof(SGNDigestInfo));
    if (di == NULL) {
       PORT_FreeArena(arena, PR_FALSE);
       return NULL;
    }

    di->arena = arena;

    /*
     * PKCS #1 specifies that the AlgorithmID must have a NULL parameter
     * (as opposed to no parameter at all).
     */
    dummy_value.data = NULL;
    dummy_value.len = 0;
    null_param = SEC_ASN1EncodeItem(NULL, NULL, &dummy_value, SEC_NullTemplate);
    if (null_param == NULL) {
       goto loser;
    }

    rv = SECOID_SetAlgorithmID(arena, &di->digestAlgorithm, algorithm,
                            null_param);

    SECITEM_FreeItem(null_param, PR_TRUE);

    if (rv != SECSuccess) {
       goto loser;
    }

    di->digest.data = (unsigned char *) PORT_ArenaAlloc(arena, len);
    if (di->digest.data == NULL) {
       goto loser;
    }

    di->digest.len = len;
    PORT_Memcpy(di->digest.data, sig, len);
    return di;

  loser:
    SGN_DestroyDigestInfo(di);
    return NULL;
}

Here is the call graph for this function:

SGNDigestInfo* SGN_DecodeDigestInfo ( SECItem *  didata)

Definition at line 164 of file secdig.c.

{
    PRArenaPool *arena;
    SGNDigestInfo *di;
    SECStatus rv = SECFailure;
    SECItem      diCopy   = {siBuffer, NULL, 0};

    arena = PORT_NewArena(SEC_ASN1_DEFAULT_ARENA_SIZE);
    if(arena == NULL)
       return NULL;

    rv = SECITEM_CopyItem(arena, &diCopy, didata);
    if (rv != SECSuccess) {
       PORT_FreeArena(arena, PR_FALSE);
       return NULL;
    }

    di = (SGNDigestInfo *)PORT_ArenaZAlloc(arena, sizeof(SGNDigestInfo));
    if (di != NULL) {
       di->arena = arena;
       rv = SEC_QuickDERDecodeItem(arena, di, sgn_DigestInfoTemplate, &diCopy);
    }
       
    if ((di == NULL) || (rv != SECSuccess)) {
       PORT_FreeArena(arena, PR_FALSE);
       di = NULL;
    }

    return di;
}

Here is the call graph for this function:

void SGN_DestroyDigestInfo ( SGNDigestInfo *  di)

Definition at line 196 of file secdig.c.

{
    if (di && di->arena) {
       PORT_FreeArena(di->arena, PR_FALSE);
    }

    return;
}

Here is the call graph for this function:

SECItem* SGN_EncodeDigestInfo ( PRArenaPool poolp,
SECItem *  dest,
SGNDigestInfo *  diginfo 
)

Definition at line 89 of file secdig.c.

{
    return SEC_ASN1EncodeItem (poolp, dest, diginfo, sgn_DigestInfoTemplate);
}

Here is the call graph for this function:


Variable Documentation

Initial value:
 {
    { SEC_ASN1_SEQUENCE,
         0, NULL, sizeof(SGNDigestInfo) },
    { SEC_ASN1_INLINE,
         offsetof(SGNDigestInfo,digestAlgorithm),
         SECOID_AlgorithmIDTemplate },
    { SEC_ASN1_OCTET_STRING,
         offsetof(SGNDigestInfo,digest) },
    { 0 }
}

Definition at line 60 of file secdig.c.

DERTemplate SGNDigestInfoTemplate[]
Initial value:
 {
    { DER_SEQUENCE,
         0, NULL, sizeof(SGNDigestInfo) },
    { DER_INLINE,
         offsetof(SGNDigestInfo,digestAlgorithm),
         SECAlgorithmIDTemplate, },
    { DER_OCTET_STRING,
         offsetof(SGNDigestInfo,digest), },
    { 0, }
}

Definition at line 47 of file secdig.c.