2
0

testpass.pp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. Program TestPass;
  2. {$mode delphi}
  3. {Test the user's password}
  4. {$DEFINE DEBUG}
  5. // The funcs in shadow are linux only.
  6. uses {$ifdef linux}shadow, {$endif} pwd ,crypth ;
  7. Var
  8. strUserName, Password : String;
  9. sEntry : PPasswordFileEntry;
  10. pEntry : PPasswd;
  11. Const
  12. Err_NoErr = 0;
  13. Err_NoUser = 1;
  14. Err_WrongPass = 2;
  15. NoUser = '*NO USER*';
  16. Function UserEncPass(User: String): String;
  17. Var
  18. A : Array[0..255] of char;
  19. Begin
  20. A := strUserName;
  21. {$IFDEF DEBUG}
  22. Writeln('User name is ',A);
  23. {$ENDIF}
  24. sEntry := getspnam(A);
  25. If sEntry = nil then
  26. Begin
  27. {$IFDEF DEBUG}
  28. Writeln('No shadow entry');
  29. {$ENDIF}
  30. pEntry := fpgetpwnam(A);
  31. If pEntry = nil then
  32. Begin
  33. {$IFDEF DEBUG}
  34. Writeln('No passwd entry');
  35. {$ENDIF}
  36. UserEncPass := NoUser
  37. End
  38. End;
  39. if sEntry <> nil then UserEncPass := sEntry^.sp_pwdp;
  40. if pEntry <> nil then UserEncPass := pEntry^.pw_passwd
  41. End;
  42. Function CheckPass(User, Pass: String): Integer;
  43. Var
  44. EncPass, ResultPass, SSalt : String;
  45. PCPass, PCSalt, PCResult : Array[0..255] of Char;
  46. I : Integer;
  47. Begin
  48. EncPass := UserEncPass(User);
  49. {$IFDEF DEBUG}
  50. Writeln('Encrypted PW is : ',EncPass);
  51. {$ENDIF}
  52. If EncPass = NoUser then
  53. Begin
  54. CheckPass := Err_NoUser;
  55. {$IFDEF DEBUG}
  56. Writeln('No user named ',User,'.');
  57. {$ENDIF}
  58. Exit
  59. End;
  60. PCPass := Pass;
  61. If Copy(EncPass,1,3) = '$1$' then
  62. Begin
  63. I := 4;
  64. SSalt := '$1$';
  65. Repeat
  66. SSalt := SSalt + EncPass[I];
  67. Inc(I)
  68. Until EncPass[I] = '$';
  69. PCSalt := SSalt
  70. End
  71. else
  72. PCSalt := Copy(EncPass,1,2);
  73. {$IFDEF DEBUG}
  74. Writeln('Salt is : ',PCSalt);
  75. {$ENDIF}
  76. PCResult := crypt(PCPass, PCSalt);
  77. ResultPass := PCResult;
  78. {$IFDEF DEBUG}
  79. Writeln('From passwd/shadow : ',EncPass);
  80. Writeln('From crypt : ',ResultPass);
  81. {$ENDIF}
  82. If ResultPass = EncPass then
  83. CheckPass := Err_NoErr
  84. else
  85. CheckPass := Err_WrongPass
  86. End;
  87. Begin
  88. Write('User name : ');
  89. Readln(strUserName);
  90. Write('Password : ');
  91. Readln(Password);
  92. If CheckPass(strUserName, Password) = Err_NoErr then
  93. Writeln('User authentication succeeded')
  94. else
  95. Writeln('User autentication failed.');
  96. End.