334 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			334 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import type {
 | |
|   Certificate,
 | |
|   Fingerprint,
 | |
|   Key,
 | |
|   PrivateKey, Signature,
 | |
| } from 'sshpk';
 | |
| import type * as openpgp from 'openpgp';
 | |
| import * as forge from 'node-forge';
 | |
| 
 | |
| export interface LabelValue {
 | |
|   label: string
 | |
|   value: string
 | |
|   multiline?: boolean
 | |
| }
 | |
| 
 | |
| function onErrorReturnErrorMessage(func: () => any) {
 | |
|   try {
 | |
|     return func();
 | |
|   }
 | |
|   catch (e: any) {
 | |
|     return e.toString();
 | |
|   }
 | |
| }
 | |
| 
 | |
| function buf2Hex(buffer: ArrayBuffer) { // buffer is an ArrayBuffer
 | |
|   return [...new Uint8Array(buffer)]
 | |
|     .map(x => x.toString(16).padStart(2, '0'))
 | |
|     .join('');
 | |
| }
 | |
| 
 | |
| export function getPublicKeyLabelValues(publicKey: Key) {
 | |
|   return [
 | |
|     {
 | |
|       label: 'Type:',
 | |
|       value: 'Public Key',
 | |
|     },
 | |
|     {
 | |
|       label: 'Key Type:',
 | |
|       value: publicKey.type,
 | |
|     },
 | |
|     {
 | |
|       label: 'Size:',
 | |
|       value: publicKey.size,
 | |
|     },
 | |
|     {
 | |
|       label: 'Comment:',
 | |
|       value: publicKey.comment,
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Curve:',
 | |
|       value: publicKey.curve ?? 'none',
 | |
|     },
 | |
|     {
 | |
|       label: 'Fingerprint (sha256):',
 | |
|       value: onErrorReturnErrorMessage(() => publicKey.fingerprint('sha256')),
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Fingerprint (sha512):',
 | |
|       value: onErrorReturnErrorMessage(() => publicKey.fingerprint('sha512')),
 | |
|       multiline: true,
 | |
|     },
 | |
|   ] as LabelValue[];
 | |
| }
 | |
| 
 | |
| export function getPrivateKeyLabelValues(privateKey: PrivateKey) {
 | |
|   return [
 | |
|     {
 | |
|       label: 'Type:',
 | |
|       value: 'Private Key',
 | |
|     },
 | |
|     {
 | |
|       label: 'Key Type:',
 | |
|       value: privateKey.type,
 | |
|     },
 | |
|     {
 | |
|       label: 'Size:',
 | |
|       value: privateKey.size,
 | |
|     },
 | |
|     {
 | |
|       label: 'Comment:',
 | |
|       value: privateKey.comment,
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Curve:',
 | |
|       value: privateKey.curve,
 | |
|     },
 | |
|     {
 | |
|       label: 'Fingerprint (sha256):',
 | |
|       value: onErrorReturnErrorMessage(() => privateKey.fingerprint('sha256')),
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Fingerprint (sha512):',
 | |
|       value: onErrorReturnErrorMessage(() => privateKey.fingerprint('sha512')),
 | |
|       multiline: true,
 | |
|     },
 | |
|   ] as LabelValue[];
 | |
| }
 | |
| 
 | |
| export function getCertificateLabelValues(cert: Certificate) {
 | |
|   return [
 | |
|     {
 | |
|       label: 'Type:',
 | |
|       value: 'Certificate',
 | |
|     },
 | |
|     {
 | |
|       label: 'Subjects:',
 | |
|       value: cert.subjects?.map(s => s.toString()).join('\n'),
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Issuer:',
 | |
|       value: cert.issuer.toString(),
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Subject Key:',
 | |
|       value: onErrorReturnErrorMessage(() => cert.subjectKey?.toString('ssh')),
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Subject Key Type:',
 | |
|       value: cert.subjectKey?.type,
 | |
|     },
 | |
|     {
 | |
|       label: 'Subject Size:',
 | |
|       value: cert.subjectKey?.size,
 | |
|     },
 | |
|     {
 | |
|       label: 'Subject Comment:',
 | |
|       value: cert.subjectKey?.comment,
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Subject Curve:',
 | |
|       value: cert.subjectKey?.curve ?? 'none',
 | |
|     },
 | |
|     {
 | |
|       label: 'Issuer Key:',
 | |
|       value: onErrorReturnErrorMessage(() => cert.issuerKey?.toString('ssh')),
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Serial:',
 | |
|       value: buf2Hex(cert.serial),
 | |
|     },
 | |
|     {
 | |
|       label: 'Purposes:',
 | |
|       value: cert.purposes?.join(', '),
 | |
|     },
 | |
|     {
 | |
|       label: 'Extensions:',
 | |
|       value: JSON.stringify(cert.getExtensions(), null, 2),
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Fingerprint (sha256):',
 | |
|       value: onErrorReturnErrorMessage(() => cert.fingerprint('sha256')),
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Fingerprint (sha512):',
 | |
|       value: onErrorReturnErrorMessage(() => cert.fingerprint('sha512')),
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Certificate (pem):',
 | |
|       value: onErrorReturnErrorMessage(() => cert.toString('pem')),
 | |
|       multiline: true,
 | |
|     },
 | |
|   ] as LabelValue[];
 | |
| }
 | |
| 
 | |
