From df3551316bc654fe00ef8ed802b1d97bb2e56e34 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se>
Date: Tue, 21 Apr 1998 23:20:37 +0200
Subject: [PATCH] Copied changes from pike-0.6. ADT.struct, Tools.PEM,
 Standards,

Rev: lib/modules/ADT.pmod/struct.pike:1.3
Rev: lib/modules/Standards.pmod/ASN1.pmod/decode.pike:1.2
Rev: lib/modules/Standards.pmod/PKCS.pmod/RSA.pmod:1.4
---
 .gitattributes                                |   1 -
 lib/modules/ADT.pmod/struct.pike              | 136 ++++++++----------
 .../Standards.pmod/ASN1.pmod/decode.pike      |   8 +-
 lib/modules/Standards.pmod/PKCS.pmod/RSA.pmod |   7 +-
 4 files changed, 64 insertions(+), 88 deletions(-)

diff --git a/.gitattributes b/.gitattributes
index 8a9825282f..f226510139 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -19,7 +19,6 @@ testfont binary
 /bin/test_pike.pike foreign_ident
 /lib/master.pike foreign_ident
 /lib/modules/ADT.pmod/queue.pike foreign_ident
-/lib/modules/ADT.pmod/struct.pike foreign_ident
 /lib/modules/Crypto/des3.pike foreign_ident
 /lib/modules/Crypto/des3_cbc.pike foreign_ident
 /lib/modules/Crypto/des_cbc.pike foreign_ident
diff --git a/lib/modules/ADT.pmod/struct.pike b/lib/modules/ADT.pmod/struct.pike
index d7d3cba88d..0f047e3d3d 100644
--- a/lib/modules/ADT.pmod/struct.pike
+++ b/lib/modules/ADT.pmod/struct.pike
@@ -1,8 +1,14 @@
-/* $Id: struct.pike,v 1.2 1997/05/31 22:03:44 grubba Exp $
+/* struct.pike
  *
- * Read and write structures from strings.
+ * New version, taken from Protocols.X
  */
 
+#if 0
+#include "error.h"
+#else
+#define error(x) throw( ({ (x), backtrace() }) )
+#endif
+
 string buffer;
 int index;
 
@@ -12,6 +18,14 @@ void create(void|string s)
   index = 0;
 }
 
+/* Return data, without removing it */
+string contents()
+{
+  buffer = buffer[index..];
+  index = 0;
+  return buffer;
+}
+
 void add_data(string s)
 {
   buffer += s;
@@ -23,46 +37,53 @@ string pop_data()
   create();
   return res;
 }
-  
-void put_int(int i, int len)
+
+void put_uint(int i, int len)
 {
+  if (i<0)
+    error("ADT.struct->put_uint: negative argument.\n");
+  
   add_data(sprintf("%*c", len, i));
 }
 
 void put_var_string(string s, int len)
 {
-  put_int(strlen(s), len);
+  if ( (len <= 3) && (strlen(s) >= ({ -1, 0x100, 0x10000, 0x1000000 })[len] ))
+    error("ADT.struct->put_var_string: Field overflow.\n");
+  put_uint(strlen(s), len);
   add_data(s);
 }
 
+void put_bignum(object i, int|void len)
+{
+  if (i<0)
+    error("ADT.struct->put_bignum: negative argument.\n");
+  put_var_string(i->digits(256), len || 2);
+}
+
 void put_fix_string(string s)
 {
   add_data(s);
 }
 
-void put_fix_array(array(int) data, int item_size)
+void put_fix_uint_array(array(int) data, int item_size)
 {
   foreach(data, int i)
-    put_int(i, item_size);
+    put_uint(i, item_size);
 }
 
-void put_var_array(array(int) data, int item_size, int len)
+void put_var_uint_array(array(int) data, int item_size, int len)
 {
-  put_int(sizeof(data), len);
-  put_fix_array(data, item_size);
+  put_uint(sizeof(data), len);
+  put_fix_uint_array(data, item_size);
 }
 
-mixed get_int(int len)
+int get_uint(int len)
 {
   mixed i;
   if ( (strlen(buffer) - index) < len)
-    throw( ({ "SSL.struct->get_int: no data\n", backtrace() }) );
-  if (len <= 3)
-  {
-    sscanf(buffer, "%*" + (string) index +"s%" + (string) len + "c", i);
-  }
-  else
-    i = Gmp.mpz(buffer[index .. index+len-1], 256);
+    error("ADT.struct->get_uint: no data\n");
+  sscanf(buffer, "%*" + (string) index +"s%" + (string) len + "c", i);
   index += len;
   return i;
 }
@@ -72,7 +93,7 @@ string get_fix_string(int len)
   string res;
   
   if ((strlen(buffer) - index) < len)
-    throw( ({ "SSL.struct->get_fix_string: no data\n", backtrace() }) );
+    error("ADT.struct->get_fix_string: no data\n");
   res = buffer[index .. index + len - 1];
   index += len;
   return res;
@@ -80,81 +101,36 @@ string get_fix_string(int len)
 
 string get_var_string(int len)
 {
-  return get_fix_string(get_int(len));
+  return get_fix_string(get_uint(len));
 }
 
