Back to index

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

Go to the source code of this file.

Functions

SECOidTag SECOID_GetAlgorithmTag (SECAlgorithmID *id)
SECStatus SECOID_SetAlgorithmID (PRArenaPool *arena, SECAlgorithmID *id, SECOidTag which, SECItem *params)
SECStatus SECOID_CopyAlgorithmID (PRArenaPool *arena, SECAlgorithmID *to, SECAlgorithmID *from)
void SECOID_DestroyAlgorithmID (SECAlgorithmID *algid, PRBool freeit)
SECComparison SECOID_CompareAlgorithmID (SECAlgorithmID *a, SECAlgorithmID *b)

Variables

DERTemplate SECAlgorithmIDTemplate []
const SEC_ASN1Template SECOID_AlgorithmIDTemplate []

Function Documentation

SECComparison SECOID_CompareAlgorithmID ( SECAlgorithmID *  a,
SECAlgorithmID *  b 
)

Definition at line 170 of file secalgid.c.

{
    SECComparison rv;

    rv = SECITEM_CompareItem(&a->algorithm, &b->algorithm);
    if (rv) return rv;
    rv = SECITEM_CompareItem(&a->parameters, &b->parameters);
    return rv;
}

Here is the caller graph for this function:

SECStatus SECOID_CopyAlgorithmID ( PRArenaPool arena,
SECAlgorithmID *  to,
SECAlgorithmID *  from 
)

Definition at line 151 of file secalgid.c.

{
    SECStatus rv;

    rv = SECITEM_CopyItem(arena, &to->algorithm, &from->algorithm);
    if (rv) return rv;
    rv = SECITEM_CopyItem(arena, &to->parameters, &from->parameters);
    return rv;
}

Here is the caller graph for this function:

void SECOID_DestroyAlgorithmID ( SECAlgorithmID *  algid,
PRBool  freeit 
)

Definition at line 161 of file secalgid.c.

{
    SECITEM_FreeItem(&algid->parameters, PR_FALSE);
    SECITEM_FreeItem(&algid->algorithm, PR_FALSE);
    if(freeit == PR_TRUE)
        PORT_Free(algid);
}

Here is the caller graph for this function:

SECOidTag SECOID_GetAlgorithmTag ( SECAlgorithmID *  id)

Definition at line 65 of file secalgid.c.

{
    if (id == NULL || id->algorithm.data == NULL)
       return SEC_OID_UNKNOWN;

    return SECOID_FindOIDTag (&(id->algorithm));
}
SECStatus SECOID_SetAlgorithmID ( PRArenaPool arena,
SECAlgorithmID *  id,
SECOidTag  which,
SECItem *  params 
)

Definition at line 74 of file secalgid.c.

{
    SECOidData *oiddata;
    PRBool add_null_param;

    oiddata = SECOID_FindOIDByTag(which);
    if ( !oiddata ) {
       PORT_SetError(SEC_ERROR_INVALID_ALGORITHM);
       return SECFailure;
    }

    if (SECITEM_CopyItem(arena, &id->algorithm, &oiddata->oid))
       return SECFailure;

    switch (which) {
      case SEC_OID_MD2:
      case SEC_OID_MD4:
      case SEC_OID_MD5:
      case SEC_OID_SHA1:
      case SEC_OID_SHA256:
      case SEC_OID_SHA384:
      case SEC_OID_SHA512:
      case SEC_OID_PKCS1_RSA_ENCRYPTION:
      case SEC_OID_PKCS1_MD2_WITH_RSA_ENCRYPTION:
      case SEC_OID_PKCS1_MD4_WITH_RSA_ENCRYPTION:
      case SEC_OID_PKCS1_MD5_WITH_RSA_ENCRYPTION:
      case SEC_OID_PKCS1_SHA1_WITH_RSA_ENCRYPTION:
      case SEC_OID_PKCS1_SHA256_WITH_RSA_ENCRYPTION:
      case SEC_OID_PKCS1_SHA384_WITH_RSA_ENCRYPTION:
      case SEC_OID_PKCS1_SHA512_WITH_RSA_ENCRYPTION:
       add_null_param = PR_TRUE;
       break;
      default:
       add_null_param = PR_FALSE;
       break;
    }

    if (params) {
       /*
        * I am specifically *not* enforcing the following assertion
        * (by following it up with an error and a return of failure)
        * because I do not want to introduce any change in the current
        * behavior.  But I do want for us to notice if the following is
        * ever true, because I do not think it should be so and probably
        * signifies an error/bug somewhere.
        */
       PORT_Assert(!add_null_param || (params->len == 2
                                   && params->data[0] == SEC_ASN1_NULL
                                   && params->data[1] == 0));
       if (SECITEM_CopyItem(arena, &id->parameters, params)) {
           return SECFailure;
       }
    } else {
       /*
        * Again, this is not considered an error.  But if we assume
        * that nobody tries to set the parameters field themselves
        * (but always uses this routine to do that), then we should
        * not hit the following assertion.  Unless they forgot to zero
        * the structure, which could also be a bad (and wrong) thing.
        */
       PORT_Assert(id->parameters.data == NULL);

       if (add_null_param) {
           (void) SECITEM_AllocItem(arena, &id->parameters, 2);
           if (id->parameters.data == NULL) {
              return SECFailure;
           }
           id->parameters.data[0] = SEC_ASN1_NULL;
           id->parameters.data[1] = 0;
       }
    }

    return SECSuccess;
}

Here is the caller graph for this function:


Variable Documentation

DERTemplate SECAlgorithmIDTemplate[]
Initial value:
 {
    { DER_SEQUENCE,
         0, NULL, sizeof(SECAlgorithmID) },
    { DER_OBJECT_ID,
         offsetof(SECAlgorithmID,algorithm), },
    { DER_OPTIONAL | DER_ANY,
         offsetof(SECAlgorithmID,parameters), },
    { 0, }
}

Definition at line 44 of file secalgid.c.

Initial value:
 {
    { SEC_ASN1_SEQUENCE,
         0, NULL, sizeof(SECAlgorithmID) },
    { SEC_ASN1_OBJECT_ID,
         offsetof(SECAlgorithmID,algorithm), },
    { SEC_ASN1_OPTIONAL | SEC_ASN1_ANY,
         offsetof(SECAlgorithmID,parameters), },
    { 0, }
}

Definition at line 54 of file secalgid.c.