Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add crypto.crc32c #1100

Merged
merged 1 commit into from
Feb 10, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Pluto.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,7 @@
<ClCompile Include="src\vendor\Soup\soup\cat.cpp" />
<ClCompile Include="src\vendor\Soup\soup\CpuInfo.cpp" />
<ClCompile Include="src\vendor\Soup\soup\crc32.cpp" />
<ClCompile Include="src\vendor\Soup\soup\crc32c.cpp" />
<ClCompile Include="src\vendor\Soup\soup\Curve25519.cpp" />
<ClCompile Include="src\vendor\Soup\soup\DefaultRngInterface.cpp" />
<ClCompile Include="src\vendor\Soup\soup\deflate.cpp" />
Expand Down Expand Up @@ -748,6 +749,7 @@
<ClInclude Include="src\vendor\Soup\soup\ConstString.hpp" />
<ClInclude Include="src\vendor\Soup\soup\CpuInfo.hpp" />
<ClInclude Include="src\vendor\Soup\soup\crc32.hpp" />
<ClInclude Include="src\vendor\Soup\soup\crc32c.hpp" />
<ClInclude Include="src\vendor\Soup\soup\crc32_intrin.hpp" />
<ClInclude Include="src\vendor\Soup\soup\CryptoHashAlgo.hpp" />
<ClInclude Include="src\vendor\Soup\soup\Curve25519.hpp" />
Expand Down
12 changes: 12 additions & 0 deletions src/lcryptolib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "vendor/Soup/soup/adler32.hpp"
#include "vendor/Soup/soup/aes.hpp"
#include "vendor/Soup/soup/crc32.hpp"
#include "vendor/Soup/soup/crc32c.hpp"
#include "vendor/Soup/soup/deflate.hpp"
#include "vendor/Soup/soup/HardwareRng.hpp"
#include "vendor/Soup/soup/ripemd160.hpp"
Expand Down Expand Up @@ -249,6 +250,16 @@ static int crc32(lua_State *L)
}


static int crc32c(lua_State *L)
{
size_t len;
const auto text = luaL_checklstring(L, 1, &len);
const auto hash = soup::crc32c::hash((const uint8_t*)text, len, (uint32_t)luaL_optinteger(L, 2, 0));
lua_pushinteger(L, hash);
return 1;
}


