1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
use crate::{AttributeDecodeError, AttributeEncodeError, HeaderDecodeError, HeaderEncodeError, definitions::StunTransactionId};
use thiserror::Error;
#[derive(Error, Debug)]
pub enum IntegrityKeyGenerationError {
#[error("Failed to process key section via SASLprep.")]
SASLPrepFailure(#[from] stringprep::Error),
#[error("No username has been provided for long-term credential key generation")]
MissingUsername(),
}
#[derive(Error, Debug)]
pub enum MessageDecodeError {
#[error("Error reading field value.")]
ReadFailure(#[from] std::io::Error),
#[error("Error decoding STUN header.")]
HeaderDecodeFailure(#[from] HeaderDecodeError),
#[error("Error decoding STUN attribute.")]
AttributeDecodeFailure {
#[source]
source: AttributeDecodeError,
transaction_id: StunTransactionId
},
#[error("Error decoding STUN attribute.")]
IntegrityKeyGenerationFailure(#[from] IntegrityKeyGenerationError),
#[error("Fingerprint attribute is not the last one. Message length: {msg_len}, attribute position: {attr_pos}.")]
IncorrectFingerprintAttributePosition {
msg_len: usize,
attr_pos: usize,
},
#[error("Fingerprint value mismatch. Attribute value: {attr_value:#X?}, computed value: {computed_value:#X?}.")]
FingerprintMismatch {
attr_value: u32,
computed_value: u32,
},
#[error("Message integrity is compromised. Attribute HMAC value: {attr_value:#X?}, computed HMAC value: {computed_value:#X?}.")]
MessageIntegrityFail {
attr_value: Vec<u8>,
computed_value: Vec<u8>,
},
}
#[derive(Error, Debug)]
pub enum MessageEncodeError {
#[error("Error writing field value.")]
WriteFailure(#[from] std::io::Error),
#[error("Error encoding STUN header.")]
HeaderEncodeFailure(#[from] HeaderEncodeError),
#[error("Error encoding STUN attribute.")]
AttributeEncodeFailure(#[from] AttributeEncodeError),
#[error("Error decoding STUN attribute.")]
IntegrityKeyGenerationFailure(#[from] IntegrityKeyGenerationError),
#[error("Fingerprint attribute is not the last one. Attributes count: {attr_count}, fingerprint attribute index: {fingerprint_attr_idx}.")]
IncorrectFingerprintAttributePosition {
attr_count: usize,
fingerprint_attr_idx: usize,
},
#[error("An attribute was added after the MessageIntegrity attribute. Only the Fingerprint attribute can be placed after the MessageIntegrity attribute.")]
AttributeAfterIntegrity(),
#[error("Missing message integrity password. A placeholder HMAC value is set in MessageIntegrity attribute but no `integrity_password` is provided as an encoding argument.")]
MissingIntegrityPassword(),
}