@@ -664,11 +664,13 @@ TestTHash_Sapphire = class(THash_TestBaseExtended)
664664 TestTHash_BCrypt = class (THash_TestPasswordBase)
665665 private
666666 type
667+ // Extract only the interesting parts
667668 TBCryptBSDTestData = record
668- Password : string;
669669 Salt : RawByteString;
670670 Cost : UInt8;
671671 end ;
672+
673+ function SplitTestVector (Vector: string):TBCryptBSDTestData;
672674 protected
673675 procedure ConfigHashClass (aHashClass: TDECHash; aIdxTestData:Integer); override;
674676 public
@@ -6206,6 +6208,15 @@ procedure TestTHash_BCrypt.SetUp;
62066208 lDataRow.AddInputVector(' ~!@#$%^&*() ~!@#$%^&*()PNBFRD' );
62076209end ;
62086210
6211+ function TestTHash_BCrypt.SplitTestVector (Vector: string): TBCryptBSDTestData;
6212+ var
6213+ Parts : TArray<string>;
6214+ begin
6215+ Parts := Vector.Split([' $' ]);
6216+ Result.Cost := Copy(Parts[2 ], Low(Parts[2 ]), Length(Parts[2 ])).ToInteger;
6217+ Result.Salt := Copy(Parts[3 ], Low(Parts[3 ]), 22 );
6218+ end ;
6219+
62096220procedure TestTHash_BCrypt.TestBlockSize ;
62106221begin
62116222 CheckEquals(8 , FHash.BlockSize);
@@ -6227,21 +6238,58 @@ procedure TestTHash_BCrypt.TestCostFactorTooShortException;
62276238end ;
62286239
62296240procedure TestTHash_BCrypt.TestCryptBSDFormat ;
6241+ type
6242+ TPair = record
6243+ pn: byte;
6244+ bs: string[60 ];
6245+ end ;
6246+ const
6247+ PW: array [0 ..4 ] of string[40 ] = (' ' , ' a' , ' abc' ,
6248+ ' abcdefghijklmnopqrstuvwxyz' , ' ~!@#$%^&*() ~!@#$%^&*()PNBFRD' );
6249+ const
6250+ // Source of test data: Wolfgang Erhardt's implementation. pn is the index
6251+ // into PW
6252+ TestData: array [1 ..20 ] of TPair = (
6253+ (pn: 0 ; bs: ' $2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.' ),
6254+ (pn: 0 ; bs: ' $2a$08$HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUtye' ),
6255+ (pn: 0 ; bs: ' $2a$10$k1wbIrmNyFAPwPVPSVa/zecw2BCEnBwVS2GbrmgzxFUOqW9dk4TCW' ),
6256+ (pn: 0 ; bs: ' $2a$12$k42ZFHFWqBp3vWli.nIn8uYyIkbvYRvodzbfbK18SSsY.CsIQPlxO' ),
6257+ (pn: 1 ; bs: ' $2a$06$m0CrhHm10qJ3lXRY.5zDGO3rS2KdeeWLuGmsfGlMfOxih58VYVfxe' ),
6258+ (pn: 1 ; bs: ' $2a$08$cfcvVd2aQ8CMvoMpP2EBfeodLEkkFJ9umNEfPD18.hUF62qqlC/V.' ),
6259+ (pn: 1 ; bs: ' $2a$10$k87L/MF28Q673VKh8/cPi.SUl7MU/rWuSiIDDFayrKk/1tBsSQu4u' ),
6260+ (pn: 1 ; bs: ' $2a$12$8NJH3LsPrANStV6XtBakCez0cKHXVxmvxIlcz785vxAIZrihHZpeS' ),
6261+ (pn: 2 ; bs: ' $2a$06$If6bvum7DFjUnE9p2uDeDu0YHzrHM6tf.iqN8.yx.jNN1ILEf7h0i' ),
6262+ (pn: 2 ; bs: ' $2a$08$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm' ),
6263+ (pn: 2 ; bs: ' $2a$10$WvvTPHKwdBJ3uk0Z37EMR.hLA2W6N9AEBhEgrAOljy2Ae5MtaSIUi' ),
6264+ (pn: 2 ; bs: ' $2a$12$EXRkfkdmXn2gzds2SSitu.MW9.gAVqa9eLS1//RYtYCmB1eLHg.9q' ),
6265+ (pn: 3 ; bs: ' $2a$06$.rCVZVOThsIa97pEDOxvGuRRgzG64bvtJ0938xuqzv18d3ZpQhstC' ),
6266+ (pn: 3 ; bs: ' $2a$08$aTsUwsyowQuzRrDqFflhgekJ8d9/7Z3GV3UcgvzQW3J5zMyrTvlz.' ),
6267+ (pn: 3 ; bs: ' $2a$10$fVH8e28OQRj9tqiDXs1e1uxpsjN0c7II7YPKXua2NAKYvM6iQk7dq' ),
6268+ (pn: 3 ; bs: ' $2a$12$D4G5f18o7aMMfwasBL7GpuQWuP3pkrZrOAnqP.bmezbMng.QwJ/pG' ),
6269+ (pn: 4 ; bs: ' $2a$06$fPIsBO8qRqkjj273rfaOI.HtSV9jLDpTbZn782DC6/t7qT67P6FfO' ),
6270+ (pn: 4 ; bs: ' $2a$08$Eq2r4G/76Wv39MzSX262huzPz612MZiYHVUJe/OcOql2jo4.9UxTW' ),
6271+ (pn: 4 ; bs: ' $2a$10$LgfYWkbzEvQ4JakH7rOvHe0y8pHKF9OaFgwUZ2q7W2FFZmZzJYlfS' ),
6272+ (pn: 4 ; bs: ' $2a$12$WApznUOJfkEGSmYRfnkrPOr466oFDCaj4b6HY3EXGvfxm43seyhgC' ));
6273+
62306274var
62316275 BCrypt : THash_BCrypt;
62326276 Result : string;
6277+ i : Integer;
6278+ SplitData :TBCryptBSDTestData;
62336279begin
62346280 BCrypt := THash_BCrypt(FHash);
6235- BCrypt.Cost := 6 ;
6236- BCrypt.Salt := TFormat_BCryptBSD.Decode(BytesOf(' DCq7YPn5Rq63x1Lad4cll.' ));
62376281
6238- Result := string(BCrypt.GetDigestInCryptFormat(' ' , TFormat_BCryptBSD));
6239-
6240- CheckEquals(' $2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.' , Result);
6282+ for i := Low(TestData) to High(TestData) do
6283+ begin
6284+ SplitData := SplitTestVector(TestData[i].bs);
6285+ BCrypt.Cost := SplitData.Cost;
6286+ BCrypt.Salt := TFormat_BCryptBSD.Decode(BytesOf(SplitData.Salt));
62416287
6288+ Result := string(BCrypt.GetDigestInCryptFormat(
6289+ RawByteString(PW[TestData[i].pn]), TFormat_BCryptBSD));
62426290
6243- // function TDECPasswordHash.GetDigestInCryptFormat(Password : RawByteString ;
6244- // Format : TDECFormatClass): RawByteString ;
6291+ CheckEquals(TestData[i].bs, Result) ;
6292+ end ;
62456293end ;
62466294
62476295procedure TestTHash_BCrypt.TestDigestSize ;
0 commit comments