Skip to content

Commit 919ba02

Browse files
Reduce memory allocations (#59)
* Remove StringBuilder from DecodeBase64 * benchmarks * Replace Regular Expressions with custom hash parser (#57) * Change EncodeBase64 to return char array (#55) * Allocation reduction Co-authored-by: Jos van der Til <jvandertil@users.noreply.github.com>
1 parent 43c225a commit 919ba02

26 files changed

Lines changed: 3947 additions & 136 deletions

src/BCrypt.Net.MainPackage/BCrypt.Net.Package.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
<Version>3.2.1</Version>
2626
<PackageTags>bcrypt;BCrypt.Net;cryptography;hashing;password;security,hash;crypto;blowfish;gdpr</PackageTags>
27+
<Configurations>Debug;Release;Benchmark</Configurations>
2728
</PropertyGroup>
2829

2930
<PropertyGroup>
@@ -71,4 +72,8 @@
7172
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\BCrypt.Net-Next.xml</DocumentationFile>
7273
</PropertyGroup>
7374

75+
<PropertyGroup Condition="'$(Configuration)'=='Benchmark'">
76+
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\BCrypt.Net-Next.xml</DocumentationFile>
77+
</PropertyGroup>
78+
7479
</Project>

src/BCrypt.Net.StrongName/BCrypt.Net.StrongName.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
<Version>3.2.1</Version>
2626
<PackageTags>bcrypt;BCrypt.Net;cryptography;hashing;password;security,hash;crypto;blowfish;gdpr</PackageTags>
27+
<Configurations>Debug;Release;Benchmark</Configurations>
2728
</PropertyGroup>
2829

2930
<PropertyGroup>
@@ -71,4 +72,8 @@
7172
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\BCrypt.Net-Next.xml</DocumentationFile>
7273
</PropertyGroup>
7374

75+
<PropertyGroup Condition="'$(Configuration)'=='Benchmark'">
76+
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\BCrypt.Net-Next.xml</DocumentationFile>
77+
</PropertyGroup>
78+
7479
</Project>

src/BCrypt.Net.UnitTests/BCrypt.Net.UnitTests.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,17 @@
44
<AssemblyName>BCrypt.Net.UnitTests</AssemblyName>
55
<PackageId>BCrypt.Net.UnitTests</PackageId>
66
<TargetFramework>netcoreapp3.1</TargetFramework>
7+
<Configurations>Debug;Release;Benchmark</Configurations>
78
</PropertyGroup>
89

910
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
1011
<NoWarn>1701;1702;CS1591</NoWarn>
1112
</PropertyGroup>
1213

14+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Benchmark|AnyCPU'">
15+
<NoWarn>1701;1702;CS1591</NoWarn>
16+
</PropertyGroup>
17+
1318
<ItemGroup>
1419
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
1520
<PackageReference Include="xunit" Version="2.4.1" />

src/BCrypt.Net.UnitTests/BCryptTests.cs

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -246,16 +246,16 @@ public void TestValidateAndReplace()
246246
[InlineData("ππππππππ")]
247247
public void TestValidateAndReplaceEnhanced(string pass)
248248
{
249-
string newPassword = "my new password";
250-
string hashed = BCrypt.EnhancedHashPassword(pass, HashType.SHA256);
249+
string newPassword = "my new password";
250+
string hashed = BCrypt.EnhancedHashPassword(pass, HashType.SHA256);
251251

252-
var newHash = BCrypt.ValidateAndReplacePassword(pass, hashed, true, HashType.SHA256, newPassword, true, HashType.SHA512);
252+
var newHash = BCrypt.ValidateAndReplacePassword(pass, hashed, true, HashType.SHA256, newPassword, true, HashType.SHA512);
253253

254-
var newPassValid = BCrypt.EnhancedVerify(newPassword, newHash, HashType.SHA512);
254+
var newPassValid = BCrypt.EnhancedVerify(newPassword, newHash, HashType.SHA512);
255255

256-
Assert.True(newPassValid);
256+
Assert.True(newPassValid);
257257

258-
Trace.Write(".");
258+
Trace.Write(".");
259259
}
260260

261261
[Fact()]
@@ -590,10 +590,52 @@ public void CreateEnhancedHashAndValidateIt()
590590

591591
var enhancedHashPassword = BCrypt.EnhancedHashPassword(myPassword, hashType: HashType.SHA384);
592592

593-
var validatePassword = BCrypt.EnhancedVerify(myPassword, enhancedHashPassword, hashType:HashType.SHA384);
593+
var validatePassword = BCrypt.EnhancedVerify(myPassword, enhancedHashPassword, hashType: HashType.SHA384);
594594

595595
Assert.True(validatePassword);
596596
}
597597

598+
[Theory]
599+
[InlineData("$2$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.", "$2$06", "2", "06", "DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.")]
600+
[InlineData("$2a$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.", "$2a$06", "2a", "06", "DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.")]
601+
[InlineData("$2a$08$HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUtye", "$2a$08", "2a", "08", "HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUtye")]
602+
public void InterrogateHash_WhenHashIsValid_ParsesHash(string hash, string settings, string version, string workFactor, string rawHash)
603+
{
604+
var hashInformation = BCrypt.InterrogateHash(hash);
605+
606+
Assert.Equal(settings, hashInformation.Settings);
607+
Assert.Equal(version, hashInformation.Version);
608+
Assert.Equal(workFactor, hashInformation.WorkFactor);
609+
Assert.Equal(rawHash, hashInformation.RawHash);
610+
}
611+
612+
[Theory]
613+
[InlineData("")]
614+
[InlineData("asdasdasldkfhja;sldgkja;sldgkjasdg")] // Jibberish
615+
[InlineData("$2a$08$HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/Sg")] // Too short
616+
[InlineData("$2a$-1$HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUtye")] // Strange workfactor
617+
[InlineData("$2a$08$HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUty!")] // Invalid base64 character
618+
[InlineData("$2a$08aHqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUtye")] // Invalid hash layout
619+
[InlineData("$2ac08$HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUtye")] // Invalid hash layout
620+
[InlineData("a2a$08$HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUtye")] // Invalid hash layout
621+
public void InterrogateHash_WhenHashInvalid_ThrowsInvalidHashFormat(string hash)
622+
{
623+
var exception = Assert.Throws<HashInformationException>(() => BCrypt.InterrogateHash(hash));
624+
625+
var saltParseException = Assert.IsType<SaltParseException>(exception.InnerException);
626+
627+
Assert.Equal("Invalid Hash Format", saltParseException.Message);
628+
}
629+
630+
[Theory]
631+
[InlineData("$2$06$DCq7YPn5Rq63x1Lad4cll.TV4S6ytwfsfvkgY8jIucDrjc8deX1s.", 8, true)]
632+
[InlineData("$2a$08$HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUtye", 10, true)]
633+
[InlineData("$2a$08$HqWuK6/Ng6sg9gQzbLrgb.Tl.ZHfXLhvt/SgVyWhQqgqcZ7ZuUtye", 6, false)]
634+
public void PasswordNeedsRehash_ComparesWorkFactorInHashWithGiven(string hash, int newWorkFactor, bool expected)
635+
{
636+
bool needsRehash = BCrypt.PasswordNeedsRehash(hash, newWorkFactor);
637+
638+
Assert.Equal(expected, needsRehash);
639+
}
598640
}
599641
}

