diff --git a/backend/agent/src/MoShiro.Agent/MoShiro.Agent.csproj b/backend/agent/src/MoShiro.Agent/MoShiro.Agent.csproj
index 7896c09..2e837f2 100644
--- a/backend/agent/src/MoShiro.Agent/MoShiro.Agent.csproj
+++ b/backend/agent/src/MoShiro.Agent/MoShiro.Agent.csproj
@@ -23,4 +23,6 @@
+
diff --git a/backend/fleet/tools/fleet-enroll/fleet-enroll.csproj b/backend/fleet/tools/fleet-enroll/fleet-enroll.csproj
index 6c646cc..9464f8e 100644
--- a/backend/fleet/tools/fleet-enroll/fleet-enroll.csproj
+++ b/backend/fleet/tools/fleet-enroll/fleet-enroll.csproj
@@ -33,4 +33,6 @@
+
diff --git a/backend/probe/src/MoShiro.Probe/MoShiro.Probe.csproj b/backend/probe/src/MoShiro.Probe/MoShiro.Probe.csproj
index 54d4202..20533a4 100644
--- a/backend/probe/src/MoShiro.Probe/MoShiro.Probe.csproj
+++ b/backend/probe/src/MoShiro.Probe/MoShiro.Probe.csproj
@@ -23,4 +23,6 @@
+
diff --git a/backend/shared/MoShiro.Measurement/MoShiro.Measurement.csproj b/backend/shared/MoShiro.Measurement/MoShiro.Measurement.csproj
index 388332a..856bb84 100644
--- a/backend/shared/MoShiro.Measurement/MoShiro.Measurement.csproj
+++ b/backend/shared/MoShiro.Measurement/MoShiro.Measurement.csproj
@@ -3,6 +3,9 @@
true
true
+
+ $(DefineConstants);MOSHIRO_STATIC_MSQUIC
+
diff --git a/backend/shared/MoShiro.Measurement/Net/MsQuicRuntime.cs b/backend/shared/MoShiro.Measurement/Net/MsQuicRuntime.cs
index ff101c1..8110a50 100644
--- a/backend/shared/MoShiro.Measurement/Net/MsQuicRuntime.cs
+++ b/backend/shared/MoShiro.Measurement/Net/MsQuicRuntime.cs
@@ -7,11 +7,13 @@ internal static class MsQuicRuntime
{
private const uint ApiVersion = 2;
private static readonly object s_gate = new();
+#if !MOSHIRO_STATIC_MSQUIC
private static nint s_library;
- private static nint s_api;
private static OpenVersionDelegate? s_open;
private static CloseDelegate? s_close;
private static readonly List s_supportLibraries = [];
+#endif
+ private static nint s_api;
public static nint Api
{
@@ -19,6 +21,19 @@ internal static class MsQuicRuntime
{
lock (s_gate)
{
+#if MOSHIRO_STATIC_MSQUIC
+ if (s_api == 0)
+ {
+ int status = OpenStatic(ApiVersion, out s_api);
+ if (status != 0 || s_api == 0)
+ {
+ s_api = 0;
+ throw new InvalidOperationException($"MsQuic API v{ApiVersion} could not be opened (status {status}).");
+ }
+ }
+
+ return s_api;
+#else
if (s_api != 0)
{
return s_api;
@@ -57,6 +72,7 @@ internal static class MsQuicRuntime
}
return s_api;
+#endif
}
}
}
@@ -65,6 +81,13 @@ internal static class MsQuicRuntime
{
lock (s_gate)
{
+#if MOSHIRO_STATIC_MSQUIC
+ if (s_api != 0)
+ {
+ CloseStatic(s_api);
+ s_api = 0;
+ }
+#else
if (s_api != 0)
{
s_close!(s_api);
@@ -83,9 +106,11 @@ internal static class MsQuicRuntime
}
s_supportLibraries.Clear();
+#endif
}
}
+#if !MOSHIRO_STATIC_MSQUIC
private static void LoadBundledSupportLibraries()
{
if (OperatingSystem.IsLinux())
@@ -106,13 +131,22 @@ internal static class MsQuicRuntime
s_supportLibraries.Add(handle);
}
}
+#else
+ [DllImport("__Internal", EntryPoint = "MsQuicOpenVersion", CallingConvention = CallingConvention.Cdecl)]
+ private static extern int OpenStatic(uint version, out nint api);
+
+ [DllImport("__Internal", EntryPoint = "MsQuicClose", CallingConvention = CallingConvention.Cdecl)]
+ private static extern void CloseStatic(nint api);
+#endif
public static T Function(int index)
where T : Delegate => Marshal.GetDelegateForFunctionPointer(Marshal.ReadIntPtr(Api, checked(index * IntPtr.Size)));
+#if !MOSHIRO_STATIC_MSQUIC
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int OpenVersionDelegate(uint version, out nint api);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void CloseDelegate(nint api);
+#endif
}
diff --git a/backend/shared/MoShiro.Measurement/StaticMsQuic.targets b/backend/shared/MoShiro.Measurement/StaticMsQuic.targets
new file mode 100644
index 0000000..714c322
--- /dev/null
+++ b/backend/shared/MoShiro.Measurement/StaticMsQuic.targets
@@ -0,0 +1,32 @@
+
+
+ <_MoShiroStaticMsQuicLibrary>$(MSBuildThisFileDirectory)../../../packaging/native/msquic/$(RuntimeIdentifier)/libmsquic.a
+
+
+
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ci/build-dev-image.sh b/ci/build-dev-image.sh
index 199be31..bd5fb03 100644
--- a/ci/build-dev-image.sh
+++ b/ci/build-dev-image.sh
@@ -113,7 +113,7 @@ mkdir -p "$nuget_cache"
commit_epoch="$(git -C "$root" show -s --format=%ct "$CI_COMMIT_SHA")"
built_at="$(date -u -d "@$commit_epoch" +%Y-%m-%dT%H:%M:%SZ)"
-python3 "$root/ci/stage-node-image.py" "$component" "$context"
+python3 "$root/ci/stage-node-image.py" "$component" "$node_rid" "$context"
run_bounded 30m buildah bud --layers --network host --tls-verify=true --arch "$arch" \
--volume "$nuget_cache:/root/.nuget/packages:rw" \
--build-arg "APP_VERSION=$image_version" \
diff --git a/ci/stage-node-image.py b/ci/stage-node-image.py
index a2ac940..d5b3b94 100644
--- a/ci/stage-node-image.py
+++ b/ci/stage-node-image.py
@@ -9,6 +9,7 @@ from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
BACKEND = ROOT / "backend"
+STATIC_MSQUIC = ROOT / "packaging/native/msquic"
IGNORED_PARTS = {".git", ".release", "artifacts", "bin", "obj", "TestResults", "tests"}
GLOBAL_BACKEND_FILES = {
"Directory.Build.props",
@@ -27,7 +28,7 @@ CONTAINERFILES = {
}
-def stage(component: str, destination: Path) -> None:
+def stage(component: str, runtime_identifier: str, destination: Path) -> None:
if destination.exists():
shutil.rmtree(destination)
restore = destination / "restore/backend"
@@ -57,6 +58,13 @@ def stage(component: str, destination: Path) -> None:
for directory in (restore, source):
shutil.copy2(ROOT / name, directory / name)
+ static_library = STATIC_MSQUIC / runtime_identifier / "libmsquic.a"
+ if not static_library.is_file():
+ raise FileNotFoundError(f"static MsQuic archive is missing for {runtime_identifier}: {static_library}")
+ staged_library = destination / "source/packaging/native/msquic" / runtime_identifier / "libmsquic.a"
+ staged_library.parent.mkdir(parents=True, exist_ok=True)
+ shutil.copy2(static_library, staged_library)
+
config = destination / "config"
config.mkdir()
(config / ".keep").write_text("", encoding="utf-8")
@@ -68,9 +76,10 @@ def stage(component: str, destination: Path) -> None:
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("component", choices=tuple(CONTAINERFILES))
+ parser.add_argument("runtime_identifier", choices=("linux-musl-x64", "linux-musl-arm64"))
parser.add_argument("destination", type=Path)
args = parser.parse_args()
- stage(args.component, args.destination)
+ stage(args.component, args.runtime_identifier, args.destination)
if __name__ == "__main__":
diff --git a/docs/ops/deployment.md b/docs/ops/deployment.md
index b4cf181..87cc1b6 100644
--- a/docs/ops/deployment.md
+++ b/docs/ops/deployment.md
@@ -1,6 +1,6 @@
# 部署
-节点(Agent、Probe)使用 NativeAOT。QUIC 通过应用目录优先加载 MsQuic v2。Linux standalone 归档会附带 MsQuic、NUMA、zstd、zlib 和 musl 所需的 LTTng 共享库;运行主机仍需提供 OpenSSL 3(`libcrypto.so.3`)和对应 libc。Agent/Probe OCI 镜像以 Alpine 为运行基底,从对应架构归档复制这些共享库到可执行文件旁边;运行容器时不需要安装 MsQuic 系统包。启动时会检查 MsQuic 是否可加载。
+节点(Agent、Probe)使用 NativeAOT。Linux standalone 归档会附带 MsQuic、NUMA、zstd、zlib 和 musl 所需的 LTTng 共享库;运行主机仍需提供 OpenSSL 3(`libcrypto.so.3`)和对应 libc。Release Agent/Probe OCI 镜像以 Alpine 为运行基底,从对应架构归档复制这些共享库到可执行文件旁边。`moshiro-dev` 镜像则从 `packaging/native/msquic` 链接对应架构的静态 MsQuic、OpenSSL 和 .NET 加密 shim,并使用静态 musl 可执行文件;这两类镜像都不需要安装 MsQuic 系统包。
## 1. 构建与打包
diff --git a/packaging/container/Agent.NativeBuild.Containerfile b/packaging/container/Agent.NativeBuild.Containerfile
index d803d27..d65fae8 100644
--- a/packaging/container/Agent.NativeBuild.Containerfile
+++ b/packaging/container/Agent.NativeBuild.Containerfile
@@ -1,35 +1,19 @@
-# Run all build commands on the native amd64 runner. AotAnywhere cross-links
-# the NativeAOT output, so an ARM64 build never needs QEMU.
-FROM --platform=linux/arm64 alpine:3.24 AS arm64-apk-keys
-
-FROM --platform=linux/amd64 alpine:3.24 AS runtime-libs
-ARG NODE_RID=linux-musl-x64
-COPY --from=arm64-apk-keys /usr/share/apk/keys/ /tmp/apk-keys-arm64/
-RUN set -eu; \
- apk_arch=x86_64; \
- case "$NODE_RID" in *arm64) apk_arch=aarch64 ;; esac; \
- mkdir -p /tmp/runtime-apks /tmp/runtime-root /out/runtime; \
- if [ "$apk_arch" = aarch64 ]; then \
- apk --keys-dir /tmp/apk-keys-arm64 --arch "$apk_arch" fetch --recursive --output /tmp/runtime-apks libmsquic numactl lttng-ust zlib; \
- else \
- apk --arch "$apk_arch" fetch --recursive --output /tmp/runtime-apks libmsquic numactl lttng-ust zlib; \
- fi; \
- set -- /tmp/runtime-apks/*.apk; \
- [ -f "$1" ]; \
- for package do tar -xzf "$package" -C /tmp/runtime-root; done; \
- cp -a /tmp/runtime-root/usr/lib/*.so* /out/runtime/
-
+# AotAnywhere cross-links both Alpine architectures on the native amd64 runner.
FROM --platform=linux/amd64 mcr.microsoft.com/dotnet/sdk:10.0-noble-aot AS build
WORKDIR /src/backend
COPY restore/backend/ ./
ARG NODE_RID=linux-musl-x64
ENV NUGET_PACKAGES=/root/.nuget/packages
-# restore 也要带 PublishAot:不然不会还原 ILCompiler,之后 --no-restore 的发布就悄悄变成「裁剪过的框架依赖程序」
-RUN dotnet restore agent/src/MoShiro.Agent -r "$NODE_RID" -p:PublishAot=true -p:UseAotAnywhere=true --artifacts-path /artifacts \
- && dotnet restore fleet/tools/fleet-enroll -r "$NODE_RID" -p:PublishAot=true -p:UseAotAnywhere=true --artifacts-path /artifacts
+RUN dotnet restore agent/src/MoShiro.Agent -r "$NODE_RID" -p:PublishAot=true -p:UseAotAnywhere=true \
+ -p:StaticMsQuic=true -p:StaticExecutable=true -p:RuntimeFrameworkVersion=10.0.12 \
+ -p:InvariantGlobalization=true --artifacts-path /artifacts \
+ && dotnet restore fleet/tools/fleet-enroll -r "$NODE_RID" -p:PublishAot=true -p:UseAotAnywhere=true \
+ -p:StaticMsQuic=true -p:StaticExecutable=true -p:RuntimeFrameworkVersion=10.0.12 -p:InvariantGlobalization=true \
+ --artifacts-path /artifacts
COPY source/backend/ ./
+COPY source/packaging/native/msquic/ /src/packaging/native/msquic/
# 构建信息:CI 通过 --build-arg 传入;不传就是空(放在 restore 之后,每次构建都变的时间不会让依赖还原的缓存失效)
ARG MOSHIRO_TAG=
ARG MOSHIRO_COMMIT=
@@ -37,16 +21,21 @@ ARG MOSHIRO_BUILT_AT=
ENV MOSHIRO_TAG=$MOSHIRO_TAG MOSHIRO_COMMIT=$MOSHIRO_COMMIT MOSHIRO_BUILT_AT=$MOSHIRO_BUILT_AT
RUN dotnet publish agent/src/MoShiro.Agent -m:3 -c Release -r "$NODE_RID" \
--self-contained true --no-restore -p:PublishAot=true -p:UseAotAnywhere=true \
- -p:UseAppHost=true -p:StripSymbols=true \
+ -p:StaticMsQuic=true -p:StaticExecutable=true -p:RuntimeFrameworkVersion=10.0.12 \
+ -p:InvariantGlobalization=true -p:UseAppHost=true -p:StripSymbols=true \
-p:DebugType=none -p:DebugSymbols=false --artifacts-path /artifacts -o /out/agent \
&& dotnet publish fleet/tools/fleet-enroll -m:3 -c Release -r "$NODE_RID" \
--self-contained true --no-restore -p:PublishAot=true -p:UseAotAnywhere=true \
+ -p:StaticMsQuic=true -p:StaticExecutable=true -p:RuntimeFrameworkVersion=10.0.12 -p:InvariantGlobalization=true \
-p:UseAppHost=true -p:StripSymbols=true \
-p:DebugType=none -p:DebugSymbols=false --artifacts-path /artifacts -o /out/enroll
-# 原生程序有几 MB;几十 KB 的是只会去找 .dll 的启动器
RUN test -x /out/agent/moshiro-agent && test -x /out/enroll/fleet-enroll \
- && test "$(stat -c%s /out/agent/moshiro-agent)" -gt 2000000 && test "$(stat -c%s /out/enroll/fleet-enroll)" -gt 2000000
-COPY --from=runtime-libs /out/runtime/ /out/runtime/
+ && test "$(stat -c%s /out/agent/moshiro-agent)" -gt 2000000 \
+ && test "$(stat -c%s /out/enroll/fleet-enroll)" -gt 2000000 \
+ && ! readelf -l /out/agent/moshiro-agent | grep -q INTERP \
+ && ! readelf -d /out/agent/moshiro-agent 2>&1 | grep -q NEEDED \
+ && ! readelf -l /out/enroll/fleet-enroll | grep -q INTERP \
+ && ! readelf -d /out/enroll/fleet-enroll 2>&1 | grep -q NEEDED
FROM mcr.microsoft.com/dotnet/runtime-deps:10.0-alpine
@@ -58,12 +47,10 @@ LABEL org.opencontainers.image.title="MoShiro Agent" \
COPY --chown=1654:1654 --from=build /out/agent/moshiro-agent /usr/local/bin/moshiro-agent
COPY --chown=1654:1654 --from=build /out/enroll/fleet-enroll /usr/local/bin/fleet-enroll
-COPY --from=build /out/runtime/ /usr/local/bin/
COPY --chown=1654:1654 config/ /etc/moshiro/
COPY --chown=1654:1654 --chmod=0755 entrypoint.sh /usr/local/bin/moshiro-entrypoint
ENV MOSHIRO_ROLE=agent
-ENV LD_LIBRARY_PATH=/usr/local/bin
USER 1654:1654
WORKDIR /etc/moshiro
VOLUME ["/etc/moshiro"]
diff --git a/packaging/container/Probe.NativeBuild.Containerfile b/packaging/container/Probe.NativeBuild.Containerfile
index fcfe164..2d9c0d0 100644
--- a/packaging/container/Probe.NativeBuild.Containerfile
+++ b/packaging/container/Probe.NativeBuild.Containerfile
@@ -1,35 +1,19 @@
-# Run all build commands on the native amd64 runner. AotAnywhere cross-links
-# the NativeAOT output, so an ARM64 build never needs QEMU.
-FROM --platform=linux/arm64 alpine:3.24 AS arm64-apk-keys
-
-FROM --platform=linux/amd64 alpine:3.24 AS runtime-libs
-ARG NODE_RID=linux-musl-x64
-COPY --from=arm64-apk-keys /usr/share/apk/keys/ /tmp/apk-keys-arm64/
-RUN set -eu; \
- apk_arch=x86_64; \
- case "$NODE_RID" in *arm64) apk_arch=aarch64 ;; esac; \
- mkdir -p /tmp/runtime-apks /tmp/runtime-root /out/runtime; \
- if [ "$apk_arch" = aarch64 ]; then \
- apk --keys-dir /tmp/apk-keys-arm64 --arch "$apk_arch" fetch --recursive --output /tmp/runtime-apks libmsquic numactl lttng-ust zlib; \
- else \
- apk --arch "$apk_arch" fetch --recursive --output /tmp/runtime-apks libmsquic numactl lttng-ust zlib; \
- fi; \
- set -- /tmp/runtime-apks/*.apk; \
- [ -f "$1" ]; \
- for package do tar -xzf "$package" -C /tmp/runtime-root; done; \
- cp -a /tmp/runtime-root/usr/lib/*.so* /out/runtime/
-
+# AotAnywhere cross-links both Alpine architectures on the native amd64 runner.
FROM --platform=linux/amd64 mcr.microsoft.com/dotnet/sdk:10.0-noble-aot AS build
WORKDIR /src/backend
COPY restore/backend/ ./
ARG NODE_RID=linux-musl-x64
ENV NUGET_PACKAGES=/root/.nuget/packages
-# restore 也要带 PublishAot:不然不会还原 ILCompiler,之后 --no-restore 的发布就悄悄变成「裁剪过的框架依赖程序」
-RUN dotnet restore probe/src/MoShiro.Probe -r "$NODE_RID" -p:PublishAot=true -p:UseAotAnywhere=true --artifacts-path /artifacts \
- && dotnet restore fleet/tools/fleet-enroll -r "$NODE_RID" -p:PublishAot=true -p:UseAotAnywhere=true --artifacts-path /artifacts
+RUN dotnet restore probe/src/MoShiro.Probe -r "$NODE_RID" -p:PublishAot=true -p:UseAotAnywhere=true \
+ -p:StaticMsQuic=true -p:StaticExecutable=true -p:RuntimeFrameworkVersion=10.0.12 \
+ -p:InvariantGlobalization=true --artifacts-path /artifacts \
+ && dotnet restore fleet/tools/fleet-enroll -r "$NODE_RID" -p:PublishAot=true -p:UseAotAnywhere=true \
+ -p:StaticMsQuic=true -p:StaticExecutable=true -p:RuntimeFrameworkVersion=10.0.12 -p:InvariantGlobalization=true \
+ --artifacts-path /artifacts
COPY source/backend/ ./
+COPY source/packaging/native/msquic/ /src/packaging/native/msquic/
# 构建信息:CI 通过 --build-arg 传入;不传就是空(放在 restore 之后,每次构建都变的时间不会让依赖还原的缓存失效)
ARG MOSHIRO_TAG=
ARG MOSHIRO_COMMIT=
@@ -37,16 +21,21 @@ ARG MOSHIRO_BUILT_AT=
ENV MOSHIRO_TAG=$MOSHIRO_TAG MOSHIRO_COMMIT=$MOSHIRO_COMMIT MOSHIRO_BUILT_AT=$MOSHIRO_BUILT_AT
RUN dotnet publish probe/src/MoShiro.Probe -m:3 -c Release -r "$NODE_RID" \
--self-contained true --no-restore -p:PublishAot=true -p:UseAotAnywhere=true \
- -p:UseAppHost=true -p:StripSymbols=true \
+ -p:StaticMsQuic=true -p:StaticExecutable=true -p:RuntimeFrameworkVersion=10.0.12 \
+ -p:InvariantGlobalization=true -p:UseAppHost=true -p:StripSymbols=true \
-p:DebugType=none -p:DebugSymbols=false --artifacts-path /artifacts -o /out/probe \
&& dotnet publish fleet/tools/fleet-enroll -m:3 -c Release -r "$NODE_RID" \
--self-contained true --no-restore -p:PublishAot=true -p:UseAotAnywhere=true \
+ -p:StaticMsQuic=true -p:StaticExecutable=true -p:RuntimeFrameworkVersion=10.0.12 -p:InvariantGlobalization=true \
-p:UseAppHost=true -p:StripSymbols=true \
-p:DebugType=none -p:DebugSymbols=false --artifacts-path /artifacts -o /out/enroll
-# 原生程序有几 MB;几十 KB 的是只会去找 .dll 的启动器
RUN test -x /out/probe/moshiro-probe && test -x /out/enroll/fleet-enroll \
- && test "$(stat -c%s /out/probe/moshiro-probe)" -gt 2000000 && test "$(stat -c%s /out/enroll/fleet-enroll)" -gt 2000000
-COPY --from=runtime-libs /out/runtime/ /out/runtime/
+ && test "$(stat -c%s /out/probe/moshiro-probe)" -gt 2000000 \
+ && test "$(stat -c%s /out/enroll/fleet-enroll)" -gt 2000000 \
+ && ! readelf -l /out/probe/moshiro-probe | grep -q INTERP \
+ && ! readelf -d /out/probe/moshiro-probe 2>&1 | grep -q NEEDED \
+ && ! readelf -l /out/enroll/fleet-enroll | grep -q INTERP \
+ && ! readelf -d /out/enroll/fleet-enroll 2>&1 | grep -q NEEDED
FROM mcr.microsoft.com/dotnet/runtime-deps:10.0-alpine
@@ -58,12 +47,10 @@ LABEL org.opencontainers.image.title="MoShiro Probe" \
COPY --chown=1654:1654 --from=build /out/probe/moshiro-probe /usr/local/bin/moshiro-probe
COPY --chown=1654:1654 --from=build /out/enroll/fleet-enroll /usr/local/bin/fleet-enroll
-COPY --from=build /out/runtime/ /usr/local/bin/
COPY --chown=1654:1654 config/ /etc/moshiro/
COPY --chown=1654:1654 --chmod=0755 entrypoint.sh /usr/local/bin/moshiro-entrypoint
ENV MOSHIRO_ROLE=probe
-ENV LD_LIBRARY_PATH=/usr/local/bin
USER 1654:1654
WORKDIR /etc/moshiro
VOLUME ["/etc/moshiro"]
diff --git a/packaging/native/msquic/README.md b/packaging/native/msquic/README.md
new file mode 100644
index 0000000..8edaea6
--- /dev/null
+++ b/packaging/native/msquic/README.md
@@ -0,0 +1,19 @@
+# Static musl MsQuic archive
+
+The two `libmsquic.a` files are extracted from `LightDl 0.4.4-h3-static.3`.
+The package identifies its source as `greepar/LightDl` commit
+`f16971a5254dacab049c6637ce52dc8d518b5a61` and includes the MsQuic MIT,
+OpenSSL Apache-2.0, and .NET MIT notices in `licenses/`.
+
+The archives contain MsQuic, OpenSSL, and the .NET OpenSSL crypto shim. They
+are linked into musl NativeAOT node executables with `StaticExecutable=true`;
+the `LightDl` NuGet package and its build targets are not used by MoShiro.
+
+The preview package SHA-256 was
+`91659183CF593ABE1C214AC18CB7B1B7CD2FB23513C2A871EA8180CB8E226D84`.
+Archive SHA-256 values:
+
+| RID | SHA-256 |
+| --- | --- |
+| `linux-musl-x64` | `5C56E1207ECEEFA990A2048789382CF971C6A0FB46B2C2EF0E7A8EE3F6777FD4` |
+| `linux-musl-arm64` | `0AD7ACABF4CE3AA2585C66BE97BF6B955E22F99271D12D7ED107770365C14838` |
diff --git a/packaging/native/msquic/licenses/MsQuic-MIT.txt b/packaging/native/msquic/licenses/MsQuic-MIT.txt
new file mode 100644
index 0000000..63447fd
--- /dev/null
+++ b/packaging/native/msquic/licenses/MsQuic-MIT.txt
@@ -0,0 +1,21 @@
+Copyright (c) Microsoft Corporation.
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/packaging/native/msquic/licenses/OpenSSL-Apache-2.0.txt b/packaging/native/msquic/licenses/OpenSSL-Apache-2.0.txt
new file mode 100644
index 0000000..49cc83d
--- /dev/null
+++ b/packaging/native/msquic/licenses/OpenSSL-Apache-2.0.txt
@@ -0,0 +1,177 @@
+
+ Apache License
+ Version 2.0, January 2004
+ https://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
diff --git a/packaging/native/msquic/licenses/dotnet-MIT.txt b/packaging/native/msquic/licenses/dotnet-MIT.txt
new file mode 100644
index 0000000..984713a
--- /dev/null
+++ b/packaging/native/msquic/licenses/dotnet-MIT.txt
@@ -0,0 +1,23 @@
+The MIT License (MIT)
+
+Copyright (c) .NET Foundation and Contributors
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/packaging/native/msquic/linux-musl-arm64/libmsquic.a b/packaging/native/msquic/linux-musl-arm64/libmsquic.a
new file mode 100644
index 0000000..39ddb60
Binary files /dev/null and b/packaging/native/msquic/linux-musl-arm64/libmsquic.a differ
diff --git a/packaging/native/msquic/linux-musl-x64/libmsquic.a b/packaging/native/msquic/linux-musl-x64/libmsquic.a
new file mode 100644
index 0000000..70aa614
Binary files /dev/null and b/packaging/native/msquic/linux-musl-x64/libmsquic.a differ