How she asks the server for the message after she determines it exists is part two hehe. I suppose she could do some private stream searching algorithm, but as far as I know all of these sort of assume that each message is padded to the same size, gah. Alice knowing that the server has a message for her is good, it would be even better if she could determine where in the database the message is. The simplest solution would be for the server to keep track of every contact string and send to every client the list of contact strings, the size of the message they point to, and where in the database they start. That is bandwidth prohibitive when things scale up to hundreds of thousands of clients. Assuming every message has 1 kb of associated data, and there are 500,000 clients getting 10 messages a day, that means there is about 4.8 gigabytes of metadata a day. Sending that to 500,000 clients is not going to fly, so the clients need to be able to query for the data that is relevant to them without the server being able to determine that the data is relevant. I think with a bloom filter and PIR I can hopefully maybe get it so the clients can determine if they have a message waiting for them with low bandwidth, but then the problem is how do the clients find out where the message to them is in the database, and how do they get it without the server knowing it is the message they got. The biggest issue I am running into is that all of these systems seem to really like the idea of related data being blocked together into sequential buckets that are all padded to the same size instead of thrown up all over the database with 1kb here and 4kb there. Perhaps I could have every message broken down into like 1KB packets, with each packet tagged with the contact string and obtained with private stream searching. But the problem is that the server cannot learn the total number of packets that an individual message consists of. I want to have messages of various different sizes and let clients get them from random spots in the database, and then padding to a certain size, without the server being able to tell the number of individual packets that are returned for a single keyword search. Gah it is really hard to even think about this shit for me honestly, it is a level or two beyond what I know about cryptography and math, and I am struggling to think of how to do it. It is like I am right on the verge of a break through but I just cannot quite get all the way there. I wish I just knew some papers that will work to do what I want when I implement them, I have a much easier time being told what to implement, getting the paper and studying my ass off until I can do it, than I do trying to figure out exactly how to describe what I want and then reading fifty papers trying to find if any of them sound similar hehe.