2015-08-03 2 views
2

Je le code suivant pour tester l'API WebCrypto. Cela fonctionne dans Firefox et Chrome et j'essaye de le faire fonctionner dans Safari.API Safari WebCrypto cryptage RSA-OAEP

function ab2str(buf) { 
     return String.fromCharCode.apply(null, new Uint16Array(buf)); 
    } 

//converts a forge 0.6.x string of bytes to an ArrayBuffer 
function str2ab(str) { 
    var b = new ArrayBuffer(str.length); 
    var view = new Uint8Array(b); 
    for(var i = 0; i < str.length; ++i) { 
    view[i] = str.charCodeAt(i); 
    } 
    return b; 
} 


function _arrayBufferToBase64(buffer) { 
    var binary = ''; 
    var bytes = new Uint8Array(buffer); 
    var len = bytes.byteLength; 
    for (var i = 0; i < len; i++) { 
     binary += String.fromCharCode(bytes[ i ]); 
    } 
    return window.btoa(binary); 
} 

var pubKey; 
var privKey; 

var s_pubKey="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5tieEkcDAqAp/baSmNIdg5ezJMcWJX63+hM/DQolgKtw9Dvc0c8GRUqK2r/idZ1iXJzOjWQ3KIFIzmgTRHOKe3aPgJADdZ2vyAqu2woKtsgQ8nTcDYI86dmyfYsHFbgbSn/qeoE8WEzwyT3OoGgn54zoMuQmUmLbGaJYY2XN5bxwqxsRJSoXetBu9o1G9Wy4V1fdxwjRtaO/2FrZfkLp/P5Tc5Hk1Ev7PIPrkRhrl/7lF4JblVRG5m90aeviErvFIN0LdlqiY90UaQY3gyTsylrheTlqRq6yyzKf3dWnF78+CeAqppsOMI+WHURThNLkN56EOTX6TaBrG6f2XjxeqQIDAQAB"; 

var cripto= window.crypto || window.msCrypto; 
var subtle= cripto.subtle || window.crypto.webkitSubtle; 

subtle.generateKey(
     { 
      name: "RSA-OAEP", 
      modulusLength: 2048, //can be 1024, 2048, or 4096 
      publicExponent: new Uint8Array([0x01, 0x00, 0x01]), 
      hash: {name: "SHA-256"}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512" 
     }, 
     true, //whether the key is extractable (i.e. can be used in exportKey) 
     ["encrypt", "decrypt"] //must contain both "encrypt" and "decrypt" 
    ) 
    .then(function(key){ 
     //returns a keypair object 
     //console.log(key); 
     //console.log(key.publicKey); 
     //console.log(key.privateKey); 
     subtle.exportKey(
       "jwk", //can be "jwk" (public or private), "spki" (public only), or "pkcs8" (private only) 
       key.publicKey //can be a publicKey or privateKey, as long as extractable was true 
      ) 
      .then(function(keydata){ 
       //returns the exported key data 

       console.log("publicKey:"+_arrayBufferToBase64(keydata)); 
       subtle.exportKey(
         "jwk", //can be "jwk" (public or private), "spki" (public only), or "pkcs8" (private only) 
         key.privateKey //can be a publicKey or privateKey, as long as extractable was true 
        ) 
        .then(function(keydata){ 
         //returns the exported key data 

         console.log("privateKey:"+_arrayBufferToBase64(keydata)); 
        }); 

       subtle.importKey(      
         "jwk", //can be "jwk" (public or private), "spki" (public only), or "pkcs8" (private only) 
         keydata, 
         { //these are the algorithm options 
          name: "RSA-OAEP", 
          hash: {name: "SHA-256"}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512" 
         }, 
         false, //whether the key is extractable (i.e. can be used in exportKey) 
         ["encrypt"] //"encrypt" for public key import, "decrypt" for private key imports 
        ) 
        .then(function(publicKey){ 
         //returns a publicKey (or privateKey if you are importing a private key) 
         console.log(publicKey); 

         subtle.encrypt(
           { 
            name: "RSA-OAEP", 
            //label: Uint8Array([...]) //optional 
           }, 
           publicKey, //from generateKey or importKey above 
           str2ab("hola mundo") //ArrayBuffer of data you want to encrypt 
          ) 
          .then(function(encrypted){ 
           //returns an ArrayBuffer containing the encrypted data 
           //console.log(new Uint8Array(encrypted)); 
           console.log("enc: "+_arrayBufferToBase64(encrypted)); 
          }) 
          .catch(function(err){ 
           console.error(err); 
          }); 
        }) 

      }) 

    }) 
    .catch(function(err){ 
     console.error(err); 
    }); 

Le problème est que subtle.encrypt est apparemment pas exécuté. Ni console.log ni console.error est appelée. Une idée de ce qui se passe? La ligne précédente "console.log (publicKey);" fonctionne bien.

Répondre

2

Les versions actuelles de Safari, Safari Technology Preview, et WebKit ne prennent pas en charge RSA-OAEP-256. Ils prennent en charge que le RSA-OAEP plus avec SHA-1:

https://bugs.webkit.org/show_bug.cgi?id=151308

+1

Le lien dans cette réponse indique que le bug a été corrigé et résolu en Novembre 2016. Cependant, à partir d'aujourd'hui, je vois toujours se plaindre Safari 10.1.2 lorsque vous essayez d'importer une clé RSA-OAEP-256. Ne semble pas avoir atterri dans une version Safari de production pour le moment. :-( – RavenHursT

1

Après votre appel 'generateKey', sont key.publicKey et key.privateKey objets réellement CryptoKey? Dans mon bricoler avec Safari (sur iPad) ils apparaissent juste pour être des objets ... et quand je l'appelle « exportkey » je reçois un TypeError être jeté

P.S. Peu importe, j'utilisais 'RSASSA-PKCS1-v1_5', pas 'RSA-OAEP'.

+0

Oui, ce sont des objets. Je n'ai pas cette exception. Il imprime dans la console les deux clés. J'utilise Safari 8.0. – juanjo75es

+0

Avez-vous trouvé une solution à votre problème? Si oui, laissez-moi savoir ce que c'était ... J'ai lu sur un problème avec WebKit et l'exportation de certaines clés RSA, pas sûr si c'est lié. –

1

Il y a actuellement un certain nombre de problèmes avec la mise en œuvre de Safari WebCrypto ainsi que la mise en œuvre Edge. Ceci est compliqué par les différences de support de l'algorithme entre les navigateurs.

Vous pouvez explorer ce qui est pris en charge par un navigateur donné en visitant: https://github.com/PeculiarVentures/webcrypto-liner/blob/master/BrowserSupport.md: https://peculiarventures.github.io/pv-webcrypto-tests/

Compte tenu de ces différences, nous avons mis en œuvre cette bibliothèque que des masques nombreux de les faire Interop les différences et ajoute quelques algorithmes (en option)

Dans le cas de Safari, ils prennent en charge que les éléments suivants avec RSA-OAEP:

  • mod RSA-OAEP: 2048 pubExp: 3/w Format SHA1: JWK
  • mod RSA-OAEP: 2048 pubExp: 65535/w format SHA1: JWK

Si vous changez: hachage: {nom: "SHA-256"}

à: hachage: {nom: "SHA-1"}

Je soupçonne que cela fonctionnera.