///
///
import * as crypto from '@shardeum-foundation/lib-crypto-utils';
import { ChildProcess, Serializable } from 'child_process';
import Log4js from 'log4js';
import Logger from '../logger';
import * as Shardus from '../shardus/shardus-types';
import Storage from '../storage';
export type HashableObject = (object | string) & {
sign?: Shardus.Sign;
};
interface Keypair {
publicKey?: crypto.publicKey;
secretKey?: crypto.secretKey;
}
interface Crypto {
baseDir: string;
config: Shardus.StrictServerConfiguration;
mainLogger: Log4js.Logger;
storage: Storage;
keypair: Keypair;
curveKeypair: {
publicKey?: crypto.curvePublicKey;
secretKey?: crypto.curveSecretKey;
};
powGenerators: {
[name: string]: ChildProcess;
};
sharedKeys: {
[name: string]: Buffer;
};
}
declare class Crypto {
constructor(baseDir: string, config: Shardus.StrictServerConfiguration, logger: Logger, storage: Storage);
init(): Promise;
setCurveKeyPair(keypair: Keypair): void;
getKeyPairFile(): string;
writeKeypairToFile(keypair: Keypair): void;
readKeypairFromFile(): crypto.Keypair;
_generateKeypair(): crypto.Keypair;
convertPublicKeyToCurve(pk: crypto.publicKey): string;
getPublicKey(): string;
getCurvePublicKey(): string;
getSharedKey(curvePk: crypto.curvePublicKey): Buffer;
tag(obj: T, recipientCurvePk: crypto.curvePublicKey): T & crypto.TaggedObject;
/**
* Measure the message size when we are making the object copy (because it is pretty much free)
* then add msgSize to the object
* relies on node honesty.. better (but more work) to implement at shardus_net level
* to implement at shardus_net level we need to have it send us an extra argument to show
* the message size
* @param obj
* @param recipientCurvePk
* @returns
*/
tagWithSize(obj: T, recipientCurvePk: crypto.curvePublicKey): T & {
msgSize: number;
} & crypto.TaggedObject;
signWithSize(obj: T): T & crypto.SignedObject;
authenticate(obj: crypto.TaggedObject, senderCurvePk: crypto.curvePublicKey): boolean;
sign(obj: T): T & crypto.SignedObject;
verify(obj: crypto.SignedObject, expectedPk?: string): boolean;
hash(obj: HashableObject): string;
isGreaterHash(hash1: string | number, hash2: string | number): boolean;
getComputeProofOfWork(seed: unknown, difficulty: number): Promise;
stopAllGenerators(): void;
_runProofOfWorkGenerator(generator: string, seed: unknown, difficulty: number): Promise;
_stopProofOfWorkGenerator(generator: string): Promise;
}
export default Crypto;