Browse Source

der fixes and additions

Christopher Brown 12 years ago
parent
commit
2cb8c44113

+ 158 - 0
libtomcrypt_VS2005.vcproj

@@ -2910,6 +2910,28 @@
 					/>
 				</FileConfiguration>
 			</File>
+			<File
+				RelativePath="src\misc\pk_get_oid.c"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""
+						PreprocessorDefinitions=""
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""
+						PreprocessorDefinitions=""
+					/>
+				</FileConfiguration>
+			</File>
 			<File
 				RelativePath="src\misc\zeromem.c"
 				>
@@ -4731,6 +4753,28 @@
 								/>
 							</FileConfiguration>
 						</File>
+						<File
+							RelativePath="src\pk\asn1\der\bit\der_decode_raw_bit_string.c"
+							>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									AdditionalIncludeDirectories=""
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									AdditionalIncludeDirectories=""
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
 						<File
 							RelativePath="src\pk\asn1\der\bit\der_encode_bit_string.c"
 							>
@@ -4753,6 +4797,28 @@
 								/>
 							</FileConfiguration>
 						</File>
+						<File
+							RelativePath="src\pk\asn1\der\bit\der_encode_raw_bit_string.c"
+							>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									AdditionalIncludeDirectories=""
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									AdditionalIncludeDirectories=""
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
 						<File
 							RelativePath="src\pk\asn1\der\bit\der_length_bit_string.c"
 							>
@@ -5290,6 +5356,28 @@
 									PreprocessorDefinitions=""
 								/>
 							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="src\pk\asn1\der\sequence\der_decode_subject_public_key_info.c"
+							>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									AdditionalIncludeDirectories=""
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									AdditionalIncludeDirectories=""
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
 						</File>
 						<File
 							RelativePath="src\pk\asn1\der\sequence\der_encode_sequence_ex.c"
@@ -5335,6 +5423,28 @@
 								/>
 							</FileConfiguration>
 						</File>
+						<File
+							RelativePath="src\pk\asn1\der\sequence\der_encode_subject_public_key_info.c"
+							>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									AdditionalIncludeDirectories=""
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									AdditionalIncludeDirectories=""
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
 						<File
 							RelativePath="src\pk\asn1\der\sequence\der_length_sequence.c"
 							>
@@ -5498,6 +5608,54 @@
 							</FileConfiguration>
 						</File>
 					</Filter>
+					<Filter
+						Name="teletex_string"
+						>
+						<File
+							RelativePath="src\pk\asn1\der\teletex_string\der_decode_teletex_string.c"
+							>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									AdditionalIncludeDirectories=""
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									AdditionalIncludeDirectories=""
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="src\pk\asn1\der\teletex_string\der_length_teletex_string.c"
+							>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									AdditionalIncludeDirectories=""
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									AdditionalIncludeDirectories=""
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+					</Filter>
 					<Filter
 						Name="utctime"
 						>

+ 33 - 1
libtomcrypt_VS2008.vcproj

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="Windows-1252"?>
 <VisualStudioProject
 	ProjectType="Visual C++"
-	Version="9,00"
+	Version="9.00"
 	Name="libtomcrypt"
 	ProjectGUID="{E3802982-DCB6-4D85-A2BD-6B08F0657E79}"
 	RootNamespace="libtomcrypt"
@@ -2920,6 +2920,10 @@
 					/>
 				</FileConfiguration>
 			</File>
+			<File
+				RelativePath=".\src\misc\pk_get_oid.c"
+				>
+			</File>
 			<File
 				RelativePath="src\misc\zeromem.c"
 				>
@@ -4741,6 +4745,10 @@
 								/>
 							</FileConfiguration>
 						</File>
+						<File
+							RelativePath=".\src\pk\asn1\der\bit\der_decode_raw_bit_string.c"
+							>
+						</File>
 						<File
 							RelativePath="src\pk\asn1\der\bit\der_encode_bit_string.c"
 							>
@@ -4763,6 +4771,10 @@
 								/>
 							</FileConfiguration>
 						</File>
+						<File
+							RelativePath=".\src\pk\asn1\der\bit\der_encode_raw_bit_string.c"
+							>
+						</File>
 						<File
 							RelativePath="src\pk\asn1\der\bit\der_length_bit_string.c"
 							>
@@ -5301,6 +5313,10 @@
 								/>
 							</FileConfiguration>
 						</File>
+						<File
+							RelativePath=".\src\pk\asn1\der\sequence\der_decode_subject_public_key_info.c"
+							>
+						</File>
 						<File
 							RelativePath="src\pk\asn1\der\sequence\der_encode_sequence_ex.c"
 							>
@@ -5345,6 +5361,10 @@
 								/>
 							</FileConfiguration>
 						</File>
