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
/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
......
/* $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;
......@@ -24,45 +38,52 @@ string pop_data()
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)
{
error("ADT.struct->get_uint: no data\n");
sscanf(buffer, "%*" + (string) index +"s%" + (string) len + "c", i);
}
else
i = Gmp.mpz(buffer[index .. index+len-1], 256);
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));
}
#if 0
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) res = allocate(size);
for(int i = 0; i<size; i++)
res[i] = get_uint(item_size);
return res;
}
array(object(field)) description;
array(function) conversions;
class parser
array(mixed) get_var_uint_array(int item_size, int len)
{
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();
return get_fix_uint_array(item_size, get_uint(len));
}
object|string recv(string data)
{
buffer += data;
while(strlen(buffer) >= info->needed_chars[field])
int is_empty()
{
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
......@@ -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));
......
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment