wolf_crypto/aead/chacha20_poly1305/
states.rs

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
//! State marker types and traits for the `ChaCha20Poly1305` AEAD.
//!
//! This module defines the internal state machine for the `ChaCha20Poly1305` AEAD, using marker
//! types and traits to enforce correct usage at compile time. It ensures that methods are called in
//! the correct order and that the AEAD transitions through the appropriate states during encryption
//! or decryption operations.
use core::ffi::c_int;
use wolf_crypto_sys::{CHACHA20_POLY1305_AEAD_DECRYPT, CHACHA20_POLY1305_AEAD_ENCRYPT};
use crate::sealed::Sealed;

pub trait State: Sealed {}

define_state! {
    /// Initial state of the `ChaCha20Poly1305` AEAD.
    Init,

    /// State where encryption can begin, with optional AAD.
    ///
    /// In this state, the cipher is ready to accept optional Additional Authenticated Data (AAD)
    /// before proceeding to encrypt data.
    EncryptMaybeAad,

    /// State for updating the AAD during encryption.
    ///
    /// In this state, the cipher is in the process of accepting AAD for authentication during
    /// encryption. Multiple AAD updates can be performed.
    EncryptAad,

    /// State where encryption of data can occur.
    ///
    /// In this state, the cipher can encrypt data and update the authentication tag accordingly.
    Encrypt,

    /// State where decryption can begin, with optional AAD.
    ///
    /// In this state, the cipher is ready to accept optional Additional Authenticated Data (AAD)
    /// before proceeding to decrypt data.
    DecryptMaybeAad,

    /// State for updating the AAD during decryption.
    ///
    /// In this state, the cipher is in the process of accepting AAD for authentication during
    /// decryption. Multiple AAD updates can be performed.
    DecryptAad,

    /// State where decryption of data can occur.
    ///
    /// In this state, the cipher can decrypt data and update the authentication tag accordingly.
    Decrypt,
}

/// Indicates that the cipher can perform data updates in the current state.
pub trait CanUpdate: State {
    /// The mode (encryption or decryption) associated with this state.
    type Mode: Updating;
}

/// Implemented by the two modes who can finalize the AEAD, as well as initialize it.
pub trait Updating: CanUpdate {
    /// The initial state type when starting the AEAD operation.
    type InitState: CanSetAad;

    #[doc(hidden)]
    #[must_use]
    /// Returns the direction (encrypt or decrypt) for the AEAD operation.
    fn direction() -> c_int;
}

pub trait CanUpdateAad: State {
    type Updating: UpdatingAad;
}
pub trait CanSetAad: CanUpdateAad + CanUpdate {
    type Mode: Updating;
    type Updating: UpdatingAad;
}
pub trait UpdatingAad: CanUpdateAad {
    type Mode: Updating;
}

// AAD permitted states
impl CanSetAad for EncryptMaybeAad {
    type Mode = Encrypt;
    type Updating = EncryptAad;
}
impl CanUpdateAad for EncryptMaybeAad {
    type Updating = EncryptAad;
}
impl CanUpdate for EncryptMaybeAad {
    type Mode = Encrypt;
}

impl CanUpdateAad for EncryptAad {
    type Updating = Self;
}
impl UpdatingAad for EncryptAad {
    type Mode = Encrypt;
}
impl<S: UpdatingAad> CanUpdate for S {
    type Mode = S::Mode;
}

// ---

impl CanUpdate for Encrypt {
    type Mode = Self;
}

impl Updating for Encrypt {
    type InitState = EncryptMaybeAad;

    #[inline(always)]
    #[doc(hidden)]
    fn direction() -> c_int {
        CHACHA20_POLY1305_AEAD_ENCRYPT as c_int
    }
}

// AAD permitted states
impl CanUpdate for DecryptMaybeAad {
    type Mode = Decrypt;
}
impl CanSetAad for DecryptMaybeAad {
    type Mode = Decrypt;
    type Updating = DecryptAad;
}
impl CanUpdateAad for DecryptMaybeAad {
    type Updating = DecryptAad;
}
impl CanUpdateAad for DecryptAad {
    type Updating = Self;
}
impl UpdatingAad for DecryptAad {
    type Mode = Decrypt;
}

// ---

impl CanUpdate for Decrypt {
    type Mode = Decrypt;
}
impl Updating for Decrypt {
    type InitState = DecryptMaybeAad;

    #[inline(always)]
    #[doc(hidden)]
    fn direction() -> c_int {
        CHACHA20_POLY1305_AEAD_DECRYPT as c_int
    }
}