General code refactor and cleanup.

This commit is contained in:
2022-11-23 18:16:04 +00:00
parent 40487268b4
commit aa5bbc1f5b
21 changed files with 340 additions and 331 deletions

View File

@@ -1,86 +1,86 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<SchemaVersion>2.0</SchemaVersion> <SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{CC48B324-A532-4A45-87A6-6F91F7141E8D}</ProjectGuid> <ProjectGuid>{CC48B324-A532-4A45-87A6-6F91F7141E8D}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<RootNamespace>Aaru.Checksums</RootNamespace> <RootNamespace>Aaru.Checksums</RootNamespace>
<AssemblyName>Aaru.Checksums</AssemblyName> <AssemblyName>Aaru.Checksums</AssemblyName>
<ReleaseVersion>$(Version)</ReleaseVersion> <ReleaseVersion>$(Version)</ReleaseVersion>
<EnableDefaultCompileItems>false</EnableDefaultCompileItems> <EnableDefaultCompileItems>false</EnableDefaultCompileItems>
<GenerateAssemblyInfo>true</GenerateAssemblyInfo> <GenerateAssemblyInfo>true</GenerateAssemblyInfo>
<Version>6.0.0-alpha8</Version> <Version>6.0.0-alpha8</Version>
<Company>Claunia.com</Company> <Company>Claunia.com</Company>
<Copyright>Copyright © 2011-2022 Natalia Portillo</Copyright> <Copyright>Copyright © 2011-2022 Natalia Portillo</Copyright>
<Product>Aaru Data Preservation Suite</Product> <Product>Aaru Data Preservation Suite</Product>
<Title>Aaru.Checksums</Title> <Title>Aaru.Checksums</Title>
<ApplicationVersion>$(Version)</ApplicationVersion> <ApplicationVersion>$(Version)</ApplicationVersion>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<LangVersion>11</LangVersion> <LangVersion>11</LangVersion>
<Description>C# implementation of CRC16, CRC32, CRC64, Fletcher, MD5, SHA1, SHA2 and SpamSum.</Description> <Description>C# implementation of CRC16, CRC32, CRC64, Fletcher, MD5, SHA1, SHA2 and SpamSum.</Description>
<PackageProjectUrl>https://github.com/aaru-dps/</PackageProjectUrl> <PackageProjectUrl>https://github.com/aaru-dps/</PackageProjectUrl>
<PackageLicenseExpression>LGPL-2.1-only</PackageLicenseExpression> <PackageLicenseExpression>LGPL-2.1-only</PackageLicenseExpression>
<RepositoryUrl>https://github.com/aaru-dps/Aaru.Checksums</RepositoryUrl> <RepositoryUrl>https://github.com/aaru-dps/Aaru.Checksums</RepositoryUrl>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<NeutralLanguage>en-US</NeutralLanguage> <NeutralLanguage>en-US</NeutralLanguage>
<GenerateDocumentationFile>true</GenerateDocumentationFile> <GenerateDocumentationFile>true</GenerateDocumentationFile>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat> <SymbolPackageFormat>snupkg</SymbolPackageFormat>
<Authors>Natalia Portillo &lt;claunia@claunia.com&gt;</Authors> <Authors>Natalia Portillo &lt;claunia@claunia.com&gt;</Authors>
<DisableImplicitNamespaceImports>true</DisableImplicitNamespaceImports> <DisableImplicitNamespaceImports>true</DisableImplicitNamespaceImports>
<EnableTrimAnalyzer>true</EnableTrimAnalyzer> <EnableTrimAnalyzer>true</EnableTrimAnalyzer>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<NoWarn>CS1591;CS1574</NoWarn> <NoWarn>CS1591;CS1574</NoWarn>
</PropertyGroup> </PropertyGroup>
<ItemGroup Condition=" '$(Configuration)' == 'Debug' "> <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
<InternalsVisibleTo Include="Aaru.Tests"/> <InternalsVisibleTo Include="Aaru.Tests"/>
<InternalsVisibleTo Include="Aaru.Tests.Devices"/> <InternalsVisibleTo Include="Aaru.Tests.Devices"/>
</ItemGroup> </ItemGroup>
<PropertyGroup> <PropertyGroup>
<NrtRevisionFormat>$(Version)+{chash:8}</NrtRevisionFormat> <NrtRevisionFormat>$(Version)+{chash:8}</NrtRevisionFormat>
<NrtResolveSimpleAttributes>true</NrtResolveSimpleAttributes> <NrtResolveSimpleAttributes>true</NrtResolveSimpleAttributes>
<NrtShowRevision>true</NrtShowRevision> <NrtShowRevision>true</NrtShowRevision>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Adler32\neon.cs"/> <Compile Include="Adler32\neon.cs"/>
<Compile Include="Adler32\ssse3.cs"/> <Compile Include="Adler32\ssse3.cs"/>
<Compile Include="CRC16CCITTContext.cs"/> <Compile Include="CRC16CCITTContext.cs"/>
<Compile Include="CRC16IBMContext.cs"/> <Compile Include="CRC16IBMContext.cs"/>
<Compile Include="CRC32\arm_simd.cs"/> <Compile Include="CRC32\arm_simd.cs"/>
<Compile Include="CRC32\clmul.cs"/> <Compile Include="CRC32\clmul.cs"/>
<Compile Include="CRC64\clmul.cs"/> <Compile Include="CRC64\clmul.cs"/>
<Compile Include="Native.cs"/> <Compile Include="Native.cs"/>
<Compile Include="Register.cs"/> <Compile Include="Register.cs"/>
<Compile Include="SpamSumContext.cs"/> <Compile Include="SpamSumContext.cs"/>
<Compile Include="Adler32Context.cs"/> <Compile Include="Adler32Context.cs"/>
<Compile Include="CDChecksums.cs"/> <Compile Include="CDChecksums.cs"/>
<Compile Include="CRC16Context.cs"/> <Compile Include="CRC16Context.cs"/>
<Compile Include="CRC32Context.cs"/> <Compile Include="CRC32Context.cs"/>
<Compile Include="CRC64Context.cs"/> <Compile Include="CRC64Context.cs"/>
<Compile Include="FletcherContext.cs"/> <Compile Include="FletcherContext.cs"/>
<Compile Include="MD5Context.cs"/> <Compile Include="MD5Context.cs"/>
<Compile Include="ReedSolomon.cs"/> <Compile Include="ReedSolomon.cs"/>
<Compile Include="SHA1Context.cs"/> <Compile Include="SHA1Context.cs"/>
<Compile Include="SHA256Context.cs"/> <Compile Include="SHA256Context.cs"/>
<Compile Include="SHA384Context.cs"/> <Compile Include="SHA384Context.cs"/>
<Compile Include="SHA512Context.cs"/> <Compile Include="SHA512Context.cs"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Aaru.CommonTypes\Aaru.CommonTypes.csproj"/> <ProjectReference Include="..\Aaru.CommonTypes\Aaru.CommonTypes.csproj"/>
<ProjectReference Include="..\Aaru.Helpers\Aaru.Helpers.csproj"/> <ProjectReference Include="..\Aaru.Helpers\Aaru.Helpers.csproj"/>
<ProjectReference Include="..\Aaru.Console\Aaru.Console.csproj"/> <ProjectReference Include="..\Aaru.Console\Aaru.Console.csproj"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="..\LICENSE.LGPL"> <EmbeddedResource Include="..\LICENSE.LGPL">
<Link>LICENSE.LGPL</Link> <Link>LICENSE.LGPL</Link>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="..\LICENSE"> <EmbeddedResource Include="..\LICENSE">
<Link>LICENSE</Link> <Link>LICENSE</Link>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Aaru.Checksums.Native" Version="6.0.0-alpha6"/> <PackageReference Include="Aaru.Checksums.Native" Version="6.0.0-alpha6"/>
<PackageReference Include="Unclassified.NetRevisionTask" Version="0.4.3" PrivateAssets="all"/> <PackageReference Include="Unclassified.NetRevisionTask" Version="0.4.3" PrivateAssets="all"/>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -45,11 +45,11 @@
// Copyright 2017 The Chromium Authors. All rights reserved. // Copyright 2017 The Chromium Authors. All rights reserved.
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums.Adler32;
using System.Runtime.Intrinsics; using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.Arm; using System.Runtime.Intrinsics.Arm;
namespace Aaru.Checksums.Adler32;
static class Neon static class Neon
{ {
internal static void Step(ref ushort preSum1, ref ushort preSum2, byte[] buf, uint len) internal static void Step(ref ushort preSum1, ref ushort preSum2, byte[] buf, uint len)
@@ -60,7 +60,7 @@ static class Neon
uint s1 = preSum1; uint s1 = preSum1;
uint s2 = preSum2; uint s2 = preSum2;
var bufPos = 0; int bufPos = 0;
/* /*
* Process the data in blocks. * Process the data in blocks.
@@ -81,8 +81,8 @@ static class Neon
* Process n blocks of data. At most NMAX data bytes can be * Process n blocks of data. At most NMAX data bytes can be
* processed before s2 must be reduced modulo ADLER_MODULE. * processed before s2 must be reduced modulo ADLER_MODULE.
*/ */
var vS2 = Vector128.Create(s1 * n, 0, 0, 0); Vector128<uint> vS2 = Vector128.Create(s1 * n, 0, 0, 0);
var vS1 = Vector128.Create(0u, 0, 0, 0); Vector128<uint> vS1 = Vector128.Create(0u, 0, 0, 0);
Vector128<ushort> vColumnSum1 = AdvSimd.DuplicateToVector128((ushort)0); Vector128<ushort> vColumnSum1 = AdvSimd.DuplicateToVector128((ushort)0);
Vector128<ushort> vColumnSum2 = AdvSimd.DuplicateToVector128((ushort)0); Vector128<ushort> vColumnSum2 = AdvSimd.DuplicateToVector128((ushort)0);
Vector128<ushort> vColumnSum3 = AdvSimd.DuplicateToVector128((ushort)0); Vector128<ushort> vColumnSum3 = AdvSimd.DuplicateToVector128((ushort)0);
@@ -93,17 +93,21 @@ static class Neon
/* /*
* Load 32 input bytes. * Load 32 input bytes.
*/ */
var bytes1 = Vector128.Create(buf[bufPos], buf[bufPos + 1], buf[bufPos + 2], buf[bufPos + 3], Vector128<byte> bytes1 = Vector128.Create(buf[bufPos], buf[bufPos + 1], buf[bufPos + 2],
buf[bufPos + 4], buf[bufPos + 5], buf[bufPos + 6], buf[bufPos + 7], buf[bufPos + 3], buf[bufPos + 4], buf[bufPos + 5],
buf[bufPos + 8], buf[bufPos + 9], buf[bufPos + 10], buf[bufPos + 11], buf[bufPos + 6], buf[bufPos + 7], buf[bufPos + 8],
buf[bufPos + 12], buf[bufPos + 13], buf[bufPos + 14], buf[bufPos + 15]); buf[bufPos + 9], buf[bufPos + 10], buf[bufPos + 11],
buf[bufPos + 12], buf[bufPos + 13], buf[bufPos + 14],
buf[bufPos + 15]);
bufPos += 16; bufPos += 16;
var bytes2 = Vector128.Create(buf[bufPos], buf[bufPos + 1], buf[bufPos + 2], buf[bufPos + 3], Vector128<byte> bytes2 = Vector128.Create(buf[bufPos], buf[bufPos + 1], buf[bufPos + 2],
buf[bufPos + 4], buf[bufPos + 5], buf[bufPos + 6], buf[bufPos + 7], buf[bufPos + 3], buf[bufPos + 4], buf[bufPos + 5],
buf[bufPos + 8], buf[bufPos + 9], buf[bufPos + 10], buf[bufPos + 11], buf[bufPos + 6], buf[bufPos + 7], buf[bufPos + 8],
buf[bufPos + 12], buf[bufPos + 13], buf[bufPos + 14], buf[bufPos + 15]); buf[bufPos + 9], buf[bufPos + 10], buf[bufPos + 11],
buf[bufPos + 12], buf[bufPos + 13], buf[bufPos + 14],
buf[bufPos + 15]);
bufPos += 16; bufPos += 16;
/* /*

View File

@@ -45,19 +45,19 @@
// Copyright 2017 The Chromium Authors. All rights reserved. // Copyright 2017 The Chromium Authors. All rights reserved.
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums.Adler32;
using System; using System;
using System.Runtime.Intrinsics; using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86; using System.Runtime.Intrinsics.X86;
namespace Aaru.Checksums.Adler32;
static class Ssse3 static class Ssse3
{ {
internal static void Step(ref ushort sum1, ref ushort sum2, byte[] buf, uint len) internal static void Step(ref ushort sum1, ref ushort sum2, byte[] buf, uint len)
{ {
uint s1 = sum1; uint s1 = sum1;
uint s2 = sum2; uint s2 = sum2;
var bufPos = 0; int bufPos = 0;
/* /*
* Process the data in blocks. * Process the data in blocks.
@@ -78,33 +78,33 @@ static class Ssse3
Vector128<byte> tap1 = Vector128.Create(32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17). Vector128<byte> tap1 = Vector128.Create(32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17).
AsByte(); AsByte();
Vector128<byte> tap2 = Vector128.Create(16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1).AsByte(); Vector128<byte> tap2 = Vector128.Create(16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1).AsByte();
Vector128<byte> zero = Vector128.Create(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0).AsByte(); Vector128<byte> zero = Vector128.Create(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0).AsByte();
var ones = Vector128.Create(1, 1, 1, 1, 1, 1, 1, 1); Vector128<short> ones = Vector128.Create(1, 1, 1, 1, 1, 1, 1, 1);
/* /*
* Process n blocks of data. At most NMAX data bytes can be * Process n blocks of data. At most NMAX data bytes can be
* processed before s2 must be reduced modulo BASE. * processed before s2 must be reduced modulo BASE.
*/ */
var vPs = Vector128.Create(s1 * n, 0, 0, 0); Vector128<uint> vPs = Vector128.Create(s1 * n, 0, 0, 0);
var vS2 = Vector128.Create(s2, 0, 0, 0); Vector128<uint> vS2 = Vector128.Create(s2, 0, 0, 0);
var vS1 = Vector128.Create(0u, 0, 0, 0); Vector128<uint> vS1 = Vector128.Create(0u, 0, 0, 0);
do do
{ {
/* /*
* Load 32 input bytes. * Load 32 input bytes.
*/ */
var bytes1 = Vector128.Create(BitConverter.ToUInt32(buf, bufPos), Vector128<uint> bytes1 = Vector128.Create(BitConverter.ToUInt32(buf, bufPos),
BitConverter.ToUInt32(buf, bufPos + 4), BitConverter.ToUInt32(buf, bufPos + 4),
BitConverter.ToUInt32(buf, bufPos + 8), BitConverter.ToUInt32(buf, bufPos + 8),
BitConverter.ToUInt32(buf, bufPos + 12)); BitConverter.ToUInt32(buf, bufPos + 12));
bufPos += 16; bufPos += 16;
var bytes2 = Vector128.Create(BitConverter.ToUInt32(buf, bufPos), Vector128<uint> bytes2 = Vector128.Create(BitConverter.ToUInt32(buf, bufPos),
BitConverter.ToUInt32(buf, bufPos + 4), BitConverter.ToUInt32(buf, bufPos + 4),
BitConverter.ToUInt32(buf, bufPos + 8), BitConverter.ToUInt32(buf, bufPos + 8),
BitConverter.ToUInt32(buf, bufPos + 12)); BitConverter.ToUInt32(buf, bufPos + 12));
bufPos += 16; bufPos += 16;

View File

@@ -36,8 +36,6 @@
// Copyright (C) Jean-loup Gailly // Copyright (C) Jean-loup Gailly
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums;
using System; using System;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
@@ -48,6 +46,8 @@ using Aaru.CommonTypes.Interfaces;
using Aaru.Helpers; using Aaru.Helpers;
using Ssse3 = System.Runtime.Intrinsics.X86.Ssse3; using Ssse3 = System.Runtime.Intrinsics.X86.Ssse3;
namespace Aaru.Checksums;
/// <inheritdoc /> /// <inheritdoc />
/// <summary>Implements the Adler-32 algorithm</summary> /// <summary>Implements the Adler-32 algorithm</summary>
public sealed class Adler32Context : IChecksum public sealed class Adler32Context : IChecksum

View File

@@ -31,13 +31,13 @@
// ECC algorithm from ECM(c) 2002-2011 Neill Corlett // ECC algorithm from ECM(c) 2002-2011 Neill Corlett
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Aaru.Console; using Aaru.Console;
using Aaru.Helpers; using Aaru.Helpers;
namespace Aaru.Checksums;
/// <summary>Implements ReedSolomon and CRC32 algorithms as used by CD-ROM</summary> /// <summary>Implements ReedSolomon and CRC32 algorithms as used by CD-ROM</summary>
public static class CdChecksums public static class CdChecksums
{ {
@@ -81,8 +81,8 @@ public static class CdChecksums
{ {
case 2448: case 2448:
{ {
var subchannel = new byte[96]; byte[] subchannel = new byte[96];
var channel = new byte[2352]; byte[] channel = new byte[2352];
Array.Copy(buffer, 0, channel, 0, 2352); Array.Copy(buffer, 0, channel, 0, 2352);
Array.Copy(buffer, 2352, subchannel, 0, 96); Array.Copy(buffer, 2352, subchannel, 0, 96);
@@ -97,11 +97,11 @@ public static class CdChecksums
status = false; status = false;
status = channelStatus switch status = channelStatus switch
{ {
null when subchannelStatus == true => true, null when subchannelStatus == true => true,
true when subchannelStatus == null => true, true when subchannelStatus == null => true,
_ => status _ => status
}; };
return status; return status;
} }
@@ -120,7 +120,7 @@ public static class CdChecksums
for(uint i = 0; i < 256; i++) for(uint i = 0; i < 256; i++)
{ {
uint edc = i; uint edc = i;
var j = (uint)((i << 1) ^ ((i & 0x80) == 0x80 ? 0x11D : 0)); uint j = (uint)((i << 1) ^ ((i & 0x80) == 0x80 ? 0x11D : 0));
_eccFTable[i] = (byte)j; _eccFTable[i] = (byte)j;
_eccBTable[i ^ j] = (byte)i; _eccBTable[i ^ j] = (byte)i;
@@ -139,7 +139,7 @@ public static class CdChecksums
for(major = 0; major < majorCount; major++) for(major = 0; major < majorCount; major++)
{ {
uint index = (major >> 1) * majorMult + (major & 1); uint index = ((major >> 1) * majorMult) + (major & 1);
byte eccA = 0; byte eccA = 0;
byte eccB = 0; byte eccB = 0;
uint minor; uint minor;
@@ -200,7 +200,7 @@ public static class CdChecksums
{ {
//AaruConsole.DebugWriteLine("CD checksums", "Mode 0 sector at address {0:X2}:{1:X2}:{2:X2}", //AaruConsole.DebugWriteLine("CD checksums", "Mode 0 sector at address {0:X2}:{1:X2}:{2:X2}",
// channel[0x00C], channel[0x00D], channel[0x00E]); // channel[0x00C], channel[0x00D], channel[0x00E]);
for(var i = 0x010; i < 0x930; i++) for(int i = 0x010; i < 0x930; i++)
if(channel[i] != 0x00) if(channel[i] != 0x00)
{ {
AaruConsole.DebugWriteLine("CD checksums", AaruConsole.DebugWriteLine("CD checksums",
@@ -227,11 +227,11 @@ public static class CdChecksums
return false; return false;
case 0x01: case 0x01:
{ {
var address = new byte[4]; byte[] address = new byte[4];
var data = new byte[2060]; byte[] data = new byte[2060];
var data2 = new byte[2232]; byte[] data2 = new byte[2232];
var eccP = new byte[172]; byte[] eccP = new byte[172];
var eccQ = new byte[104]; byte[] eccQ = new byte[104];
Array.Copy(channel, 0x0C, address, 0, 4); Array.Copy(channel, 0x0C, address, 0, 4);
Array.Copy(channel, 0x10, data, 0, 2060); Array.Copy(channel, 0x10, data, 0, 2060);
@@ -255,7 +255,7 @@ public static class CdChecksums
"Mode 1 sector at address: {0:X2}:{1:X2}:{2:X2}, fails ECC Q check", "Mode 1 sector at address: {0:X2}:{1:X2}:{2:X2}, fails ECC Q check",
channel[0x00C], channel[0x00D], channel[0x00E]); channel[0x00C], channel[0x00D], channel[0x00E]);
var storedEdc = BitConverter.ToUInt32(channel, 0x810); uint storedEdc = BitConverter.ToUInt32(channel, 0x810);
uint calculatedEdc = ComputeEdc(0, channel, 0x810); uint calculatedEdc = ComputeEdc(0, channel, 0x810);
correctEdc = calculatedEdc == storedEdc; correctEdc = calculatedEdc == storedEdc;
@@ -275,7 +275,7 @@ public static class CdChecksums
{ {
//AaruConsole.DebugWriteLine("CD checksums", "Mode 2 sector at address {0:X2}:{1:X2}:{2:X2}", //AaruConsole.DebugWriteLine("CD checksums", "Mode 2 sector at address {0:X2}:{1:X2}:{2:X2}",
// channel[0x00C], channel[0x00D], channel[0x00E]); // channel[0x00C], channel[0x00D], channel[0x00E]);
var mode2Sector = new byte[channel.Length - 0x10]; byte[] mode2Sector = new byte[channel.Length - 0x10];
Array.Copy(channel, 0x10, mode2Sector, 0, mode2Sector.Length); Array.Copy(channel, 0x10, mode2Sector, 0, mode2Sector.Length);
if((channel[0x012] & 0x20) == 0x20) // mode 2 form 2 if((channel[0x012] & 0x20) == 0x20) // mode 2 form 2
@@ -288,7 +288,7 @@ public static class CdChecksums
"Subheader copies differ in mode 2 form 2 sector at address: {0:X2}:{1:X2}:{2:X2}", "Subheader copies differ in mode 2 form 2 sector at address: {0:X2}:{1:X2}:{2:X2}",
channel[0x00C], channel[0x00D], channel[0x00E]); channel[0x00C], channel[0x00D], channel[0x00E]);
var storedEdc = BitConverter.ToUInt32(mode2Sector, 0x91C); uint storedEdc = BitConverter.ToUInt32(mode2Sector, 0x91C);
// No CRC stored! // No CRC stored!
if(storedEdc == 0x00000000) if(storedEdc == 0x00000000)
@@ -318,9 +318,9 @@ public static class CdChecksums
"Subheader copies differ in mode 2 form 1 sector at address: {0:X2}:{1:X2}:{2:X2}", "Subheader copies differ in mode 2 form 1 sector at address: {0:X2}:{1:X2}:{2:X2}",
channel[0x00C], channel[0x00D], channel[0x00E]); channel[0x00C], channel[0x00D], channel[0x00E]);
var address = new byte[4]; byte[] address = new byte[4];
var eccP = new byte[172]; byte[] eccP = new byte[172];
var eccQ = new byte[104]; byte[] eccQ = new byte[104];
Array.Copy(mode2Sector, 0x80C, eccP, 0, 172); Array.Copy(mode2Sector, 0x80C, eccP, 0, 172);
Array.Copy(mode2Sector, 0x8B8, eccQ, 0, 104); Array.Copy(mode2Sector, 0x8B8, eccQ, 0, 104);
@@ -341,7 +341,7 @@ public static class CdChecksums
"Mode 2 form 1 sector at address: {0:X2}:{1:X2}:{2:X2}, fails ECC Q check", "Mode 2 form 1 sector at address: {0:X2}:{1:X2}:{2:X2}, fails ECC Q check",
channel[0x00C], channel[0x00D], channel[0x00E]); channel[0x00C], channel[0x00D], channel[0x00E]);
var storedEdc = BitConverter.ToUInt32(mode2Sector, 0x808); uint storedEdc = BitConverter.ToUInt32(mode2Sector, 0x808);
uint calculatedEdc = ComputeEdc(0, mode2Sector, 0x808); uint calculatedEdc = ComputeEdc(0, mode2Sector, 0x808);
correctEdc = calculatedEdc == storedEdc; correctEdc = calculatedEdc == storedEdc;
@@ -367,7 +367,7 @@ public static class CdChecksums
static uint ComputeEdc(uint edc, IReadOnlyList<byte> src, int size) static uint ComputeEdc(uint edc, IReadOnlyList<byte> src, int size)
{ {
var pos = 0; int pos = 0;
for(; size > 0; size--) for(; size > 0; size--)
edc = (edc >> 8) ^ _edcTable[(edc ^ src[pos++]) & 0xFF]; edc = (edc >> 8) ^ _edcTable[(edc ^ src[pos++]) & 0xFF];
@@ -377,23 +377,23 @@ public static class CdChecksums
static bool? CheckCdSectorSubChannel(IReadOnlyList<byte> subchannel) static bool? CheckCdSectorSubChannel(IReadOnlyList<byte> subchannel)
{ {
bool? status = true; bool? status = true;
var qSubChannel = new byte[12]; byte[] qSubChannel = new byte[12];
var cdTextPack1 = new byte[18]; byte[] cdTextPack1 = new byte[18];
var cdTextPack2 = new byte[18]; byte[] cdTextPack2 = new byte[18];
var cdTextPack3 = new byte[18]; byte[] cdTextPack3 = new byte[18];
var cdTextPack4 = new byte[18]; byte[] cdTextPack4 = new byte[18];
var cdSubRwPack1 = new byte[24]; byte[] cdSubRwPack1 = new byte[24];
var cdSubRwPack2 = new byte[24]; byte[] cdSubRwPack2 = new byte[24];
var cdSubRwPack3 = new byte[24]; byte[] cdSubRwPack3 = new byte[24];
var cdSubRwPack4 = new byte[24]; byte[] cdSubRwPack4 = new byte[24];
var i = 0; int i = 0;
for(var j = 0; j < 12; j++) for(int j = 0; j < 12; j++)
qSubChannel[j] = 0; qSubChannel[j] = 0;
for(var j = 0; j < 18; j++) for(int j = 0; j < 18; j++)
{ {
cdTextPack1[j] = 0; cdTextPack1[j] = 0;
cdTextPack2[j] = 0; cdTextPack2[j] = 0;
@@ -401,7 +401,7 @@ public static class CdChecksums
cdTextPack4[j] = 0; cdTextPack4[j] = 0;
} }
for(var j = 0; j < 24; j++) for(int j = 0; j < 24; j++)
{ {
cdSubRwPack1[j] = 0; cdSubRwPack1[j] = 0;
cdSubRwPack2[j] = 0; cdSubRwPack2[j] = 0;
@@ -409,7 +409,7 @@ public static class CdChecksums
cdSubRwPack4[j] = 0; cdSubRwPack4[j] = 0;
} }
for(var j = 0; j < 12; j++) for(int j = 0; j < 12; j++)
{ {
qSubChannel[j] = (byte)(qSubChannel[j] | ((subchannel[i++] & 0x40) << 1)); qSubChannel[j] = (byte)(qSubChannel[j] | ((subchannel[i++] & 0x40) << 1));
qSubChannel[j] = (byte)(qSubChannel[j] | (subchannel[i++] & 0x40)); qSubChannel[j] = (byte)(qSubChannel[j] | (subchannel[i++] & 0x40));
@@ -423,7 +423,7 @@ public static class CdChecksums
i = 0; i = 0;
for(var j = 0; j < 18; j++) for(int j = 0; j < 18; j++)
{ {
cdTextPack1[j] = (byte)(cdTextPack1[j] | ((subchannel[i++] & 0x3F) << 2)); cdTextPack1[j] = (byte)(cdTextPack1[j] | ((subchannel[i++] & 0x3F) << 2));
@@ -440,7 +440,7 @@ public static class CdChecksums
cdTextPack1[j] = (byte)(cdTextPack1[j] | (subchannel[i++] & 0x3F)); cdTextPack1[j] = (byte)(cdTextPack1[j] | (subchannel[i++] & 0x3F));
} }
for(var j = 0; j < 18; j++) for(int j = 0; j < 18; j++)
{ {
cdTextPack2[j] = (byte)(cdTextPack2[j] | ((subchannel[i++] & 0x3F) << 2)); cdTextPack2[j] = (byte)(cdTextPack2[j] | ((subchannel[i++] & 0x3F) << 2));
@@ -457,7 +457,7 @@ public static class CdChecksums
cdTextPack2[j] = (byte)(cdTextPack2[j] | (subchannel[i++] & 0x3F)); cdTextPack2[j] = (byte)(cdTextPack2[j] | (subchannel[i++] & 0x3F));
} }
for(var j = 0; j < 18; j++) for(int j = 0; j < 18; j++)
{ {
cdTextPack3[j] = (byte)(cdTextPack3[j] | ((subchannel[i++] & 0x3F) << 2)); cdTextPack3[j] = (byte)(cdTextPack3[j] | ((subchannel[i++] & 0x3F) << 2));
@@ -474,7 +474,7 @@ public static class CdChecksums
cdTextPack3[j] = (byte)(cdTextPack3[j] | (subchannel[i++] & 0x3F)); cdTextPack3[j] = (byte)(cdTextPack3[j] | (subchannel[i++] & 0x3F));
} }
for(var j = 0; j < 18; j++) for(int j = 0; j < 18; j++)
{ {
cdTextPack4[j] = (byte)(cdTextPack4[j] | ((subchannel[i++] & 0x3F) << 2)); cdTextPack4[j] = (byte)(cdTextPack4[j] | ((subchannel[i++] & 0x3F) << 2));
@@ -493,16 +493,16 @@ public static class CdChecksums
i = 0; i = 0;
for(var j = 0; j < 24; j++) for(int j = 0; j < 24; j++)
cdSubRwPack1[j] = (byte)(subchannel[i++] & 0x3F); cdSubRwPack1[j] = (byte)(subchannel[i++] & 0x3F);
for(var j = 0; j < 24; j++) for(int j = 0; j < 24; j++)
cdSubRwPack2[j] = (byte)(subchannel[i++] & 0x3F); cdSubRwPack2[j] = (byte)(subchannel[i++] & 0x3F);
for(var j = 0; j < 24; j++) for(int j = 0; j < 24; j++)
cdSubRwPack3[j] = (byte)(subchannel[i++] & 0x3F); cdSubRwPack3[j] = (byte)(subchannel[i++] & 0x3F);
for(var j = 0; j < 24; j++) for(int j = 0; j < 24; j++)
cdSubRwPack4[j] = (byte)(subchannel[i++] & 0x3F); cdSubRwPack4[j] = (byte)(subchannel[i++] & 0x3F);
switch(cdSubRwPack1[0]) switch(cdSubRwPack1[0])
@@ -544,8 +544,8 @@ public static class CdChecksums
break; break;
} }
var qSubChannelCrc = BigEndianBitConverter.ToUInt16(qSubChannel, 10); ushort qSubChannelCrc = BigEndianBitConverter.ToUInt16(qSubChannel, 10);
var qSubChannelForCrc = new byte[10]; byte[] qSubChannelForCrc = new byte[10];
Array.Copy(qSubChannel, 0, qSubChannelForCrc, 0, 10); Array.Copy(qSubChannel, 0, qSubChannelForCrc, 0, 10);
ushort calculatedQcrc = CRC16CCITTContext.Calculate(qSubChannelForCrc); ushort calculatedQcrc = CRC16CCITTContext.Calculate(qSubChannelForCrc);
@@ -559,8 +559,8 @@ public static class CdChecksums
if((cdTextPack1[0] & 0x80) == 0x80) if((cdTextPack1[0] & 0x80) == 0x80)
{ {
var cdTextPack1Crc = BigEndianBitConverter.ToUInt16(cdTextPack1, 16); ushort cdTextPack1Crc = BigEndianBitConverter.ToUInt16(cdTextPack1, 16);
var cdTextPack1ForCrc = new byte[16]; byte[] cdTextPack1ForCrc = new byte[16];
Array.Copy(cdTextPack1, 0, cdTextPack1ForCrc, 0, 16); Array.Copy(cdTextPack1, 0, cdTextPack1ForCrc, 0, 16);
ushort calculatedCdtp1Crc = CRC16CCITTContext.Calculate(cdTextPack1ForCrc); ushort calculatedCdtp1Crc = CRC16CCITTContext.Calculate(cdTextPack1ForCrc);
@@ -576,8 +576,8 @@ public static class CdChecksums
if((cdTextPack2[0] & 0x80) == 0x80) if((cdTextPack2[0] & 0x80) == 0x80)
{ {
var cdTextPack2Crc = BigEndianBitConverter.ToUInt16(cdTextPack2, 16); ushort cdTextPack2Crc = BigEndianBitConverter.ToUInt16(cdTextPack2, 16);
var cdTextPack2ForCrc = new byte[16]; byte[] cdTextPack2ForCrc = new byte[16];
Array.Copy(cdTextPack2, 0, cdTextPack2ForCrc, 0, 16); Array.Copy(cdTextPack2, 0, cdTextPack2ForCrc, 0, 16);
ushort calculatedCdtp2Crc = CRC16CCITTContext.Calculate(cdTextPack2ForCrc); ushort calculatedCdtp2Crc = CRC16CCITTContext.Calculate(cdTextPack2ForCrc);
@@ -596,8 +596,8 @@ public static class CdChecksums
if((cdTextPack3[0] & 0x80) == 0x80) if((cdTextPack3[0] & 0x80) == 0x80)
{ {
var cdTextPack3Crc = BigEndianBitConverter.ToUInt16(cdTextPack3, 16); ushort cdTextPack3Crc = BigEndianBitConverter.ToUInt16(cdTextPack3, 16);
var cdTextPack3ForCrc = new byte[16]; byte[] cdTextPack3ForCrc = new byte[16];
Array.Copy(cdTextPack3, 0, cdTextPack3ForCrc, 0, 16); Array.Copy(cdTextPack3, 0, cdTextPack3ForCrc, 0, 16);
ushort calculatedCdtp3Crc = CRC16CCITTContext.Calculate(cdTextPack3ForCrc); ushort calculatedCdtp3Crc = CRC16CCITTContext.Calculate(cdTextPack3ForCrc);
@@ -617,8 +617,8 @@ public static class CdChecksums
if((cdTextPack4[0] & 0x80) != 0x80) if((cdTextPack4[0] & 0x80) != 0x80)
return status; return status;
var cdTextPack4Crc = BigEndianBitConverter.ToUInt16(cdTextPack4, 16); ushort cdTextPack4Crc = BigEndianBitConverter.ToUInt16(cdTextPack4, 16);
var cdTextPack4ForCrc = new byte[16]; byte[] cdTextPack4ForCrc = new byte[16];
Array.Copy(cdTextPack4, 0, cdTextPack4ForCrc, 0, 16); Array.Copy(cdTextPack4, 0, cdTextPack4ForCrc, 0, 16);
ushort calculatedCdtp4Crc = CRC16CCITTContext.Calculate(cdTextPack4ForCrc); ushort calculatedCdtp4Crc = CRC16CCITTContext.Calculate(cdTextPack4ForCrc);

View File

@@ -30,8 +30,6 @@
// Copyright © 2011-2022 Natalia Portillo // Copyright © 2011-2022 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums;
using System; using System;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
@@ -39,6 +37,8 @@ using System.Text;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
using Aaru.Helpers; using Aaru.Helpers;
namespace Aaru.Checksums;
/// <inheritdoc /> /// <inheritdoc />
/// <summary>Implements a CRC16 algorithm</summary> /// <summary>Implements a CRC16 algorithm</summary>
public class Crc16Context : IChecksum public class Crc16Context : IChecksum

View File

@@ -45,18 +45,18 @@
// Copyright 2017 The Chromium Authors. All rights reserved. // Copyright 2017 The Chromium Authors. All rights reserved.
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums.CRC32;
using System; using System;
using System.Runtime.Intrinsics.Arm; using System.Runtime.Intrinsics.Arm;
namespace Aaru.Checksums.CRC32;
static class ArmSimd static class ArmSimd
{ {
internal static uint Step64(byte[] buf, long len, uint crc) internal static uint Step64(byte[] buf, long len, uint crc)
{ {
uint c = crc; uint c = crc;
var bufPos = 0; int bufPos = 0;
while(len >= 64) while(len >= 64)
{ {
@@ -96,7 +96,7 @@ static class ArmSimd
{ {
uint c = crc; uint c = crc;
var bufPos = 0; int bufPos = 0;
while(len >= 32) while(len >= 32)
{ {

View File

@@ -47,13 +47,13 @@
// Copyright (C) 2013 Intel Corporation. All rights reserved. // Copyright (C) 2013 Intel Corporation. All rights reserved.
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums.CRC32;
using System; using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.Intrinsics; using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86; using System.Runtime.Intrinsics.X86;
namespace Aaru.Checksums.CRC32;
static class Clmul static class Clmul
{ {
static readonly uint[] _crcK = static readonly uint[] _crcK =
@@ -66,7 +66,7 @@ static class Clmul
static void Fold4(ref Vector128<uint> xmmCRC0, ref Vector128<uint> xmmCRC1, ref Vector128<uint> xmmCRC2, static void Fold4(ref Vector128<uint> xmmCRC0, ref Vector128<uint> xmmCRC1, ref Vector128<uint> xmmCRC2,
ref Vector128<uint> xmmCRC3) ref Vector128<uint> xmmCRC3)
{ {
var xmmFold4 = Vector128.Create(0xc6e41596, 0x00000001, 0x54442bd4, 0x00000001); Vector128<uint> xmmFold4 = Vector128.Create(0xc6e41596, 0x00000001, 0x54442bd4, 0x00000001);
Vector128<uint> xTmp0 = xmmCRC0; Vector128<uint> xTmp0 = xmmCRC0;
Vector128<uint> xTmp1 = xmmCRC1; Vector128<uint> xTmp1 = xmmCRC1;
@@ -110,37 +110,41 @@ static class Clmul
Vector128<uint> xmmCRC1 = Vector128<uint>.Zero; Vector128<uint> xmmCRC1 = Vector128<uint>.Zero;
Vector128<uint> xmmCRC2 = Vector128<uint>.Zero; Vector128<uint> xmmCRC2 = Vector128<uint>.Zero;
Vector128<uint> xmmCRC3 = Vector128<uint>.Zero; Vector128<uint> xmmCRC3 = Vector128<uint>.Zero;
var bufPos = 0; int bufPos = 0;
var first = true; bool first = true;
/* fold 512 to 32 step variable declarations for ISO-C90 compat. */ /* fold 512 to 32 step variable declarations for ISO-C90 compat. */
var xmmMask = Vector128.Create(0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000); Vector128<uint> xmmMask = Vector128.Create(0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000);
var xmmMask2 = Vector128.Create(0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); Vector128<uint> xmmMask2 = Vector128.Create(0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
while((len -= 64) >= 0) while((len -= 64) >= 0)
{ {
var xmmT0 = Vector128.Create(BitConverter.ToUInt32(src, bufPos), BitConverter.ToUInt32(src, bufPos + 4), Vector128<uint> xmmT0 = Vector128.Create(BitConverter.ToUInt32(src, bufPos),
BitConverter.ToUInt32(src, bufPos + 8), BitConverter.ToUInt32(src, bufPos + 4),
BitConverter.ToUInt32(src, bufPos + 12)); BitConverter.ToUInt32(src, bufPos + 8),
BitConverter.ToUInt32(src, bufPos + 12));
bufPos += 16; bufPos += 16;
var xmmT1 = Vector128.Create(BitConverter.ToUInt32(src, bufPos), BitConverter.ToUInt32(src, bufPos + 4), Vector128<uint> xmmT1 = Vector128.Create(BitConverter.ToUInt32(src, bufPos),
BitConverter.ToUInt32(src, bufPos + 8), BitConverter.ToUInt32(src, bufPos + 4),
BitConverter.ToUInt32(src, bufPos + 12)); BitConverter.ToUInt32(src, bufPos + 8),
BitConverter.ToUInt32(src, bufPos + 12));
bufPos += 16; bufPos += 16;
var xmmT2 = Vector128.Create(BitConverter.ToUInt32(src, bufPos), BitConverter.ToUInt32(src, bufPos + 4), Vector128<uint> xmmT2 = Vector128.Create(BitConverter.ToUInt32(src, bufPos),
BitConverter.ToUInt32(src, bufPos + 8), BitConverter.ToUInt32(src, bufPos + 4),
BitConverter.ToUInt32(src, bufPos + 12)); BitConverter.ToUInt32(src, bufPos + 8),
BitConverter.ToUInt32(src, bufPos + 12));
bufPos += 16; bufPos += 16;
var xmmT3 = Vector128.Create(BitConverter.ToUInt32(src, bufPos), BitConverter.ToUInt32(src, bufPos + 4), Vector128<uint> xmmT3 = Vector128.Create(BitConverter.ToUInt32(src, bufPos),
BitConverter.ToUInt32(src, bufPos + 8), BitConverter.ToUInt32(src, bufPos + 4),
BitConverter.ToUInt32(src, bufPos + 12)); BitConverter.ToUInt32(src, bufPos + 8),
BitConverter.ToUInt32(src, bufPos + 12));
bufPos += 16; bufPos += 16;
@@ -163,7 +167,7 @@ static class Clmul
/* /*
* k1 * k1
*/ */
var crcFold = Vector128.Create(_crcK[0], _crcK[1], _crcK[2], _crcK[3]); Vector128<uint> crcFold = Vector128.Create(_crcK[0], _crcK[1], _crcK[2], _crcK[3]);
Vector128<uint> xTmp0 = Pclmulqdq.CarrylessMultiply(xmmCRC0.AsUInt64(), crcFold.AsUInt64(), 0x10).AsUInt32(); Vector128<uint> xTmp0 = Pclmulqdq.CarrylessMultiply(xmmCRC0.AsUInt64(), crcFold.AsUInt64(), 0x10).AsUInt32();

View File

@@ -30,8 +30,6 @@
// Copyright © 2011-2022 Natalia Portillo // Copyright © 2011-2022 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums;
using System; using System;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
@@ -42,6 +40,8 @@ using Aaru.Checksums.CRC32;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
using Aaru.Helpers; using Aaru.Helpers;
namespace Aaru.Checksums;
/// <inheritdoc /> /// <inheritdoc />
/// <summary>Implements a CRC32 algorithm</summary> /// <summary>Implements a CRC32 algorithm</summary>
public sealed class Crc32Context : IChecksum public sealed class Crc32Context : IChecksum

View File

@@ -21,13 +21,13 @@
// Copyright © 2011-2022 Natalia Portillo // Copyright © 2011-2022 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums.CRC64;
using System; using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.Intrinsics; using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86; using System.Runtime.Intrinsics.X86;
namespace Aaru.Checksums.CRC64;
static class Clmul static class Clmul
{ {
static readonly byte[] _shuffleMasks = static readonly byte[] _shuffleMasks =
@@ -42,13 +42,14 @@ static class Clmul
{ {
uint maskPos = 16 - n; uint maskPos = 16 - n;
var maskA = Vector128.Create(_shuffleMasks[maskPos], _shuffleMasks[maskPos + 1], _shuffleMasks[maskPos + 2], Vector128<byte> maskA = Vector128.Create(_shuffleMasks[maskPos], _shuffleMasks[maskPos + 1],
_shuffleMasks[maskPos + 3], _shuffleMasks[maskPos + 4], _shuffleMasks[maskPos + 5], _shuffleMasks[maskPos + 2], _shuffleMasks[maskPos + 3],
_shuffleMasks[maskPos + 6], _shuffleMasks[maskPos + 7], _shuffleMasks[maskPos + 8], _shuffleMasks[maskPos + 4], _shuffleMasks[maskPos + 5],
_shuffleMasks[maskPos + 9], _shuffleMasks[maskPos + 10], _shuffleMasks[maskPos + 6], _shuffleMasks[maskPos + 7],
_shuffleMasks[maskPos + 11], _shuffleMasks[maskPos + 12], _shuffleMasks[maskPos + 8], _shuffleMasks[maskPos + 9],
_shuffleMasks[maskPos + 13], _shuffleMasks[maskPos + 14], _shuffleMasks[maskPos + 10], _shuffleMasks[maskPos + 11],
_shuffleMasks[maskPos + 15]); _shuffleMasks[maskPos + 12], _shuffleMasks[maskPos + 13],
_shuffleMasks[maskPos + 14], _shuffleMasks[maskPos + 15]);
Vector128<byte> maskB = Sse2.Xor(maskA, Sse2.CompareEqual(Vector128<byte>.Zero, Vector128<byte>.Zero)); Vector128<byte> maskB = Sse2.Xor(maskA, Sse2.CompareEqual(Vector128<byte>.Zero, Vector128<byte>.Zero));
@@ -63,14 +64,14 @@ static class Clmul
internal static ulong Step(ulong crc, byte[] data, uint length) internal static ulong Step(ulong crc, byte[] data, uint length)
{ {
var bufPos = 16; int bufPos = 16;
const ulong k1 = 0xe05dd497ca393ae4; const ulong k1 = 0xe05dd497ca393ae4;
const ulong k2 = 0xdabe95afc7875f40; const ulong k2 = 0xdabe95afc7875f40;
const ulong mu = 0x9c3e466c172963d5; const ulong mu = 0x9c3e466c172963d5;
const ulong pol = 0x92d8af2baf0e1e85; const ulong pol = 0x92d8af2baf0e1e85;
var foldConstants1 = Vector128.Create(k1, k2); Vector128<ulong> foldConstants1 = Vector128.Create(k1, k2);
var foldConstants2 = Vector128.Create(mu, pol); Vector128<ulong> foldConstants2 = Vector128.Create(mu, pol);
var initialCrc = Vector128.Create(~crc, 0); Vector128<ulong> initialCrc = Vector128.Create(~crc, 0);
length -= 16; length -= 16;
// Initial CRC can simply be added to data // Initial CRC can simply be added to data

View File

@@ -30,8 +30,6 @@
// Copyright © 2011-2022 Natalia Portillo // Copyright © 2011-2022 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums;
using System; using System;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
@@ -41,6 +39,8 @@ using Aaru.Checksums.CRC64;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
using Aaru.Helpers; using Aaru.Helpers;
namespace Aaru.Checksums;
/// <inheritdoc /> /// <inheritdoc />
/// <summary>Implements a CRC64 algorithm</summary> /// <summary>Implements a CRC64 algorithm</summary>
public sealed class Crc64Context : IChecksum public sealed class Crc64Context : IChecksum

View File

@@ -32,8 +32,6 @@
// Disabled because the speed is abnormally slow // Disabled because the speed is abnormally slow
namespace Aaru.Checksums;
using System; using System;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
@@ -41,6 +39,8 @@ using System.Text;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
using Aaru.Helpers; using Aaru.Helpers;
namespace Aaru.Checksums;
/// <inheritdoc /> /// <inheritdoc />
/// <summary>Implements the Fletcher-32 algorithm</summary> /// <summary>Implements the Fletcher-32 algorithm</summary>
public sealed class Fletcher32Context : IChecksum public sealed class Fletcher32Context : IChecksum

View File

@@ -30,14 +30,14 @@
// Copyright © 2011-2022 Natalia Portillo // Copyright © 2011-2022 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums;
using System; using System;
using System.IO; using System.IO;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
namespace Aaru.Checksums;
/// <inheritdoc /> /// <inheritdoc />
/// <summary>Wraps up .NET MD5 implementation to a Init(), Update(), Final() context.</summary> /// <summary>Wraps up .NET MD5 implementation to a Init(), Update(), Final() context.</summary>
public sealed class Md5Context : IChecksum public sealed class Md5Context : IChecksum

View File

@@ -30,10 +30,10 @@
// Copyright © 2011-2022 Natalia Portillo // Copyright © 2011-2022 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Aaru.Checksums;
/// <summary>Handles native implementations of compression algorithms</summary> /// <summary>Handles native implementations of compression algorithms</summary>
public static class Native public static class Native
{ {

View File

@@ -57,11 +57,11 @@
* *
*/ */
namespace Aaru.Checksums;
using System; using System;
using Aaru.Console; using Aaru.Console;
namespace Aaru.Checksums;
/// <summary>Implements the Reed-Solomon algorithm</summary> /// <summary>Implements the Reed-Solomon algorithm</summary>
public class ReedSolomon public class ReedSolomon
{ {
@@ -87,69 +87,69 @@ public class ReedSolomon
public void InitRs(int n, int k, int m) public void InitRs(int n, int k, int m)
{ {
_pp = m switch _pp = m switch
{ {
2 => new[] 2 => new[]
{ {
1, 1, 1 1, 1, 1
}, },
3 => new[] 3 => new[]
{ {
1, 1, 0, 1 1, 1, 0, 1
}, },
4 => new[] 4 => new[]
{ {
1, 1, 0, 0, 1 1, 1, 0, 0, 1
}, },
5 => new[] 5 => new[]
{ {
1, 0, 1, 0, 0, 1 1, 0, 1, 0, 0, 1
}, },
6 => new[] 6 => new[]
{ {
1, 1, 0, 0, 0, 0, 1 1, 1, 0, 0, 0, 0, 1
}, },
7 => new[] 7 => new[]
{ {
1, 0, 0, 1, 0, 0, 0, 1 1, 0, 0, 1, 0, 0, 0, 1
}, },
8 => new[] 8 => new[]
{ {
1, 0, 1, 1, 1, 0, 0, 0, 1 1, 0, 1, 1, 1, 0, 0, 0, 1
}, },
9 => new[] 9 => new[]
{ {
1, 0, 0, 0, 1, 0, 0, 0, 0, 1 1, 0, 0, 0, 1, 0, 0, 0, 0, 1
}, },
10 => new[] 10 => new[]
{ {
1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1
}, },
11 => new[] 11 => new[]
{ {
1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
}, },
12 => new[] 12 => new[]
{ {
1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1
}, },
13 => new[] 13 => new[]
{ {
1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
}, },
14 => new[] 14 => new[]
{ {
1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1
}, },
15 => new[] 15 => new[]
{ {
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
}, },
16 => new[] 16 => new[]
{ {
1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1
}, },
_ => throw new ArgumentOutOfRangeException(nameof(m), "m must be between 2 and 16 inclusive") _ => throw new ArgumentOutOfRangeException(nameof(m), "m must be between 2 and 16 inclusive")
}; };
_mm = m; _mm = m;
_kk = k; _kk = k;
@@ -237,7 +237,7 @@ public class ReedSolomon
{ {
int i; int i;
var mask = 1; int mask = 1;
_alphaTo[_mm] = 0; _alphaTo[_mm] = 0;
for(i = 0; i < _mm; i++) for(i = 0; i < _mm; i++)
@@ -396,18 +396,18 @@ public class ReedSolomon
throw new UnauthorizedAccessException("Trying to calculate RS without initializing!"); throw new UnauthorizedAccessException("Trying to calculate RS without initializing!");
erasPos = new int[_nn - _kk]; erasPos = new int[_nn - _kk];
int i, j; int i, j;
int q, tmp; int q, tmp;
var recd = new int[_nn]; int[] recd = new int[_nn];
var lambda = new int[_nn - _kk + 1]; /* Err+Eras Locator poly */ int[] lambda = new int[_nn - _kk + 1]; /* Err+Eras Locator poly */
var s = new int[_nn - _kk + 1]; /* syndrome poly */ int[] s = new int[_nn - _kk + 1]; /* syndrome poly */
var b = new int[_nn - _kk + 1]; int[] b = new int[_nn - _kk + 1];
var t = new int[_nn - _kk + 1]; int[] t = new int[_nn - _kk + 1];
var omega = new int[_nn - _kk + 1]; int[] omega = new int[_nn - _kk + 1];
var root = new int[_nn - _kk]; int[] root = new int[_nn - _kk];
var reg = new int[_nn - _kk + 1]; int[] reg = new int[_nn - _kk + 1];
var loc = new int[_nn - _kk]; int[] loc = new int[_nn - _kk];
int count; int count;
/* data[] is in polynomial form, copy and convert to index form */ /* data[] is in polynomial form, copy and convert to index form */
for(i = _nn - 1; i >= 0; i--) for(i = _nn - 1; i >= 0; i--)
@@ -422,7 +422,7 @@ public class ReedSolomon
/* first form the syndromes; i.e., evaluate recd(x) at roots of g(x) /* first form the syndromes; i.e., evaluate recd(x) at roots of g(x)
* namely @**(B0+i), i = 0, ... ,(NN-KK-1) * namely @**(B0+i), i = 0, ... ,(NN-KK-1)
*/ */
var synError = 0; int synError = 0;
for(i = 1; i <= _nn - _kk; i++) for(i = 1; i <= _nn - _kk; i++)
{ {
@@ -430,7 +430,7 @@ public class ReedSolomon
for(j = 0; j < _nn; j++) for(j = 0; j < _nn; j++)
if(recd[j] != _a0) /* recd[j] in index form */ if(recd[j] != _a0) /* recd[j] in index form */
tmp ^= _alphaTo[Modnn(recd[j] + (B0 + i - 1) * j)]; tmp ^= _alphaTo[Modnn(recd[j] + ((B0 + i - 1) * j))];
synError |= tmp; /* set flag if non-zero syndrome => synError |= tmp; /* set flag if non-zero syndrome =>
* error */ * error */
@@ -523,7 +523,7 @@ public class ReedSolomon
{ {
/* r is the step number */ /* r is the step number */
/* Compute discrepancy at the r-th step in poly-form */ /* Compute discrepancy at the r-th step in poly-form */
var discrR = 0; int discrR = 0;
for(i = 0; i < r; i++) for(i = 0; i < r; i++)
if(lambda[i] != 0 && if(lambda[i] != 0 &&
@@ -572,7 +572,7 @@ public class ReedSolomon
} }
/* Convert lambda to index form and compute deg(lambda(x)) */ /* Convert lambda to index form and compute deg(lambda(x)) */
var degLambda = 0; int degLambda = 0;
for(i = 0; i < _nn - _kk + 1; i++) for(i = 0; i < _nn - _kk + 1; i++)
{ {
@@ -627,7 +627,7 @@ public class ReedSolomon
* Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo * Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo
* x**(NN-KK)). in index form. Also find deg(omega). * x**(NN-KK)). in index form. Also find deg(omega).
*/ */
var degOmega = 0; int degOmega = 0;
for(i = 0; i < _nn - _kk; i++) for(i = 0; i < _nn - _kk; i++)
{ {
@@ -653,19 +653,19 @@ public class ReedSolomon
*/ */
for(j = count - 1; j >= 0; j--) for(j = count - 1; j >= 0; j--)
{ {
var num1 = 0; int num1 = 0;
for(i = degOmega; i >= 0; i--) for(i = degOmega; i >= 0; i--)
if(omega[i] != _a0) if(omega[i] != _a0)
num1 ^= _alphaTo[Modnn(omega[i] + i * root[j])]; num1 ^= _alphaTo[Modnn(omega[i] + (i * root[j]))];
int num2 = _alphaTo[Modnn(root[j] * (B0 - 1) + _nn)]; int num2 = _alphaTo[Modnn((root[j] * (B0 - 1)) + _nn)];
var den = 0; int den = 0;
/* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */ /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */
for(i = Min(degLambda, _nn - _kk - 1) & ~1; i >= 0; i -= 2) for(i = Min(degLambda, _nn - _kk - 1) & ~1; i >= 0; i -= 2)
if(lambda[i + 1] != _a0) if(lambda[i + 1] != _a0)
den ^= _alphaTo[Modnn(lambda[i + 1] + i * root[j])]; den ^= _alphaTo[Modnn(lambda[i + 1] + (i * root[j]))];
if(den == 0) if(den == 0)
{ {

View File

@@ -36,14 +36,14 @@
// Copyright © 2011-2022 Natalia Portillo // Copyright © 2011-2022 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
namespace Aaru.Checksums;
/// <inheritdoc /> /// <inheritdoc />
public sealed class Register : IPluginRegister public sealed class Register : IPluginRegister
{ {

View File

@@ -30,14 +30,14 @@
// Copyright © 2011-2022 Natalia Portillo // Copyright © 2011-2022 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums;
using System; using System;
using System.IO; using System.IO;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
namespace Aaru.Checksums;
/// <inheritdoc /> /// <inheritdoc />
/// <summary>Wraps up .NET SHA1 implementation to a Init(), Update(), Final() context.</summary> /// <summary>Wraps up .NET SHA1 implementation to a Init(), Update(), Final() context.</summary>
public sealed class Sha1Context : IChecksum public sealed class Sha1Context : IChecksum

View File

@@ -30,14 +30,14 @@
// Copyright © 2011-2022 Natalia Portillo // Copyright © 2011-2022 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums;
using System; using System;
using System.IO; using System.IO;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
namespace Aaru.Checksums;
/// <inheritdoc /> /// <inheritdoc />
/// <summary>Wraps up .NET SHA256 implementation to a Init(), Update(), Final() context.</summary> /// <summary>Wraps up .NET SHA256 implementation to a Init(), Update(), Final() context.</summary>
public sealed class Sha256Context : IChecksum public sealed class Sha256Context : IChecksum

View File

@@ -30,14 +30,14 @@
// Copyright © 2011-2022 Natalia Portillo // Copyright © 2011-2022 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums;
using System; using System;
using System.IO; using System.IO;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
namespace Aaru.Checksums;
/// <inheritdoc /> /// <inheritdoc />
/// <summary>Wraps up .NET SHA384 implementation to a Init(), Update(), Final() context.</summary> /// <summary>Wraps up .NET SHA384 implementation to a Init(), Update(), Final() context.</summary>
public sealed class Sha384Context : IChecksum public sealed class Sha384Context : IChecksum

View File

@@ -30,14 +30,14 @@
// Copyright © 2011-2022 Natalia Portillo // Copyright © 2011-2022 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
namespace Aaru.Checksums;
using System; using System;
using System.IO; using System.IO;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
namespace Aaru.Checksums;
/// <inheritdoc /> /// <inheritdoc />
/// <summary>Wraps up .NET SHA512 implementation to a Init(), Update(), Final() context.</summary> /// <summary>Wraps up .NET SHA512 implementation to a Init(), Update(), Final() context.</summary>
public sealed class Sha512Context : IChecksum public sealed class Sha512Context : IChecksum

View File

@@ -39,13 +39,13 @@
// http://www.samba.org/ftp/unpacked/junkcode/spamsum/ // http://www.samba.org/ftp/unpacked/junkcode/spamsum/
// http://ssdeep.sf.net/ // http://ssdeep.sf.net/
namespace Aaru.Checksums;
using System; using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Text; using System.Text;
using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Interfaces;
namespace Aaru.Checksums;
/// <inheritdoc /> /// <inheritdoc />
/// <summary>Implements the SpamSum fuzzy hashing algorithm.</summary> /// <summary>Implements the SpamSum fuzzy hashing algorithm.</summary>
public sealed class SpamSumContext : IChecksum public sealed class SpamSumContext : IChecksum
@@ -56,7 +56,7 @@ public sealed class SpamSumContext : IChecksum
const uint HASH_INIT = 0x28021967; const uint HASH_INIT = 0x28021967;
const uint NUM_BLOCKHASHES = 31; const uint NUM_BLOCKHASHES = 31;
const uint SPAMSUM_LENGTH = 64; const uint SPAMSUM_LENGTH = 64;
const uint FUZZY_MAX_RESULT = 2 * SPAMSUM_LENGTH + 20; const uint FUZZY_MAX_RESULT = (2 * SPAMSUM_LENGTH) + 20;
//"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; //"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
readonly byte[] _b64 = readonly byte[] _b64 =
@@ -77,7 +77,7 @@ public sealed class SpamSumContext : IChecksum
Bh = new BlockhashContext[NUM_BLOCKHASHES] Bh = new BlockhashContext[NUM_BLOCKHASHES]
}; };
for(var i = 0; i < NUM_BLOCKHASHES; i++) for(int i = 0; i < NUM_BLOCKHASHES; i++)
_self.Bh[i].Digest = new byte[SPAMSUM_LENGTH]; _self.Bh[i].Digest = new byte[SPAMSUM_LENGTH];
_self.Bhstart = 0; _self.Bhstart = 0;
@@ -99,7 +99,7 @@ public sealed class SpamSumContext : IChecksum
{ {
_self.TotalSize += len; _self.TotalSize += len;
for(var i = 0; i < len; i++) for(int i = 0; i < len; i++)
fuzzy_engine_step(data[i]); fuzzy_engine_step(data[i]);
} }
@@ -274,7 +274,7 @@ public sealed class SpamSumContext : IChecksum
var sb = new StringBuilder(); var sb = new StringBuilder();
uint bi = _self.Bhstart; uint bi = _self.Bhstart;
uint h = roll_sum(); uint h = roll_sum();
var remain = (int)(FUZZY_MAX_RESULT - 1); /* Exclude terminating '\0'. */ int remain = (int)(FUZZY_MAX_RESULT - 1); /* Exclude terminating '\0'. */
result = new byte[FUZZY_MAX_RESULT]; result = new byte[FUZZY_MAX_RESULT];
/* Verify that our elimination was not overeager. */ /* Verify that our elimination was not overeager. */
@@ -471,7 +471,7 @@ public sealed class SpamSumContext : IChecksum
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
static string CToString(byte[] cString) static string CToString(byte[] cString)
{ {
var count = 0; int count = 0;
// ReSharper disable once LoopCanBeConvertedToQuery // ReSharper disable once LoopCanBeConvertedToQuery
// LINQ is six times slower // LINQ is six times slower