xpra icon
Bug tracker and wiki

Ticket #2615: asmcrypto.patch

File asmcrypto.patch, 6.4 KB (added by Antoine Martin, 4 months ago)

attempting to switch over

  • html5/index.html

     
    2525                <script type="text/javascript" src="js/lib/zlib.js"></script>
    2626                <script type="text/javascript" src="js/lib/lz4.js"></script>
    2727                <script type="text/javascript" src="js/lib/brotli_decode.js"></script>
    28                 <script type="text/javascript" src="js/lib/forge.js"></script>
     28                <script type="text/javascript" src="js/lib/asmcrypto.js"></script>
    2929
    3030                <script type="text/javascript" src="js/lib/jsmpeg.js"></script>
    3131                <script type="text/javascript" src="js/lib/broadway/Decoder.js"></script>
  • html5/js/Client.js

     
    10621062XpraClient.prototype._make_hello_base = function() {
    10631063        this.capabilities = {};
    10641064        const digests = ["hmac", "hmac+md5", "xor"];
    1065         if (typeof forge!=='undefined') {
    1066                 try {
    1067                         this.debug("network", "forge.md.algorithms=", forge.md.algorithms);
    1068                         for (const hash in forge.md.algorithms) {
    1069                                 digests.push("hmac+"+hash);
    1070                         }
    1071                         this.debug("network", "digests:", digests);
     1065        if (typeof asmCrypto!=='undefined') {
     1066                if (typeof asmCrypto.HMAC_SHA512!=='undefined') {
     1067                        digests.push("hmac+sha512");
    10721068                }
    1073                 catch (e) {
    1074                         this.cerror("Error probing forge crypto digests");
     1069                if (typeof asmCrypto.HMAC_SHA256!=='undefined') {
     1070                        digests.push("hmac+sha256");
    10751071                }
     1072                if (typeof asmCrypto.HMAC_SHA1!=='undefined') {
     1073                        digests.push("hmac+sha1");
     1074                }
    10761075        }
    1077         else {
    1078                 this.clog("cryptography library 'forge' not found");
    1079         }
     1076        this.debug("network", "digests:", digests);
    10801077        this._update_capabilities({
    10811078                // version and platform
    10821079                "version"                                       : Utilities.VERSION,
     
    11071104                "compression_level"                     : 1,
    11081105                "mouse.show"                            : true,
    11091106                // packet encoders
    1110                 "rencode"                                       : (PyRencoder!==null && PyRencoder!==undefined),
     1107                "rencode"                                       : false, //(PyRencoder!==null && PyRencoder!==undefined),
    11111108                "bencode"                                       : true,
    11121109                "yaml"                                          : false,
    11131110                "open-url"                                      : this.open_url,
     
    20712068                        hash = digest.split("+")[1];
    20722069                }
    20732070                this.clog("hmac using hash", hash);
    2074                 const hmac = forge.hmac.create();
    2075                 hmac.start(hash, password);
    2076                 hmac.update(salt);
    2077                 return hmac.digest().toHex();
     2071                let constructor = null;
     2072                if (hash=="sha512") {
     2073                        constructor = asmCrypto.HMAC_SHA512.hex;
     2074                }
     2075                else if (hash=="sha256") {
     2076                        constructor = asmCrypto.HMAC_SHA256.hex;
     2077                }
     2078                else if (hash=="sha1") {
     2079                        constructor = asmCrypto.HMAC_SHA1.hex;
     2080                }
     2081                else {
     2082                        throw Exception("unsupported hash '"+hash+"'");
     2083                }
     2084                return constructor(salt, password);
    20782085        } else if (digest == "xor") {
    20792086                const trimmed_salt = salt.slice(0, password.length);
    20802087                return Utilities.xorString(trimmed_salt, password);
  • html5/js/Protocol.js

     
    11/*
    2  * Copyright (c) 2013-2019 Antoine Martin <antoine@xpra.org>
     2 * Copyright (c) 2013-2020 Antoine Martin <antoine@xpra.org>
    33 * Copyright (c) 2016 David Brushinski <dbrushinski@spikes.com>
    44 * Copyright (c) 2014 Joshua Higgins <josh@kxes.net>
    55 * Copyright (c) 2015 Spikes, Inc.
     
    1515 *  inflate.js
    1616 *  lz4.js
    1717 *  brotli_decode.js
     18 *  asmcrypto.js
    1819 */
    1920
    2021
     
    299300
    300301        // decrypt if needed
    301302        if (proto_crypto) {
    302                 this.cipher_in.update(forge.util.createBuffer(uintToString(packet_data)));
    303                 const decrypted = this.cipher_in.output.getBytes();
    304                 packet_data = [];
    305                 for (i=0; i<decrypted.length; i++)
    306                         packet_data.push(decrypted[i].charCodeAt(0));
    307                 packet_data = new Uint8Array(packet_data.slice(0, -1 * padding));
     303                const decrypted = this.cipher_in.process(packet_data).result;
     304                console.log("decrypted(", packet_data, ")=", decrypted);
     305                packet_data = decrypted.slice(0, -1 * padding);
    308306        }
    309307
    310308        //decompress it if needed:
     
    405403                let proto_flags = 0;
    406404                let bdata = null;
    407405                try {
    408                         if (PyRencoder) {
     406                        if (PyRencoder && false) {
    409407                                bdata = PyRencoder.encode(packet);
    410408                                proto_flags = 1;
    411409                        }
     
    424422                        for (let i = 0; i<padding_size; i++) {
    425423                                bdata += String.fromCharCode(padding_size);
    426424                        }
    427                         this.cipher_out.update(forge.util.createBuffer(bdata));
    428                         bdata = this.cipher_out.output.getBytes();
     425                        const encrypted = this.cipher_out.process(bdata).result;
     426                        console.log("encrypted(", bdata, ")=", encrypted);
     427                        bdata = encrypted;
    429428                }
    430429                const actual_size = bdata.length;
    431430                //convert string to a byte array:
     
    438437                                cdata.push(ord(bdata[i]));
    439438                }
    440439                const level = 0;
    441                 /*
    442                 const use_zlib = false;         //does not work...
    443                 if (use_zlib) {
    444                         cdata = new Zlib.Deflate(cdata).compress();
    445                         level = 1;
    446                 }*/
    447440                //struct.pack('!BBBBL', ord("P"), proto_flags, level, index, payload_size)
    448441                let header = ["P".charCodeAt(0), proto_flags, level, 0];
    449442                for (let i=3; i>=0; i--)
     
    488481XpraProtocol.prototype.set_cipher_in = function(caps, key) {
    489482        this.cipher_in_block_size = 32;
    490483        // stretch the password
    491         const secret = forge.pkcs5.pbkdf2(key, caps['cipher.key_salt'], caps['cipher.key_stretch_iterations'], this.cipher_in_block_size);
     484        const secret = asmCrypto.PBKDF2_HMAC_SHA1.bytes(key, caps['cipher.key_salt'], caps['cipher.key_stretch_iterations'], this.cipher_in_block_size);
    492485        // start the cipher
    493         this.cipher_in = forge.cipher.createDecipher('AES-CBC', secret);
    494         this.cipher_in.start({iv: caps['cipher.iv']});
     486        this.cipher_in = new asmCrypto.AES_CBC.Encrypt( { key: secret, iv: caps['cipher.iv']} );
    495487};
    496488
    497489XpraProtocol.prototype.set_cipher_out = function(caps, key) {
    498490        this.cipher_out_block_size = 32;
    499491        // stretch the password
    500         const secret = forge.pkcs5.pbkdf2(key, caps['cipher.key_salt'], caps['cipher.key_stretch_iterations'], this.cipher_out_block_size);
     492        const secret = asmCrypto.PBKDF2_HMAC_SHA1.bytes(key, caps['cipher.key_salt'], caps['cipher.key_stretch_iterations'], this.cipher_out_block_size);
    501493        // start the cipher
    502         this.cipher_out = forge.cipher.createCipher('AES-CBC', secret);
    503         this.cipher_out.start({iv: caps['cipher.iv']});
     494        this.cipher_out = new asmCrypto.AES_CBC.Decrypt( { key: secret, iv: caps['cipher.iv']} );
    504495};
    505496
    506497
     
    516507                'lib/lz4.js',
    517508                'lib/es6-shim.js',
    518509                'lib/brotli_decode.js',
    519                 'lib/forge.js',
     510                'lib/asmcrypto.js',
    520511                'lib/pyrencoder.js');
    521512        // make protocol instance
    522513        const protocol = new XpraProtocol();