crypto rename
This commit is contained in:
parent
3557e307a8
commit
0b6002bbbc
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
import * as nacl from "./nacl-fast.js";
|
import * as nacl from "./nacl-fast.js";
|
||||||
import { sha256 } from "./sha256.js";
|
import { sha256 } from "./sha256.js";
|
||||||
|
import { useNative } from "./taler-crypto.js";
|
||||||
|
|
||||||
export function sha512(data: Uint8Array): Uint8Array {
|
export function sha512(data: Uint8Array): Uint8Array {
|
||||||
return nacl.hash(data);
|
return nacl.hash(data);
|
||||||
@ -65,6 +66,10 @@ export function kdf(
|
|||||||
salt?: Uint8Array,
|
salt?: Uint8Array,
|
||||||
info?: Uint8Array,
|
info?: Uint8Array,
|
||||||
): Uint8Array {
|
): Uint8Array {
|
||||||
|
if (useNative && "_kdf" in globalThis) {
|
||||||
|
// @ts-ignore
|
||||||
|
return globalThis._kdf(outputLength, ikm, salt, info);
|
||||||
|
}
|
||||||
salt = salt ?? new Uint8Array(64);
|
salt = salt ?? new Uint8Array(64);
|
||||||
// extract
|
// extract
|
||||||
const prk = hmacSha512(salt, ikm);
|
const prk = hmacSha512(salt, ikm);
|
||||||
|
@ -21,10 +21,10 @@ import test from "ava";
|
|||||||
import {
|
import {
|
||||||
encodeCrock,
|
encodeCrock,
|
||||||
decodeCrock,
|
decodeCrock,
|
||||||
ecdheGetPublic,
|
ecdhGetPublic,
|
||||||
eddsaGetPublic,
|
eddsaGetPublic,
|
||||||
keyExchangeEddsaEcdhe,
|
keyExchangeEddsaEcdh,
|
||||||
keyExchangeEcdheEddsa,
|
keyExchangeEcdhEddsa,
|
||||||
stringToBytes,
|
stringToBytes,
|
||||||
bytesToString,
|
bytesToString,
|
||||||
deriveBSeed,
|
deriveBSeed,
|
||||||
@ -127,19 +127,19 @@ test("taler-exchange-tvg eddsa_ecdh", (t) => {
|
|||||||
const key_material =
|
const key_material =
|
||||||
"PKZ42Z56SVK2796HG1QYBRJ6ZQM2T9QGA3JA4AAZ8G7CWK9FPX175Q9JE5P0ZAX3HWWPHAQV4DPCK10R9X3SAXHRV0WF06BHEC2ZTKR";
|
"PKZ42Z56SVK2796HG1QYBRJ6ZQM2T9QGA3JA4AAZ8G7CWK9FPX175Q9JE5P0ZAX3HWWPHAQV4DPCK10R9X3SAXHRV0WF06BHEC2ZTKR";
|
||||||
|
|
||||||
const myEcdhePub = ecdheGetPublic(decodeCrock(priv_ecdhe));
|
const myEcdhePub = ecdhGetPublic(decodeCrock(priv_ecdhe));
|
||||||
t.deepEqual(encodeCrock(myEcdhePub), pub_ecdhe);
|
t.deepEqual(encodeCrock(myEcdhePub), pub_ecdhe);
|
||||||
|
|
||||||
const myEddsaPub = eddsaGetPublic(decodeCrock(priv_eddsa));
|
const myEddsaPub = eddsaGetPublic(decodeCrock(priv_eddsa));
|
||||||
t.deepEqual(encodeCrock(myEddsaPub), pub_eddsa);
|
t.deepEqual(encodeCrock(myEddsaPub), pub_eddsa);
|
||||||
|
|
||||||
const myKm1 = keyExchangeEddsaEcdhe(
|
const myKm1 = keyExchangeEddsaEcdh(
|
||||||
decodeCrock(priv_eddsa),
|
decodeCrock(priv_eddsa),
|
||||||
decodeCrock(pub_ecdhe),
|
decodeCrock(pub_ecdhe),
|
||||||
);
|
);
|
||||||
t.deepEqual(encodeCrock(myKm1), key_material);
|
t.deepEqual(encodeCrock(myKm1), key_material);
|
||||||
|
|
||||||
const myKm2 = keyExchangeEcdheEddsa(
|
const myKm2 = keyExchangeEcdhEddsa(
|
||||||
decodeCrock(priv_ecdhe),
|
decodeCrock(priv_ecdhe),
|
||||||
decodeCrock(pub_eddsa),
|
decodeCrock(pub_eddsa),
|
||||||
);
|
);
|
||||||
@ -193,19 +193,19 @@ test("taler-exchange-tvg eddsa_ecdh #2", (t) => {
|
|||||||
const key_material =
|
const key_material =
|
||||||
"G6RA58N61K7MT3WA13Q7VRTE1FQS6H43RX9HK8Z5TGAB61601GEGX51JRHHQMNKNM2R9AVC1STSGQDRHGKWVYP584YGBCTVMMJYQF30";
|
"G6RA58N61K7MT3WA13Q7VRTE1FQS6H43RX9HK8Z5TGAB61601GEGX51JRHHQMNKNM2R9AVC1STSGQDRHGKWVYP584YGBCTVMMJYQF30";
|
||||||
|
|
||||||
const myEcdhePub = ecdheGetPublic(decodeCrock(priv_ecdhe));
|
const myEcdhePub = ecdhGetPublic(decodeCrock(priv_ecdhe));
|
||||||
t.deepEqual(encodeCrock(myEcdhePub), pub_ecdhe);
|
t.deepEqual(encodeCrock(myEcdhePub), pub_ecdhe);
|
||||||
|
|
||||||
const myEddsaPub = eddsaGetPublic(decodeCrock(priv_eddsa));
|
const myEddsaPub = eddsaGetPublic(decodeCrock(priv_eddsa));
|
||||||
t.deepEqual(encodeCrock(myEddsaPub), pub_eddsa);
|
t.deepEqual(encodeCrock(myEddsaPub), pub_eddsa);
|
||||||
|
|
||||||
const myKm1 = keyExchangeEddsaEcdhe(
|
const myKm1 = keyExchangeEddsaEcdh(
|
||||||
decodeCrock(priv_eddsa),
|
decodeCrock(priv_eddsa),
|
||||||
decodeCrock(pub_ecdhe),
|
decodeCrock(pub_ecdhe),
|
||||||
);
|
);
|
||||||
t.deepEqual(encodeCrock(myKm1), key_material);
|
t.deepEqual(encodeCrock(myKm1), key_material);
|
||||||
|
|
||||||
const myKm2 = keyExchangeEcdheEddsa(
|
const myKm2 = keyExchangeEcdhEddsa(
|
||||||
decodeCrock(priv_ecdhe),
|
decodeCrock(priv_ecdhe),
|
||||||
decodeCrock(pub_eddsa),
|
decodeCrock(pub_eddsa),
|
||||||
);
|
);
|
||||||
|
@ -55,7 +55,7 @@ export function getRandomBytesF<T extends number, N extends string>(
|
|||||||
return nacl.randomBytes(n);
|
return nacl.randomBytes(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
const useNative = true;
|
export const useNative = true;
|
||||||
|
|
||||||
const encTable = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
const encTable = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
||||||
|
|
||||||
@ -182,29 +182,41 @@ export function eddsaGetPublic(eddsaPriv: Uint8Array): Uint8Array {
|
|||||||
return pair.publicKey;
|
return pair.publicKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function ecdheGetPublic(ecdhePriv: Uint8Array): Uint8Array {
|
export function ecdhGetPublic(ecdhePriv: Uint8Array): Uint8Array {
|
||||||
|
if (useNative && "_ecdheGetPublic" in globalThis) {
|
||||||
|
// @ts-ignore
|
||||||
|
return globalThis._ecdheGetPublic(ecdhePriv);
|
||||||
|
}
|
||||||
return nacl.scalarMult_base(ecdhePriv);
|
return nacl.scalarMult_base(ecdhePriv);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function keyExchangeEddsaEcdhe(
|
export function keyExchangeEddsaEcdh(
|
||||||
eddsaPriv: Uint8Array,
|
eddsaPriv: Uint8Array,
|
||||||
ecdhePub: Uint8Array,
|
ecdhPub: Uint8Array,
|
||||||
): Uint8Array {
|
): Uint8Array {
|
||||||
|
if (useNative && "_keyExchangeEddsaEcdh" in globalThis) {
|
||||||
|
// @ts-ignore
|
||||||
|
return globalThis._keyExchangeEddsaEcdh(eddsaPriv, ecdhPub);
|
||||||
|
}
|
||||||
const ph = hash(eddsaPriv);
|
const ph = hash(eddsaPriv);
|
||||||
const a = new Uint8Array(32);
|
const a = new Uint8Array(32);
|
||||||
for (let i = 0; i < 32; i++) {
|
for (let i = 0; i < 32; i++) {
|
||||||
a[i] = ph[i];
|
a[i] = ph[i];
|
||||||
}
|
}
|
||||||
const x = nacl.scalarMult(a, ecdhePub);
|
const x = nacl.scalarMult(a, ecdhPub);
|
||||||
return hash(x);
|
return hash(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function keyExchangeEcdheEddsa(
|
export function keyExchangeEcdhEddsa(
|
||||||
ecdhePriv: Uint8Array & MaterialEcdhePriv,
|
ecdhPriv: Uint8Array & MaterialEcdhePriv,
|
||||||
eddsaPub: Uint8Array & MaterialEddsaPub,
|
eddsaPub: Uint8Array & MaterialEddsaPub,
|
||||||
): Uint8Array {
|
): Uint8Array {
|
||||||
|
if (useNative && "_keyExchangeEcdhEddsa" in globalThis) {
|
||||||
|
// @ts-ignore
|
||||||
|
return globalThis._keyExchangeEcdhEddsa(ecdhPriv, eddsaPub);
|
||||||
|
}
|
||||||
const curve25519Pub = nacl.sign_ed25519_pk_to_curve25519(eddsaPub);
|
const curve25519Pub = nacl.sign_ed25519_pk_to_curve25519(eddsaPub);
|
||||||
const x = nacl.scalarMult(ecdhePriv, curve25519Pub);
|
const x = nacl.scalarMult(ecdhPriv, curve25519Pub);
|
||||||
return hash(x);
|
return hash(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -365,6 +377,10 @@ export function rsaBlind(
|
|||||||
bks: Uint8Array,
|
bks: Uint8Array,
|
||||||
rsaPubEnc: Uint8Array,
|
rsaPubEnc: Uint8Array,
|
||||||
): Uint8Array {
|
): Uint8Array {
|
||||||
|
if (useNative && "_rsaBlind" in globalThis) {
|
||||||
|
// @ts-ignore
|
||||||
|
return globalThis._rsaBlind(hm, bks, rsaPubEnc);
|
||||||
|
}
|
||||||
const rsaPub = rsaPubDecode(rsaPubEnc);
|
const rsaPub = rsaPubDecode(rsaPubEnc);
|
||||||
const data = rsaFullDomainHash(hm, rsaPub);
|
const data = rsaFullDomainHash(hm, rsaPub);
|
||||||
const r = rsaBlindingKeyDerive(rsaPub, bks);
|
const r = rsaBlindingKeyDerive(rsaPub, bks);
|
||||||
@ -378,6 +394,10 @@ export function rsaUnblind(
|
|||||||
rsaPubEnc: Uint8Array,
|
rsaPubEnc: Uint8Array,
|
||||||
bks: Uint8Array,
|
bks: Uint8Array,
|
||||||
): Uint8Array {
|
): Uint8Array {
|
||||||
|
if (useNative && "_rsaUnblind" in globalThis) {
|
||||||
|
// @ts-ignore
|
||||||
|
return globalThis._rsaUnblind(sig, rsaPubEnc, bks);
|
||||||
|
}
|
||||||
const rsaPub = rsaPubDecode(rsaPubEnc);
|
const rsaPub = rsaPubDecode(rsaPubEnc);
|
||||||
const blinded_s = loadBigInt(sig);
|
const blinded_s = loadBigInt(sig);
|
||||||
const r = rsaBlindingKeyDerive(rsaPub, bks);
|
const r = rsaBlindingKeyDerive(rsaPub, bks);
|
||||||
@ -391,6 +411,10 @@ export function rsaVerify(
|
|||||||
rsaSig: Uint8Array,
|
rsaSig: Uint8Array,
|
||||||
rsaPubEnc: Uint8Array,
|
rsaPubEnc: Uint8Array,
|
||||||
): boolean {
|
): boolean {
|
||||||
|
if (useNative && "_rsaVerify" in globalThis) {
|
||||||
|
// @ts-ignore
|
||||||
|
return globalThis._rsaVerify(hm, rsaSig, rsaPubEnc);
|
||||||
|
}
|
||||||
const rsaPub = rsaPubDecode(rsaPubEnc);
|
const rsaPub = rsaPubDecode(rsaPubEnc);
|
||||||
const d = rsaFullDomainHash(hm, rsaPub);
|
const d = rsaFullDomainHash(hm, rsaPub);
|
||||||
const sig = loadBigInt(rsaSig);
|
const sig = loadBigInt(rsaSig);
|
||||||
@ -629,7 +653,7 @@ export function createEddsaKeyPair(): EddsaKeyPair {
|
|||||||
|
|
||||||
export function createEcdheKeyPair(): EcdheKeyPair {
|
export function createEcdheKeyPair(): EcdheKeyPair {
|
||||||
const ecdhePriv = nacl.randomBytes(32);
|
const ecdhePriv = nacl.randomBytes(32);
|
||||||
const ecdhePub = ecdheGetPublic(ecdhePriv);
|
const ecdhePub = ecdhGetPublic(ecdhePriv);
|
||||||
return { ecdhePriv, ecdhePub };
|
return { ecdhePriv, ecdhePub };
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1353,7 +1377,7 @@ export function encryptContractForMerge(
|
|||||||
mergePriv,
|
mergePriv,
|
||||||
contractTermsCompressed,
|
contractTermsCompressed,
|
||||||
]);
|
]);
|
||||||
const key = keyExchangeEcdheEddsa(contractPriv, pursePub);
|
const key = keyExchangeEcdhEddsa(contractPriv, pursePub);
|
||||||
return encryptWithDerivedKey(getRandomBytesF(24), key, data, mergeSalt);
|
return encryptWithDerivedKey(getRandomBytesF(24), key, data, mergeSalt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1370,7 +1394,7 @@ export function encryptContractForDeposit(
|
|||||||
bufferForUint32(contractTermsBytes.length),
|
bufferForUint32(contractTermsBytes.length),
|
||||||
contractTermsCompressed,
|
contractTermsCompressed,
|
||||||
]);
|
]);
|
||||||
const key = keyExchangeEcdheEddsa(contractPriv, pursePub);
|
const key = keyExchangeEcdhEddsa(contractPriv, pursePub);
|
||||||
return encryptWithDerivedKey(getRandomBytesF(24), key, data, depositSalt);
|
return encryptWithDerivedKey(getRandomBytesF(24), key, data, depositSalt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1388,7 +1412,7 @@ export async function decryptContractForMerge(
|
|||||||
pursePub: PursePublicKey,
|
pursePub: PursePublicKey,
|
||||||
contractPriv: ContractPrivateKey,
|
contractPriv: ContractPrivateKey,
|
||||||
): Promise<DecryptForMergeResult> {
|
): Promise<DecryptForMergeResult> {
|
||||||
const key = keyExchangeEcdheEddsa(contractPriv, pursePub);
|
const key = keyExchangeEcdhEddsa(contractPriv, pursePub);
|
||||||
const dec = await decryptWithDerivedKey(enc, key, mergeSalt);
|
const dec = await decryptWithDerivedKey(enc, key, mergeSalt);
|
||||||
const mergePriv = dec.slice(8, 8 + 32);
|
const mergePriv = dec.slice(8, 8 + 32);
|
||||||
const contractTermsCompressed = dec.slice(8 + 32);
|
const contractTermsCompressed = dec.slice(8 + 32);
|
||||||
@ -1408,7 +1432,7 @@ export async function decryptContractForDeposit(
|
|||||||
pursePub: PursePublicKey,
|
pursePub: PursePublicKey,
|
||||||
contractPriv: ContractPrivateKey,
|
contractPriv: ContractPrivateKey,
|
||||||
): Promise<DecryptForDepositResult> {
|
): Promise<DecryptForDepositResult> {
|
||||||
const key = keyExchangeEcdheEddsa(contractPriv, pursePub);
|
const key = keyExchangeEcdhEddsa(contractPriv, pursePub);
|
||||||
const dec = await decryptWithDerivedKey(enc, key, depositSalt);
|
const dec = await decryptWithDerivedKey(enc, key, depositSalt);
|
||||||
const contractTermsCompressed = dec.slice(8);
|
const contractTermsCompressed = dec.slice(8);
|
||||||
const contractTermsBuf = fflate.unzlibSync(contractTermsCompressed);
|
const contractTermsBuf = fflate.unzlibSync(contractTermsCompressed);
|
||||||
|
@ -42,7 +42,7 @@ import {
|
|||||||
decryptContractForMerge,
|
decryptContractForMerge,
|
||||||
DenomKeyType,
|
DenomKeyType,
|
||||||
DepositInfo,
|
DepositInfo,
|
||||||
ecdheGetPublic,
|
ecdhGetPublic,
|
||||||
eddsaGetPublic,
|
eddsaGetPublic,
|
||||||
EddsaPublicKeyString,
|
EddsaPublicKeyString,
|
||||||
eddsaSign,
|
eddsaSign,
|
||||||
@ -62,7 +62,7 @@ import {
|
|||||||
hashTruncate32,
|
hashTruncate32,
|
||||||
kdf,
|
kdf,
|
||||||
kdfKw,
|
kdfKw,
|
||||||
keyExchangeEcdheEddsa,
|
keyExchangeEcdhEddsa,
|
||||||
Logger,
|
Logger,
|
||||||
MakeSyncSignatureRequest,
|
MakeSyncSignatureRequest,
|
||||||
PlanchetCreationRequest,
|
PlanchetCreationRequest,
|
||||||
@ -1355,7 +1355,7 @@ export const nativeCryptoR: TalerCryptoInterfaceR = {
|
|||||||
): Promise<KeyExchangeResult> {
|
): Promise<KeyExchangeResult> {
|
||||||
return {
|
return {
|
||||||
h: encodeCrock(
|
h: encodeCrock(
|
||||||
keyExchangeEcdheEddsa(
|
keyExchangeEcdhEddsa(
|
||||||
decodeCrock(req.ecdhePriv),
|
decodeCrock(req.ecdhePriv),
|
||||||
decodeCrock(req.eddsaPub),
|
decodeCrock(req.eddsaPub),
|
||||||
),
|
),
|
||||||
@ -1367,7 +1367,7 @@ export const nativeCryptoR: TalerCryptoInterfaceR = {
|
|||||||
req: EcdheGetPublicRequest,
|
req: EcdheGetPublicRequest,
|
||||||
): Promise<EcdheGetPublicResponse> {
|
): Promise<EcdheGetPublicResponse> {
|
||||||
return {
|
return {
|
||||||
pub: encodeCrock(ecdheGetPublic(decodeCrock(req.priv))),
|
pub: encodeCrock(ecdhGetPublic(decodeCrock(req.priv))),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
async setupRefreshTransferPub(
|
async setupRefreshTransferPub(
|
||||||
|
@ -41,9 +41,10 @@
|
|||||||
"typescript": "^4.8.4"
|
"typescript": "^4.8.4"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@gnu-taler/taler-util": "workspace:*",
|
|
||||||
"@gnu-taler/idb-bridge": "workspace:*",
|
"@gnu-taler/idb-bridge": "workspace:*",
|
||||||
|
"@gnu-taler/taler-util": "workspace:*",
|
||||||
"@gnu-taler/taler-wallet-core": "workspace:*",
|
"@gnu-taler/taler-wallet-core": "workspace:*",
|
||||||
|
"@gnu-taler/taler-wallet-embedded": "link:",
|
||||||
"tslib": "^2.4.0"
|
"tslib": "^2.4.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user