summaryrefslogtreecommitdiff
path: root/source4/libcli/util/smbdes.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/libcli/util/smbdes.c')
-rw-r--r--source4/libcli/util/smbdes.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/source4/libcli/util/smbdes.c b/source4/libcli/util/smbdes.c
index d282b0135a..80b938b460 100644
--- a/source4/libcli/util/smbdes.c
+++ b/source4/libcli/util/smbdes.c
@@ -357,7 +357,8 @@ void cred_hash3(unsigned char *out, unsigned char *in, const unsigned char *key,
smbhash(out + 8, in + 8, key2, forw);
}
-void SamOEMhash( unsigned char *data, const unsigned char *key, int val)
+
+void SamOEMhashBlob(unsigned char *data, int len, const DATA_BLOB *key)
{
unsigned char s_box[256];
unsigned char index_i = 0;
@@ -369,23 +370,22 @@ void SamOEMhash( unsigned char *data, const unsigned char *key, int val)
s_box[ind] = (unsigned char)ind;
}
- for( ind = 0; ind < 256; ind++) {
+ for (ind = 0; ind < 256; ind++) {
unsigned char tc;
-
- j += (s_box[ind] + key[ind%16]);
-
+
+ j += (s_box[ind] + key->data[ind%key->length]);
+
tc = s_box[ind];
s_box[ind] = s_box[j];
s_box[j] = tc;
}
-
- for (ind = 0; ind < val; ind++){
+ for (ind = 0; ind < len; ind++) {
unsigned char tc;
unsigned char t;
index_i++;
index_j += s_box[index_i];
-
+
tc = s_box[index_i];
s_box[index_i] = s_box[index_j];
s_box[index_j] = tc;
@@ -395,6 +395,20 @@ void SamOEMhash( unsigned char *data, const unsigned char *key, int val)
}
}
+/*
+ a varient that assumes a 16 byte key. This should be removed
+ when the last user is gone
+*/
+void SamOEMhash(unsigned char *data, const unsigned char keystr[16], int len)
+{
+ DATA_BLOB key;
+
+ key.length = 16;
+ key.data = keystr;
+
+ SamOEMhashBlob(data, len, &key);
+}
+
/* Decode a sam password hash into a password. The password hash is the
same method used to store passwords in the NT registry. The DES key