### File

`src/app/_pgp/pgp-key-store.ts`

### Description

Provides a keyring for pgp keys.

### Implements

`MutableKeyStore`

### Index

###### Methods
clearKeysInKeyring getEncryptKeys getFingerprint getKeyId getKeysForId getPrivateKey getPrivateKeyForId getPrivateKeyId getPrivateKeys getPublicKeyForId getPublicKeyForSubkeyId getPublicKeys getPublicKeysForAddress getTrustedActiveKeys getTrustedKeys Async importKeyPair Async importPrivateKey Async importPublicKey Async isEncryptedPrivateKey Async isValidKey Async loadKeyring removeKeysForId removePublicKey removePublicKeyForId Async sign

### Methods

clearKeysInKeyring
`clearKeysInKeyring()`
Defined in src/app/_pgp/pgp-key-store.ts:167
Remove all keys from the keyring. Returns : `void`

getEncryptKeys
`getEncryptKeys()`
Defined in src/app/_pgp/pgp-key-store.ts:178
Get all the encryption keys. Returns : `Array<any>` An array of encryption keys.

getFingerprint
`getFingerprint()`
Defined in src/app/_pgp/pgp-key-store.ts:186
Get the first private key's fingerprint. Returns : `string` The first private key's fingerprint.

getKeyId
`getKeyId(key: any)`
Defined in src/app/_pgp/pgp-key-store.ts:201
Get a key's keyId. Parameters :
Name | Type | Optional | Description
key | `any` | No | The key to fetch the keyId from.
Returns : `string` The key's keyId.

getKeysForId
`getKeysForId(keyId: string)`
Defined in src/app/_pgp/pgp-key-store.ts:210
Get keys from the keyring using their keyId. Parameters :
Name | Type | Optional | Description
keyId | `string` | No | The keyId of the keys to be fetched from the keyring.
Returns : `Array<any>` An array of the keys with that keyId.

getPrivateKey
`getPrivateKey()`
Defined in src/app/_pgp/pgp-key-store.ts:218
Get the first private key. Returns : `any` The first private key.

getPrivateKeyForId
`getPrivateKeyForId(keyId)`
Defined in src/app/_pgp/pgp-key-store.ts:227
Get a private key from the keyring using it's keyId. Parameters :
Name | Optional | Description
keyId | No | The keyId of the private key to be fetched from the keyring.
Returns : `any` The private key with that keyId.

getPrivateKeyId
`getPrivateKeyId()`
Defined in src/app/_pgp/pgp-key-store.ts:235
Get the first private key's keyID. Returns : `string` The first private key's keyId.

getPrivateKeys
`getPrivateKeys()`
Defined in src/app/_pgp/pgp-key-store.ts:248
Get all private keys. Returns : `Array<any>` An array of all private keys.

getPublicKeyForId
`getPublicKeyForId(keyId)`
Defined in src/app/_pgp/pgp-key-store.ts:257
Get a public key from the keyring using it's keyId. Parameters :
Name | Optional | Description
keyId | No | The keyId of the public key to be fetched from the keyring.
Returns : `any` The public key with that keyId.

getPublicKeyForSubkeyId
`getPublicKeyForSubkeyId(subkeyId)`
Defined in src/app/_pgp/pgp-key-store.ts:266
Get a public key from the keyring using it's subkeyId. Parameters :
Name | Optional | Description
subkeyId | No | The subkeyId of the public key to be fetched from the keyring.
Returns : `any` The public key with that subkeyId.

getPublicKeys
`getPublicKeys()`
Defined in src/app/_pgp/pgp-key-store.ts:274
Get all the public keys. Returns : `Array<any>` An array of public keys.

getPublicKeysForAddress
`getPublicKeysForAddress(address)`
Defined in src/app/_pgp/pgp-key-store.ts:283
Get public keys from the keyring using their address. Parameters :
Name | Optional | Description
address | No | The address of the public keys to be fetched from the keyring.
Returns : `Array<any>` An array of the public keys with that address.

