usar más de un async() en una cadena en la función rompe mi función. ¿Hay alguna manera de incluir Key2pkcs8() dentro de generateKey() ?
async function generateKey() { let getKeyPair = await crypto.subtle.generateKey( { name: "ECDH", namedCurve: "P-384" }, false, ["deriveKey"] ); let PriKey = async() => { let PriKey = await getKeyPair.privateKey; console.log("pri = " + PriKey); return PriKey; }; let PubKey = async() => { let PubKey = await getKeyPair.publicKey; console.log("pub = " + PubKey); }; let Key2pkcs8 = async(PriKey, PubKey) => { let Key2pkcs8Pub = await crypto.subtle.exportKey("pkcs8", PubKey); let Key2pkcs8Pri = await crypto.subtle.exportKey("pkcs8", PriKey); return pkcs8keyarray = [Key2pkcs8Pub, Key2pkcs8Pri]; return Keyarray = [PriKey(), PubKey()]; // i want to put <return pkcs8keyarray()> here }; generateKey().then(Key2pkcs8 => console.log(Key2pkcs8[0], Key2pkcs8[1])); funciona como se esperaba y devuelve pri = [object CryptoKey] Promise { <state>: "fulfilled", <value>: undefined } Promise { <state>: "fulfilled", <value>: CryptoKey }
pero cuando se usa return pkcs8keyarray() en lugar de return Keyarray = [PriKey(), PubKey()]; se rompe y vuelve indefinido
tenía la intención de que key2pkcs2 tomara una clave como variable (clave pública o privada) y luego devolviera ambas en una matriz al final similar al ejemplo
Su programa demuestra un malentendido de las promesas, async/await, el módulo criptográfico y javascript en su conjunto.
let solo cuando desee reasignar valores a un enlacereturn Keyarray = ... están filtrando variables globales y no se comportan como probablemente esperabasasync cada vez que desee await otro valor asíncronoconsole.log las claves públicas o privadas. Según los documentos de exportKey , devuelve una promesa que se resuelve en un ArrayBuffer que son datos de bytes sin procesar y no tienen una representación de cadena. async function generateKey() { const {privateKey, publicKey} = // <- get privateKey, publicKey await crypto.subtle.generateKey( { name: "ECDH", namedCurve: "P-384" }, true, ["deriveKey"] ) return [ await crypto.subtle.exportKey("pkcs8", privateKey), // <- export private await crypto.subtle.exportKey("pkcs8", publicKey), // <- export public ] } Dado que generateKey devuelve un par de matrices de [private, public] , podemos usarlas fácilmente en las otras funciones asíncronas que escriba:
async function myfunction() { const [private, public] = await generateKey() // <- resolves pair // do something } Mueva todos los efectos secundarios aguas abajo en los controladores .then . La persona que llama es responsable de catch los errores. Manejar siempre los errores -
myfunction().then(console.log).catch(console.error)No intente implementar soluciones criptográficas si no comprende estas cosas simples. Obtendrá algo 100% mal e introducirá una vulnerabilidad y usted y sus usuarios sufrirán las consecuencias.
El código en esta respuesta no está probado y solo está aquí para resaltar los errores que puedo ver fácilmente. No use el código palabra por palabra y no espere que lo copie/pegue directamente en su proyecto. No entiendo cuáles son sus requisitos o intenciones y, por lo tanto, no puedo hacer recomendaciones u ofrecer otros consejos.
Para obtener más información sobre el mal uso de async y await , consulte estas preguntas y respuestas relacionadas .
async function generateKey() { let keyPair = await crypto.subtle.generateKey( { name: "ECDH", namedCurve: "P-384" }, false, ["deriveKey"] ); let PriKey = (keyPair) => { let PriKey = keyPair.privateKey; console.log("pri = " + PriKey); return keyPair; }; let PubKey = (keyPair) => { let PubKey = keyPair.publicKey; console.log("pub = " + PubKey); return keyPair; }; let Key2pkcs8 = async(keyPair) => { console.log("key = " + keyPair); let Key2pkcs8 = await crypto.subtle.exportKey("pkcs8", keyPair); return Key2pkcs8; }; let printme = async() => { let printme = await Key2pkcs8(PubKey()); console.log(printme); return printme; }; return printme(); }Uso:
generateKey().then(Key2pkcs8 => console.log(Key2pkcs8 )); Si su vida externa es asíncrona, await ya convertirá el flujo asíncrono en sincronizado, lo await significa que getKeyPair (o keyPair en mi fragmento) ya estará disponible cuando llame a otras funciones.
PubKey y PriKey no necesitan ser asíncronos, y en ambos casos no está devolviendo nada. Key2pkcs8 tampoco devuelve nada, entonces, ¿qué es exactamente lo que quiere await Key2pkcs8(PubKey()); ¿regresar? Idealmente, todas estas funciones deberían devolver algo si desea que la Promise resultante se resuelva en algo que no sea undefined . Pruebe el fragmento anterior, no lo probé.