/*
 * Copyright (c) 2017 NumberFour AG.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   NumberFour AG - Initial API and implementation
 */

//export external public function Certificate(): Certificate;
export external public const DEFAULT_ENCODING: string;
export external public function createCipher(algorithm: string, password: union{string, Buffer}): Cipher;
export external public function createCipheriv(algorithm: string, key: union{string, Buffer}, iv: union{string, Buffer}): Cipher;

export external public function createDecipher(algorithm: string, password: union{string, Buffer}): Decipher;
export external public function createDecipheriv(algorithm: string, key: union{string, Buffer}, iv: union{string, Buffer}): Decipher;

//signature affected by overloading
export external public function createDiffieHellman(prime: union{number, string, Buffer}, prime_encoding: string=, generator: union{number, string, Buffer}=, generator_encoding: string=): DiffieHellman;
export external public function createECDH(curve_name: string): ECDH;
export external public function createHash(algorithm: string): Hash;
export external public function createHmac(algorithm: string, key: string): Hmac;
export external public function createSign(algorithm: string): Sign;
export external public function createVerify(algorithm: string): Verify;
export external public function getCiphers(): string[];
export external public function getCurves(): string[];
export external public function getDiffieHellman(group_name: string): ~DiffieHellman;
export external public function getHashes(): string[];
@Promisifiable export external public function pbkdf2(password: string, salt: string, iterations: int, keylen: int, digest: string=, callback: {function(Error, Buffer)}=): void;
export external public function pbkdf2Sync(password: string, salt: string, iterations: int, keylen: int, digest: string=): Buffer;
export external public function privateDecrypt(private_key: union{string, Object}, buffer: Buffer): void;
export external public function privateEncrypt(private_key: union{string, Object}, buffer: Buffer): void;
export external public function publicDecrypt(private_key: union{string, Object}, buffer: Buffer): void;
export external public function publicEncrypt(private_key: union{string, Object}, buffer: Buffer): void;
@Promisifiable export external public function randomBytes(size: number, callback: {function(Error, Buffer)}=): Buffer;
export external public function setEngine(engine: string, flags: any=): void;

export external public class Certificate {
    public exportChallenge(spkac: union{string, Buffer}): Buffer;
    public exportPublicKey(spkac: union{string, Buffer}): Buffer;
    public verifySpkac(spkac: Buffer): boolean;
}

export external public class Cipher {
    public final(output_encoding: string=): union{string, Buffer};
    public setAAD(buffer: Buffer): void;
    public getAuthTag(): Buffer;
    public setAutoPadding(auto_padding/* = true*/: boolean): void;
    public update(data: union{string, Buffer}, input_padding: string=, output_padding: string=): union{string, Buffer};
}

export external public class Decipher {
    public final(output_encoding: string=): union{string, Buffer};
    public setAAD(buffer: Buffer): void;
    public setAuthTag(buffer: Buffer): void;
    public setAutoPadding(auto_padding/* = true*/: boolean): void;
    public update(data: union{string, Buffer}, input_padding: string=, output_padding: string=): union{string, Buffer};
}

export external public class DiffieHellman {
    public computeSecret(other_public_key: union{string, Buffer}, input_encoding: string=, output_encoding: string=): union{string, Buffer};
    public generateKeys(encoding: string=): union{string, Buffer};
    public getGenerator(encoding: string=): union{string, Buffer};
    public getPrime(encoding: string=): union{string, Buffer};
    public getPrivateKey(encoding: string=): union{string, Buffer};
    public getPublicKey(encoding: string=): union{string, Buffer};
    public setPrivateKey(private_key: union{string, Buffer}, encoding: string=): void;
    public setPublicKey(public_key: union{string, Buffer}, encoding: string=): void;
    public verifyError: any;
}

export external public class ECDH {
    public computeSecret(other_public_key: union{string, Buffer}, input_encoding: string=, output_encoding: string=): union{string, Buffer};
    public generateKeys(encoding: string=, format:string=): union{string, Buffer};
    public getPrivateKey(encoding: string=): union{string, Buffer};
    public getPublicKey(encoding: string=): union{string, Buffer};
    public setPrivateKey(private_key: union{string, Buffer}, encoding: string=): void;
}

export external public class Hash {
    public digest(encoding: string=): union{string, Buffer};
    public update(data: union{string, Buffer}, encoding: string=): void;
}

export external public class Hmac {
    public digest(encoding: string=): union{string, Buffer};
    public update(data: any): void;
}

export external public class Sign {
    public sign(private_key: union{string, Object}, output_format: string=): union{string, Buffer};
    public update(data: any): void;
}

export external public class Verify {
    public update(data: any): void;
    public verify(object: string, signature: union{string, Buffer}=, signature_format:string=): boolean;
}