| export async function getPGPPublicKeyLabelValuesAsync(pgpPublicKey: openpgp.Key) {
 | |
|   return [
 | |
|     {
 | |
|       label: 'Type:',
 | |
|       value: 'PGP Public Key',
 | |
|     },
 | |
|     {
 | |
|       label: 'Creation Time:',
 | |
|       value: pgpPublicKey.getCreationTime().toString(),
 | |
|     },
 | |
|     {
 | |
|       label: 'Expiration Time:',
 | |
|       value: (await pgpPublicKey.getExpirationTime())?.toString() || '',
 | |
|     },
 | |
|     {
 | |
|       label: 'Algorithm Info:',
 | |
|       value: JSON.stringify(pgpPublicKey.getAlgorithmInfo()),
 | |
|     },
 | |
|     {
 | |
|       label: 'Fingerprint:',
 | |
|       value: pgpPublicKey.getFingerprint(),
 | |
|     },
 | |
|     {
 | |
|       label: 'User ID(s):',
 | |
|       value: pgpPublicKey.getUserIDs().join(', '),
 | |
|     },
 | |
|     {
 | |
|       label: 'Key ID(s):',
 | |
|       value: pgpPublicKey.getKeyIDs().map(k => k.toHex()).join(' ; '),
 | |
|     },
 | |
|   ] as LabelValue[];
 | |
| }
 | |
| 
 | |
| export async function getPGPPrivateKeyLabelValuesAsync(pgpPrivateKey: openpgp.Key) {
 | |
|   return [
 | |
|     {
 | |
|       label: 'Type:',
 | |
|       value: 'PGP Private Key',
 | |
|     },
 | |
|     {
 | |
|       label: 'Creation Time:',
 | |
|       value: pgpPrivateKey.getCreationTime().toString(),
 | |
|     },
 | |
|     {
 | |
|       label: 'Expiration Time:',
 | |
|       value: (await pgpPrivateKey.getExpirationTime())?.toString() || '',
 | |
|     },
 | |
|     {
 | |
|       label: 'Algorithm Info:',
 | |
|       value: JSON.stringify(pgpPrivateKey.getAlgorithmInfo()),
 | |
|     },
 | |
|     {
 | |
|       label: 'Fingerprint:',
 | |
|       value: pgpPrivateKey.getFingerprint(),
 | |
|     },
 | |
|     {
 | |
|       label: 'User ID(s):',
 | |
|       value: pgpPrivateKey.getUserIDs().join(', '),
 | |
|     },
 | |
|     {
 | |
|       label: 'Key ID(s):',
 | |
|       value: pgpPrivateKey.getKeyIDs().map(k => k.toHex()).join(' ; '),
 | |
|     },
 | |
|   ] as LabelValue[];
 | |
| }
 | |
| 
 | |
| export function getCSRLabelValues(csr: forge.pki.Certificate) {
 | |
|   return [
 | |
|     {
 | |
|       label: 'Type:',
 | |
|       value: 'Certificate Signing Request',
 | |
|     },
 | |
|     {
 | |
|       label: 'Subject:',
 | |
|       value: csr.subject?.attributes?.map(a => JSON.stringify(a, null, 2)).join('\n'),
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Issuer:',
 | |
|       value: csr.issuer?.toString(),
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Validity:',
 | |
|       value: JSON.stringify(csr.validity, null, 2),
 | |
|     },
 | |
|     {
 | |
|       label: 'Signature:',
 | |
|       value: csr.signature,
 | |
|     },
 | |
|     {
 | |
|       label: 'Signature Oid:',
 | |
|       value: csr.signatureOid?.toString(),
 | |
|     },
 | |
|     {
 | |
|       label: 'Signature parameters:',
 | |
|       value: JSON.stringify(csr.signatureParameters, null, 2),
 | |
|     },
 | |
|     {
 | |
|       label: 'Signing info:',
 | |
|       value: JSON.stringify(csr.siginfo, null, 2),
 | |
|     },
 | |
|     {
 | |
|       label: 'Serial:',
 | |
|       value: csr.serialNumber?.toString(),
 | |
|     },
 | |
|     {
 | |
|       label: 'Extensions:',
 | |
|       value: JSON.stringify(csr.extensions, null, 2),
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Public Key:',
 | |
|       value: onErrorReturnErrorMessage(() => forge.pki.publicKeyToPem(csr.publicKey)),
 | |
|       multiline: true,
 | |
|     },
 | |
|     {
 | |
|       label: 'Public Key Fingerprint:',
 | |
|       value: onErrorReturnErrorMessage(() => forge.pki.getPublicKeyFingerprint(csr.publicKey)?.toHex()),
 | |
|       multiline: true,
 | |
|     },
 | |
|   ] as LabelValue[];
 | |
| }
 | |
| 
 | |
| export function getFingerprintLabelValues(fingerprint: Fingerprint) {
 | |
|   return [
 | |
|     {
 | |
|       label: 'Type:',
 | |
|       value: 'Fingerprint',
 | |
|     },
 | |
|     {
 | |
|       label: 'Fingerprint (hex):',
 | |
|       value: fingerprint.toString('hex'),
 | |
|     },
 | |
|     {
 | |
|       label: 'Fingerprint (base64):',
 | |
|       value: fingerprint.toString('base64'),
 | |
|     },
 | |
|   ] as LabelValue[];
 | |
| }
 | |
| 
 | |
| export function getSignatureLabelValues(signature: Signature) {
 | |
|   return [
 | |
|     {
 | |
|       label: 'Type:',
 | |
|       value: 'Signature',
 | |
|     },
 | |
|     {
 | |
|       label: 'Fingerprint (asn1):',
 | |
|       value: signature.toString('asn1'),
 | |
|     },
 | |
|     {
 | |
|       label: 'Fingerprint (ssh):',
 | |
|       value: signature.toString('ssh'),
 | |
|     },
 | |
|   ] as LabelValue[];
 | |
| }
 |