src/BCrypt.Net.sln

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BCrypt.Net.StrongName", "BC
2121
EndProject
2222
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BCrypt.Net.Package", "BCrypt.Net.MainPackage\BCrypt.Net.Package.csproj", "{2AB9DBD9-6C09-492F-817C-54EEDFFDA120}"
2323
EndProject
24-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Benchmark", "Benchmark\Benchmark.csproj", "{E75AA3B8-BF28-4366-B5C6-14AF342290C3}"
24+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Benchmark", "Benchmark\Benchmark.csproj", "{E75AA3B8-BF28-4366-B5C6-14AF342290C3}"
2525
EndProject
2626
Global
2727
GlobalSection(SolutionConfigurationPlatforms) = preSolution
28+
Benchmark|Any CPU = Benchmark|Any CPU
29+
Benchmark|x64 = Benchmark|x64
30+
Benchmark|x86 = Benchmark|x86
2831
Debug|Any CPU = Debug|Any CPU
2932
Debug|x64 = Debug|x64
3033
Debug|x86 = Debug|x86
@@ -33,6 +36,11 @@ Global
3336
Release|x86 = Release|x86
3437
EndGlobalSection
3538
GlobalSection(ProjectConfigurationPlatforms) = postSolution
39+
{CD69F016-5940-4FCA-BCA1-9D1D87C6F873}.Benchmark|Any CPU.ActiveCfg = Benchmark|Any CPU
40+
{CD69F016-5940-4FCA-BCA1-9D1D87C6F873}.Benchmark|x64.ActiveCfg = Benchmark|Any CPU
41+
{CD69F016-5940-4FCA-BCA1-9D1D87C6F873}.Benchmark|x64.Build.0 = Benchmark|Any CPU
42+
{CD69F016-5940-4FCA-BCA1-9D1D87C6F873}.Benchmark|x86.ActiveCfg = Benchmark|Any CPU
43+
{CD69F016-5940-4FCA-BCA1-9D1D87C6F873}.Benchmark|x86.Build.0 = Benchmark|Any CPU
3644
{CD69F016-5940-4FCA-BCA1-9D1D87C6F873}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
3745
{CD69F016-5940-4FCA-BCA1-9D1D87C6F873}.Debug|Any CPU.Build.0 = Debug|Any CPU
3846
{CD69F016-5940-4FCA-BCA1-9D1D87C6F873}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -45,6 +53,11 @@ Global
4553
{CD69F016-5940-4FCA-BCA1-9D1D87C6F873}.Release|x64.Build.0 = Release|Any CPU
4654
{CD69F016-5940-4FCA-BCA1-9D1D87C6F873}.Release|x86.ActiveCfg = Release|Any CPU
4755
{CD69F016-5940-4FCA-BCA1-9D1D87C6F873}.Release|x86.Build.0 = Release|Any CPU
56+
{2078EB7B-7EDF-4B65-80F7-DB4D92E08CCD}.Benchmark|Any CPU.ActiveCfg = Benchmark|Any CPU
57+
{2078EB7B-7EDF-4B65-80F7-DB4D92E08CCD}.Benchmark|x64.ActiveCfg = Benchmark|Any CPU
58+
{2078EB7B-7EDF-4B65-80F7-DB4D92E08CCD}.Benchmark|x64.Build.0 = Benchmark|Any CPU
59+
{2078EB7B-7EDF-4B65-80F7-DB4D92E08CCD}.Benchmark|x86.ActiveCfg = Benchmark|Any CPU
60+
{2078EB7B-7EDF-4B65-80F7-DB4D92E08CCD}.Benchmark|x86.Build.0 = Benchmark|Any CPU
4861
{2078EB7B-7EDF-4B65-80F7-DB4D92E08CCD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
4962
{2078EB7B-7EDF-4B65-80F7-DB4D92E08CCD}.Debug|Any CPU.Build.0 = Debug|Any CPU
5063
{2078EB7B-7EDF-4B65-80F7-DB4D92E08CCD}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -57,6 +70,11 @@ Global
5770
{2078EB7B-7EDF-4B65-80F7-DB4D92E08CCD}.Release|x64.Build.0 = Release|Any CPU
5871
{2078EB7B-7EDF-4B65-80F7-DB4D92E08CCD}.Release|x86.ActiveCfg = Release|Any CPU
5972
{2078EB7B-7EDF-4B65-80F7-DB4D92E08CCD}.Release|x86.Build.0 = Release|Any CPU
73+
{10BEEF4B-A8BA-4FA2-A7B2-CF14E15B8D65}.Benchmark|Any CPU.ActiveCfg = Benchmark|Any CPU
74+
{10BEEF4B-A8BA-4FA2-A7B2-CF14E15B8D65}.Benchmark|x64.ActiveCfg = Benchmark|Any CPU
75+
{10BEEF4B-A8BA-4FA2-A7B2-CF14E15B8D65}.Benchmark|x64.Build.0 = Benchmark|Any CPU
76+
{10BEEF4B-A8BA-4FA2-A7B2-CF14E15B8D65}.Benchmark|x86.ActiveCfg = Benchmark|Any CPU
77+
{10BEEF4B-A8BA-4FA2-A7B2-CF14E15B8D65}.Benchmark|x86.Build.0 = Benchmark|Any CPU
6078
{10BEEF4B-A8BA-4FA2-A7B2-CF14E15B8D65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
6179
{10BEEF4B-A8BA-4FA2-A7B2-CF14E15B8D65}.Debug|Any CPU.Build.0 = Debug|Any CPU
6280
{10BEEF4B-A8BA-4FA2-A7B2-CF14E15B8D65}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -69,6 +87,11 @@ Global
6987
{10BEEF4B-A8BA-4FA2-A7B2-CF14E15B8D65}.Release|x64.Build.0 = Release|Any CPU
7088
{10BEEF4B-A8BA-4FA2-A7B2-CF14E15B8D65}.Release|x86.ActiveCfg = Release|Any CPU
7189
{10BEEF4B-A8BA-4FA2-A7B2-CF14E15B8D65}.Release|x86.Build.0 = Release|Any CPU
90+
{2AB9DBD9-6C09-492F-817C-54EEDFFDA120}.Benchmark|Any CPU.ActiveCfg = Benchmark|Any CPU
91+
{2AB9DBD9-6C09-492F-817C-54EEDFFDA120}.Benchmark|x64.ActiveCfg = Benchmark|Any CPU
92+
{2AB9DBD9-6C09-492F-817C-54EEDFFDA120}.Benchmark|x64.Build.0 = Benchmark|Any CPU
93+
{2AB9DBD9-6C09-492F-817C-54EEDFFDA120}.Benchmark|x86.ActiveCfg = Benchmark|Any CPU
94+
{2AB9DBD9-6C09-492F-817C-54EEDFFDA120}.Benchmark|x86.Build.0 = Benchmark|Any CPU
7295
{2AB9DBD9-6C09-492F-817C-54EEDFFDA120}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
7396
{2AB9DBD9-6C09-492F-817C-54EEDFFDA120}.Debug|Any CPU.Build.0 = Debug|Any CPU
7497
{2AB9DBD9-6C09-492F-817C-54EEDFFDA120}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -81,18 +104,24 @@ Global
81104
{2AB9DBD9-6C09-492F-817C-54EEDFFDA120}.Release|x64.Build.0 = Release|Any CPU
82105
{2AB9DBD9-6C09-492F-817C-54EEDFFDA120}.Release|x86.ActiveCfg = Release|Any CPU
83106
{2AB9DBD9-6C09-492F-817C-54EEDFFDA120}.Release|x86.Build.0 = Release|Any CPU
84-
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
85-
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
86-
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Debug|x64.ActiveCfg = Debug|Any CPU
87-
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Debug|x64.Build.0 = Debug|Any CPU
88-
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Debug|x86.ActiveCfg = Debug|Any CPU
89-
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Debug|x86.Build.0 = Debug|Any CPU
90-
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
91-
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Release|Any CPU.Build.0 = Release|Any CPU
92-
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Release|x64.ActiveCfg = Release|Any CPU
93-
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Release|x64.Build.0 = Release|Any CPU
94-
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Release|x86.ActiveCfg = Release|Any CPU
95-
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Release|x86.Build.0 = Release|Any CPU
107+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Benchmark|Any CPU.ActiveCfg = Benchmark|Any CPU
108+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Benchmark|Any CPU.Build.0 = Benchmark|Any CPU
109+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Benchmark|x64.ActiveCfg = Benchmark|Any CPU
110+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Benchmark|x64.Build.0 = Benchmark|Any CPU
111+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Benchmark|x86.ActiveCfg = Benchmark|Any CPU
112+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Benchmark|x86.Build.0 = Benchmark|Any CPU
113+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Debug|Any CPU.ActiveCfg = Benchmark|Any CPU
114+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Debug|Any CPU.Build.0 = Benchmark|Any CPU
115+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Debug|x64.ActiveCfg = Benchmark|Any CPU
116+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Debug|x64.Build.0 = Benchmark|Any CPU
117+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Debug|x86.ActiveCfg = Benchmark|Any CPU
118+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Debug|x86.Build.0 = Benchmark|Any CPU
119+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Release|Any CPU.ActiveCfg = Benchmark|Any CPU
120+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Release|Any CPU.Build.0 = Benchmark|Any CPU
121+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Release|x64.ActiveCfg = Benchmark|Any CPU
122+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Release|x64.Build.0 = Benchmark|Any CPU
123+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Release|x86.ActiveCfg = Benchmark|Any CPU
124+
{E75AA3B8-BF28-4366-B5C6-14AF342290C3}.Release|x86.Build.0 = Benchmark|Any CPU
96125
EndGlobalSection
97126
GlobalSection(SolutionProperties) = preSolution
98127
HideSolutionNode = FALSE

src/BCrypt.Net/BCrypt.Net.csproj

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,37 +20,42 @@
2020
<PackageLicenseUrl>https://github.com/BcryptNet/bcrypt.net/blob/master/licence.txt</PackageLicenseUrl>
2121

2222
<Version>3.2.1</Version>
23+
24+
<Configurations>Debug;Release;Benchmark</Configurations>
2325
</PropertyGroup>
2426

2527
<PropertyGroup>
2628
<Deterministic>false</Deterministic>
2729
</PropertyGroup>
2830

2931
<PropertyGroup Condition="'$(TargetFramework)' == 'net20' ">
30-
<DefineConstants>$(DefineConstants);LEGACY</DefineConstants>
3132
<FrameworkPathOverride Condition="'$(TargetFramework)' == 'net20'">C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client</FrameworkPathOverride>
3233
</PropertyGroup>
34+
3335
<PropertyGroup Condition="'$(TargetFramework)' == 'net35' ">
34-
<DefineConstants>$(DefineConstants);LEGACY</DefineConstants>
3536
<FrameworkPathOverride Condition="'$(TargetFramework)' == 'net35'">C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client</FrameworkPathOverride>
3637
</PropertyGroup>
37-
<PropertyGroup Condition="'$(TargetFramework)' == 'net40' ">
38-
<DefineConstants>$(DefineConstants);LEGACY</DefineConstants>
38+
39+
<PropertyGroup Condition="'$(TargetFramework)' == 'netstandard2.1' ">
40+
<DefineConstants>$(DefineConstants);NET2_1</DefineConstants>
3941
</PropertyGroup>
4042

4143
<ItemGroup Condition="'$(TargetFramework)' == 'net20|net35|net40'">
4244
<Reference Include="System" />
4345
</ItemGroup>
4446

4547
<ItemGroup Condition="'$(TargetFramework)' == 'net452|net462|net472'">
46-
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
4748
<Reference Include="System" />
4849
</ItemGroup>
4950

5051
<PropertyGroup Condition="'$(Configuration)'=='Release'">
5152
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\BCrypt.Net-Next.xml</DocumentationFile>
5253
</PropertyGroup>
5354

55+
<PropertyGroup Condition="'$(Configuration)'=='Benchmark'">
56+
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\BCrypt.Net-Next.xml</DocumentationFile>
57+
</PropertyGroup>
58+
5459
<ItemGroup>
5560
<PackageReference Update="SourceLink.Create.GitHub" Version="2.8.3" />
5661
</ItemGroup>

0 commit comments

Comments
 (0)