+						<File
+							RelativePath=".\src\pk\asn1\der\sequence\der_encode_subject_public_key_info.c"
+							>
+						</File>
 						<File
 							RelativePath="src\pk\asn1\der\sequence\der_length_sequence.c"
 							>
@@ -5648,6 +5668,18 @@
 							</FileConfiguration>
 						</File>
 					</Filter>
+					<Filter
+						Name="teletex_string"
+						>
+						<File
+							RelativePath=".\src\pk\asn1\der\teletex_string\der_decode_teletex_string.c"
+							>
+						</File>
+						<File
+							RelativePath=".\src\pk\asn1\der\teletex_string\der_length_teletex_string.c"
+							>
+						</File>
+					</Filter>
 				</Filter>
 			</Filter>
 			<Filter

+ 11 - 1
src/headers/tomcrypt_pk.h

@@ -444,6 +444,8 @@ enum {
  LTC_ASN1_SET,
  LTC_ASN1_SETOF,
  LTC_ASN1_RAW_BIT_STRING,
+ LTC_ASN1_TELETEX_STRING,
+ LTC_ASN1_CONSTRUCTED,
 };
 
 /** A LTC ASN.1 list type */
@@ -563,7 +565,15 @@ int der_length_ia5_string(const unsigned char *octets, unsigned long noctets, un
 int der_ia5_char_encode(int c);
 int der_ia5_value_decode(int v);
 
-/* Printable STRING */
+/* TELETEX STRING */
+int der_decode_teletex_string(const unsigned char *in, unsigned long inlen,
+                                unsigned char *out, unsigned long *outlen);
+int der_length_teletex_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen);
+
+int der_teletex_char_encode(int c);
+int der_teletex_value_decode(int v);
+
+/* PRINTABLE STRING */
 int der_encode_printable_string(const unsigned char *in, unsigned long inlen,
                                 unsigned char *out, unsigned long *outlen);
 int der_decode_printable_string(const unsigned char *in, unsigned long inlen,

+ 4 - 4
src/misc/pk_get_oid.c

@@ -10,13 +10,13 @@
 #include "tomcrypt.h"
 
 static const oid_st rsa_oid = {
-   .OIDlen = 7,
-   .OID = { 1, 2, 840, 113549, 1, 1, 1  },
+   { 1, 2, 840, 113549, 1, 1, 1  },
+   7,
 };
 
 static const oid_st dsa_oid = {
-   .OIDlen = 6,
-   .OID = { 1, 2, 840, 10040, 4, 1  },
+   { 1, 2, 840, 10040, 4, 1  },
+   6,
 };
 
 /*

+ 1 - 1
src/pk/asn1/der/boolean/der_decode_boolean.c

@@ -31,7 +31,7 @@ int der_decode_boolean(const unsigned char *in, unsigned long inlen,
    LTC_ARGCHK(in  != NULL);
    LTC_ARGCHK(out != NULL);
    
-   if (inlen != 3 || in[0] != 0x01 || in[1] != 0x01 || (in[2] != 0x00 && in[2] != 0xFF)) {
+   if (inlen < 3 || in[0] != 0x01 || in[1] != 0x01 || (in[2] != 0x00 && in[2] != 0xFF)) {
       return CRYPT_INVALID_ARG;
    }
    

+ 35 - 5
src/pk/asn1/der/sequence/der_decode_sequence_flexi.c

@@ -65,6 +65,7 @@ int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc
    ltc_asn1_list *l;
    unsigned long err, type, len, totlen, x, y;
    void          *realloc_tmp;
+   int           isConstructed;
    
    LTC_ARGCHK(in    != NULL);
    LTC_ARGCHK(inlen != NULL);
@@ -102,7 +103,14 @@ int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc
          l = l->next;
       }
 
-      /* now switch on type */
+      if ((isConstructed = ((type & 0xE0) == 0xA0 ? 1 : 0))) {
+         /* constructed, use the 'used' field to store the original tag number */
+         l->used = (type & 0x1F);
+         /* treat constructed elements like SETs */
+         type = 0x31;
+      }
+     
+     /* now switch on type */
       switch (type) {
          case 0x01: /* BOOLEAN */
             l->type = LTC_ASN1_BOOLEAN;
@@ -259,6 +267,26 @@ int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc
             }
             break;
          
+         case 0x14: /* TELETEXT */
+         
+            /* init field */
+            l->type = LTC_ASN1_TELETEX_STRING;
+            l->size = len;
+
+            if ((l->data = XCALLOC(1, l->size)) == NULL) {
+               err = CRYPT_MEM;
+               goto error;
+            }
+            
+            if ((err = der_decode_teletex_string(in, *inlen, l->data, &l->size)) != CRYPT_OK) {
+               goto error;
+            }
+            
+            if ((err = der_length_teletex_string(l->data, l->size, &len)) != CRYPT_OK) {
+               goto error;
+            }
+            break;
+            
          case 0x16: /* IA5 */
          
             /* init field */
@@ -304,7 +332,7 @@ int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc
          case 0x31: /* SET */
          
              /* init field */
-             l->type = (type == 0x30) ? LTC_ASN1_SEQUENCE : LTC_ASN1_SET;
+             l->type = (isConstructed ? LTC_ASN1_CONSTRUCTED : ((type == 0x30) ? LTC_ASN1_SEQUENCE : LTC_ASN1_SET));
              
              /* we have to decode the SEQUENCE header and get it's length */
              
@@ -343,9 +371,11 @@ int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc
          default:
            /* invalid byte ... this is a soft error */
            /* remove link */
-           l       = l->prev;
-           XFREE(l->next);
-           l->next = NULL;
+           if (l->prev) {
+              l       = l->prev;
+              XFREE(l->next);
+              l->next = NULL;
+           }
            goto outside;
       }
       

