Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / shared / lib / interfaces / Key.ts
bloba816eb8371210c1bb68dbdc18ffefefb6106ce28
1 import type {
2     PrivateKeyReference,
3     PrivateKeyReferenceV4,
4     PrivateKeyReferenceV6,
5     PublicKeyReference,
6 } from '@proton/crypto';
8 import type { RequireSome } from './utils';
10 export interface KeyWithRecoverySecret extends Key {
11     RecoverySecret: string;
12     RecoverySecretSignature: string;
15 export interface Key {
16     ID: string;
17     Primary: 1 | 0;
18     Active: 1 | 0;
19     Flags?: number; // Only available for address keys
20     Fingerprint: string;
21     Fingerprints: string[];
22     PublicKey: string; // armored key
23     Version: number;
24     Activation?: string;
25     PrivateKey: string; // armored key
26     Token?: string;
27     Signature?: string; // Only available for address keys
28     RecoverySecret?: string | null; // Only available for user keys
29     RecoverySecretSignature?: string | null; // Only available for user keys
30     AddressForwardingID?: string | null; // Only available for address keys
33 export type AddressKey = RequireSome<Key, 'Flags' | 'Signature' | 'AddressForwardingID'>;
34 export type UserKey = RequireSome<Key, 'RecoverySecret' | 'RecoverySecretSignature'>;
36 export interface KeyPair<PrivateKeyReferenceWithVersion extends PrivateKeyReference = PrivateKeyReference> {
37     privateKey: PrivateKeyReferenceWithVersion;
38     publicKey: PublicKeyReference;
41 export interface KeysPair {
42     privateKeys: PrivateKeyReference[];
43     publicKeys: PublicKeyReference[];
46 export interface DecryptedKey<PrivateKeyReferenceWithVersion extends PrivateKeyReference = PrivateKeyReference>
47     extends KeyPair<PrivateKeyReferenceWithVersion> {
48     ID: string;
51 export interface DecryptedAddressKey extends KeyPair {
52     ID: string;
53     Flags: number;
54     Primary: 1 | 0;
57 export interface InactiveKey {
58     Key: Key;
59     fingerprint?: string;
62 export interface ActiveKey<
63     PrivateKeyReferenceWithVersion extends PrivateKeyReference = PrivateKeyReferenceV4 | PrivateKeyReferenceV6,
64 > extends DecryptedKey<PrivateKeyReferenceWithVersion> {
65     fingerprint: string;
66     flags: number;
67     primary: 1 | 0;
68     sha256Fingerprints: string[];
71 export type ActiveKeyWithVersion = ActiveKey<PrivateKeyReferenceV6> | ActiveKey<PrivateKeyReferenceV4>;
73 /**
74  * Users who have generated a v6 address key might have two primary keys instead of one.
75  * This is because a v6 address key can only be marked as primary alongside a v4 key,
76  * for compatibility reasons with Proton apps/clients that do not support encrypting to v6 keys.
77  * We store v4 and v6 keys separately to make it easier to implement primary key changes and checks,
78  * and to help keep track of the key versions being used with TS support.
79  */
80 export interface ActiveAddressKeysByVersion {
81     v4: ActiveKey<PrivateKeyReferenceV4>[]; // one or more
82     v6: ActiveKey<PrivateKeyReferenceV6>[]; // zero or more
85 export const isActiveKeyV6 = (activeKey: ActiveKey): activeKey is ActiveKey<PrivateKeyReferenceV6> =>
86     activeKey.privateKey.isPrivateKeyV6();