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