home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 21
/
CD_ASCQ_21_040595.iso
/
dos
/
prg
/
pas
/
nwtp06
/
nwpn9401.txt
< prev
next >
Wrap
Text File
|
1995-03-01
|
7KB
|
200 lines
NWTP Note 0501 "About the encryption mechanism"
This note discribes the password encryption mechanisms as used by Novell
Netware 3.x/4.x. Passwords are encrypted by workstations
and servers. The password verification process is also based on encryption.
This note describes the entire process of password verification and
password change. It has 3 appendices:
1. A description of the ASM calls involved with encrypted passwords;
2. Sourcecode of the encryption routines and tables in Turbo Pascal;
3. Sourcecode of the encryption routines and tables in C.
Initial state
=============
Our transaction model starts with a description of the initial state
of the server.
The following tables are stored at the server:
-The EncryptionKeyTable, containing an 8 byte EncryptionKey for
every workstation connection. This table can be queried by
workstations using the GetEncryptionKey (INT 21h, AX=F217h, subf. 17h).
Table entry [c] is renewed whenever connection c used a call using
encrypted passwords.
-The PasswordTable containing an 16 Byte encrypted password
(socalled "Shuffled" Password) for every connection.
A short description of the various encryption mechanisms involved:
-Shuffling. ('S' for short)
The encryption of the password (string of char) into 16 bytes (the
shuffled password), using a number of static tables and the objectID
of the object the password is associated with.
In Mathematical terms:
ShuffledPassWord=S(PasswordString) or Spw=S(pw)
-Encryption ('E' for short)
The main encryption process, encrypting the shuffled password (S(pw)
for short) into 8 bytes, using the same static tables as the Shuffling
functions and a dynamic encryption key requested from the server.
In mathematical terms:
EncryptedPassWord=E(EncryptionKey,ShuffledPassword) or Epw=E(Ekey,Spw)
-EncryptDifference ('D' for short)
Encrypts the 'difference' between the Shuffled old password and the
Shuffled new password, using a static table. The encrypted difference
is passed to the server. The computed 'difference' consist of
16 bytes of data and 1 checksum byte.
In mathematical terms:
PasswordDiff=D(ShuffledOldPW,ShuffledNewPW) or pwDiff=D(SOpw,SNpw)
-DecryptDifference ('Dinv' for short)
Server decryption process. Decrypts a 'password-difference'
encrypted block as suplied by a workstation to a shuffled version
of the new password. The shuffled old password, as stored in the
servers' EncryptionKeyTable is used in the decryption process.
In mathematical terms:
ShuffledNewPW=Dinv(ShuffledOldPW,PasswordDiff) or SNpw=Dinv(SOpw,pwDiff)
Notes:-ShuffledOldPassword is taken by the server from its'
EncryptionKeyTable, i.e. ShuffledOldPassword=EncryptionKeyTable[c]
where c is the connection number of the object the password
is associated with.
-SNpw=Dinv(SOpw,D(SNpw,Opw)), hence the name "D inverse".
-GenerateNewKey ('GNK' for short)
The server process creating a new encryption key for a certain
connection after the previous one has been used by that connection.
In mathematical terms:
EncryptionKeyTable[c]:=GenerateNewKey(EncryptionTable[c])
Password Verification
=====================
Password verification procedure when the encrypted password calls
(VerifyEncrBinderyObjectPassword and LoginEncrToFileServer)
are used:
Workstation Server
=========== ======
GetEncryptionKey ----------------> Return EncryptionKeyTable[c]
EncrKey <---------------------
Epw:=E(EncrKey,S(pw))
Verify/Login(Epw) ---------------> Epw'=E(EncryptionKeyTable[c],
PasswordTable[c])
Epw'=Epw ?
completion code <--------------------
EncryptionKeyTable[c]=
GNK(EncryptionKeyTable[c])
Note: c = Workstation connection number
pw = Password (string, max. 128 characters)
Epw= Encrypted Password (8 bytes)
Password verification procedure when the calls using unencrypted
passwords (VerifyBinderyObjectPassword and LoginToFileserver)
are used in combination with a 3.x server:
Workstation Server
=========== ======
Verify/Login(pw) ---------------->
S(pw)=PasswordTable[c] ?
completion code <--------------------
EncryptionKeyTable[c]=
GNK(EncryptionKeyTable[c])
Note: c = Workstation connection number
pw = Password (string, max. 128 characters)
Changing Passwords
==================
The process of changeing a password using encrypted passwords:
Workstation Server
=========== ======
GetEncryptionKey ----------------> Return EncryptionKeyTable[c]
EncrKey <---------------------
SOpw=S(oldPW)
SNpw=S(newPW)
EOpw=E(encrKey,SOpw)
PWdif=D(SNpw,SOpw)
ChangeEncrBinderyObjPW
(EOpw,PWdiff)
--------------> Epw'=E(EncryptionKeyTable[c],
PasswordTable[c])
Epw'=Epw ?
completion code <--------------------
SNpw'=Dinv(PasswordTable[c],
PWdiff)
PasswordTable[c]=SNpw'
EncryptionKeyTable[c]=
GNK(EncryptionKeyTable[c])
Note: c = Workstation connection number
OldPW = Old password (string, max. 128 characters)
NewPW = New password (string, max. 128 characters)
SNpw = Shuffled new password (12 bytes)
SOpw = Shuffled old password (12 bytes)
EOpw = Encrypted old Password (8 bytes)
THe process of chageing a password when using unencrypted passwords:
Workstation Server
=========== ======
ChangeBinderyObjPW
(OldPW,NewPW)
-------------->
S(OldPW)=PasswordTable[c] ?
completion code <--------------------
PasswordTable[c]=S(NewPW)
EncryptionKeyTable[c]=
GNK(EncryptionKeyTable[c])
Note: c = Workstation connection number
OldPW = Old password (string, max. 128 characters)
NewPW = New password (string, max. 128 characters)
Sources: NVPW.C by Itsme [Itsme@Hacktic.nl]
LOGON.PAS by Barry Nance/Terje Mathesen, Byte, March 1993.