Skip to main content

rusty_acse/
api.rs

1use der_parser::Oid;
2use rusty_copp::CoppError;
3use thiserror::Error;
4
5#[derive(Error, Debug)]
6pub enum AcseError {
7    #[error("ACSE Protocol Error - {}", .0)]
8    ProtocolError(String),
9
10    #[error("ACSE over COSP Protocol Stack Error - {}", .0)]
11    ProtocolStackError(#[from] CoppError),
12
13    #[error("ACSE IO Error: {:?}", .0)]
14    IoError(#[from] std::io::Error),
15
16    #[error("ACSE Error: {}", .0)]
17    InternalError(String),
18}
19
20// Only BER encoding is supported.
21
22#[derive(Clone, PartialEq, Debug)]
23pub struct AcseRequestInformation {
24    pub application_context_name: Oid<'static>,
25
26    pub called_ap_title: Option<ApTitle>,
27    pub called_ae_qualifier: Option<AeQualifier>,
28    pub called_ap_invocation_identifier: Option<Vec<u8>>, // Integer
29    pub called_ae_invocation_identifier: Option<Vec<u8>>, // Integer
30
31    pub calling_ap_title: Option<ApTitle>,
32    pub calling_ae_qualifier: Option<AeQualifier>,
33    pub calling_ap_invocation_identifier: Option<Vec<u8>>, // Integer
34    pub calling_ae_invocation_identifier: Option<Vec<u8>>, // Integer
35
36    pub implementation_information: Option<String>,
37}
38
39impl Default for AcseRequestInformation {
40    fn default() -> Self {
41        Self {
42            application_context_name: Oid::from(&[1, 2, 3, 4, 5]).expect("Failed to generate constant OID. This is a bug.").to_owned(),
43            called_ap_title: Default::default(),
44            called_ae_qualifier: Default::default(),
45            called_ap_invocation_identifier: Default::default(),
46            called_ae_invocation_identifier: Default::default(),
47            calling_ap_title: Default::default(),
48            calling_ae_qualifier: Default::default(),
49            calling_ap_invocation_identifier: Default::default(),
50            calling_ae_invocation_identifier: Default::default(),
51            implementation_information: Default::default(),
52        }
53    }
54}
55
56#[derive(Clone, PartialEq, Debug)]
57pub struct AcseResponseInformation {
58    pub application_context_name: Oid<'static>,
59
60    pub associate_result: AssociateResult,
61    pub associate_source_diagnostic: AssociateSourceDiagnostic,
62
63    pub responding_ap_title: Option<ApTitle>,
64    pub responding_ae_qualifier: Option<AeQualifier>,
65    pub responding_ap_invocation_identifier: Option<Vec<u8>>, // Integer
66    pub responding_ae_invocation_identifier: Option<Vec<u8>>, // Integer
67
68    pub implementation_information: Option<String>,
69}
70
71#[derive(Clone, PartialEq, Debug)]
72pub enum AssociateResult {
73    Accepted,
74    RejectedPermanent,
75    RejectedTransient,
76    Unknown(Vec<u8>),
77}
78
79#[derive(Clone, PartialEq, Debug)]
80pub enum AssociateSourceDiagnostic {
81    User(AssociateSourceDiagnosticUserCategory),
82    Provider(AssociateSourceDiagnosticProviderCategory),
83    Unknown(Vec<u8>), // Integer
84}
85
86#[derive(Clone, PartialEq, Debug)]
87pub enum AssociateSourceDiagnosticUserCategory {
88    Null,
89    NoReasonGiven,
90    ApplicationContextNameNotSupported,
91    CallingApTitleNotRecognized,
92    CallingApInvocationIdentifierNotRecognized,
93    CallingAeQualifierNotRecognized,
94    CallingAeInvocationIdentifierNotRecognized,
95    CalledApTitleNotRecognized,
96    CalledApInvocationIdentifierNotRecognized,
97    CalledAeQualifierNotRecognized,
98    CalledAeInvocationIdentifierNotRecognized,
99    AuthenticationMechanismNameNotRecognized,
100    AuthenticationMechanismNameRequired,
101    AuthenticationFailure,
102    AuthenticationRequired,
103    Unknown(Vec<u8>), // Integer
104}
105
106#[derive(Clone, PartialEq, Debug)]
107pub enum AssociateSourceDiagnosticProviderCategory {
108    Null,
109    NoReasonGiven,
110    NoCommonAcseVersion,
111    Unknown(Vec<u8>), // Integer
112}
113
114#[derive(Clone, PartialEq, Debug)]
115pub enum ApTitle {
116    // Form1(...), Not supporting as this library does not support DN.
117    Form2(Oid<'static>),
118}
119
120#[derive(Clone, PartialEq, Debug)]
121pub enum AeQualifier {
122    // Form1(...), Not supporting as this library does not support DN.
123    Form2(Vec<u8>), // Integer
124}
125
126#[derive(Debug, PartialEq, Eq)]
127pub enum AcseRecvResult {
128    Closed,
129    Data(Vec<u8>),
130}
131
132pub trait OsiSingleValueAcseInitiator: Send {
133    fn initiate(self, abstract_syntax_name: Oid<'static>, user_data: Vec<u8>) -> impl std::future::Future<Output = Result<(impl OsiSingleValueAcseConnection, AcseResponseInformation, Vec<u8>), AcseError>> + Send;
134}
135
136pub trait OsiSingleValueAcseListener: Send {
137    fn responder(self) -> impl std::future::Future<Output = Result<(impl OsiSingleValueAcseResponder, Vec<u8>), AcseError>> + Send;
138}
139
140pub trait OsiSingleValueAcseResponder: Send {
141    fn accept(self, user_data: Vec<u8>) -> impl std::future::Future<Output = Result<impl OsiSingleValueAcseConnection, AcseError>> + Send;
142}
143
144pub trait OsiSingleValueAcseConnection: Send {
145    fn split(self) -> impl std::future::Future<Output = Result<(impl OsiSingleValueAcseReader, impl OsiSingleValueAcseWriter), AcseError>> + Send;
146}
147
148pub trait OsiSingleValueAcseReader: Send {
149    fn recv(&mut self) -> impl std::future::Future<Output = Result<AcseRecvResult, AcseError>> + Send;
150}
151
152pub trait OsiSingleValueAcseWriter: Send {
153    fn send(&mut self, data: Vec<u8>) -> impl std::future::Future<Output = Result<(), AcseError>> + Send;
154    fn continue_send(&mut self) -> impl std::future::Future<Output = Result<(), AcseError>> + Send;
155}