// The hashing function used inside Lua. Honorary addition.
// Basically a slightly different DJB2.
static int lua(lua_State *L)
Expand Down Expand Up @@ -751,6 +762,7 @@ static const luaL_Reg funcs_crypto[] = {
{"sha512", l_hashwithdigest<soup::sha512>},
{"lua", lua},
{"crc32", crc32},
{"crc32c", crc32c},
{"lookup3", lookup3},
{"md5", md5},
{"sdbm", sdbm},
Expand Down
2 changes: 1 addition & 1 deletion src/vendor/Soup/soup/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ CFLAGS=-c -Wall

LIBNAME=libsoup.a
# echo $(ls *.cpp | sed 's/.cpp/.o/g')
OBJS=adler32.o aes.o alloc.o Asn1Identifier.o Asn1Sequence.o base32.o base64.o base.o Bigint.o Capture.o cat.o CpuInfo.o crc32.o Curve25519.o deflate.o DetachedScheduler.o dnsHttpResolver.o dnsName.o dnsRawResolver.o dnsSmartResolver.o dnsUdpResolver.o dns_records.o dnsResolver.o ecc.o filesystem.o HttpRequest.o HttpRequestTask.o IpAddr.o joaat.o JsonArray.o JsonBool.o json.o JsonFloat.o JsonInt.o JsonNode.o JsonNull.o JsonObject.o JsonString.o log.o MimeMessage.o netConfig.o netConnectTask.o netStatus.o Oid.o pem.o Promise.o rand.o rsa.o Scheduler.o SelfDeletingThread.o sha1.o sha256.o sha384.o sha512.o Socket.o SocketTlsEncrypter.o SocketTlsHandshaker.o spaceship.o string.o Task.o Thread.o time.o TrustStore.o unicode.o Uri.o urlenc.o version_compare.o Worker.o X509Certchain.o X509Certificate.o X509RelativeDistinguishedName.o xml.o Reader.o Writer.o DefaultRngInterface.o HardwareRng.o Server.o os.o Regex.o RegexGroup.o ffi.o SharedLibrary.o rflParser.o LexemeParser.o Mixed.o LangDesc.o Rgb.o ParserState.o parse_tree.o ripemd160.o Canvas.o QrCode.o RasterFont.o TinyPngOut.o ResolveIpAddrTask.o SocketAddr.o memAllocator.o
OBJS=adler32.o aes.o alloc.o Asn1Identifier.o Asn1Sequence.o base32.o base64.o base.o Bigint.o Capture.o cat.o CpuInfo.o crc32.o Curve25519.o deflate.o DetachedScheduler.o dnsHttpResolver.o dnsName.o dnsRawResolver.o dnsSmartResolver.o dnsUdpResolver.o dns_records.o dnsResolver.o ecc.o filesystem.o HttpRequest.o HttpRequestTask.o IpAddr.o joaat.o JsonArray.o JsonBool.o json.o JsonFloat.o JsonInt.o JsonNode.o JsonNull.o JsonObject.o JsonString.o log.o MimeMessage.o netConfig.o netConnectTask.o netStatus.o Oid.o pem.o Promise.o rand.o rsa.o Scheduler.o SelfDeletingThread.o sha1.o sha256.o sha384.o sha512.o Socket.o SocketTlsEncrypter.o SocketTlsHandshaker.o spaceship.o string.o Task.o Thread.o time.o TrustStore.o unicode.o Uri.o urlenc.o version_compare.o Worker.o X509Certchain.o X509Certificate.o X509RelativeDistinguishedName.o xml.o Reader.o Writer.o DefaultRngInterface.o HardwareRng.o Server.o os.o Regex.o RegexGroup.o ffi.o SharedLibrary.o rflParser.o LexemeParser.o Mixed.o LangDesc.o Rgb.o ParserState.o parse_tree.o ripemd160.o Canvas.o QrCode.o RasterFont.o TinyPngOut.o ResolveIpAddrTask.o SocketAddr.o memAllocator.o crc32c.o

all: $(LIBNAME)

Expand Down
103 changes: 103 additions & 0 deletions src/vendor/Soup/soup/crc32c.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
#include "crc32c.hpp"

#define CRC32C_INTRIN SOUP_X86

#if CRC32C_INTRIN
#include <nmmintrin.h>

#include "CpuInfo.hpp"
#endif

NAMESPACE_SOUP
{
static uint32_t tab[] = {
0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4, 0xc79a971f, 0x35f1141c,
0x26a1e7e8, 0xd4ca64eb, 0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b,
0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24, 0x105ec76f, 0xe235446c,
0xf165b798, 0x030e349b, 0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384,
0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54, 0x5d1d08bf, 0xaf768bbc,
0xbc267848, 0x4e4dfb4b, 0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a,
0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35, 0xaa64d611, 0x580f5512,
0x4b5fa6e6, 0xb93425e5, 0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa,
0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45, 0xf779deae, 0x05125dad,
0x1642ae59, 0xe4292d5a, 0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a,
0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595, 0x417b1dbc, 0xb3109ebf,
0xa0406d4b, 0x522bee48, 0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957,
0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687, 0x0c38d26c, 0xfe53516f,
0xed03a29b, 0x1f682198, 0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927,
0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38, 0xdbfc821c, 0x2997011f,
0x3ac7f2eb, 0xc8ac71e8, 0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7,
0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096, 0xa65c047d, 0x5437877e,
0x4767748a, 0xb50cf789, 0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859,
0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46, 0x7198540d, 0x83f3d70e,
0x90a324fa, 0x62c8a7f9, 0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6,
0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36, 0x3cdb9bdd, 0xceb018de,
0xdde0eb2a, 0x2f8b6829, 0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c,
0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93, 0x082f63b7, 0xfa44e0b4,
0xe9141340, 0x1b7f9043, 0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c,
0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3, 0x55326b08, 0xa759e80b,
0xb4091bff, 0x466298fc, 0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c,
0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033, 0xa24bb5a6, 0x502036a5,
0x4370c551, 0xb11b4652, 0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d,
0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d, 0xef087a76, 0x1d63f975,
0x0e330a81, 0xfc588982, 0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d,
0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622, 0x38cc2a06, 0xcaa7a905,
0xd9f75af1, 0x2b9cd9f2, 0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed,
0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530, 0x0417b1db, 0xf67c32d8,
0xe52cc12c, 0x1747422f, 0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff,
0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0, 0xd3d3e1ab, 0x21b862a8,
0x32e8915c, 0xc083125f, 0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540,
0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90, 0x9e902e7b, 0x6cfbad78,
0x7fab5e8c, 0x8dc0dd8f, 0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee,
0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1, 0x69e9f0d5, 0x9b8273d6,
0x88d28022, 0x7ab90321, 0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e,
0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81, 0x34f4f86a, 0xc69f7b69,
0xd5cf889d, 0x27a40b9e, 0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e,
0xbe2da0a5, 0x4c4623a6, 0x5f16d052, 0xad7d5351
};
#define STEP1(octet, crc) (tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))

#if CRC32C_INTRIN
#if defined(__GNUC__) || defined(__clang__)
__attribute__((target("sse4.2")))
#endif
#endif
uint32_t crc32c::hash(const uint8_t* data, size_t size, uint32_t initial) noexcept
{
uint32_t i = ~initial;
#if CRC32C_INTRIN
if (CpuInfo::get().supportsSSE4_2())
{
#if SOUP_BITS >= 64
while (size >= 8)
{
i = (uint32_t)_mm_crc32_u64(i, *reinterpret_cast<const uint64_t*>(data));
data += 8;
size -= 8;
}
#else
while (size >= 4)
{
i = _mm_crc32_u32(i, *reinterpret_cast<const uint32_t*>(data));
data += 4;
size -= 4;
}
#endif
while (size > 0)
{
i = _mm_crc32_u8(i, *data);
data += 1;
size -= 1;
}
}
else
#endif
{
for (; size; --size, ++data)
{
i = STEP1(*data, i);
}
}
return ~i;
}
}
14 changes: 14 additions & 0 deletions src/vendor/Soup/soup/crc32c.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#pragma once

#include "base.hpp"

#include <cstdint>
#include <cstddef>

NAMESPACE_SOUP
{
struct crc32c
{
[[nodiscard]] static uint32_t hash(const uint8_t* data, size_t size, uint32_t initial = 0) noexcept;
};
}
4 changes: 4 additions & 0 deletions testes/pluto/basic.pluto
Original file line number Diff line number Diff line change
Expand Up @@ -1498,10 +1498,14 @@ do
assert(crypto.fnv1("hello world") == 0x7DCF62CDB1910E6F)
assert(crypto.fnv1a("hello world") == 8618312879776256743)
assert(crypto.joaat("hello world") == 1045060183)
assert(crypto.crc32("hello world") == 222957957)
assert(crypto.crc32c("hello world") == 3381945770)
-- Constexpr
assert($crypto.fnv1("hello world") == 0x7DCF62CDB1910E6F)
assert($crypto.fnv1a("hello world") == 8618312879776256743)
assert($crypto.joaat("hello world") == 1045060183)
assert($crypto.crc32("hello world") == 222957957)
assert($crypto.crc32c("hello world") == 3381945770)

assert(crypto.sha1("Pluto") == "bce8c9aca4120776fad6b517874aa09c46405454")
assert(crypto.sha1("Pluto", true) == "\xbc\xe8\xc9\xac\xa4\x12\x07\x76\xfa\xd6\xb5\x17\x87\x4a\xa0\x9c\x46\x40\x54\x54")
Expand Down