Home | History | Annotate | Download | only in octet
      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_decode_octet_string.c
     15   ASN.1 DER, encode a OCTET STRING, Tom St Denis
     16 */
     17 
     18 
     19 #ifdef LTC_DER
     20 
     21 /**
     22   Store a OCTET STRING
     23   @param in      The DER encoded OCTET STRING
     24   @param inlen   The size of the DER OCTET STRING
     25   @param out     [out] The array of octets stored (one per char)
     26   @param outlen  [in/out] The number of octets stored
     27   @return CRYPT_OK if successful
     28 */
     29 int der_decode_octet_string(const unsigned char *in, unsigned long inlen,
     30                                   unsigned char *out, unsigned long *outlen)
     31 {
     32    unsigned long x, y, len;
     33 
     34    LTC_ARGCHK(in     != NULL);
     35    LTC_ARGCHK(out    != NULL);
     36    LTC_ARGCHK(outlen != NULL);
     37 
     38    /* must have header at least */
     39    if (inlen < 2) {
     40       return CRYPT_INVALID_PACKET;
     41    }
     42 
     43    /* check for 0x04 */
     44    if ((in[0] & 0x1F) != 0x04) {
     45       return CRYPT_INVALID_PACKET;
     46    }
     47    x = 1;
     48 
     49    /* decode the length */
     50    if (in[x] & 0x80) {
     51       /* valid # of bytes in length are 1,2,3 */
     52       y = in[x] & 0x7F;
     53       if ((y == 0) || (y > 3) || ((x + y) > inlen)) {
     54          return CRYPT_INVALID_PACKET;
     55       }
     56 
     57       /* read the length in */
     58       len = 0;
     59       ++x;
     60       while (y--) {
     61          len = (len << 8) | in[x++];
     62       }
     63    } else {
     64       len = in[x++] & 0x7F;
     65    }
     66 
     67    /* is it too long? */
     68    if (len > *outlen) {
     69       *outlen = len;
     70       return CRYPT_BUFFER_OVERFLOW;
     71    }
     72 
     73    if (len + x > inlen) {
     74       return CRYPT_INVALID_PACKET;
     75    }
     76 
     77    /* read the data */
     78    for (y = 0; y < len; y++) {
     79        out[y] = in[x++];
     80    }
     81 
     82    *outlen = y;
     83 
     84    return CRYPT_OK;
     85 }
     86 
     87 #endif
     88 
     89 /* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/octet/der_decode_octet_string.c,v $ */
     90 /* $Revision: 1.3 $ */
     91 /* $Date: 2006/06/16 21:53:41 $ */
     92