Back to index

lightning-sunbird  0.9+nobinonly
Classes | Defines | Functions | Variables
dsautil.c File Reference
#include "cryptohi.h"
#include "secasn1.h"
#include "secitem.h"
#include "prerr.h"

Go to the source code of this file.

Classes

struct  DSA_ASN1Signature

Defines

#define DSA_SUBPRIME_LEN   20 /* bytes */

Functions

void DSAU_ConvertUnsignedToSigned (SECItem *dest, SECItem *src)
SECStatus DSAU_ConvertSignedToFixedUnsigned (SECItem *dest, SECItem *src)
static SECStatus common_EncodeDerSig (SECItem *dest, SECItem *src)
static SECItem * common_DecodeDerSig (SECItem *item, unsigned int len)
SECStatus DSAU_EncodeDerSig (SECItem *dest, SECItem *src)
SECStatus DSAU_EncodeDerSigWithLen (SECItem *dest, SECItem *src, unsigned int len)
SECItem * DSAU_DecodeDerSig (SECItem *item)
SECItem * DSAU_DecodeDerSigToLen (SECItem *item, unsigned int len)

Variables

const SEC_ASN1Template DSA_SignatureTemplate []

Class Documentation

struct DSA_ASN1Signature

Definition at line 46 of file dsautil.c.

Class Members
SECItem r
SECItem s

Define Documentation

#define DSA_SUBPRIME_LEN   20 /* bytes */

Definition at line 43 of file dsautil.c.


Function Documentation

static SECItem* common_DecodeDerSig ( SECItem *  item,
unsigned int  len 
) [static]

Definition at line 195 of file dsautil.c.

