src/app/_pgp/pgp-signer.ts
Provides functionality for signing and verifying signed messages.
Properties |
Methods |
|
constructor(keyStore: MutableKeyStore)
|
||||||||
Defined in src/app/_pgp/pgp-signer.ts:74
|
||||||||
Initializing the Signer.
Parameters :
|
algo |
Type : string
|
Default value : 'sha256'
|
Defined in src/app/_pgp/pgp-signer.ts:62
|
Encryption algorithm used |
dgst |
Type : string
|
Defined in src/app/_pgp/pgp-signer.ts:64
|
Message digest |
engine |
Type : string
|
Default value : 'pgp'
|
Defined in src/app/_pgp/pgp-signer.ts:60
|
Encryption engine used. |
keyStore |
Type : MutableKeyStore
|
Defined in src/app/_pgp/pgp-signer.ts:68
|
A keystore holding pgp keys. |
loggingService |
Type : LoggingService
|
Defined in src/app/_pgp/pgp-signer.ts:74
|
A service that provides logging capabilities. |
onsign |
Type : function
|
Defined in src/app/_pgp/pgp-signer.ts:70
|
Event triggered on successful signing of message. |
onverify |
Type : function
|
Defined in src/app/_pgp/pgp-signer.ts:72
|
Event triggered on successful verification of a signature. |
signature |
Type : Signature
|
Defined in src/app/_pgp/pgp-signer.ts:66
|
Generated signature |
Public fingerprint |
fingerprint()
|
Defined in src/app/_pgp/pgp-signer.ts:90
|
Get the private key fingerprint.
Returns :
string
A private key fingerprint. |
Public prepare | ||||||||
prepare(material: Signable)
|
||||||||
Defined in src/app/_pgp/pgp-signer.ts:99
|
||||||||
Load the message digest.
Parameters :
Returns :
boolean
true - If digest has been loaded successfully. |
Public Async sign | ||||||||
sign(digest: string)
|
||||||||
Defined in src/app/_pgp/pgp-signer.ts:146
|
||||||||
Signs a message using a private key.
Parameters :
Returns :
Promise<void>
|
Public verify | ||||||||||||
verify(digest: string, signature: Signature)
|
||||||||||||
Defined in src/app/_pgp/pgp-signer.ts:109
|
||||||||||||
Verify that signature is valid.
Parameters :
Returns :
void
|
import * as openpgp from 'openpgp';
// Application imports
import { MutableKeyStore } from '@app/_pgp/pgp-key-store';
import { LoggingService } from '@app/_services/logging.service';
/** Signable object interface */
interface Signable {
/** The message to be signed. */
digest(): string;
}
/** Signature object interface */
interface Signature {
/** Encryption engine used. */
engine: string;
/** Encryption algorithm used */
algo: string;
/** Data to be signed. */
data: string;
/** Message digest */
digest: string;
}
/** Signer interface */
interface Signer {
/** Event triggered on successful signing of message. */
onsign(signature: Signature): void;
/** Event triggered on successful verification of a signature. */
onverify(flag: boolean): void;
/**
* Get the private key fingerprint.
* @returns A private key fingerprint.
*/
fingerprint(): string;
/**
* Load the message digest.
* @param material - A signable object.
* @returns true - If digest has been loaded successfully.
*/
prepare(material: Signable): boolean;
/**
* Verify that signature is valid.
* @param digest - The message that was signed.
* @param signature - The generated signature.
*/
verify(digest: string, signature: Signature): void;
/**
* Signs a message using a private key.
* @async
* @param digest - The message to be signed.
*/
sign(digest: string): Promise<void>;
}
/** Provides functionality for signing and verifying signed messages. */
class PGPSigner implements Signer {
/** Encryption engine used. */
engine = 'pgp';
/** Encryption algorithm used */
algo = 'sha256';
/** Message digest */
dgst: string;
/** Generated signature */
signature: Signature;
/** A keystore holding pgp keys. */
keyStore: MutableKeyStore;
/** Event triggered on successful signing of message. */
onsign: (signature: Signature) => void;
/** Event triggered on successful verification of a signature. */
onverify: (flag: boolean) => void;
/** A service that provides logging capabilities. */
loggingService: LoggingService;
/**
* Initializing the Signer.
* @param keyStore - A keystore holding pgp keys.
*/
constructor(keyStore: MutableKeyStore) {
this.keyStore = keyStore;
this.onsign = (signature: Signature) => {};
this.onverify = (flag: boolean) => {};
}
/**
* Get the private key fingerprint.
* @returns A private key fingerprint.
*/
public fingerprint(): string {
return this.keyStore.getFingerprint();
}
/**
* Load the message digest.
* @param material - A signable object.
* @returns true - If digest has been loaded successfully.
*/
public prepare(material: Signable): boolean {
this.dgst = material.digest();
return true;
}
/**
* Verify that signature is valid.
* @param digest - The message that was signed.
* @param signature - The generated signature.
*/
public verify(digest: string, signature: Signature): void {
openpgp.signature
.readArmored(signature.data)
.then((sig) => {
const opts = {
message: openpgp.cleartext.fromText(digest),
publicKeys: this.keyStore.getTrustedKeys(),
signature: sig,
};
openpgp.verify(opts).then((v) => {
let i = 0;
for (i = 0; i < v.signatures.length; i++) {
const s = v.signatures[i];
if (s.valid) {
this.onverify(s);
return;
}
}
this.loggingService.sendErrorLevelMessage(
`Checked ${i} signature(s) but none valid`,
this,
{ error: '404 Not found!' }
);
this.onverify(false);
});
})
.catch((e) => {
this.loggingService.sendErrorLevelMessage(e.message, this, { error: e });
this.onverify(false);
});
}
/**
* Signs a message using a private key.
* @async
* @param digest - The message to be signed.
*/
public async sign(digest: string): Promise<void> {
const m = openpgp.cleartext.fromText(digest);
const pk = this.keyStore.getPrivateKey();
if (!pk.isDecrypted()) {
const password = window.prompt('password');
await pk.decrypt(password);
}
const opts = {
message: m,
privateKeys: [pk],
detached: true,
};
openpgp
.sign(opts)
.then((s) => {
this.signature = {
engine: this.engine,
algo: this.algo,
data: s.signature,
// TODO: fix for browser later
digest,
};
this.onsign(this.signature);
})
.catch((e) => {
this.loggingService.sendErrorLevelMessage(e.message, this, { error: e });
this.onsign(undefined);
});
}
}
/** @exports */
export { Signable, Signature, Signer, PGPSigner };