/* eslint-disable @stylistic/indent */ import { type DecryptOptions, type DecryptMessageResult as openpgp_DecryptMessageResult, type Message, Key, type Signature, type SignOptions, type EncryptOptions, PublicKey, PrivateKey, type SessionKey, type EncryptSessionKeyOptions, type decryptSessionKeys as openpgp_decryptSessionKeys, decryptKey, encryptKey, type WebStream, readMessage, readSignature, readCleartextMessage, readKey, readKeys, readPrivateKey, readPrivateKeys, type PartialConfig, type AlgorithmInfo } from 'openpgp/lightweight'; import { VERIFICATION_STATUS, SIGNATURE_TYPES } from './constants'; import type { ContextSigningOptions, ContextVerificationOptions } from './message/context'; export function init(): void; export { VERIFICATION_STATUS, SIGNATURE_TYPES, type PartialConfig }; export { SignatureContextError } from './message/context'; export type OpenPGPKey = Key; export type OpenPGPMessage = Message | string>; // TODO missing streaming support export type OpenPGPSignature = Signature; export { generateKey, reformatKey, generateSessionKey, generateSessionKeyForAlgorithm, isExpiredKey, isRevokedKey, canKeyEncrypt, getSHA256Fingerprints, getMatchingKey } from './key/utils'; export type { GenerateKeyOptions, ReformatKeyOptions, GenerateSessionKeyOptionsPmcrypto } from './key/utils'; export { decryptKey, encryptKey, readMessage, readSignature, readCleartextMessage, readKey, readKeys, readPrivateKey, readPrivateKeys, PrivateKey, PublicKey, Key, type SessionKey, type AlgorithmInfo }; export { generateForwardingMaterial, doesKeySupportForwarding, isForwardingKey } from './key/forwarding'; export interface EncryptSessionKeyOptionsPmcrypto extends EncryptSessionKeyOptions {} export function encryptSessionKey( options: EncryptSessionKeyOptionsPmcrypto & { format?: FormatType } ): Promise< FormatType extends 'armored' ? string : FormatType extends 'binary' ? Uint8Array : FormatType extends 'object' ? OpenPGPMessage : never >; export type DecryptSessionKeyOptionsPmcrypto = Parameters[0]; // This differs from `openpgp.decryptSessionKeys` in the return type export function decryptSessionKey(options: DecryptSessionKeyOptionsPmcrypto): Promise; export interface DecryptOptionsPmcrypto> extends DecryptOptions { message: Message; encryptedSignature?: Message>; signatureContext?: ContextVerificationOptions } export interface DecryptResultPmcrypto> { data: DataType; signatures: DataType extends WebStream ? Promise : OpenPGPSignature[]; filename: string; verificationStatus: DataType extends WebStream ? Promise : VERIFICATION_STATUS; verificationErrors?: DataType extends WebStream ? Promise : Error[]; } export function decryptMessage, FormatType extends DecryptOptions['format'] = 'utf8'>( options: DecryptOptionsPmcrypto & { format?: FormatType } ): Promise< FormatType extends 'utf8' ? DataType extends WebStream ? DecryptResultPmcrypto> : DecryptResultPmcrypto : FormatType extends 'binary' ? DataType extends WebStream ? DecryptResultPmcrypto>> : DecryptResultPmcrypto> : never >; // TS v5.9.2 discriminates between Uint8Array and Uint8Array export type Data = string | Uint8Array; export type MaybeWebStream = T | WebStream; export type { WebStream }; export interface EncryptOptionsPmcrypto> extends Omit { textData?: T extends MaybeWebStream ? T : never; binaryData?: T extends MaybeWebStream> ? T : never; stripTrailingSpaces?: T extends MaybeWebStream ? boolean : never; detached?: boolean; signatureContext?: ContextSigningOptions; } // No reuse from OpenPGP's equivalent export interface EncryptResult< MessageType, SignatureType = undefined, EncryptedSingatureType = undefined > { message: MessageType; signature: SignatureType; encryptedSignature: EncryptedSingatureType; } export function encryptMessage< DataType extends MaybeWebStream, FormatType extends EncryptOptions['format'] = 'armored', // extends 'string' also works, but it gives unclear error if passed unexpected 'format' values DetachedType extends boolean = false >( options: EncryptOptionsPmcrypto & { format?: FormatType; detached?: DetachedType; } ): Promise< FormatType extends 'armored' ? DetachedType extends true ? DataType extends WebStream ? EncryptResult, WebStream, WebStream> : EncryptResult : DataType extends WebStream ? EncryptResult> : EncryptResult : FormatType extends 'binary' ? DetachedType extends true ? DataType extends WebStream ? EncryptResult< WebStream>, WebStream>, WebStream> > : EncryptResult, Uint8Array, Uint8Array> : DataType extends WebStream ? EncryptResult>> : EncryptResult> : FormatType extends 'object' ? DetachedType extends true ? never : // unsupported EncryptResult : never >; export interface SignOptionsPmcrypto> extends Omit { textData?: T extends MaybeWebStream ? T : never; binaryData?: T extends MaybeWebStream> ? T : never; stripTrailingSpaces?: T extends MaybeWebStream ? boolean : never; signatureContext?: ContextSigningOptions; } export function signMessage< DataType extends MaybeWebStream, FormatType extends SignOptions['format'] = 'armored', DetachedType extends boolean = false >( options: SignOptionsPmcrypto & { format?: FormatType; detached?: DetachedType } ): Promise< FormatType extends 'armored' ? DataType extends WebStream ? WebStream : string : FormatType extends 'binary' ? DataType extends WebStream ? WebStream> : Uint8Array : FormatType extends 'object' ? DetachedType extends true ? OpenPGPMessage : OpenPGPSignature : never >; export { splitMessage, armorBytes, stripArmor } from './message/utils'; export { SHA256, SHA512, unsafeMD5, unsafeSHA1 } from './crypto/hash'; export { argon2, type Argon2Options } from './crypto/argon2'; export { verifyMessage, verifyCleartextMessage } from './message/verify'; export type { VerifyCleartextOptionsPmcrypto, VerifyMessageResult, VerifyOptionsPmcrypto } from './message/verify'; export type { ContextSigningOptions, ContextVerificationOptions }; export { type MIMEAttachment, type ProcessMIMEOptions, default as processMIME, type ProcessMIMEResult } from './message/processMIME'; export { serverTime, updateServerTime } from './serverTime'; export { checkKeyStrength, checkKeyCompatibility } from './key/check';