Avatar
Leo Wandersleb
46fcbe3065eaf1ae7811465924e48923363ff3f526bd6f73d7c184b16bd8ce4d
https://walletscrutiny.com https://nostr.info Working on Bitcoin, Nostr and being a good dad.

If gossip is the way, clients are heading, we probably should also use that for our relay.

Mobile clients still have a hard time keeping dozens of websockets open all the time so I think there will be demand for relays that get the events you care about for you. But "follows of follows" is probably too simple an approach.

Legacy apps where the devs have the keys certainly have an easier time migrating off Play Store. They "only" have to convince their clients to enable "untrusted" sources and download updates from their websites. Users can then update, knowing the binary was signed by the same devs as before.

New apps essentially have to start from zero and tell their users to install that other app if they loose their Google Developer account. Clients cannot upgrade from the Play Store version to the free version. They have to either delete the Play Store version before installing the free version or the provider has to provide the free version under a completely different app ID.

I'm an Android dev since day two (2009) and prefer it over Apple but Google is also going for more wallet garden.

It used to be such that developers signed their apps with a key that never was shared with Google. Then they let developers opt in to sharing that key with them and now I think, to distribute on Google Play, new developers don't get their hands on the signing key.

The consequence is that if you publish on Google Play and with direct downloads from your website, you have to sign with different keys or risk to not be able to provide updates if Google gives you the boot.

At first I thought they sent you a CD or something :D The sticker is cool though.

Wonder if Greenpeace will ever be embarrassed about having produced those stickers and sent them to people.

Sounds like constructive criticism.

The fix was not the hard part. Just not using JSON.stringify() was good enough. The problem was that I had empty sets for other reasons so I tested just those 20 LOC with a console.log in the end and I was scratching my head for half an hour why the set was empty all the time.

TIL:

console.log(JSON.stringify(new Set(["bla", "foo"])))

prints

{}

which does not mean that the set was empty.

ChatGPT found it after three rounds of finding errors that were no errors at all and

> I apologize for the confusion. Upon further inspection, I see another issue in the code.

Here in Chile they sell IQF minced meat and the following video is ten years old. I bought my first and last bag of IQF minced a year ago. Feels more processed than the locally minced from the fridge.

https://www.youtube.com/watch?v=kcJDyoULWsg

Replying to Avatar 134355345

nostr:npub1gm7tuvr9atc6u7q3gevjfeyfyvmrlul4y67k7u7hcxztz67ceexs078rf6. Maybe one option would be to just publish apps in places where signed .APK can be uploaded.

With WalletScrutiny.com we focus on impact. As much as "Just build it yourself. It's easy" isn't a good excuse for stealing from the 99.9% of users that will not compile it themselves, offering alternative downloads doesn't fix much. So if you offer the apk on your project's website for download, most users would be more vulnerable due to phishing attacks than if you figure it out with one repository - Google Play Store.

There is one alternative though: Fdroid. If your project is open source, you can publish it via fdroid and benefit from fdroid checking for reproducible builds.

Replying to Avatar 134355345

nostr:npub1gm7tuvr9atc6u7q3gevjfeyfyvmrlul4y67k7u7hcxztz67ceexs078rf6

I just downloaded the APK file from Play Store Console (the APK file that Google generated from the .AAB file I uploaded to Play Store) and compared it with the signed APK file I generated with my Intellij IDE, using the same keystore, key index and code commit.

I used the SHA256 hash and both APKs have different hashes

I cannot think of an easy way of verifying that the app published on Play Store is the same build that I would obtain by building the source code. Am I correct in the logic?

So ... naturally, third parties cannot reproduce bit for bit of an Android executable APK file as it contains the signature which third parties cannot generate. This is why when testing APKs for nostr:npub1j9kttlc86w63emmldd4h74rekyqpksqup6p9trhp5gjsf374qlyszvuswx we have to take a bit more efforts and thus have to make more assumptions than when there is no signature.

You compared the sha256sum hashes. If those match, the files match or whoever knows how to generate hash collisions could get filthy rich mining Bitcoin.

The APK is a zip file. You can literally rename it to app.zip and unzip it. Inside you will find the signature in a folder called META-INF. Content in that folder is not covered by the signature, so you could put some "malicious" files there, zip it again, rename it .apk and Android would load it as a good, signed by the provider app. Android should not load or do anything really with your "malicious" file but ... that's the assumption. Maybe some payload could be planted that could confuse Android to still do something shady.

Anyway, the app's sha256 fingerprint depends on not only the compressed content that could vary in the META-INF folder but also on the compression itself. I don't know why but I did observe different hashes for same versions of the same app even with both obtained from Google.

All that said, to diff two APKs, use unzip and recursive diff or use diffoscope. If you find diffs only in META-INF, you should be good. In your case you should not find diffs in META-INF neither as you expect the same signature.

That "oil" is butter I hope.

created_at ranges from 1620799628 to 1686364020 but I suspect some back-dating there so let me clip those first 1000 events ...

1685927349 to 1686364020. 5 days, streamed from damus, probably with pauses with changing but mostly not very aggressive filters.