text: /*
   * Copyright (c) 2001-2007, Tom St Denis
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions are met:
   *
   * 1. Redistributions of source code must retain the above copyright notice,
   * this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright notice,
   * this list of conditions and the following disclaimer in the documentation
   * and/or other materials provided with the distribution.
   *
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGE.
   */
  
  /* LibTomCrypt, modular cryptographic library -- Tom St Denis
   *
   * LibTomCrypt is a library that provides various cryptographic
   * algorithms in a highly modular and flexible manner.
   *
   * The library is free for all purposes without any express
   * guarantee it works.
   *
   * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
   */
  #include "tomcrypt.h"
  
  /**
    @file der_decode_ia5_string.c
    ASN.1 DER, encode a IA5 STRING, Tom St Denis
  */
  
  
  #ifdef LTC_DER
  
  /**
    Store a IA5 STRING
    @param in      The DER encoded IA5 STRING
    @param inlen   The size of the DER IA5 STRING
    @param out     [out] The array of octets stored (one per char)
    @param outlen  [in/out] The number of octets stored
    @return CRYPT_OK if successful
  */
  int der_decode_ia5_string(const unsigned char *in, unsigned long inlen,
                                  unsigned char *out, unsigned long *outlen)
  {
     unsigned long x, y, len;
     int           t;
  
     LTC_ARGCHK(in     != NULL);
     LTC_ARGCHK(out    != NULL);
     LTC_ARGCHK(outlen != NULL);
  
     /* must have header at least */
     if (inlen < 2) {
        return CRYPT_INVALID_PACKET;
     }
  
     /* check for 0x16 */
     if ((in[0] & 0x1F) != 0x16) {
        return CRYPT_INVALID_PACKET;
     }
     x = 1;
  
     /* decode the length */
     if (in[x] & 0x80) {
        /* valid # of bytes in length are 1,2,3 */
        y = in[x] & 0x7F;
        if ((y == 0) || (y > 3) || ((x + y) > inlen)) {
           return CRYPT_INVALID_PACKET;
        }
  
        /* read the length in */
        len = 0;
        ++x;
        while (y--) {
           len = (len << 8) | in[x++];
        }
     } else {
        len = in[x++] & 0x7F;
     }
  
     /* is it too long? */
     if (len > *outlen) {
        *outlen = len;
        return CRYPT_BUFFER_OVERFLOW;
     }
  
     if (len + x > inlen) {
        return CRYPT_INVALID_PACKET;
     }
  
     /* read the data */
     for (y = 0; y < len; y++) {
         t = der_ia5_value_decode(in[x++]);
         if (t == -1) {
             return CRYPT_INVALID_ARG;
         }
         out[y] = t;
     }
  
     *outlen = y;
  
     return CRYPT_OK;
  }
   
  #endif
  
  /* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/ia5/der_decode_ia5_string.c,v $ */
  /* $Revision: 1.4 $ */
  /* $Date: 2006/12/28 01:27:24 $ */
  