getTrustedActiveKeys
`getTrustedActiveKeys()`
Defined in src/app/_pgp/pgp-key-store.ts:291
Get all the trusted active keys. Returns : `Array<any>` An array of trusted active keys.

getTrustedKeys
`getTrustedKeys()`
Defined in src/app/_pgp/pgp-key-store.ts:299
Get all the trusted keys. Returns : `Array<any>` An array of trusted keys.

Async importKeyPair
`importKeyPair(publicKey: any, privateKey: any)`
Defined in src/app/_pgp/pgp-key-store.ts:310
Add a key pair to keyring. Parameters :
Name | Type | Optional | Description
publicKey | `any` | No | The public key to be added to the keyring.
privateKey | `any` | No | The private key to be added to the keyring.
Returns : `Promise<void>`

Async importPrivateKey
`importPrivateKey(privateKey: any)`
Defined in src/app/_pgp/pgp-key-store.ts:325
Add private key to keyring. Parameters :
Name | Type | Optional | Description
privateKey | `any` | No | The private key to be added to the keyring.
Returns : `Promise<void>`

Async importPublicKey
`importPublicKey(publicKey: any)`
Defined in src/app/_pgp/pgp-key-store.ts:339
Add public key to keyring. Parameters :
Name | Type | Optional | Description
publicKey | `any` | No | The public key to be added to the keyring.
Returns : `Promise<void>`

Async isEncryptedPrivateKey
`isEncryptedPrivateKey(privateKey: any)`
Defined in src/app/_pgp/pgp-key-store.ts:353
Verify that a private key is encrypted. Parameters :
Name | Type | Optional | Description
privateKey | `any` | No | The private key to verify.
Returns : `Promise<boolean>` true - If private key is encrypted.

Async isValidKey
`isValidKey(key)`
Defined in src/app/_pgp/pgp-key-store.ts:369
Test if the input is a valid key. Parameters :
Name | Optional | Description
key | No | The input to be validated.
Returns : `Promise<boolean>` true - If the input is a valid key.

Async loadKeyring
`loadKeyring()`
Defined in src/app/_pgp/pgp-key-store.ts:379
Instantiate the keyring in the keystore. Returns : `Promise<void>`

removeKeysForId
`removeKeysForId(keyId)`
Defined in src/app/_pgp/pgp-key-store.ts:389
Remove a public key from the keyring using it's keyId. Parameters :
Name | Optional | Description
keyId | No | The keyId of the keys to be removed from the keyring.
Returns : `Array<any>` An array of the removed keys.

removePublicKey
`removePublicKey(publicKey: any)`
Defined in src/app/_pgp/pgp-key-store.ts:398
Remove a public key from the keyring. Parameters :
Name | Type | Optional | Description
publicKey | `any` | No | The public key to be removed from the keyring.
Returns : `any` The removed public key.

removePublicKeyForId
`removePublicKeyForId(keyId)`
Defined in src/app/_pgp/pgp-key-store.ts:408
Remove a public key from the keyring using it's keyId. Parameters :
Name | Optional | Description
keyId | No | The keyId of the public key to be removed from the keyring.
Returns : `any` The removed public key.

