code: function(senderPriv, recipientPub, msg, iv, salt) {
      // Errors
      if (!senderPriv || !recipientPub || !msg || !iv || !salt) throw new Error('Missing argument !');
      if (!Helpers.isPrivateKeyValid(senderPriv)) throw new Error('Private key is not valid !');
      if (!Helpers.isPublicKeyValid(recipientPub)) throw new Error('Public key is not valid !');
      // Processing
      let sk = convert.hex2ua_reversed(senderPriv);
      let pk = convert.hex2ua(recipientPub);
      let shared = new Uint8Array(32);
      let r = key_derive(shared, salt, sk, pk);
      let encKey = r;
      let encIv = {
          iv: convert.ua2words(iv, 16)
      };
      let encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Hex.parse(convert.utf8ToHex(msg)), encKey, encIv);
      // Result
      let result = convert.ua2hex(salt) + convert.ua2hex(iv) + CryptoJS.enc.Hex.stringify(encrypted.ciphertext);
      return result;
  }
docs: *
  Encode a message, separated from encode() to help testing
  
  @param {string} senderPriv - A sender private key
  @param {string} recipientPub - A recipient public key
  @param {string} msg - A text message
  @param {Uint8Array} iv - An initialization vector
  @param {Uint8Array} salt - A salt
  
  @return {string} - The encoded message