PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
digital_signature.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
19#pragma once
20
21#include "certificate.h"
22#include "signature_types.h"
23
26
27#include <kcenon/common/patterns/result.h>
28
29#include <optional>
30#include <span>
31#include <vector>
32
33namespace kcenon::pacs::security {
34
69public:
70 // ========================================================================
71 // Signature Creation
72 // ========================================================================
73
89 [[nodiscard]] static auto sign(
90 core::dicom_dataset& dataset,
91 const certificate& cert,
92 const private_key& key,
94 ) -> kcenon::common::VoidResult;
95
108 [[nodiscard]] static auto sign_tags(
109 core::dicom_dataset& dataset,
110 const certificate& cert,
111 const private_key& key,
112 std::span<const core::dicom_tag> tags_to_sign,
114 ) -> kcenon::common::VoidResult;
115
116 // ========================================================================
117 // Signature Verification
118 // ========================================================================
119
132 [[nodiscard]] static auto verify(
133 const core::dicom_dataset& dataset
135
146 [[nodiscard]] static auto verify_with_trust(
147 const core::dicom_dataset& dataset,
148 const std::vector<certificate>& trusted_certs
150
151 // ========================================================================
152 // Signature Information
153 // ========================================================================
154
164 [[nodiscard]] static auto get_signature_info(
165 const core::dicom_dataset& dataset
166 ) -> std::optional<signature_info>;
167
176 [[nodiscard]] static auto get_all_signatures(
177 const core::dicom_dataset& dataset
178 ) -> std::vector<signature_info>;
179
186 [[nodiscard]] static auto has_signature(
187 const core::dicom_dataset& dataset
188 ) -> bool;
189
190 // ========================================================================
191 // Utility Methods
192 // ========================================================================
193
202 static auto remove_signatures(
203 core::dicom_dataset& dataset
204 ) -> bool;
205
213 [[nodiscard]] static auto generate_signature_uid() -> std::string;
214
215private:
216 // Internal helper methods
217 static auto compute_mac(
218 const core::dicom_dataset& dataset,
219 std::span<const core::dicom_tag> tags,
220 mac_algorithm algo
221 ) -> std::vector<std::uint8_t>;
222
223 static auto sign_mac(
224 std::span<const std::uint8_t> mac_data,
225 const private_key& key,
228
229 static auto verify_mac_signature(
230 std::span<const std::uint8_t> mac_data,
231 std::span<const std::uint8_t> signature,
232 const certificate& cert,
234 ) -> bool;
235};
236
237} // namespace kcenon::pacs::security
X.509 Certificate and Private Key handling for DICOM digital signatures.
static auto compute_mac(const core::dicom_dataset &dataset, std::span< const core::dicom_tag > tags, mac_algorithm algo) -> std::vector< std::uint8_t >
static auto sign_mac(std::span< const std::uint8_t > mac_data, const private_key &key, signature_algorithm algo) -> kcenon::common::Result< std::vector< std::uint8_t > >
static auto has_signature(const core::dicom_dataset &dataset) -> bool
Check if a dataset contains digital signatures.
static auto remove_signatures(core::dicom_dataset &dataset) -> bool
Remove all digital signatures from a dataset.
static auto sign(core::dicom_dataset &dataset, const certificate &cert, const private_key &key, signature_algorithm algo=signature_algorithm::rsa_sha256) -> kcenon::common::VoidResult
Sign a DICOM dataset.
static auto verify_with_trust(const core::dicom_dataset &dataset, const std::vector< certificate > &trusted_certs) -> kcenon::common::Result< signature_status >
Verify digital signatures with a trusted certificate store.
static auto verify(const core::dicom_dataset &dataset) -> kcenon::common::Result< signature_status >
Verify digital signatures in a dataset.
static auto sign_tags(core::dicom_dataset &dataset, const certificate &cert, const private_key &key, std::span< const core::dicom_tag > tags_to_sign, signature_algorithm algo=signature_algorithm::rsa_sha256) -> kcenon::common::VoidResult
Sign specific tags in a DICOM dataset.
static auto verify_mac_signature(std::span< const std::uint8_t > mac_data, std::span< const std::uint8_t > signature, const certificate &cert, signature_algorithm algo) -> bool
static auto get_signature_info(const core::dicom_dataset &dataset) -> std::optional< signature_info >
Get information about signatures in a dataset.
static auto get_all_signatures(const core::dicom_dataset &dataset) -> std::vector< signature_info >
Get all signatures in a dataset.
static auto generate_signature_uid() -> std::string
Generate a new Digital Signature UID.
DICOM Dataset - ordered collection of Data Elements.
DICOM Tag representation (Group, Element pairs)
mac_algorithm
MAC algorithm identifiers per DICOM PS3.15.
signature_algorithm
Signature algorithms supported for DICOM digital signatures.
@ rsa_sha256
RSA with SHA-256 (recommended for most use cases)
Digital signature types and structures for DICOM PS3.15 compliance.