-array(mixed) get_fix_array(int item_size, int size)
+object get_bignum(int|void len)
 {
-  array(mixed) res = allocate(size);
-  for(int i = 0; i<size; i++)
-    res[i] = get_int(item_size);
-  return res;
+  return Gmp.mpz(get_var_string(len || 2), 256);
 }
 
-array(mixed) get_var_array(int item_size, int len)
+string get_rest()
 {
-  return get_fix_array(item_size, get_int(len));
+  string s = buffer[index..];
+  create();
+  return s;
 }
 
-int is_empty()
+array(mixed) get_fix_uint_array(int item_size, int size)
 {
-  return (index == strlen(buffer));
+  array(mixed) res = allocate(size);
+  for(int i = 0; i<size; i++)
+    res[i] = get_uint(item_size);
+  return res;
 }
-	       
-#if 0
 
-constant FIELD_int = 1;
-constant FIELD_string = 2;
-
-class field
+array(mixed) get_var_uint_array(int item_size, int len)
 {
-  string name;  /* Name of field */
-  int type;
-  int len;      /* For integers: length,
-		 * for strings: index to the field that holds the length */
+  return get_fix_uint_array(item_size, get_uint(len));
 }
 
-
-
-array(object(field)) description;
-array(function) conversions;
-
-class parser
+int is_empty()
 {
-  string buffer = "";
-  object info;
-  int field; /* Field being read */
-  object o; /* The object to fill in */
-  object me;
-
-  mapping(int:function(string, object:void)) conversions;
-
-  create(object i)
-  {
-    info = i;
-    o = i->prog();
-    me = this_object();
-  }
-  
-  object|string recv(string data)
-  {
-    buffer += data;
-    while(strlen(buffer) >= info->needed_chars[field])
-    {
-      object err;
-      if (err = info->conversions[field](me))
-	return err;
-      field++;
-      if (field >= sizeof(info->description))
-	return buffer[info->needed_chars[field-1]..];
-    }
-    return 0;
-  }
+  return (index == strlen(buffer));
 }
 
-array compile()
-{
-  conversions = 
-
-
-#endif
diff --git a/lib/modules/Standards.pmod/ASN1.pmod/decode.pike b/lib/modules/Standards.pmod/ASN1.pmod/decode.pike
index ded17b5530..5f55aa4e57 100644
--- a/lib/modules/Standards.pmod/ASN1.pmod/decode.pike
+++ b/lib/modules/Standards.pmod/ASN1.pmod/decode.pike
@@ -2,7 +2,7 @@
  *
  * Rudimentary support for decoding ASN.1 encoded data.
  *
- * $Id: decode.pike,v 1.1 1997/11/30 11:36:37 nisse Exp $
+ * $Id: decode.pike,v 1.2 1998/04/21 21:20:35 nisse Exp $
  */
 
 /* BER/DER decoder
@@ -17,7 +17,7 @@ inherit ADT.struct;
 
 array get_asn1()
 {
-  int|string tag = get_int(1);
+  int|string tag = get_uint(1);
   int len;
   string contents;
   mixed value;
@@ -27,9 +27,9 @@ array get_asn1()
 #endif
   if ( (tag & 0x1f) == 0x1f)
     throw( ({ "high tag numbers is not supported\n", backtrace() }) );
-  int len = get_int(1);
+  int len = get_uint(1);
   if (len & 0x80)
-    len = get_int(len & 0x7f);
+    len = get_uint(len & 0x7f);
     
 #ifdef SSL3_DEBUG
   werror(sprintf("len : %d\n", len));
diff --git a/lib/modules/Standards.pmod/PKCS.pmod/RSA.pmod b/lib/modules/Standards.pmod/PKCS.pmod/RSA.pmod
index 3a91b37aff..66fa2a1600 100644
--- a/lib/modules/Standards.pmod/PKCS.pmod/RSA.pmod
+++ b/lib/modules/Standards.pmod/PKCS.pmod/RSA.pmod
@@ -14,8 +14,9 @@ import Standards.ASN1.Encode;
 string rsa_private_key(object rsa)
 {
   return asn1_sequence(@ Array.map(
-    ({ 0, rsa->n, rsa->e, rsa->d, rsa->p, rsa->q,
-       rsa->d % (rsa->p - 1), rsa->d, (rsa->q -1),
+    ({ 0, rsa->n, rsa->e, rsa->d,
+       rsa->p, rsa->q,
+       rsa->d % (rsa->p - 1), rsa->d % (rsa->q -1),
        rsa->q->invert(rsa->p) % rsa->p
     }),
     asn1_integer))->der();
@@ -30,7 +31,7 @@ object parse_private_key(string key)
   WERROR(sprintf("rsa->parse_private_key: asn1 = %O\n", a));
   if (!a
       || (a[0] != "SEQUENCE")
-      || (sizeof(a[1]) != 10)
+      || (sizeof(a[1]) != 9)
       || (sizeof(column(a[1], 0) - ({ "INTEGER" })))
       || a[1][0][1])
     return 0;
-- 
GitLab