Async sign
`sign(plainText)`
Defined in src/app/_pgp/pgp-key-store.ts:418
Sign message using private key. Parameters :
Name | Optional | Description
plainText | No | The message to be signed.
Returns : `Promise<any>` The generated signature.

    import { KeyStore } from 'cic-client-meta';
    // TODO should we put this on the mutable key store object
    import * as openpgp from 'openpgp';

    /** An openpgp Keyring instance. */
    const keyring = new openpgp.Keyring();

    /**
     * Mutable Key store interface.
     *
     * @extends KeyStore
     */
    interface MutableKeyStore extends KeyStore {
      /** Remove all keys from the keyring. */
      clearKeysInKeyring(): void;
      /**
       * Get all the encryption keys.
       * @returns An array of encryption keys.
       * @remarks
       * Current implementation doesn't include encryption keys.
       * This is included to appease the implemented Keystore interface.
       */
      getEncryptKeys(): Array<any>;
      /**
       * Get the first private key's fingerprint.
       * @returns The first private key's fingerprint.
       */
      getFingerprint(): string;
      /**
       * Get a key's keyId.
       * @param key - The key to fetch the keyId from.
       * @returns The key's keyId.
       */
      getKeyId(key: any): string;
      /**
       * Get keys from the keyring using their keyId.
       * @param keyId - The keyId of the keys to be fetched from the keyring.
       * @returns An array of the keys with that keyId.
       */
      getKeysForId(keyId: string): Array<any>;
      /**
       * Get the first private key.
       * @returns The first private key.
       */
      getPrivateKey(): any;
      /**
       * Get a private key from the keyring using it's keyId.
       * @param keyId - The keyId of the private key to be fetched from the keyring.
       * @returns The private key with that keyId.
       */
      getPrivateKeyForId(keyId: string): any;
      /**
       * Get the first private key's keyID.
       * @returns The first private key's keyId.
       */
      getPrivateKeyId(): string;
      /**
       * Get all private keys.
       * @returns An array of all private keys.
       */
      getPrivateKeys(): Array<any>;
      /**
       * Get a public key from the keyring using it's keyId.
       * @param keyId - The keyId of the public key to be fetched from the keyring.
       * @returns The public key with that keyId.
       */
      getPublicKeyForId(keyId: string): any;
      /**
       * Get a public key from the keyring using it's subkeyId.
       * @param subkeyId - The subkeyId of the public key to be fetched from the keyring.
       * @returns The public key with that subkeyId.
       */
      getPublicKeyForSubkeyId(subkeyId: string): any;
      /**
       * Get all the public keys.
       * @returns An array of public keys.
       */
      getPublicKeys(): Array<any>;
      /**
       * Get public keys from the keyring using their address.
       * @param address - The address of the public keys to be fetched from the keyring.
       * @returns An array of the public keys with that address.
       */
      getPublicKeysForAddress(address: string): Array<any>;
      /**
       * Get all the trusted active keys.
       * @returns An array of trusted active keys.
       */
      getTrustedActiveKeys(): Array<any>;
      /**
       * Get all the trusted keys.
       * @returns An array of trusted keys.
       */
      getTrustedKeys(): Array<any>;
      /**
       * Add a key pair to keyring.
       * @async
       * @param publicKey - The public key to be added to the keyring.
       * @param privateKey - The private key to be added to the keyring.
       * @throws Error
       */
      importKeyPair(publicKey: any, privateKey: any): Promise<void>;
      /**
       * Add private key to keyring.
       * @async
       * @param privateKey - The private key to be added to the keyring.
       * @throws Error
       */
      importPrivateKey(privateKey: any): Promise<void>;
      /**
       * Add public key to keyring.
       * @async
       * @param publicKey - The public key to be added to the keyring.
       * @throws Error
       */
      importPublicKey(publicKey: any): Promise<void>;
      /**
       * Verify that a private key is encrypted.
       * @async
       * @param privateKey - The private key to verify.
       * @returns true - If private key is encrypted.
       */
      isEncryptedPrivateKey(privateKey: any): Promise<boolean>;
      /**
       * Test if the input is a valid key.
       * @async
       * @param key - The input to be validated.
       * @returns true - If the input is a valid key.
       */
      isValidKey(key: any): Promise<boolean>;
      /**
       * Instantiate the keyring in the keystore.
       * @async
       */
      loadKeyring(): void;
      /**
       * Remove a public key from the keyring using it's keyId.
       * @param keyId - The keyId of the keys to be removed from the keyring.
       * @returns An array of the removed keys.
       */
      removeKeysForId(keyId: string): Array<any>;
      /**
       * Remove a public key from the keyring.
       * @param publicKey - The public key to be removed from the keyring.
       * @returns The removed public key.
       */
      removePublicKey(publicKey: any): any;
      /**
       * Remove a public key from the keyring using it's keyId.
       * @param keyId - The keyId of the public key to be removed from the keyring.
       * @returns The removed public key.
       */
      removePublicKeyForId(keyId: string): any;
      /**
       * Sign message using private key.
       * @async
       * @param plainText - The message to be signed.
       * @returns The generated signature.
       */
      sign(plainText: string): Promise<any>;
    }

    /** Provides a keyring for pgp keys. */
    class MutablePgpKeyStore implements MutableKeyStore {
      /** Remove all keys from the keyring. */
      clearKeysInKeyring(): void {
        keyring.clear();
      }

      /**
       * Get all the encryption keys.
       * @returns An array of encryption keys.
       * @remarks
       * Current implementation doesn't include encryption keys.
       * This is included to appease the implemented Keystore interface.
       */
      getEncryptKeys(): Array<any> {
        return [];
      }

      /**
       * Get the first private key's fingerprint.
       * @returns The first private key's fingerprint.
       */
      getFingerprint(): string {
        // TODO Handle multiple keys
        return (
          keyring.privateKeys &&
          keyring.privateKeys.keys[0] &&
          keyring.privateKeys.keys[0].keyPacket &&
          keyring.privateKeys.keys[0].keyPacket.fingerprint
        );
      }

      /**
       * Get a key's keyId.
       * @param key - The key to fetch the keyId from.
       * @returns The key's keyId.
       */
      getKeyId(key: any): string {
        return key.getKeyId().toHex();
      }

      /**
       * Get keys from the keyring using their keyId.
       * @param keyId - The keyId of the keys to be fetched from the keyring.
       * @returns An array of the keys with that keyId.
       */
      getKeysForId(keyId: string): Array<any> {
        return keyring.getKeysForId(keyId);
      }

      /**
       * Get the first private key.
       * @returns The first private key.
       */
      getPrivateKey(): any {
        return keyring.privateKeys && keyring.privateKeys.keys[0];
      }

      /**
       * Get a private key from the keyring using it's keyId.
       * @param keyId - The keyId of the private key to be fetched from the keyring.
       * @returns The private key with that keyId.
       */
      getPrivateKeyForId(keyId): any {
        return keyring.privateKeys && keyring.privateKeys.getForId(keyId);
      }

      /**
       * Get the first private key's keyID.
       * @returns The first private key's keyId.
       */
      getPrivateKeyId(): string {
        // TODO is there a library that comes with angular for doing this?
        return (
          keyring.privateKeys &&
          keyring.privateKeys.keys[0] &&
          keyring.privateKeys.keys[0].getKeyId().toHex()
        );
      }

      /**
       * Get all private keys.
       * @returns An array of all private keys.
       */
      getPrivateKeys(): Array<any> {
        return keyring.privateKeys && keyring.privateKeys.keys;
      }

      /**
       * Get a public key from the keyring using it's keyId.
       * @param keyId - The keyId of the public key to be fetched from the keyring.
       * @returns The public key with that keyId.
       */
      getPublicKeyForId(keyId): any {
        return keyring.publicKeys && keyring.publicKeys.getForId(keyId);
      }

      /**
       * Get a public key from the keyring using it's subkeyId.
       * @param subkeyId - The subkeyId of the public key to be fetched from the keyring.
       * @returns The public key with that subkeyId.
       */
      getPublicKeyForSubkeyId(subkeyId): any {
        return keyring.publicKeys && keyring.publicKeys.getForId(subkeyId, true);
      }

      /**
       * Get all the public keys.
       * @returns An array of public keys.
       */
      getPublicKeys(): Array<any> {
        return keyring.publicKeys && keyring.publicKeys.keys;
      }

      /**
       * Get public keys from the keyring using their address.
       * @param address - The address of the public keys to be fetched from the keyring.
       * @returns An array of the public keys with that address.
       */
      getPublicKeysForAddress(address): Array<any> {
        return keyring.publicKeys && keyring.publicKeys.getForAddress(address);
      }

      /**
       * Get all the trusted active keys.
       * @returns An array of trusted active keys.
       */
      getTrustedActiveKeys(): Array<any> {
        return keyring.publicKeys && keyring.publicKeys.keys;
      }

      /**
       * Get all the trusted keys.
       * @returns An array of trusted keys.
       */
      getTrustedKeys(): Array<any> {
        return keyring.publicKeys && keyring.publicKeys.keys;
      }

      /**
       * Add a key pair to keyring.
       * @async
       * @param publicKey - The public key to be added to the keyring.
       * @param privateKey - The private key to be added to the keyring.
       * @throws Error
       */
      async importKeyPair(publicKey: any, privateKey: any): Promise<void> {
        try {
          await keyring.publicKeys.importKey(publicKey);
          await keyring.privateKeys.importKey(privateKey);
        } catch (error) {
          throw error;
        }
      }

      /**
       * Add private key to keyring.
       * @async
       * @param privateKey - The private key to be added to the keyring.
       * @throws Error
       */
      async importPrivateKey(privateKey: any): Promise<void> {
        try {
          await keyring.privateKeys.importKey(privateKey);
        } catch (error) {
          throw error;
        }
      }

      /**
       * Add public key to keyring.
       * @async
       * @param publicKey - The public key to be added to the keyring.
       * @throws Error
       */
      async importPublicKey(publicKey: any): Promise<void> {
        try {
          await keyring.publicKeys.importKey(publicKey);
        } catch (error) {
          throw error;
        }
      }

      /**
       * Verify that a private key is encrypted.
       * @async
       * @param privateKey - The private key to verify.
       * @returns true - If private key is encrypted.
       */
      async isEncryptedPrivateKey(privateKey: any): Promise<boolean> {
        const imported = await openpgp.key.readArmored(privateKey);
        for (const key of imported.keys) {
          if (key.isDecrypted()) {
            return false;
          }
        }
        return true;
      }

      /**
       * Test if the input is a valid key.
       * @async
       * @param key - The input to be validated.
       * @returns true - If the input is a valid key.
       */
      async isValidKey(key): Promise<boolean> {
        // There is supposed to be an openpgp.readKey() method but I can't find it?
        const testKey = await openpgp.key.readArmored(key);
        return !testKey.err;
      }

      /**
       * Instantiate the keyring in the keystore.
       * @async
       */
      async loadKeyring(): Promise<void> {
        await keyring.load();
        await keyring.store();
      }

      /**
       * Remove a public key from the keyring using it's keyId.
       * @param keyId - The keyId of the keys to be removed from the keyring.
       * @returns An array of the removed keys.
       */
      removeKeysForId(keyId): Array<any> {
        return keyring.removeKeysForId(keyId);
      }

      /**
       * Remove a public key from the keyring.
       * @param publicKey - The public key to be removed from the keyring.
       * @returns The removed public key.
       */
      removePublicKey(publicKey: any): any {
        const keyId = publicKey.getKeyId().toHex();
        return keyring.publicKeys && keyring.publicKeys.removeForId(keyId);
      }

      /**
       * Remove a public key from the keyring using it's keyId.
       * @param keyId - The keyId of the public key to be removed from the keyring.
       * @returns The removed public key.
       */
      removePublicKeyForId(keyId): any {
        return keyring.publicKeys && keyring.publicKeys.removeForId(keyId);
      }

      /**
       * Sign message using private key.
       * @async
       * @param plainText - The message to be signed.
       * @returns The generated signature.
       */
      async sign(plainText): Promise<any> {
        const privateKey = this.getPrivateKey();
        if (!privateKey.isDecrypted()) {
          const password = window.prompt('password');
          await privateKey.decrypt(password);
        }
        const opts = {
          message: openpgp.message.fromText(plainText),
          privateKeys: [privateKey],
          detached: true,
        };
        const signatureObject = await openpgp.sign(opts);
        return signatureObject.signature;
      }
    }

    /** @exports */
    export { MutableKeyStore, MutablePgpKeyStore };

# result-matching ""

# No results matching ""