{
    SECItem *         result = NULL;
    SECStatus         status;
    DSA_ASN1Signature sig;
    SECItem           dst;

    PORT_Memset(&sig, 0, sizeof(sig));

    result = PORT_ZNew(SECItem);
    if (result == NULL)
       goto loser;

    result->len  = 2 * len;
    result->data = (unsigned char*)PORT_Alloc(2 * len);
    if (result->data == NULL)
       goto loser;

    sig.r.type = siUnsignedInteger;
    sig.s.type = siUnsignedInteger;
    status = SEC_ASN1DecodeItem(NULL, &sig, DSA_SignatureTemplate, item);
    if (status != SECSuccess)
       goto loser;

    /* Convert sig.r and sig.s from variable  length signed integers to 
    ** fixed length unsigned integers.
    */
    dst.data = result->data;
    dst.len  = len;
    status = DSAU_ConvertSignedToFixedUnsigned(&dst, &sig.r);
    if (status != SECSuccess)
       goto loser;

    dst.data += len;
    status = DSAU_ConvertSignedToFixedUnsigned(&dst, &sig.s);
    if (status != SECSuccess)
       goto loser;

done:
    if (sig.r.data != NULL)
       PORT_Free(sig.r.data);
    if (sig.s.data != NULL)
       PORT_Free(sig.s.data);

    return result;

loser:
    if (result != NULL) {
       SECITEM_FreeItem(result, PR_TRUE);
       result = NULL;
    }
    goto done;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static SECStatus common_EncodeDerSig ( SECItem *  dest,
SECItem *  src 
) [static]

Definition at line 135 of file dsautil.c.

{
    SECItem *         item;
    SECItem           srcItem;
    DSA_ASN1Signature sig;
    unsigned char     *signedR;
    unsigned char     *signedS;
    unsigned int len;

    /* Allocate memory with room for an extra byte that
     * may be required if the top bit in the first byte
     * is already set.
     */
    len = src->len/2;
    signedR = (unsigned char *) PORT_Alloc(len + 1);
    if (!signedR) return SECFailure;
    signedS = (unsigned char *) PORT_ZAlloc(len + 1);
    if (!signedS) {
        if (signedR) PORT_Free(signedR);
       return SECFailure;
    }

    PORT_Memset(&sig, 0, sizeof(sig));

    /* Must convert r and s from "unsigned" integers to "signed" integers.
    ** If the high order bit of the first byte (MSB) is 1, then must
    ** prepend with leading zero.  
    ** Must remove all but one leading zero byte from numbers.
    */
    sig.r.type = siUnsignedInteger;
    sig.r.data = signedR;
    sig.r.len  = sizeof signedR;
    sig.s.type = siUnsignedInteger;
    sig.s.data = signedS;
    sig.s.len  = sizeof signedR;

    srcItem.data = src->data;
    srcItem.len  = len;

    DSAU_ConvertUnsignedToSigned(&sig.r, &srcItem);
    srcItem.data += len;
    DSAU_ConvertUnsignedToSigned(&sig.s, &srcItem);

    item = SEC_ASN1EncodeItem(NULL, dest, &sig, DSA_SignatureTemplate);
    if (signedR) PORT_Free(signedR);
    if (signedS) PORT_Free(signedS);
    if (item == NULL)
       return SECFailure;

    /* XXX leak item? */
    return SECSuccess;
}

Here is the call graph for this function:

Here is the caller graph for this function:

SECStatus DSAU_ConvertSignedToFixedUnsigned ( SECItem *  dest,
SECItem *  src 
)

Definition at line 103 of file dsautil.c.

{
    unsigned char *pSrc = src->data;
    unsigned char *pDst = dest->data;
    unsigned int   cntSrc = src->len;
    unsigned int   cntDst = dest->len;
    int            zCount = cntDst - cntSrc;

    if (zCount > 0) {
       PORT_Memset(pDst, 0, zCount);
       PORT_Memcpy(pDst + zCount, pSrc, cntSrc);
       return SECSuccess;
    }
    if (zCount <= 0) {
       /* Source is longer than destination.  Check for leading zeros. */
       while (zCount++ < 0) {
           if (*pSrc++ != 0)
              goto loser;
       }
    }
    PORT_Memcpy(pDst, pSrc, cntDst);
    return SECSuccess;

loser:
    PORT_SetError( PR_INVALID_ARGUMENT_ERROR );
    return SECFailure;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void DSAU_ConvertUnsignedToSigned ( SECItem *  dest,
SECItem *  src 
)

Definition at line 69 of file dsautil.c.

{
    unsigned char *pSrc = src->data;
    unsigned char *pDst = dest->data;
    unsigned int   cntSrc = src->len;

    /* skip any leading zeros. */
    while (cntSrc && !(*pSrc)) { 
       pSrc++; 
       cntSrc--;
    }
    if (!cntSrc) {
       *pDst = 0; 
       dest->len = 1; 
       return; 
    }

    if (*pSrc & 0x80)
       *pDst++ = 0;

    PORT_Memcpy(pDst, pSrc, cntSrc);
    dest->len = (pDst - dest->data) + cntSrc;
}

Here is the caller graph for this function:

SECItem* DSAU_DecodeDerSig ( SECItem *  item)

Definition at line 286 of file dsautil.c.

SECItem* DSAU_DecodeDerSigToLen ( SECItem *  item,
unsigned int  len 
)

Definition at line 297 of file dsautil.c.

{
    return common_DecodeDerSig(item, len/2);
}
SECStatus DSAU_EncodeDerSig ( SECItem *  dest,
SECItem *  src 
)

Definition at line 253 of file dsautil.c.

SECStatus DSAU_EncodeDerSigWithLen ( SECItem *  dest,
SECItem *  src,
unsigned int  len 
)

Definition at line 268 of file dsautil.c.

{

    PORT_Assert((src->len == len) && (len % 2 == 0));
    if ((src->len != len) || (src->len % 2 != 0)) {
       PORT_SetError( PR_INVALID_ARGUMENT_ERROR );
       return SECFailure;
    }

    return common_EncodeDerSig(dest, src);
}

Variable Documentation

Initial value:

Definition at line 51 of file dsautil.c.