identity_jose/jwk/
key_operation.rs

1// Copyright 2020-2023 IOTA Stiftung
2// SPDX-License-Identifier: Apache-2.0
3
4use core::fmt::Display;
5use core::fmt::Formatter;
6use core::fmt::Result;
7
8/// Supported algorithms for the JSON Web Key `key_ops` property.
9///
10/// [More Info](https://www.iana.org/assignments/jose/jose.xhtml#web-key-operations)
11#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, serde::Deserialize, serde::Serialize)]
12#[serde(rename_all = "camelCase")]
13pub enum JwkOperation {
14  /// Compute digital signature or MAC.
15  Sign,
16  /// Verify digital signature or MAC.
17  Verify,
18  /// Encrypt content.
19  Encrypt,
20  /// Decrypt content and validate decryption, if applicable.
21  Decrypt,
22  /// Encrypt key.
23  WrapKey,
24  /// Decrypt key and validate decryption, if applicable.
25  UnwrapKey,
26  /// Derive key.
27  DeriveKey,
28  /// Derive bits not to be used as a key.
29  DeriveBits,
30  /// Compute proof
31  ProofGeneration,
32  /// Verify proof
33  ProofVerification,
34}
35
36impl JwkOperation {
37  /// Returns the JWK "key_ops" as a `str` slice.
38  pub const fn name(&self) -> &'static str {
39    match self {
40      Self::Sign => "sign",
41      Self::Verify => "verify",
42      Self::Encrypt => "encrypt",
43      Self::Decrypt => "decrypt",
44      Self::WrapKey => "wrapKey",
45      Self::UnwrapKey => "unwrapKey",
46      Self::DeriveKey => "deriveKey",
47      Self::DeriveBits => "deriveBits",
48      Self::ProofGeneration => "proofGeneration",
49      Self::ProofVerification => "proofVerification",
50    }
51  }
52
53  /// Returns the inverse operation of `self`.
54  pub const fn invert(&self) -> Self {
55    match self {
56      Self::Sign => Self::Verify,
57      Self::Verify => Self::Sign,
58      Self::Encrypt => Self::Decrypt,
59      Self::Decrypt => Self::Encrypt,
60      Self::WrapKey => Self::UnwrapKey,
61      Self::UnwrapKey => Self::WrapKey,
62      Self::DeriveKey => Self::DeriveKey,
63      Self::DeriveBits => Self::DeriveBits,
64      Self::ProofGeneration => Self::ProofVerification,
65      Self::ProofVerification => Self::ProofGeneration,
66    }
67  }
68}
69
70impl Display for JwkOperation {
71  fn fmt(&self, f: &mut Formatter<'_>) -> Result {
72    f.write_str(self.name())
73  }
74}