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_printable_string.c 15 ASN.1 DER, encode a printable STRING, Tom St Denis 16 */ 17 18 19 #ifdef LTC_DER 20 21 /** 22 Store a printable STRING 23 @param in The DER encoded printable STRING 24 @param inlen The size of the DER printable 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_printable_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 0x13 */ 45 if ((in[0] & 0x1F) != 0x13) { 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_printable_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/printable_string/der_decode_printable_string.c,v $ */ 95 /* $Revision: 1.3 $ */ 96 /* $Date: 2006/06/16 21:53:41 $ */ 97