| 221 | } |
| 222 | |
| 223 | WasiCryptoExpect<__wasi_symmetric_state_t> |
| 224 | Context::symmetricStateOpen(Symmetric::Algorithm Alg, |
| 225 | __wasi_opt_symmetric_key_t OptKeyHandle, |
| 226 | __wasi_opt_options_t OptOptionsHandle) noexcept { |
| 227 | // Copy from KeyManager. |
| 228 | auto OptKeyResult = |
| 229 | mapAndTransposeOptional(OptKeyHandle, |
| 230 | [this](__wasi_symmetric_key_t KeyHandle) noexcept |
| 231 | -> WasiCryptoExpect<Symmetric::KeyVariant> { |
| 232 | return SymmetricKeyManager.get(KeyHandle); |
| 233 | }); |
| 234 | if (!OptKeyResult) { |
| 235 | return WasiCryptoUnexpect(OptKeyResult); |
| 236 | } |
| 237 | |
| 238 | // Copy from OptionsManager. |
| 239 | auto OptOptionsResult = mapAndTransposeOptional( |
| 240 | OptOptionsHandle, [this](__wasi_options_t OptionsHandle) noexcept { |
| 241 | return OptionsManager.get(OptionsHandle); |
| 242 | }); |
| 243 | if (!OptOptionsResult) { |
| 244 | return WasiCryptoUnexpect(OptOptionsResult); |
| 245 | } |
| 246 | |
| 247 | // Refer to OptOptionsResult if it's a Smmetric::Options. |
| 248 | auto OptSymmetricOptionsResult = transposeOptionalToRef( |
| 249 | *OptOptionsResult, |
| 250 | [](const auto &Options) noexcept |
| 251 | -> WasiCryptoExpect<OptionalRef<const Symmetric::Options>> { |
| 252 | auto *SymmetricOptions = std::get_if<Symmetric::Options>(&Options); |
| 253 | if (!SymmetricOptions) { |
| 254 | return WasiCryptoUnexpect(__WASI_CRYPTO_ERRNO_INVALID_HANDLE); |
| 255 | } |
| 256 | return SymmetricOptions; |
| 257 | }); |
| 258 | if (!OptSymmetricOptionsResult) { |
| 259 | return WasiCryptoUnexpect(OptSymmetricOptionsResult); |
| 260 | } |
| 261 | |
| 262 | return Symmetric::openState(Alg, asOptionalRef(*OptKeyResult), |
| 263 | *OptSymmetricOptionsResult) |
| 264 | .and_then([this](auto &&State) noexcept { |
| 265 | return SymmetricStateManager.registerManager( |
| 266 | std::forward<decltype(State)>(State)); |
| 267 | }); |
| 268 | } |
| 269 | |
| 270 | WasiCryptoExpect<__wasi_symmetric_state_t> |
| 271 | Context::symmetricStateClone(__wasi_symmetric_state_t StateHandle) noexcept { |
no test coverage detected