Home | History | Annotate | Download | only in integer
      1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
      2  *
      3  * LibTomCrypt is a library that provides various cryptographic
      4  * algorithms in a highly modular and flexible manner.
      5  *
      6  * The library is free for all purposes without any express
      7  * guarantee it works.
      8  *
      9  * Tom St Denis, tomstdenis (at) gmail.com, http://libtomcrypt.com
     10  */
     11 #include "tomcrypt.h"
     12 
     13 /**
     14   @file der_length_integer.c
     15   ASN.1 DER, get length of encoding, Tom St Denis
     16 */
     17 
     18 
     19 #ifdef LTC_DER
     20 /**
     21   Gets length of DER encoding of num
     22   @param num    The int to get the size of
     23   @param outlen [out] The length of the DER encoding for the given integer
     24   @return CRYPT_OK if successful
     25 */
     26 int der_length_integer(void *num, unsigned long *outlen)
     27 {
     28    unsigned long z, len;
     29    int           leading_zero;
     30 
     31    LTC_ARGCHK(num     != NULL);
     32    LTC_ARGCHK(outlen  != NULL);
     33 
     34    if (mp_cmp_d(num, 0) != LTC_MP_LT) {
     35       /* positive */
     36 
     37       /* we only need a leading zero if the msb of the first byte is one */
     38       if ((mp_count_bits(num) & 7) == 0 || mp_iszero(num) == LTC_MP_YES) {
     39          leading_zero = 1;
     40       } else {
     41          leading_zero = 0;
     42       }
     43 
     44       /* size for bignum */
     45       z = len = leading_zero + mp_unsigned_bin_size(num);
     46    } else {
     47       /* it's negative */
     48       /* find power of 2 that is a multiple of eight and greater than count bits */
     49       leading_zero = 0;
     50       z = mp_count_bits(num);
     51       z = z + (8 - (z & 7));
     52       if (((mp_cnt_lsb(num)+1)==mp_count_bits(num)) && ((mp_count_bits(num)&7)==0)) --z;
     53       len = z = z >> 3;
     54    }
     55 
     56    /* now we need a length */
     57    if (z < 128) {
     58       /* short form */
     59       ++len;
     60    } else {
     61       /* long form (relies on z != 0), assumes length bytes < 128 */
     62       ++len;
     63 
     64       while (z) {
     65          ++len;
     66          z >>= 8;
     67       }
     68    }
     69 
     70    /* we need a 0x02 to indicate it's INTEGER */
     71    ++len;
     72 
     73    /* return length */
     74    *outlen = len;
     75    return CRYPT_OK;
     76 }
     77 
     78 #endif
     79 
     80 /* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/integer/der_length_integer.c,v $ */
     81 /* $Revision: 1.4 $ */
     82 /* $Date: 2006/04/22 01:22:55 $ */
     83