function getBackupPublicKey(contents) {
    try {
        return PublicKey.fromBuffer(contents.slice(0, 33))
    } catch(e) {
        console.error(e, e.stack)
    }
}
 return new Promise( resolve => {
     var public_key = PublicKey.fromPublicKeyString(backup_pubkey)
     var onetime_private_key = key.get_random_key(entropy)
     var walletString = JSON.stringify(wallet_object, null, 0)
     compress(walletString, compression_mode, compressedWalletBytes => {
         var backup_buffer =
             Aes.encrypt_with_checksum(onetime_private_key, public_key,
                 null/*nonce*/, compressedWalletBytes)
         
         var onetime_public_key = onetime_private_key.toPublicKey()
         var backup = Buffer.concat([ onetime_public_key.toBuffer(), backup_buffer ])
         resolve(backup)
     })
 })
 ]).then(accounts => {
     let myPublicKey = accounts[0].options.memo_key;
     let myPrivateKey = WalletDb.getPrivateKey(myPublicKey);
     if (!myPrivateKey) {
         throw "Wallet does not have private memo key for " + myAccountNameOrId
     }
     let otherPublicKey = PublicKey.fromStringOrThrow(accounts[1].options.memo_key);
     console.log(myPrivateKey.toWif(), accounts[1].options.memo_key);
     let secret = myPrivateKey.get_shared_secret(otherPublicKey);
     secret = secret.reduce((prev, current) => {
       return prev + ('0' + current.toString(16)).substr(-2);
     }, '');
     return secret;
 });
 return new Promise( (resolve, reject) => {
     if( ! Buffer.isBuffer(backup_buffer))
         backup_buffer = new Buffer(backup_buffer, 'binary')
     
     var private_key = PrivateKey.fromWif(backup_wif)
     var public_key
     try {
         public_key = PublicKey.fromBuffer(backup_buffer.slice(0, 33))
     } catch(e) {
         console.error(e, e.stack)
         throw new Error("Invalid backup file")
     }
     
     backup_buffer = backup_buffer.slice(33)
     try {
         backup_buffer = Aes.decrypt_with_checksum(
             private_key, public_key, null/*nonce*/, backup_buffer)
     } catch(error) {
         console.error("Error decrypting wallet", error, error.stack)
         reject("invalid_decryption_key")
         return
     }
     
     try {
         decompress(backup_buffer, wallet_string => {
             try {
                 var wallet_object = JSON.parse(wallet_string)
                 resolve(wallet_object)
             } catch(error) {
                 if( ! wallet_string) wallet_string = ""
                 console.error("Error parsing wallet json",
                     wallet_string.substring(0,10)+ "...")
                 reject("Error parsing wallet json")
             }
         })
     } catch(error) {
         console.error("Error decompressing wallet", error, error.stack)
         reject("Error decompressing wallet")
         return
     }
 })