feat(INDA-383): daily stats.
[ProtonMail-WebClient.git] / packages / shared / lib / keys / keyAlgorithm.ts
blob3baf58e3809e6c9dc0d9339effbb8cba1ff11193
1 import type { AlgorithmInfo } from '@proton/crypto';
2 import unique from '@proton/utils/unique';
4 import type { KeyGenConfig } from '../interfaces';
6 const formatCurveName = (curve: AlgorithmInfo['curve']) => {
7     switch (curve) {
8         case 'curve25519Legacy':
9         case 'ed25519Legacy':
10             return 'Curve25519';
11         case 'nistP256':
12         case 'nistP384':
13         case 'nistP521':
14             return curve.replace('nist', 'NIST ');
15         case 'brainpoolP256r1':
16         case 'brainpoolP384r1':
17         case 'brainpoolP512r1':
18             return curve.replace('brainpool', 'Brainpool ');
19         default:
20             return curve;
21     }
24 export const getFormattedAlgorithmName = ({ algorithm, bits, curve }: AlgorithmInfo) => {
25     switch (algorithm) {
26         case 'elgamal':
27             return `ElGamal (${bits})`;
28         case 'dsa':
29             return `DSA (${bits})`;
30         case 'rsaEncrypt':
31         case 'rsaEncryptSign':
32         case 'rsaSign':
33             return `RSA (${bits})`;
34         case 'eddsaLegacy':
35         case 'ecdsa':
36         case 'ecdh':
37             return `ECC (${formatCurveName(curve)})`;
38         case 'ed25519':
39         case 'x25519':
40             return `ECC (Curve25519, new format)`;
41         case 'ed448':
42         case 'x448':
43             return `ECC (Curve448, new format)`;
44         default:
45             return algorithm.toUpperCase(); // should never get here
46     }
49 /**
50  * Aggregate different algorithm information, returning a string including the list of unique key algo descriptors.
51  * @param {AlgorithmInfo[]} algorithmInfos
52  * @returns {String} formatted unique algorithm names. Different curves or key sizes result in separate entries, e.g.
53  *      [{ name: 'rsa', bits: 2048 }, { name: 'rsa', bits: 4096 }] returns `RSA (2048), RSA (4096)`.
54  */
55 export const getFormattedAlgorithmNames = (algorithmInfos: AlgorithmInfo[] = []) => {
56     const formattedAlgos = algorithmInfos.map(getFormattedAlgorithmName);
57     return unique(formattedAlgos).join(', ');
60 /**
61  * Determine whether any of the given algorithmInfo matches the keyGenConfig
62  */
63 export const getAlgorithmExists = (algorithmInfos: AlgorithmInfo[] = [], keyGenConfig: KeyGenConfig) => {
64     return algorithmInfos.some(({ algorithm, curve, bits }) => {
65         switch (algorithm) {
66             case 'rsaEncrypt':
67             case 'rsaEncryptSign':
68             case 'rsaSign':
69                 return bits === keyGenConfig.rsaBits;
70             case 'eddsaLegacy':
71             case 'ecdsa':
72             case 'ecdh':
73                 return curve === keyGenConfig.curve;
74             case 'ed25519':
75             case 'x25519':
76             case 'ed448':
77             case 'x448':
78                 return false; // key generation currently unsupported
79             default:
80                 return false;
81         }
82     });