testpass.pp 2.1 KB

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