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