Skip to content
Snippets Groups Projects
Commit df355131 authored by Niels Möller's avatar Niels Möller
Browse files

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
parent a9f7d6b3
No related branches found
No related tags found
No related merge requests found
...@@ -19,7 +19,6 @@ testfont binary ...@@ -19,7 +19,6 @@ testfont binary
/bin/test_pike.pike foreign_ident /bin/test_pike.pike foreign_ident
/lib/master.pike foreign_ident /lib/master.pike foreign_ident
/lib/modules/ADT.pmod/queue.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.pike foreign_ident
/lib/modules/Crypto/des3_cbc.pike foreign_ident /lib/modules/Crypto/des3_cbc.pike foreign_ident
/lib/modules/Crypto/des_cbc.pike foreign_ident /lib/modules/Crypto/des_cbc.pike foreign_ident
......
/* $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; string buffer;
int index; int index;
...@@ -12,6 +18,14 @@ void create(void|string s) ...@@ -12,6 +18,14 @@ void create(void|string s)
index = 0; index = 0;
} }
/* Return data, without removing it */
string contents()
{
buffer = buffer[index..];
index = 0;
return buffer;
}
void add_data(string s) void add_data(string s)
{ {
buffer += s; buffer += s;
...@@ -24,45 +38,52 @@ string pop_data() ...@@ -24,45 +38,52 @@ string pop_data()
return res; 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)); add_data(sprintf("%*c", len, i));
} }
void put_var_string(string s, int len) 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); 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) void put_fix_string(string s)
{ {
add_data(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) 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_uint(sizeof(data), len);
put_fix_array(data, item_size); put_fix_uint_array(data, item_size);
} }
mixed get_int(int len) int get_uint(int len)
{ {
mixed i; mixed i;
if ( (strlen(buffer) - index) < len) if ( (strlen(buffer) - index) < len)
throw( ({ "SSL.struct->get_int: no data\n", backtrace() }) ); error("ADT.struct->get_uint: no data\n");
if (len <= 3)
{
sscanf(buffer, "%*" + (string) index +"s%" + (string) len + "c", i); sscanf(buffer, "%*" + (string) index +"s%" + (string) len + "c", i);
}
else
i = Gmp.mpz(buffer[index .. index+len-1], 256);
index += len; index += len;
return i; return i;
} }
...@@ -72,7 +93,7 @@ string get_fix_string(int len) ...@@ -72,7 +93,7 @@ string get_fix_string(int len)
string res; string res;
if ((strlen(buffer) - index) < len) 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]; res = buffer[index .. index + len - 1];
index += len; index += len;
return res; return res;
...@@ -80,81 +101,36 @@ string get_fix_string(int len) ...@@ -80,81 +101,36 @@ string get_fix_string(int len)
string get_var_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); return Gmp.mpz(get_var_string(len || 2), 256);
for(int i = 0; i<size; i++)
res[i] = get_int(item_size);
return res;
} }
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);
#if 0 return res;
constant FIELD_int = 1;
constant FIELD_string = 2;
class field
{
string name; /* Name of field */
int type;
int len; /* For integers: length,
* for strings: index to the field that holds the length */
} }
array(mixed) get_var_uint_array(int item_size, int len)
array(object(field)) description;
array(function) conversions;
class parser
{ {
string buffer = ""; return get_fix_uint_array(item_size, get_uint(len));
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) int is_empty()
{
buffer += data;
while(strlen(buffer) >= info->needed_chars[field])
{ {
object err; return (index == strlen(buffer));
if (err = info->conversions[field](me))
return err;
field++;
if (field >= sizeof(info->description))
return buffer[info->needed_chars[field-1]..];
}
return 0;
}
} }
array compile()
{
conversions =
#endif
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* Rudimentary support for decoding ASN.1 encoded data. * 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 /* BER/DER decoder
...@@ -17,7 +17,7 @@ inherit ADT.struct; ...@@ -17,7 +17,7 @@ inherit ADT.struct;
array get_asn1() array get_asn1()
{ {
int|string tag = get_int(1); int|string tag = get_uint(1);
int len; int len;
string contents; string contents;
mixed value; mixed value;
...@@ -27,9 +27,9 @@ array get_asn1() ...@@ -27,9 +27,9 @@ array get_asn1()
#endif #endif
if ( (tag & 0x1f) == 0x1f) if ( (tag & 0x1f) == 0x1f)
throw( ({ "high tag numbers is not supported\n", backtrace() }) ); throw( ({ "high tag numbers is not supported\n", backtrace() }) );
int len = get_int(1); int len = get_uint(1);
if (len & 0x80) if (len & 0x80)
len = get_int(len & 0x7f); len = get_uint(len & 0x7f);
#ifdef SSL3_DEBUG #ifdef SSL3_DEBUG
werror(sprintf("len : %d\n", len)); werror(sprintf("len : %d\n", len));
......
...@@ -14,8 +14,9 @@ import Standards.ASN1.Encode; ...@@ -14,8 +14,9 @@ import Standards.ASN1.Encode;
string rsa_private_key(object rsa) string rsa_private_key(object rsa)
{ {
return asn1_sequence(@ Array.map( return asn1_sequence(@ Array.map(
({ 0, rsa->n, rsa->e, rsa->d, rsa->p, rsa->q, ({ 0, rsa->n, rsa->e, rsa->d,
rsa->d % (rsa->p - 1), rsa->d, (rsa->q -1), rsa->p, rsa->q,
rsa->d % (rsa->p - 1), rsa->d % (rsa->q -1),
rsa->q->invert(rsa->p) % rsa->p rsa->q->invert(rsa->p) % rsa->p
}), }),
asn1_integer))->der(); asn1_integer))->der();
...@@ -30,7 +31,7 @@ object parse_private_key(string key) ...@@ -30,7 +31,7 @@ object parse_private_key(string key)
WERROR(sprintf("rsa->parse_private_key: asn1 = %O\n", a)); WERROR(sprintf("rsa->parse_private_key: asn1 = %O\n", a));
if (!a if (!a
|| (a[0] != "SEQUENCE") || (a[0] != "SEQUENCE")
|| (sizeof(a[1]) != 10) || (sizeof(a[1]) != 9)
|| (sizeof(column(a[1], 0) - ({ "INTEGER" }))) || (sizeof(column(a[1], 0) - ({ "INTEGER" })))
|| a[1][0][1]) || a[1][0][1])
return 0; return 0;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment