| 188 | } |
| 189 | |
| 190 | WasiCryptoExpect<__wasi_symmetric_key_t> |
| 191 | Context::symmetricKeyGenerate(Symmetric::Algorithm Alg, |
| 192 | __wasi_opt_options_t OptOptionsHandle) noexcept { |
| 193 | auto OptOptionsResult = mapAndTransposeOptional( |
| 194 | OptOptionsHandle, [this](__wasi_options_t OptionsHandle) noexcept { |
| 195 | return OptionsManager.get(OptionsHandle); |
| 196 | }); |
| 197 | if (!OptOptionsResult) { |
| 198 | return WasiCryptoUnexpect(OptOptionsResult); |
| 199 | } |
| 200 | |
| 201 | // Refer to OptOptionsResult if it's a Symmetric::Options. |
| 202 | auto OptSymmetricOptionsResult = transposeOptionalToRef( |
| 203 | *OptOptionsResult, |
| 204 | [](const auto &Options) noexcept |
| 205 | -> WasiCryptoExpect<OptionalRef<const Symmetric::Options>> { |
| 206 | auto *SymmetricOptions = std::get_if<Symmetric::Options>(&Options); |
| 207 | if (!SymmetricOptions) { |
| 208 | return WasiCryptoUnexpect(__WASI_CRYPTO_ERRNO_INVALID_HANDLE); |
| 209 | } |
| 210 | return SymmetricOptions; |
| 211 | }); |
| 212 | if (!OptSymmetricOptionsResult) { |
| 213 | return WasiCryptoUnexpect(OptSymmetricOptionsResult); |
| 214 | } |
| 215 | |
| 216 | return Symmetric::generateKey(Alg, *OptSymmetricOptionsResult) |
| 217 | .and_then([this](auto &&Key) noexcept { |
| 218 | return SymmetricKeyManager.registerManager( |
| 219 | std::forward<decltype(Key)>(Key)); |
| 220 | }); |
| 221 | } |
| 222 | |
| 223 | WasiCryptoExpect<__wasi_symmetric_state_t> |
| 224 | Context::symmetricStateOpen(Symmetric::Algorithm Alg, |
no test coverage detected