+ 2 - 1
src/pk/asn1/der/sequence/der_decode_subject_public_key_info.c

@@ -36,7 +36,8 @@ int der_decode_subject_public_key_info(const unsigned char *in, unsigned long in
         unsigned int algorithm, void* public_key, unsigned long* public_key_len,
         unsigned long parameters_type, ltc_asn1_list* parameters, unsigned long parameters_len)
 {
-   int err, len;
+   int err;
+   unsigned long len;
    oid_st oid;
    unsigned char *tmpbuf;
    unsigned long  tmpoid[16];

+ 2 - 0
src/pk/asn1/der/sequence/der_sequence_free.c

@@ -24,6 +24,8 @@
 void der_sequence_free(ltc_asn1_list *in)
 {
    ltc_asn1_list *l;
+
+   if (!in) return;
    
    /* walk to the start of the chain */
    while (in->prev != NULL || in->parent != NULL) {

+ 95 - 0
src/pk/asn1/der/teletex_string/der_decode_teletex_string.c

@@ -0,0 +1,95 @@
+/* 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, [email protected], http://libtom.org
+ */
+#include "tomcrypt.h"
+
+/**
+  @file der_decode_teletex_string.c
+  ASN.1 DER, encode a teletex STRING
+*/
+
+#ifdef LTC_DER
+
+/**
+  Store a teletex STRING
+  @param in      The DER encoded teletex STRING
+  @param inlen   The size of the DER teletex 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_teletex_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 0x13 */
+   if ((in[0] & 0x1F) != 0x14) {
+      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_teletex_value_decode(in[x++]);
+       if (t == -1) {
+           return CRYPT_INVALID_ARG;
+       }
+       out[y] = t;
+   }
+
+   *outlen = y;
+
+   return CRYPT_OK;
+}
+ 
+#endif
+
+/* $Source$ */
+/* $Revision$ */
+/* $Date$ */

+ 210 - 0
src/pk/asn1/der/teletex_string/der_length_teletex_string.c

@@ -0,0 +1,210 @@
+/* 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, [email protected], http://libtom.org
+ */
+#include "tomcrypt.h"
+
+/**
+  @file der_length_teletex_string.c
+  ASN.1 DER, get length of teletex STRING
+*/
+
+#ifdef LTC_DER
+
+static const struct {
+   int code, value;
+} teletex_table[] = {
+{ '\0',  0 },
+{ '\a',  7 },
+{ '\b',  8 },
+{ '\t',  9 },
+{ '\n', 10 },
+{ '\v', 11 },
+{ '\f', 12 },
+{ '\r', 13 },
+{ ' ',  32 }, 
+{ '!',  33 }, 
+{ '"',  34 }, 
+{ '%',  37 }, 
+{ '&',  38 }, 
+{ '\'', 39 }, 
+{ '(',  40 }, 
+{ ')',  41 }, 
+{ '+',  43 }, 
+{ ',',  44 }, 
+{ '-',  45 }, 
+{ '.',  46 }, 
+{ '/',  47 }, 
+{ '0',  48 }, 
+{ '1',  49 }, 
+{ '2',  50 }, 
+{ '3',  51 }, 
+{ '4',  52 }, 
+{ '5',  53 }, 
+{ '6',  54 }, 
+{ '7',  55 }, 
+{ '8',  56 }, 
+{ '9',  57 }, 
+{ ':',  58 }, 
+{ ';',  59 }, 
+{ '<',  60 }, 
+{ '=',  61 }, 
+{ '>',  62 }, 
+{ '?',  63 }, 
+{ '@',  64 }, 
+{ 'A',  65 }, 
+{ 'B',  66 }, 
+{ 'C',  67 }, 
+{ 'D',  68 }, 
+{ 'E',  69 }, 
+{ 'F',  70 }, 
+{ 'G',  71 }, 
+{ 'H',  72 }, 
+{ 'I',  73 }, 
+{ 'J',  74 }, 
+{ 'K',  75 }, 
+{ 'L',  76 }, 
+{ 'M',  77 }, 
+{ 'N',  78 }, 
+{ 'O',  79 }, 
+{ 'P',  80 }, 
+{ 'Q',  81 }, 
+{ 'R',  82 }, 
+{ 'S',  83 }, 
+{ 'T',  84 }, 
+{ 'U',  85 }, 
+{ 'V',  86 }, 
+{ 'W',  87 }, 
+{ 'X',  88 }, 
+{ 'Y',  89 }, 
+{ 'Z',  90 }, 
+{ '[',  91 }, 
+{ ']',  93 }, 
+{ '_',  95 }, 
+{ 'a',  97 }, 
+{ 'b',  98 }, 
+{ 'c',  99 }, 
+{ 'd',  100 }, 
+{ 'e',  101 }, 
+{ 'f',  102 }, 
+{ 'g',  103 }, 
+{ 'h',  104 }, 
+{ 'i',  105 }, 
+{ 'j',  106 }, 
+{ 'k',  107 }, 
+{ 'l',  108 }, 
+{ 'm',  109 }, 
+{ 'n',  110 }, 
+{ 'o',  111 }, 
+{ 'p',  112 }, 
+{ 'q',  113 }, 
+{ 'r',  114 }, 
+{ 's',  115 }, 
+{ 't',  116 }, 
+{ 'u',  117 }, 
+{ 'v',  118 }, 
+{ 'w',  119 }, 
+{ 'x',  120 }, 
+{ 'y',  121 }, 
+{ 'z',  122 }, 
+{ '|',  124 }, 
+{ ' ',  160 }, 
+{ 0xa1, 161 }, 
+{ 0xa2, 162 }, 
+{ 0xa3, 163 }, 
+{ '$',  164 }, 
+{ 0xa5, 165 }, 
+{ '#',  166 }, 
+{ 0xa7, 167 }, 
+{ 0xa4, 168 }, 
+{ 0xab, 171 }, 
+{ 0xb0, 176 }, 
+{ 0xb1, 177 }, 
+{ 0xb2, 178 }, 
+{ 0xb3, 179 }, 
+{ 0xd7, 180 }, 
+{ 0xb5, 181 }, 
+{ 0xb6, 182 }, 
+{ 0xb7, 183 }, 
+{ 0xf7, 184 }, 
+{ 0xbb, 187 }, 
+{ 0xbc, 188 }, 
+{ 0xbd, 189 }, 
+{ 0xbe, 190 }, 
+{ 0xbf, 191 }, 
+};
+
+int der_teletex_char_encode(int c)
+{
+   int x;
+   for (x = 0; x < (int)(sizeof(teletex_table)/sizeof(teletex_table[0])); x++) {
+       if (teletex_table[x].code == c) {
+          return teletex_table[x].value;
+       }
+   }
+   return -1;
+}
+
+int der_teletex_value_decode(int v)
+{
+   int x;
+   for (x = 0; x < (int)(sizeof(teletex_table)/sizeof(teletex_table[0])); x++) {
+       if (teletex_table[x].value == v) {
+          return teletex_table[x].code;
+       }
+   }
+   return -1;
+}
+   
+/**
+  Gets length of DER encoding of teletex STRING 
+  @param octets   The values you want to encode 
+  @param noctets  The number of octets in the string to encode
+  @param outlen   [out] The length of the DER encoding for the given string
+  @return CRYPT_OK if successful
+*/
+int der_length_teletex_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen)
+{
+   unsigned long x;
+
+   LTC_ARGCHK(outlen != NULL);
+   LTC_ARGCHK(octets != NULL);
+
+   /* scan string for validity */
+   for (x = 0; x < noctets; x++) {
+       if (der_teletex_char_encode(octets[x]) == -1) {
+          return CRYPT_INVALID_ARG;
+       }
+   }
+
+   if (noctets < 128) {
+      /* 16 LL DD DD DD ... */
+      *outlen = 2 + noctets;
+   } else if (noctets < 256) {
+      /* 16 81 LL DD DD DD ... */
+      *outlen = 3 + noctets;
+   } else if (noctets < 65536UL) {
+      /* 16 82 LL LL DD DD DD ... */
+      *outlen = 4 + noctets;
+   } else if (noctets < 16777216UL) {
+      /* 16 83 LL LL LL DD DD DD ... */
+      *outlen = 5 + noctets;
+   } else {
+      return CRYPT_INVALID_ARG;
+   }
+
+   return CRYPT_OK;
+}
+
+#endif
+
+
+/* $Source$ */
+/* $Revision$ */
+/* $Date$ */