From 4afb0ae995af991736d68dd66ba2a88561fefcd2 Mon Sep 17 00:00:00 2001
From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com>
Date: Sun, 12 Jan 2025 20:02:50 +0100
Subject: [PATCH 1/7] add fedora signing and replace xmlsec
---
.devcontainer/devcontainer.json | 31 ---
.devcontainer/{ => docker}/Dockerfile | 0
.devcontainer/docker/devcontainer.json | 34 +++
.../{ => docker}/postCreateCommand.sh | 0
.devcontainer/podman/.env | 2 +
.devcontainer/podman/Dockerfile | 37 +++
.devcontainer/podman/devcontainer.json | 24 ++
.devcontainer/podman/docker-compose.yml | 18 ++
.devcontainer/podman/entrypoint.sh | 20 ++
.devcontainer/podman/onCreateCommand.sh | 8 +
.devcontainer/podman/postCreateCommand.sh | 2 +
.../actions/install-dependencies/action.yml | 2 +-
Cargo.lock | 193 +++-------------
Cargo.toml | 11 +-
rust-toolchain.toml | 3 +
xbuilder/Cargo.toml | 7 +-
xsender/Cargo.toml | 7 +-
xsigner/Cargo.toml | 4 +-
.../resources/test/invoice_with_template.xml | 181 ---------------
xsigner/src/lib.rs | 210 +++++++++---------
20 files changed, 298 insertions(+), 496 deletions(-)
delete mode 100644 .devcontainer/devcontainer.json
rename .devcontainer/{ => docker}/Dockerfile (100%)
create mode 100644 .devcontainer/docker/devcontainer.json
rename .devcontainer/{ => docker}/postCreateCommand.sh (100%)
create mode 100644 .devcontainer/podman/.env
create mode 100644 .devcontainer/podman/Dockerfile
create mode 100644 .devcontainer/podman/devcontainer.json
create mode 100644 .devcontainer/podman/docker-compose.yml
create mode 100755 .devcontainer/podman/entrypoint.sh
create mode 100755 .devcontainer/podman/onCreateCommand.sh
create mode 100755 .devcontainer/podman/postCreateCommand.sh
create mode 100644 rust-toolchain.toml
delete mode 100644 xsigner/resources/test/invoice_with_template.xml
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
deleted file mode 100644
index af0522bc..00000000
--- a/.devcontainer/devcontainer.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "name": "xhandler-rust",
- "build": {
- "dockerfile": "Dockerfile"
- },
- "features": {
- "ghcr.io/devcontainers/features/rust:1": {},
- "ghcr.io/devcontainers/features/node:1": {
- "version": "20"
- },
- "ghcr.io/devcontainers/features/docker-in-docker:2": {}
- },
- "postCreateCommand": "bash .devcontainer/postCreateCommand.sh",
- "customizations": {
- "vscode": {
- "settings": {},
- "extensions": [
- "vadimcn.vscode-lldb",
- "rust-lang.rust-analyzer",
- "tamasfe.even-better-toml",
- "github.vscode-github-actions",
- "github.vscode-pull-request-github"
- ]
- },
- "codespaces": {
- "openFiles": [
- "README.md"
- ]
- }
- }
-}
\ No newline at end of file
diff --git a/.devcontainer/Dockerfile b/.devcontainer/docker/Dockerfile
similarity index 100%
rename from .devcontainer/Dockerfile
rename to .devcontainer/docker/Dockerfile
diff --git a/.devcontainer/docker/devcontainer.json b/.devcontainer/docker/devcontainer.json
new file mode 100644
index 00000000..f7606920
--- /dev/null
+++ b/.devcontainer/docker/devcontainer.json
@@ -0,0 +1,34 @@
+{
+ "name": "xhandler-rust",
+ "build": {
+ "dockerfile": "Dockerfile"
+ },
+ "features": {
+ "ghcr.io/devcontainers/features/rust:1": {},
+ "ghcr.io/devcontainers/features/node:1": {
+ "version": "20"
+ },
+ "ghcr.io/devcontainers/features/docker-in-docker:2": {}
+ },
+ "postCreateCommand": "bash .devcontainer/docker/postCreateCommand.sh",
+ "customizations": {
+ "jetbrains": {
+ "backend": "RustRover"
+ },
+ "vscode": {
+ "settings": {},
+ "extensions": [
+ "vadimcn.vscode-lldb",
+ "rust-lang.rust-analyzer",
+ "tamasfe.even-better-toml",
+ "github.vscode-github-actions",
+ "github.vscode-pull-request-github"
+ ]
+ },
+ "codespaces": {
+ "openFiles": [
+ "README.md"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/.devcontainer/postCreateCommand.sh b/.devcontainer/docker/postCreateCommand.sh
similarity index 100%
rename from .devcontainer/postCreateCommand.sh
rename to .devcontainer/docker/postCreateCommand.sh
diff --git a/.devcontainer/podman/.env b/.devcontainer/podman/.env
new file mode 100644
index 00000000..e2dbf394
--- /dev/null
+++ b/.devcontainer/podman/.env
@@ -0,0 +1,2 @@
+REPO_PATH=/home/cferiavi/git/openubl/xhandler-rust
+USER_UID=115091
diff --git a/.devcontainer/podman/Dockerfile b/.devcontainer/podman/Dockerfile
new file mode 100644
index 00000000..4894e6a5
--- /dev/null
+++ b/.devcontainer/podman/Dockerfile
@@ -0,0 +1,37 @@
+FROM quay.io/fedora/fedora:41
+
+ARG USERNAME=vscode
+ARG USER_UID=1000
+ARG USER_GID=$USER_UID
+
+COPY entrypoint.sh /entrypoint.sh
+
+RUN dnf -y update && \
+ dnf install -y @development-tools && \
+ dnf install -y curl wget podman
+
+RUN groupadd --gid $USER_GID $USERNAME && \
+ useradd --uid $USER_UID --gid $USER_GID -m $USERNAME && \
+ echo $USERNAME:10000:5000 > /etc/subuid && echo $USERNAME:10000:5000 > /etc/subgid && \
+ # Allow user to execute 'sudo' without password
+ usermod -aG wheel $USERNAME && \
+ echo "%wheel ALL=(ALL) NOPASSWD:ALL" | tee -a /etc/sudoers > /dev/null
+
+# Podman
+# https://github.com/containers/podman/issues/2788#issuecomment-479923274
+RUN chmod 4755 /usr/bin/newgidmap && chmod 4755 /usr/bin/newuidmap
+
+# set permissions
+RUN chown $USERNAME:$USERNAME -R /home/$USERNAME
+
+RUN usermod -aG wheel $USERNAME && \
+ # Allow user to execute 'sudo' without password
+ echo "%wheel ALL=(ALL) NOPASSWD:ALL" | tee -a /etc/sudoers > /dev/null && \
+ # https://github.com/containers/podman/issues/2788#issuecomment-479923274
+ chmod 4755 /usr/bin/newgidmap && chmod 4755 /usr/bin/newuidmap
+
+ENV _CONTAINERS_USERNS_CONFIGURED=""
+
+ENTRYPOINT [ "/entrypoint.sh" ]
+USER $USERNAME
+CMD ["tail", "-f", "/dev/null"]
diff --git a/.devcontainer/podman/devcontainer.json b/.devcontainer/podman/devcontainer.json
new file mode 100644
index 00000000..5f0cdae1
--- /dev/null
+++ b/.devcontainer/podman/devcontainer.json
@@ -0,0 +1,24 @@
+{
+ "name": "xhandler-rust",
+ "dockerComposeFile": "docker-compose.yml",
+ "overrideCommand": true,
+ "shutdownAction": "stopCompose",
+ "service": "xhandler-rust",
+ "remoteUser": "vscode",
+ "onCreateCommand": "bash .devcontainer/podman/onCreateCommand.sh",
+ "postCreateCommand": "bash .devcontainer/podman/postCreateCommand.sh",
+ "customizations": {
+ "jetbrains": {
+ "backend": "RustRover"
+ },
+ "vscode": {
+ "extensions": [
+ "vadimcn.vscode-lldb",
+ "rust-lang.rust-analyzer",
+ "tamasfe.even-better-toml",
+ "github.vscode-github-actions",
+ "github.vscode-pull-request-github"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/.devcontainer/podman/docker-compose.yml b/.devcontainer/podman/docker-compose.yml
new file mode 100644
index 00000000..3757873a
--- /dev/null
+++ b/.devcontainer/podman/docker-compose.yml
@@ -0,0 +1,18 @@
+volumes:
+ cargo-cache:
+
+services:
+ xhandler-rust:
+ # https://github.com/microsoft/vscode-remote-release/issues/10215
+ image: localhost/xhandler-rust_devcontainer-xhandler-rust:latest
+ build:
+ context: .
+ dockerfile: ./Dockerfile
+ args:
+ USER_UID: ${USER_UID}
+ privileged: true
+ userns_mode: "keep-id"
+# command: tail -f /dev/null
+ volumes:
+ - ${REPO_PATH}:/workspace:cached
+ - cargo-cache:/home/vscode/.cargo
diff --git a/.devcontainer/podman/entrypoint.sh b/.devcontainer/podman/entrypoint.sh
new file mode 100755
index 00000000..434c8781
--- /dev/null
+++ b/.devcontainer/podman/entrypoint.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# Ensure $HOME exists when starting
+if [ ! -d "${HOME}" ]; then
+ mkdir -p "${HOME}"
+fi
+
+# Setup $PS1 for a consistent and reasonable prompt
+if [ -w "${HOME}" ] && [ ! -f "${HOME}"/.bashrc ]; then
+ echo "PS1='\s-\v \w \$ '" > "${HOME}"/.bashrc
+fi
+
+# Add current (arbitrary) user to /etc/passwd and /etc/group
+if ! whoami > /dev/null 2>&1; then
+ if [ -w /etc/passwd ]; then
+ echo "update passwd file"
+ echo "${USER_NAME:-user}:x:$(id -u):0:${USER_NAME:-user} user:${HOME}:/bin/bash" >> /etc/passwd
+ echo "${USER_NAME:-user}:x:$(id -u):" >> /etc/group
+ fi
+fi
diff --git a/.devcontainer/podman/onCreateCommand.sh b/.devcontainer/podman/onCreateCommand.sh
new file mode 100755
index 00000000..c00d5e02
--- /dev/null
+++ b/.devcontainer/podman/onCreateCommand.sh
@@ -0,0 +1,8 @@
+sudo dnf install -y @development-tools
+sudo dnf install -y @c-development
+sudo dnf install -y libxml2-devel openssl-devel gcc gcc-c++ cmake perl
+
+sudo dnf install -y rustup
+rustup-init -y
+. "$HOME/.cargo/env"
+rustup update
diff --git a/.devcontainer/podman/postCreateCommand.sh b/.devcontainer/podman/postCreateCommand.sh
new file mode 100755
index 00000000..62357f99
--- /dev/null
+++ b/.devcontainer/podman/postCreateCommand.sh
@@ -0,0 +1,2 @@
+# Git autocomplete
+echo "source /usr/share/bash-completion/completions/git" >> ~/.bashrc
diff --git a/.github/actions/install-dependencies/action.yml b/.github/actions/install-dependencies/action.yml
index 7210d089..0a263d66 100644
--- a/.github/actions/install-dependencies/action.yml
+++ b/.github/actions/install-dependencies/action.yml
@@ -6,4 +6,4 @@ runs:
- name: Install dependencies
shell: bash
run: |
- sudo apt-get -y install pkg-config xmlsec1 libxml2-dev libxmlsec1-dev libxmlsec1-openssl libclang-dev
+ sudo apt-get -y install pkg-config libssl-dev libxml2-dev libclang-dev
diff --git a/Cargo.lock b/Cargo.lock
index eedc406b..40039da8 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1,6 +1,6 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
-version = 3
+version = 4
[[package]]
name = "addr2line"
@@ -123,29 +123,6 @@ version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
-[[package]]
-name = "bindgen"
-version = "0.65.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5"
-dependencies = [
- "bitflags 1.3.2",
- "cexpr",
- "clang-sys",
- "lazy_static",
- "lazycell",
- "log",
- "peeking_take_while",
- "prettyplease",
- "proc-macro2",
- "quote",
- "regex",
- "rustc-hash",
- "shlex",
- "syn 2.0.71",
- "which",
-]
-
[[package]]
name = "bitflags"
version = "1.3.2"
@@ -199,7 +176,7 @@ dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
"syn_derive",
]
@@ -284,15 +261,6 @@ dependencies = [
"libc",
]
-[[package]]
-name = "cexpr"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
-dependencies = [
- "nom",
-]
-
[[package]]
name = "cfg-if"
version = "1.0.0"
@@ -362,17 +330,6 @@ dependencies = [
"inout",
]
-[[package]]
-name = "clang-sys"
-version = "1.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
-dependencies = [
- "glob",
- "libc",
- "libloading",
-]
-
[[package]]
name = "const-oid"
version = "0.9.6"
@@ -496,7 +453,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
]
[[package]]
@@ -516,7 +473,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
]
[[package]]
@@ -545,15 +502,9 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
]
-[[package]]
-name = "either"
-version = "1.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
-
[[package]]
name = "encoding_rs"
version = "0.8.34"
@@ -820,15 +771,6 @@ dependencies = [
"digest",
]
-[[package]]
-name = "home"
-version = "0.5.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
-dependencies = [
- "windows-sys 0.52.0",
-]
-
[[package]]
name = "http"
version = "1.1.0"
@@ -1058,28 +1000,12 @@ dependencies = [
"spin",
]
-[[package]]
-name = "lazycell"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
-
[[package]]
name = "libc"
version = "0.2.155"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
-[[package]]
-name = "libloading"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4"
-dependencies = [
- "cfg-if",
- "windows-targets 0.52.6",
-]
-
[[package]]
name = "libm"
version = "0.2.8"
@@ -1157,12 +1083,6 @@ dependencies = [
"unicase",
]
-[[package]]
-name = "minimal-lexical"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
-
[[package]]
name = "miniz_oxide"
version = "0.7.4"
@@ -1201,16 +1121,6 @@ dependencies = [
"tempfile",
]
-[[package]]
-name = "nom"
-version = "7.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
-dependencies = [
- "memchr",
- "minimal-lexical",
-]
-
[[package]]
name = "num-bigint-dig"
version = "0.8.4"
@@ -1302,7 +1212,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
]
[[package]]
@@ -1380,12 +1290,6 @@ dependencies = [
"hmac",
]
-[[package]]
-name = "peeking_take_while"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
-
[[package]]
name = "pem-rfc7468"
version = "0.7.0"
@@ -1432,7 +1336,7 @@ dependencies = [
"pest_meta",
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
]
[[package]]
@@ -1501,7 +1405,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
]
[[package]]
@@ -1555,16 +1459,6 @@ version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
-[[package]]
-name = "prettyplease"
-version = "0.2.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e"
-dependencies = [
- "proc-macro2",
- "syn 2.0.71",
-]
-
[[package]]
name = "proc-macro-crate"
version = "3.1.0"
@@ -1807,9 +1701,9 @@ dependencies = [
[[package]]
name = "rsa"
-version = "0.9.6"
+version = "0.9.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc"
+checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519"
dependencies = [
"const-oid",
"digest",
@@ -1858,12 +1752,6 @@ version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
-[[package]]
-name = "rustc-hash"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
-
[[package]]
name = "rustix"
version = "0.38.34"
@@ -2008,7 +1896,7 @@ checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
]
[[package]]
@@ -2056,7 +1944,7 @@ checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
]
[[package]]
@@ -2081,12 +1969,6 @@ dependencies = [
"digest",
]
-[[package]]
-name = "shlex"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
-
[[package]]
name = "signature"
version = "2.2.0"
@@ -2196,9 +2078,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.71"
+version = "2.0.87"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462"
+checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d"
dependencies = [
"proc-macro2",
"quote",
@@ -2214,7 +2096,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
]
[[package]]
@@ -2301,7 +2183,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
]
[[package]]
@@ -2356,7 +2238,7 @@ checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
]
[[package]]
@@ -2383,7 +2265,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
]
[[package]]
@@ -2662,7 +2544,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
"wasm-bindgen-shared",
]
@@ -2696,7 +2578,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@@ -2717,18 +2599,6 @@ dependencies = [
"wasm-bindgen",
]
-[[package]]
-name = "which"
-version = "4.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
-dependencies = [
- "either",
- "home",
- "once_cell",
- "rustix",
-]
-
[[package]]
name = "winapi-util"
version = "0.1.8"
@@ -2930,7 +2800,7 @@ dependencies = [
[[package]]
name = "xbuilder"
-version = "0.1.0"
+version = "0.1.1"
dependencies = [
"anyhow",
"chrono",
@@ -2944,7 +2814,6 @@ dependencies = [
"serial_test",
"static-files",
"tera",
- "thiserror",
"tokio",
"xsender",
"xsigner",
@@ -2966,26 +2835,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193"
[[package]]
-name = "xmlsec"
-version = "0.2.3"
+name = "xml_c14n"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85162cd6fa3c1e8ebc239bd11c7c001042ba6fb7bb861d63b5d7b3c99951f1df"
+checksum = "10920b2d5910f5e249f6476ae61952fe3f0b9d1fdf379a994a4325984e63665c"
dependencies = [
- "bindgen",
- "lazy_static",
- "libc",
"libxml",
- "pkg-config",
+ "thiserror",
]
[[package]]
name = "xsender"
-version = "0.1.0"
+version = "0.1.1"
dependencies = [
"anyhow",
"base64",
"lazy_static",
- "log",
"regex",
"reqwest",
"serde",
@@ -3004,12 +2869,14 @@ name = "xsigner"
version = "0.1.0"
dependencies = [
"anyhow",
+ "base64",
"der",
"libxml",
+ "openssl",
"rsa",
"thiserror",
"x509-cert",
- "xmlsec",
+ "xml_c14n",
]
[[package]]
@@ -3029,7 +2896,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.71",
+ "syn 2.0.87",
]
[[package]]
diff --git a/Cargo.toml b/Cargo.toml
index de921410..3ce44dc7 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -2,6 +2,12 @@
resolver = "2"
members = ["xbuilder", "xsender", "xsigner"]
+[workspace.package]
+version = "0.1.1"
+edition = "2021"
+publish = false
+license = "Apache-2.0"
+
[workspace.dependencies]
chrono = { version = "0.4.31", features = ["serde"] }
regex = "1.10.6"
@@ -23,13 +29,12 @@ thiserror = "1.0.53"
anyhow = "1.0.78"
sha2 = "0.10.8"
rsa = "0.9.6"
-rand = "0.8.5"
serial_test = "3.1.1"
tokio = "1.39.2"
-xmlsec = "0.2.3"
libxml = "0.3.3"
x509-cert = "0.2.5"
der = { version = "0.7.6" }
-spki = { version = "0.7.3" }
+openssl = "0.10"
+xml_c14n = "0.3.0"
[patch.crates-io]
diff --git a/rust-toolchain.toml b/rust-toolchain.toml
new file mode 100644
index 00000000..c6d8cdf2
--- /dev/null
+++ b/rust-toolchain.toml
@@ -0,0 +1,3 @@
+[toolchain]
+channel = "1.83.0"
+components = [ "rustfmt", "clippy" ]
diff --git a/xbuilder/Cargo.toml b/xbuilder/Cargo.toml
index 5173ecc7..5b159a6e 100644
--- a/xbuilder/Cargo.toml
+++ b/xbuilder/Cargo.toml
@@ -1,9 +1,9 @@
[package]
name = "xbuilder"
-version = "0.1.0"
-edition = "2021"
-license = "Apache-2.0"
description = "Creates XML files based on UBL under the standards of Peru."
+version.workspace = true
+edition.workspace = true
+license.workspace = true
[dependencies]
chrono = { workspace = true, features = ["serde"] }
@@ -15,7 +15,6 @@ lazy_static = { workspace = true }
serde = { workspace = true, features = ["derive"] }
rust_decimal = { workspace = true, features = ["serde-str", "serde-with-str"] }
rust_decimal_macros = { workspace = true }
-thiserror = { workspace = true }
anyhow = { workspace = true }
[dev-dependencies]
diff --git a/xsender/Cargo.toml b/xsender/Cargo.toml
index 83554bda..669a7626 100644
--- a/xsender/Cargo.toml
+++ b/xsender/Cargo.toml
@@ -1,13 +1,12 @@
[package]
name = "xsender"
-version = "0.1.0"
-edition = "2021"
-license = "Apache-2.0"
description = "Sends XML files through SOAP - SUNAT"
+version.workspace = true
+edition.workspace = true
+license.workspace = true
[dependencies]
xml = { workspace = true }
-log = { workspace = true }
zip = { workspace = true }
tera = { workspace = true }
static-files = { workspace = true }
diff --git a/xsigner/Cargo.toml b/xsigner/Cargo.toml
index 9a94223a..a1ffc18e 100644
--- a/xsigner/Cargo.toml
+++ b/xsigner/Cargo.toml
@@ -8,10 +8,12 @@ description = "Sign your XML files"
[dependencies]
thiserror = { workspace = true }
anyhow = { workspace = true }
-xmlsec = { workspace = true }
libxml = { workspace = true }
rsa = { workspace = true, features = ["sha2"] }
x509-cert = { workspace = true, features = ["builder"] }
der = { workspace = true, features = ["alloc", "derive", "flagset", "oid"] }
+base64 = { workspace = true }
+openssl = { workspace = true }
+xml_c14n = { workspace = true }
[dev-dependencies]
diff --git a/xsigner/resources/test/invoice_with_template.xml b/xsigner/resources/test/invoice_with_template.xml
deleted file mode 100644
index eea6e3f0..00000000
--- a/xsigner/resources/test/invoice_with_template.xml
+++ /dev/null
@@ -1,181 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 2.1
- 2.0
- F001-1
- 2019-12-24
- 01
- PEN
-
- 12345678912
-
-
- 12345678912
-
-
-
-
-
-
-
- #PROJECT-OPENUBL-SIGN
-
-
-
-
-
-
- 12345678912
-
-
-
-
- 0000
-
-
-
-
-
-
-
-
-
-
- 12121212121
-
-
-
-
-
-
-
- FormaPago
- Contado
-
-
- 424.80
-
- 2360.00
- 424.80
-
- S
-
- 1000
- IGV
- VAT
-
-
-
-
-
- 2360.00
- 2784.80
- 0
- 0
- 2784.80
-
-
- 1
- 10
- 1180.00
-
-
- 139.24
- 01
-
-
-
- 212.40
-
- 1180.00
- 212.40
-
- S
- 18.00
- 10
-
- 1000
- IGV
- VAT
-
-
-
-
-
-
-
-
- 118.00
-
-
-
- 2
- 10
- 1180.00
-
-
- 139.24
- 01
-
-
-
- 212.40
-
- 1180.00
- 212.40
-
- S
- 18.00
- 10
-
- 1000
- IGV
- VAT
-
-
-
-
-
-
-
-
- 118.00
-
-
-
diff --git a/xsigner/src/lib.rs b/xsigner/src/lib.rs
index 8cc77656..050836e9 100644
--- a/xsigner/src/lib.rs
+++ b/xsigner/src/lib.rs
@@ -1,13 +1,18 @@
use anyhow::anyhow;
+use base64::engine::general_purpose;
+use base64::Engine;
use der::{DecodePem, EncodePem};
-use libxml::parser::XmlParseError;
-use libxml::tree::{Document, Namespace, Node};
-use libxml::xpath::Context;
+use libxml::parser::{Parser, XmlParseError};
+use libxml::tree::{Document, Node};
+use openssl::hash::{hash, MessageDigest};
+use openssl::pkey::PKey;
+use openssl::rsa::Rsa;
+use openssl::sign::Signer;
use rsa::pkcs1::{DecodeRsaPrivateKey, EncodeRsaPrivateKey};
use rsa::pkcs8::LineEnding;
use rsa::RsaPrivateKey;
use x509_cert::Certificate;
-use xmlsec::{XmlSecError, XmlSecKey, XmlSecKeyFormat, XmlSecSignatureContext};
+use xml_c14n::{canonicalize_xml, CanonicalizationMode, CanonicalizationOptions};
#[derive(Debug, thiserror::Error)]
pub enum EncryptionError {
@@ -61,8 +66,6 @@ pub enum SignErr {
#[error(transparent)]
Pkcs1(#[from] rsa::pkcs1::Error),
#[error(transparent)]
- XmlSec(#[from] XmlSecError),
- #[error(transparent)]
Any(#[from] anyhow::Error),
}
@@ -103,116 +106,113 @@ impl XSigner {
pub fn sign(&self, key_pair: &RsaKeyPair) -> Result<(), SignErr> {
let xml = &self.xml_document;
+ let xml_string = xml.to_string();
+
+ let canonicalize_options = CanonicalizationOptions {
+ mode: CanonicalizationMode::Canonical1_1,
+ keep_comments: false,
+ inclusive_ns_prefixes: vec![],
+ };
+ let xml_canonicalize = canonicalize_xml(&xml_string, canonicalize_options.clone())
+ .expect("Could not canonicalize xml");
+
+ // Generate digest
+ let digest = hash(MessageDigest::sha256(), xml_canonicalize.as_bytes())
+ .expect("Digest generation error");
+ let digest_base64 = general_purpose::STANDARD.encode(digest);
+
+ // Sign
+ let signed_info_string = format!(
+ "
+
+
+
+
+
+
+
+ {digest_base64}
+
+ "
+ );
+ let signed_info_canonicalize =
+ canonicalize_xml(&signed_info_string, canonicalize_options.clone())
+ .expect("Could not canonicalize xml");
+
+ // Sign
+ let pk_pem = key_pair.private_key_to_pem()?;
+ let rsa = Rsa::private_key_from_pem(pk_pem.as_bytes()).expect("Failed to parse PK");
+ let pkey = PKey::from_rsa(rsa).expect("Failed to convert RSA to PKey");
+
+ let certificate_pem = key_pair.certificate_to_pem()?;
+ let pem_contents = certificate_pem
+ .lines()
+ .filter(|line| !line.starts_with("-----"))
+ .collect::>()
+ .join("\n");
+
+ let mut signer =
+ Signer::new(MessageDigest::sha256(), &pkey).expect("Signer creation error");
+ signer
+ .update(signed_info_canonicalize.as_bytes())
+ .expect("Failed to update signer");
+ let signature = signer.sign_to_vec().expect("Error while signing");
+ let signature_base64 = general_purpose::STANDARD.encode(&signature);
// Search Signature element
- let context = Context::new(xml)?;
- let signature_node = context.evaluate("//ds:Signature");
-
- // Add the Signature xml tag
- if signature_node.is_err() {
- fn find_extension_content_node(node: Node) -> Option {
- if let Some(ns) = node.get_namespace() {
- if ns.get_prefix() == "ext" && node.get_name() == "ExtensionContent" {
- return Some(node);
- }
+ fn find_extension_content_node(node: Node) -> Option {
+ if let Some(ns) = node.get_namespace() {
+ if ns.get_prefix() == "ext" && node.get_name() == "ExtensionContent" {
+ return Some(node);
}
+ }
- for child in node.get_child_nodes().into_iter() {
- let result = find_extension_content_node(child);
- if result.is_some() {
- return result;
- }
+ for child in node.get_child_nodes().into_iter() {
+ let result = find_extension_content_node(child);
+ if result.is_some() {
+ return result;
}
-
- None
}
- let root = xml
- .get_root_element()
- .ok_or(SignErr::Any(anyhow!("Could not get the xml root element")))?;
- let mut root_note = find_extension_content_node(root).ok_or(SignErr::Any(anyhow!(
- "Could not find the ext:ExtensionContent tag"
- )))?;
-
- // Signature
- let mut signature = Node::new("Signature", None, xml)?;
- signature.set_attribute("Id", "PROJECT-OPENUBL")?;
- let ns = Namespace::new("ds", "http://www.w3.org/2000/09/xmldsig#", &mut signature)?;
- signature.set_namespace(&ns)?;
-
- //
- let mut signed_info = Node::new("SignedInfo", Some(ns.clone()), xml)?;
- signature.add_child(&mut signed_info)?;
-
- let mut canonicalization_method =
- Node::new("CanonicalizationMethod", Some(ns.clone()), xml)?;
- canonicalization_method.set_attribute(
- "Algorithm",
- "http://www.w3.org/TR/2001/REC-xml-c14n-20010315",
- )?;
- signed_info.add_child(&mut canonicalization_method)?;
-
- let mut signature_method = Node::new("SignatureMethod", Some(ns.clone()), xml)?;
- signature_method
- .set_attribute("Algorithm", "http://www.w3.org/2000/09/xmldsig#rsa-sha1")?;
- signed_info.add_child(&mut signature_method)?;
-
- let mut reference = Node::new("Reference", Some(ns.clone()), xml)?;
- reference.set_attribute("URI", "")?;
- signed_info.add_child(&mut reference)?;
-
- let mut transforms = Node::new("Transforms", Some(ns.clone()), xml)?;
- reference.add_child(&mut transforms)?;
-
- let mut transform = Node::new("Transform", Some(ns.clone()), xml)?;
- transform.set_attribute(
- "Algorithm",
- "http://www.w3.org/2000/09/xmldsig#enveloped-signature",
- )?;
- transforms.add_child(&mut transform)?;
-
- let mut digest_method = Node::new("DigestMethod", Some(ns.clone()), xml)?;
- digest_method.set_attribute("Algorithm", "http://www.w3.org/2000/09/xmldsig#sha1")?;
- reference.add_child(&mut digest_method)?;
-
- let mut digest_value = Node::new("DigestValue", Some(ns.clone()), xml)?;
- reference.add_child(&mut digest_value)?;
-
- let mut signature_value = Node::new("SignatureValue", Some(ns.clone()), xml)?;
- signature.add_child(&mut signature_value)?;
-
- let mut key_info = Node::new("KeyInfo", Some(ns.clone()), xml)?;
- signature.add_child(&mut key_info)?;
-
- let mut x509_data = Node::new("X509Data", Some(ns.clone()), xml)?;
- key_info.add_child(&mut x509_data)?;
-
- let mut x509_certificate = Node::new("X509Certificate", Some(ns.clone()), xml)?;
- x509_data.add_child(&mut x509_certificate)?;
-
- //
- root_note.add_child(&mut signature)?;
+ None
}
- let private_key_pem = key_pair.private_key_to_pem()?;
- let private_key =
- XmlSecKey::from_memory(private_key_pem.as_bytes(), XmlSecKeyFormat::Pem, None)?;
-
- let certificate_pem = key_pair.certificate_to_pem()?;
- private_key.load_cert_from_memory(certificate_pem.as_bytes(), XmlSecKeyFormat::CertPem)?;
-
- let mut sigctx = XmlSecSignatureContext::new();
- sigctx.insert_key(private_key);
-
- sigctx.sign_document(xml)?;
-
+ let xml_root_node = xml
+ .get_root_element()
+ .ok_or(SignErr::Any(anyhow!("Could not get the xml root element")))?;
+ let mut extension_content_node = find_extension_content_node(xml_root_node).ok_or(
+ SignErr::Any(anyhow!("Could not find the ext:ExtensionContent tag")),
+ )?;
+
+ // Signature
+ let signature_string = format!(
+ "
+ {signed_info_string}
+ {signature_base64}
+
+
+ {pem_contents}
+
+
+ "
+ );
+
+ let parser = Parser::default();
+ let signature_string_node = parser
+ .parse_string(&signature_string)
+ .expect("Could not parse Signature");
+ let mut signed_info_node_root = signature_string_node
+ .get_root_element()
+ .expect("Could not get root element of Signature");
+ signed_info_node_root.unlink();
+
+ extension_content_node.add_child(&mut signed_info_node_root)?;
Ok(())
}
}
#[cfg(test)]
mod tests {
-
use std::fs;
use crate::RsaKeyPair;
@@ -247,7 +247,6 @@ mod tests {
fs::read_to_string(format!("{RESOURCES}/public.cer")).expect("Could not read file");
let xml_no_template = format!("{RESOURCES}/invoice_no_template.xml");
- let xml_with_template = format!("{RESOURCES}/invoice_with_template.xml");
let rsa_key_pair = RsaKeyPair::from_pkcs1_pem_and_certificate(
&private_key_from_file,
@@ -257,14 +256,9 @@ mod tests {
let document1 =
XSigner::from_file(&xml_no_template).expect("Could read xml with no template");
- let document2 =
- XSigner::from_file(&xml_with_template).expect("Could read xml with template");
document1
.sign(&rsa_key_pair)
- .expect("Could not sign document with no tempate");
- document2
- .sign(&rsa_key_pair)
- .expect("Could not sign document with template");
+ .expect("Could not sign document with no template");
}
}
From 9c9d089861f02367a94228708f762c87ee62647a Mon Sep 17 00:00:00 2001
From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com>
Date: Sun, 12 Jan 2025 20:07:20 +0100
Subject: [PATCH 2/7] fix lock
---
Cargo.lock | 228 ++++++++++++++++++++---------------------------------
1 file changed, 84 insertions(+), 144 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 40039da8..f46a3949 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -123,12 +123,6 @@ version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
[[package]]
name = "bitflags"
version = "2.6.0"
@@ -226,9 +220,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "bytes"
-version = "1.6.1"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952"
+checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b"
[[package]]
name = "bzip2"
@@ -295,7 +289,7 @@ dependencies = [
"num-traits",
"serde",
"wasm-bindgen",
- "windows-targets 0.52.6",
+ "windows-targets",
]
[[package]]
@@ -527,7 +521,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
dependencies = [
"libc",
- "windows-sys 0.52.0",
+ "windows-sys",
]
[[package]]
@@ -717,7 +711,7 @@ version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757"
dependencies = [
- "bitflags 2.6.0",
+ "bitflags",
"ignore",
"walkdir",
]
@@ -875,9 +869,9 @@ dependencies = [
[[package]]
name = "hyper-util"
-version = "0.1.6"
+version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956"
+checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4"
dependencies = [
"bytes",
"futures-channel",
@@ -888,7 +882,6 @@ dependencies = [
"pin-project-lite",
"socket2",
"tokio",
- "tower",
"tower-service",
"tracing",
]
@@ -1101,7 +1094,7 @@ dependencies = [
"hermit-abi",
"libc",
"wasi",
- "windows-sys 0.52.0",
+ "windows-sys",
]
[[package]]
@@ -1195,7 +1188,7 @@ version = "0.10.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1"
dependencies = [
- "bitflags 2.6.0",
+ "bitflags",
"cfg-if",
"foreign-types",
"libc",
@@ -1253,7 +1246,7 @@ dependencies = [
"libc",
"redox_syscall",
"smallvec",
- "windows-targets 0.52.6",
+ "windows-targets",
]
[[package]]
@@ -1388,26 +1381,6 @@ dependencies = [
"siphasher",
]
-[[package]]
-name = "pin-project"
-version = "1.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3"
-dependencies = [
- "pin-project-internal",
-]
-
-[[package]]
-name = "pin-project-internal"
-version = "1.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.87",
-]
-
[[package]]
name = "pin-project-lite"
version = "0.2.14"
@@ -1571,7 +1544,7 @@ version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4"
dependencies = [
- "bitflags 2.6.0",
+ "bitflags",
]
[[package]]
@@ -1614,9 +1587,9 @@ dependencies = [
[[package]]
name = "reqwest"
-version = "0.12.5"
+version = "0.12.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37"
+checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da"
dependencies = [
"base64",
"bytes",
@@ -1647,12 +1620,13 @@ dependencies = [
"system-configuration",
"tokio",
"tokio-native-tls",
+ "tower",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
- "winreg",
+ "windows-registry",
]
[[package]]
@@ -1667,7 +1641,7 @@ dependencies = [
"libc",
"spin",
"untrusted",
- "windows-sys 0.52.0",
+ "windows-sys",
]
[[package]]
@@ -1758,11 +1732,11 @@ version = "0.38.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
dependencies = [
- "bitflags 2.6.0",
+ "bitflags",
"errno",
"libc",
"linux-raw-sys",
- "windows-sys 0.52.0",
+ "windows-sys",
]
[[package]]
@@ -1835,7 +1809,7 @@ version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
dependencies = [
- "windows-sys 0.52.0",
+ "windows-sys",
]
[[package]]
@@ -1862,7 +1836,7 @@ version = "2.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
dependencies = [
- "bitflags 2.6.0",
+ "bitflags",
"core-foundation",
"core-foundation-sys",
"libc",
@@ -1881,18 +1855,18 @@ dependencies = [
[[package]]
name = "serde"
-version = "1.0.205"
+version = "1.0.217"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150"
+checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.205"
+version = "1.0.217"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1"
+checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
dependencies = [
"proc-macro2",
"quote",
@@ -2029,7 +2003,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
dependencies = [
"libc",
- "windows-sys 0.52.0",
+ "windows-sys",
]
[[package]]
@@ -2104,23 +2078,26 @@ name = "sync_wrapper"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
+dependencies = [
+ "futures-core",
+]
[[package]]
name = "system-configuration"
-version = "0.5.1"
+version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
+checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
dependencies = [
- "bitflags 1.3.2",
+ "bitflags",
"core-foundation",
"system-configuration-sys",
]
[[package]]
name = "system-configuration-sys"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
+checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
dependencies = [
"core-foundation-sys",
"libc",
@@ -2141,7 +2118,7 @@ dependencies = [
"cfg-if",
"fastrand",
"rustix",
- "windows-sys 0.52.0",
+ "windows-sys",
]
[[package]]
@@ -2254,7 +2231,7 @@ dependencies = [
"pin-project-lite",
"socket2",
"tokio-macros",
- "windows-sys 0.52.0",
+ "windows-sys",
]
[[package]]
@@ -2321,14 +2298,14 @@ dependencies = [
[[package]]
name = "tower"
-version = "0.4.13"
+version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
+checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
dependencies = [
"futures-core",
"futures-util",
- "pin-project",
"pin-project-lite",
+ "sync_wrapper",
"tokio",
"tower-layer",
"tower-service",
@@ -2336,15 +2313,15 @@ dependencies = [
[[package]]
name = "tower-layer"
-version = "0.3.2"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
+checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
[[package]]
name = "tower-service"
-version = "0.3.2"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
[[package]]
name = "tracing"
@@ -2605,7 +2582,7 @@ version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
dependencies = [
- "windows-sys 0.52.0",
+ "windows-sys",
]
[[package]]
@@ -2614,40 +2591,46 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
- "windows-targets 0.52.6",
+ "windows-targets",
]
[[package]]
-name = "windows-sys"
-version = "0.48.0"
+name = "windows-registry"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0"
dependencies = [
- "windows-targets 0.48.5",
+ "windows-result",
+ "windows-strings",
+ "windows-targets",
]
[[package]]
-name = "windows-sys"
-version = "0.52.0"
+name = "windows-result"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
dependencies = [
- "windows-targets 0.52.6",
+ "windows-targets",
]
[[package]]
-name = "windows-targets"
-version = "0.48.5"
+name = "windows-strings"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
+dependencies = [
+ "windows-result",
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
- "windows_aarch64_gnullvm 0.48.5",
- "windows_aarch64_msvc 0.48.5",
- "windows_i686_gnu 0.48.5",
- "windows_i686_msvc 0.48.5",
- "windows_x86_64_gnu 0.48.5",
- "windows_x86_64_gnullvm 0.48.5",
- "windows_x86_64_msvc 0.48.5",
+ "windows-targets",
]
[[package]]
@@ -2656,46 +2639,28 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
- "windows_aarch64_gnullvm 0.52.6",
- "windows_aarch64_msvc 0.52.6",
- "windows_i686_gnu 0.52.6",
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
"windows_i686_gnullvm",
- "windows_i686_msvc 0.52.6",
- "windows_x86_64_gnu 0.52.6",
- "windows_x86_64_gnullvm 0.52.6",
- "windows_x86_64_msvc 0.52.6",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
]
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
-
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
-
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
-[[package]]
-name = "windows_i686_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
-
[[package]]
name = "windows_i686_gnu"
version = "0.52.6"
@@ -2708,48 +2673,24 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
-[[package]]
-name = "windows_i686_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
-
[[package]]
name = "windows_i686_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
-
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
-
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
-
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.6"
@@ -2765,16 +2706,6 @@ dependencies = [
"memchr",
]
-[[package]]
-name = "winreg"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5"
-dependencies = [
- "cfg-if",
- "windows-sys 0.48.0",
-]
-
[[package]]
name = "wyz"
version = "0.5.1"
@@ -2819,6 +2750,15 @@ dependencies = [
"xsigner",
]
+[[package]]
+name = "xhandler"
+version = "0.1.0"
+dependencies = [
+ "xbuilder",
+ "xsender",
+ "xsigner",
+]
+
[[package]]
name = "xml"
version = "0.8.20"
From ab2aef5b275908172246551b817411df8909dd23 Mon Sep 17 00:00:00 2001
From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com>
Date: Sun, 19 Jan 2025 08:47:20 +0100
Subject: [PATCH 3/7] use quick-xml
---
Cargo.lock | 10 +++
Cargo.toml | 1 +
xbuilder/tests/common/mod.rs | 24 ++++---
xsigner/Cargo.toml | 1 +
xsigner/src/lib.rs | 125 +++++++++++++++++++----------------
5 files changed, 94 insertions(+), 67 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index f46a3949..e01ae956 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1493,6 +1493,15 @@ dependencies = [
"syn 1.0.109",
]
+[[package]]
+name = "quick-xml"
+version = "0.37.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003"
+dependencies = [
+ "memchr",
+]
+
[[package]]
name = "quote"
version = "1.0.36"
@@ -2813,6 +2822,7 @@ dependencies = [
"der",
"libxml",
"openssl",
+ "quick-xml",
"rsa",
"thiserror",
"x509-cert",
diff --git a/Cargo.toml b/Cargo.toml
index db8e6637..c1627d47 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -29,6 +29,7 @@ rsa = "0.9.6"
serial_test = "3.1.1"
tokio = "1.39.2"
libxml = "0.3.3"
+quick-xml = "0.37.2"
x509-cert = "0.2.5"
der = { version = "0.7.6" }
openssl = "0.10"
diff --git a/xbuilder/tests/common/mod.rs b/xbuilder/tests/common/mod.rs
index ad735c62..30422cab 100644
--- a/xbuilder/tests/common/mod.rs
+++ b/xbuilder/tests/common/mod.rs
@@ -1,7 +1,7 @@
use std::fs;
use chrono::NaiveDate;
-use libxml::tree::Document;
+use libxml::parser::Parser;
use rust_decimal_macros::dec;
use xbuilder::prelude::*;
@@ -101,7 +101,7 @@ pub fn cliente_base() -> Cliente {
}
}
-fn sign_xml(xml: &str) -> Document {
+fn sign_xml(xml: &str) -> Vec {
let private_key_from_file = fs::read_to_string("tests/resources/certificates/private.key")
.expect("Could not read private.key");
let certificate_from_file = fs::read_to_string("tests/resources/certificates/public.cer")
@@ -111,10 +111,10 @@ fn sign_xml(xml: &str) -> Document {
RsaKeyPair::from_pkcs1_pem_and_certificate(&private_key_from_file, &certificate_from_file)
.expect("Could not initialize RsaKeyPair");
- let signer = XSigner::from_string(xml).expect("Could parse xml");
- signer.sign(&rsa_key_pair).expect("Could not sign document");
-
- signer.xml_document
+ let signer = XSigner {
+ xml_document: xml.to_string(),
+ };
+ signer.sign(&rsa_key_pair).expect("Could not sign document")
}
#[allow(dead_code)]
@@ -171,7 +171,7 @@ fn assert_snapshot(expected: &str, snapshot_filename: &str) {
);
}
-fn assert_xsd(xml: &Document, schema: &str) {
+fn assert_xsd(xml: &Vec, schema: &str) {
let mut xsdparser = SchemaParserContext::from_file(schema);
let xsd = SchemaValidationContext::from_parser(&mut xsdparser);
@@ -185,18 +185,20 @@ fn assert_xsd(xml: &Document, schema: &str) {
let mut xsd = xsd.unwrap();
- if let Err(errors) = xsd.validate_document(xml) {
+ let xml_document = Parser::default().parse_string(xml).unwrap();
+ if let Err(errors) = xsd.validate_document(&xml_document) {
for err in &errors {
println!("{}", err.message.as_ref().unwrap());
}
- panic!("Invalid XML accoding to XSD schema");
+ panic!("Invalid XML according to XSD schema");
}
}
-async fn assert_sunat(xml: &Document) {
+async fn assert_sunat(xml: &Vec) {
+ let file_content = String::from_utf8_lossy(xml).to_string();
let xml_file = UblFile {
- file_content: xml.to_string(),
+ file_content,
};
let result = CLIENT
diff --git a/xsigner/Cargo.toml b/xsigner/Cargo.toml
index a1ffc18e..44858d23 100644
--- a/xsigner/Cargo.toml
+++ b/xsigner/Cargo.toml
@@ -9,6 +9,7 @@ description = "Sign your XML files"
thiserror = { workspace = true }
anyhow = { workspace = true }
libxml = { workspace = true }
+quick-xml = { workspace = true }
rsa = { workspace = true, features = ["sha2"] }
x509-cert = { workspace = true, features = ["builder"] }
der = { workspace = true, features = ["alloc", "derive", "flagset", "oid"] }
diff --git a/xsigner/src/lib.rs b/xsigner/src/lib.rs
index 050836e9..fc45d7f0 100644
--- a/xsigner/src/lib.rs
+++ b/xsigner/src/lib.rs
@@ -1,16 +1,16 @@
-use anyhow::anyhow;
use base64::engine::general_purpose;
use base64::Engine;
use der::{DecodePem, EncodePem};
-use libxml::parser::{Parser, XmlParseError};
-use libxml::tree::{Document, Node};
use openssl::hash::{hash, MessageDigest};
use openssl::pkey::PKey;
use openssl::rsa::Rsa;
use openssl::sign::Signer;
+use quick_xml::events::{BytesEnd, BytesStart, Event};
use rsa::pkcs1::{DecodeRsaPrivateKey, EncodeRsaPrivateKey};
use rsa::pkcs8::LineEnding;
use rsa::RsaPrivateKey;
+use std::io::Cursor;
+use std::{fs, io};
use x509_cert::Certificate;
use xml_c14n::{canonicalize_xml, CanonicalizationMode, CanonicalizationOptions};
@@ -88,36 +88,26 @@ impl From> for SignErr {
}
pub struct XSigner {
- pub xml_document: Document,
+ pub xml_document: String,
}
impl XSigner {
- pub fn from_file(filename: &str) -> Result {
- let xml_parser = libxml::parser::Parser::default();
- let xml_document = xml_parser.parse_file(filename)?;
+ pub fn from_file(filename: &str) -> Result {
+ let xml_document = fs::read_to_string(filename)?;
Ok(Self { xml_document })
}
- pub fn from_string(xml: &str) -> Result {
- let xml_parser = libxml::parser::Parser::default();
- let xml_document = xml_parser.parse_string(xml)?;
- Ok(Self { xml_document })
- }
-
- pub fn sign(&self, key_pair: &RsaKeyPair) -> Result<(), SignErr> {
- let xml = &self.xml_document;
- let xml_string = xml.to_string();
-
+ pub fn sign(&self, key_pair: &RsaKeyPair) -> Result, SignErr> {
let canonicalize_options = CanonicalizationOptions {
mode: CanonicalizationMode::Canonical1_1,
- keep_comments: false,
+ keep_comments: true,
inclusive_ns_prefixes: vec![],
};
- let xml_canonicalize = canonicalize_xml(&xml_string, canonicalize_options.clone())
+ let xml_canonicalized = canonicalize_xml(&self.xml_document, canonicalize_options.clone())
.expect("Could not canonicalize xml");
// Generate digest
- let digest = hash(MessageDigest::sha256(), xml_canonicalize.as_bytes())
+ let digest = hash(MessageDigest::sha256(), xml_canonicalized.as_bytes())
.expect("Digest generation error");
let digest_base64 = general_purpose::STANDARD.encode(digest);
@@ -159,31 +149,6 @@ impl XSigner {
let signature = signer.sign_to_vec().expect("Error while signing");
let signature_base64 = general_purpose::STANDARD.encode(&signature);
- // Search Signature element
- fn find_extension_content_node(node: Node) -> Option {
- if let Some(ns) = node.get_namespace() {
- if ns.get_prefix() == "ext" && node.get_name() == "ExtensionContent" {
- return Some(node);
- }
- }
-
- for child in node.get_child_nodes().into_iter() {
- let result = find_extension_content_node(child);
- if result.is_some() {
- return result;
- }
- }
-
- None
- }
-
- let xml_root_node = xml
- .get_root_element()
- .ok_or(SignErr::Any(anyhow!("Could not get the xml root element")))?;
- let mut extension_content_node = find_extension_content_node(xml_root_node).ok_or(
- SignErr::Any(anyhow!("Could not find the ext:ExtensionContent tag")),
- )?;
-
// Signature
let signature_string = format!(
"
@@ -197,17 +162,65 @@ impl XSigner {
"
);
- let parser = Parser::default();
- let signature_string_node = parser
- .parse_string(&signature_string)
- .expect("Could not parse Signature");
- let mut signed_info_node_root = signature_string_node
- .get_root_element()
- .expect("Could not get root element of Signature");
- signed_info_node_root.unlink();
-
- extension_content_node.add_child(&mut signed_info_node_root)?;
- Ok(())
+ let mut xml_reader = quick_xml::Reader::from_str(&xml_canonicalized);
+ let mut xml_writer = quick_xml::Writer::new(Cursor::new(Vec::new()));
+
+ let mut inside_target_element = false;
+ let mut requires_closing_extension_content_tag = false;
+
+ loop {
+ match xml_reader.read_event() {
+ Ok(Event::Empty(e)) => {
+ if e.name().as_ref() == b"ext:ExtensionContent" {
+ inside_target_element = true;
+ requires_closing_extension_content_tag = true;
+
+ xml_writer
+ .write_event(Event::Start(BytesStart::new("ext:ExtensionContent")))
+ .unwrap();
+ } else {
+ assert!(xml_writer.write_event(Event::Start(e.clone())).is_ok());
+ }
+ }
+ Ok(Event::Start(e)) => {
+ assert!(xml_writer.write_event(Event::Start(e.clone())).is_ok());
+ if e.name().as_ref() == b"ext:ExtensionContent" {
+ inside_target_element = true;
+ }
+ }
+ Ok(Event::End(e)) => {
+ if inside_target_element {
+ inside_target_element = false;
+
+ let mut xml_content_reader = quick_xml::Reader::from_str(&signature_string);
+ loop {
+ match xml_content_reader.read_event() {
+ Ok(Event::Eof) => break,
+ Ok(e) => assert!(xml_writer.write_event(e).is_ok()),
+ Err(e) => panic!(
+ "Error at position {}: {:?}",
+ xml_reader.error_position(),
+ e
+ ),
+ }
+ }
+
+ if requires_closing_extension_content_tag {
+ xml_writer
+ .write_event(Event::End(BytesEnd::new("ext:ExtensionContent")))
+ .unwrap();
+ }
+ }
+ assert!(xml_writer.write_event(Event::End(e.clone())).is_ok());
+ }
+ Ok(Event::Eof) => break,
+ Ok(e) => assert!(xml_writer.write_event(e).is_ok()),
+ Err(e) => panic!("Error at position {}: {:?}", xml_reader.error_position(), e),
+ }
+ }
+
+ let result = xml_writer.into_inner().into_inner();
+ Ok(result)
}
}
From 400868e0b1c05fda081aefe2e651e9afede2de5e Mon Sep 17 00:00:00 2001
From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com>
Date: Sun, 19 Jan 2025 08:58:24 +0100
Subject: [PATCH 4/7] fix lint
---
xsigner/src/lib.rs | 65 ++++++++++++++--------------------------------
1 file changed, 20 insertions(+), 45 deletions(-)
diff --git a/xsigner/src/lib.rs b/xsigner/src/lib.rs
index fc45d7f0..519dbb3c 100644
--- a/xsigner/src/lib.rs
+++ b/xsigner/src/lib.rs
@@ -1,6 +1,7 @@
use base64::engine::general_purpose;
use base64::Engine;
use der::{DecodePem, EncodePem};
+use openssl::error::ErrorStack;
use openssl::hash::{hash, MessageDigest};
use openssl::pkey::PKey;
use openssl::rsa::Rsa;
@@ -12,7 +13,9 @@ use rsa::RsaPrivateKey;
use std::io::Cursor;
use std::{fs, io};
use x509_cert::Certificate;
-use xml_c14n::{canonicalize_xml, CanonicalizationMode, CanonicalizationOptions};
+use xml_c14n::{
+ canonicalize_xml, CanonicalizationErrorCode, CanonicalizationMode, CanonicalizationOptions,
+};
#[derive(Debug, thiserror::Error)]
pub enum EncryptionError {
@@ -57,34 +60,14 @@ impl RsaKeyPair {
#[derive(Debug, thiserror::Error)]
pub enum SignErr {
- #[error("Error while signing")]
- Generic,
- #[error("Error `{0}`")]
- GenericWithMessage(String),
- #[error("Error")]
- Std(Box),
#[error(transparent)]
Pkcs1(#[from] rsa::pkcs1::Error),
#[error(transparent)]
- Any(#[from] anyhow::Error),
-}
-
-impl From<()> for SignErr {
- fn from(_error: ()) -> Self {
- Self::Generic
- }
-}
-
-impl From for SignErr {
- fn from(error: String) -> Self {
- Self::GenericWithMessage(error)
- }
-}
-
-impl From> for SignErr {
- fn from(error: Box) -> Self {
- Self::Std(error)
- }
+ Key(#[from] ErrorStack),
+ #[error(transparent)]
+ IO(#[from] io::Error),
+ #[error(transparent)]
+ Canonicalization(#[from] CanonicalizationErrorCode),
}
pub struct XSigner {
@@ -103,12 +86,10 @@ impl XSigner {
keep_comments: true,
inclusive_ns_prefixes: vec![],
};
- let xml_canonicalized = canonicalize_xml(&self.xml_document, canonicalize_options.clone())
- .expect("Could not canonicalize xml");
+ let xml_canonicalize = canonicalize_xml(&self.xml_document, canonicalize_options.clone())?;
// Generate digest
- let digest = hash(MessageDigest::sha256(), xml_canonicalized.as_bytes())
- .expect("Digest generation error");
+ let digest = hash(MessageDigest::sha256(), xml_canonicalize.as_bytes())?;
let digest_base64 = general_purpose::STANDARD.encode(digest);
// Sign
@@ -126,13 +107,12 @@ impl XSigner {
"
);
let signed_info_canonicalize =
- canonicalize_xml(&signed_info_string, canonicalize_options.clone())
- .expect("Could not canonicalize xml");
+ canonicalize_xml(&signed_info_string, canonicalize_options.clone())?;
// Sign
let pk_pem = key_pair.private_key_to_pem()?;
- let rsa = Rsa::private_key_from_pem(pk_pem.as_bytes()).expect("Failed to parse PK");
- let pkey = PKey::from_rsa(rsa).expect("Failed to convert RSA to PKey");
+ let rsa = Rsa::private_key_from_pem(pk_pem.as_bytes())?;
+ let pkey = PKey::from_rsa(rsa)?;
let certificate_pem = key_pair.certificate_to_pem()?;
let pem_contents = certificate_pem
@@ -141,12 +121,9 @@ impl XSigner {
.collect::>()
.join("\n");
- let mut signer =
- Signer::new(MessageDigest::sha256(), &pkey).expect("Signer creation error");
- signer
- .update(signed_info_canonicalize.as_bytes())
- .expect("Failed to update signer");
- let signature = signer.sign_to_vec().expect("Error while signing");
+ let mut signer = Signer::new(MessageDigest::sha256(), &pkey)?;
+ signer.update(signed_info_canonicalize.as_bytes())?;
+ let signature = signer.sign_to_vec()?;
let signature_base64 = general_purpose::STANDARD.encode(&signature);
// Signature
@@ -162,7 +139,7 @@ impl XSigner {
"
);
- let mut xml_reader = quick_xml::Reader::from_str(&xml_canonicalized);
+ let mut xml_reader = quick_xml::Reader::from_str(&xml_canonicalize);
let mut xml_writer = quick_xml::Writer::new(Cursor::new(Vec::new()));
let mut inside_target_element = false;
@@ -176,8 +153,7 @@ impl XSigner {
requires_closing_extension_content_tag = true;
xml_writer
- .write_event(Event::Start(BytesStart::new("ext:ExtensionContent")))
- .unwrap();
+ .write_event(Event::Start(BytesStart::new("ext:ExtensionContent")))?;
} else {
assert!(xml_writer.write_event(Event::Start(e.clone())).is_ok());
}
@@ -207,8 +183,7 @@ impl XSigner {
if requires_closing_extension_content_tag {
xml_writer
- .write_event(Event::End(BytesEnd::new("ext:ExtensionContent")))
- .unwrap();
+ .write_event(Event::End(BytesEnd::new("ext:ExtensionContent")))?;
}
}
assert!(xml_writer.write_event(Event::End(e.clone())).is_ok());
From 02e92e48feedc568177111915e603c24b5a43b5b Mon Sep 17 00:00:00 2001
From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com>
Date: Sun, 19 Jan 2025 09:06:18 +0100
Subject: [PATCH 5/7] fix lint
---
xbuilder/tests/common/mod.rs | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/xbuilder/tests/common/mod.rs b/xbuilder/tests/common/mod.rs
index 30422cab..f7a4a558 100644
--- a/xbuilder/tests/common/mod.rs
+++ b/xbuilder/tests/common/mod.rs
@@ -197,9 +197,7 @@ fn assert_xsd(xml: &Vec, schema: &str) {
async fn assert_sunat(xml: &Vec) {
let file_content = String::from_utf8_lossy(xml).to_string();
- let xml_file = UblFile {
- file_content,
- };
+ let xml_file = UblFile { file_content };
let result = CLIENT
.send_file(&xml_file)
From 54865ecb5a6560afc8f6d5acf83f2c9fb2bd4846 Mon Sep 17 00:00:00 2001
From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com>
Date: Sun, 19 Jan 2025 09:11:12 +0100
Subject: [PATCH 6/7] fix lint
---
xbuilder/tests/common/mod.rs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/xbuilder/tests/common/mod.rs b/xbuilder/tests/common/mod.rs
index f7a4a558..e297df71 100644
--- a/xbuilder/tests/common/mod.rs
+++ b/xbuilder/tests/common/mod.rs
@@ -195,7 +195,7 @@ fn assert_xsd(xml: &Vec, schema: &str) {
}
}
-async fn assert_sunat(xml: &Vec) {
+async fn assert_sunat(xml: &[u8]) {
let file_content = String::from_utf8_lossy(xml).to_string();
let xml_file = UblFile { file_content };
From 9c806b289ca9137865b9f38a854c84ba0cde9efa Mon Sep 17 00:00:00 2001
From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com>
Date: Sun, 19 Jan 2025 09:13:22 +0100
Subject: [PATCH 7/7] fix lint
---
.devcontainer/docker/Dockerfile | 9 ++++++++-
.devcontainer/docker/devcontainer.json | 5 +++++
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/.devcontainer/docker/Dockerfile b/.devcontainer/docker/Dockerfile
index 2a5b7f93..f7d1a80b 100644
--- a/.devcontainer/docker/Dockerfile
+++ b/.devcontainer/docker/Dockerfile
@@ -1,2 +1,9 @@
FROM mcr.microsoft.com/devcontainers/rust:bullseye
-RUN apt-get update && apt-get -y install pkg-config xmlsec1 libxml2-dev libxmlsec1-dev libxmlsec1-openssl libclang-dev
+RUN apt-get update && apt-get -y install pkg-config libssl-dev libxml2-dev libclang-dev
+RUN apt update && \
+ apt install sudo && \
+ usermod -aG sudo vscode && \
+ echo "%sudo ALL=(ALL) NOPASSWD:ALL" | tee -a /etc/sudoers > /dev/null
+
+RUN chown vscode:vscode -R /home/vscode
+USER vscode
\ No newline at end of file
diff --git a/.devcontainer/docker/devcontainer.json b/.devcontainer/docker/devcontainer.json
index f7606920..e776a030 100644
--- a/.devcontainer/docker/devcontainer.json
+++ b/.devcontainer/docker/devcontainer.json
@@ -3,6 +3,11 @@
"build": {
"dockerfile": "Dockerfile"
},
+ "runArgs": [
+ "--privileged",
+ "--userns=keep-id"
+ ],
+ "remoteUser": "vscode",
"features": {
"ghcr.io/devcontainers/features/rust:1": {},
"ghcr.io/devcontainers/features/node:1": {