summaryrefslogtreecommitdiff
path: root/source3/libsmb/asn1.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2001-10-17 08:54:19 +0000
committerAndrew Tridgell <tridge@samba.org>2001-10-17 08:54:19 +0000
commitb728042334f67738fd1a6fdd03e619bdb78fe06a (patch)
tree2ae5e7d47a8c6f67789f671bc4ea3ea4a4546d72 /source3/libsmb/asn1.c
parentd731149a41d7563ab99acd3d3d20fff899e7de8f (diff)
downloadsamba-b728042334f67738fd1a6fdd03e619bdb78fe06a.tar.gz
samba-b728042334f67738fd1a6fdd03e619bdb78fe06a.tar.bz2
samba-b728042334f67738fd1a6fdd03e619bdb78fe06a.zip
added basic NTLMSSP support in smbd. This is still quite rough, and
loses things like username mapping. I wanted to get this in then discuss it a bit to see how we want to split up the existing session setup code (This used to be commit b74fda69bf23207c26d8b2af23910d8f2eb89875)
Diffstat (limited to 'source3/libsmb/asn1.c')
-rw-r--r--source3/libsmb/asn1.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/source3/libsmb/asn1.c b/source3/libsmb/asn1.c
index e72da897b9..59763408cf 100644
--- a/source3/libsmb/asn1.c
+++ b/source3/libsmb/asn1.c
@@ -87,13 +87,18 @@ BOOL asn1_pop_tag(ASN1_DATA *data)
/* yes, this is ugly. We don't know in advance how many bytes the length
of a tag will take, so we assumed 1 byte. If we were wrong then we
need to correct our mistake */
- if (len > 127) {
+ if (len > 255) {
data->data[nesting->start] = 0x82;
if (!asn1_write_uint8(data, 0)) return False;
if (!asn1_write_uint8(data, 0)) return False;
memmove(data->data+nesting->start+3, data->data+nesting->start+1, len);
data->data[nesting->start+1] = len>>8;
data->data[nesting->start+2] = len&0xff;
+ } else if (len > 127) {
+ data->data[nesting->start] = 0x81;
+ if (!asn1_write_uint8(data, 0)) return False;
+ memmove(data->data+nesting->start+2, data->data+nesting->start+1, len);
+ data->data[nesting->start+1] = len;
} else {
data->data[nesting->start] = len;
}
@@ -203,14 +208,16 @@ BOOL asn1_start_tag(ASN1_DATA *data, uint8 tag)
asn1_read_uint8(data, &b);
if (b & 0x80) {
int n = b & 0x7f;
- if (n != 2) {
+ if (n > 2) {
data->has_error = True;
return False;
}
asn1_read_uint8(data, &b);
- nesting->taglen = b<<8;
- asn1_read_uint8(data, &b);
- nesting->taglen |= b;
+ nesting->taglen = b;
+ if (n == 2) {
+ asn1_read_uint8(data, &b);
+ nesting->taglen = (nesting->taglen << 8) | b;
+ }
} else {
nesting->taglen = b;
}
@@ -320,7 +327,7 @@ BOOL asn1_read_GeneralString(ASN1_DATA *data, char **s)
}
/* read a octet string blob */
-BOOL asn1_read_octet_string(ASN1_DATA *data, DATA_BLOB *blob)
+BOOL asn1_read_OctetString(ASN1_DATA *data, DATA_BLOB *blob)
{
int len;
if (!asn1_start_tag(data, ASN1_OCTET_STRING)) return False;
@@ -345,3 +352,12 @@ BOOL asn1_check_enumerated(ASN1_DATA *data, int v)
asn1_end_tag(data);
return !data->has_error && (v == b);
}
+
+/* check a enumarted value is correct */
+BOOL asn1_write_enumerated(ASN1_DATA *data, uint8 v)
+{
+ if (!asn1_push_tag(data, ASN1_ENUMERATED)) return False;
+ asn1_write_uint8(data, v);
+ asn1_pop_tag(data);
+ return !data->has_error;
+}