Christos Anesti!

Alithos Anesti!

Having risen from the grave has he fortold, Jesus has granted us eternal life and great mercy!


Welcome!

Personal websites seem trendy, and I'm not one for riding trends, but I figured I'd give it another shot. I don't think that I have all that much to offer to the world but I must admit, I benefited greatly from random people writing all sorts of things even on low profile pages such as this one.

First of all, I dedicate this whole site to Jesus, who is so such an awesome God. You may not be a believer, you may not even care, but so long as God grants you breath in your lungs and the spark of reason in your mind, you have the opportunity to return to him. Death is unavoidable, the day will come when you will die. If you really think about how short our time is on this earth, and how fragile our lives are, then you'll soon realize that you can bring nothing with you when your time comes. All your stuff is left behind, given to others. So what do you profit from amassing so much junk?

Death wasn't part of the plan. In the beginning, man was created immortal. We're not supposed to die. Physical death is a result of spiritual death. Man lives not by bread alone, but by every word that proceeds from the mouth of God. When man rejects this life-giving word, he finds death. Simple as that. The good news is that death is abolished and those who trust in God will not taste it!

Programming

This website

I like raw bytes. Real down to the wire kind of stuff. Go ahead, right click and view page source. The only external resource is the stylesheet, which is just aesthetics. You can curl this site. Open your terminal and type the following.

curl https://tuffbizz.com

I actually think it would be real neat if we returned to this kind of simplicty. Do you really need to download six gigabytes of javascript and ads just to read a couple of paragraphs?

I actually wanted to (re)make a personal website for a while. I knew I wanted a static page but spun my wheels for a long time looking into the various static site generators and hosting providers.


Projects

I don't want to parade around old projects. I've been programming since middle school. If I'm really as good as I'd like you to think I am, then I should be able demonstrate a bit of my knowledge through some new projects. There are a couple of ideas I had floating around that I haven't gotten around to, but now I have an excuse to get them going. Every project on this page is started after the launch of this website and my progress is documented along the way.

πŸ” Tajny Zapis

Link to service

Motiviation and Vision

Sometimes I want to securely share data between computers but I may not have a physical connection available between the devices.

What we need:

  • Webpage
  • Backend
  • Storage
        [client] --> [server] --> [db]
        [browser crypto] --> [aws lambda url] --> [dynamodb]
      

Encryption

Let's use the browser's crypto library. This is what should happen.

  1. Show an input field on the webpage
  2. User puts in data
  3. User presses encrypt
  4. Generate a unique encryption key
  5. Encrypt the data
  6. Post the encrypted data to the backend
  7. Backend stores the encrypted blob
  8. Backend returns an access token that can be used to get encrypted data

Now, when we want to get the data this is what happens.

  1. Show input field to get the encrypted blob
  2. Users gives the access token
  3. Backend fetches the encrypted blob for the key
  4. If the key doesn't exist, sometimes return random bytes
  5. Front end requests a decryption passphrase from the user
  6. Decrypt data using browser crypto api

Notice that we abscure whether or not a given access key exists by not guaranteeing that a non-existing access key will return a 404. There is a small chance that the backend will generate a random blob for the access key, and return it. Just because the backend returns a valid response doesn't mean that the data is real. Currently the dummy data is not cached so it shouldn't be too hard to guess when this happens. There's a few caching options available depending on how fancy we want to get. The simplest is to use the lambda's 512 megabytes of ephemeral storage and use a basic disk cache. If we want to get fancier, we can use EFS to share this cache accorss lambdas.

The next question is, what should the encryption passphrase be? Should this be generated by the browser? Should the user get to specify one? It's best to generate one automatically. Humans are notoriusly bad at generating cryptographically secure random data. In the future I could allow users to specify their very own passphrase.

I have a dictionary of 7,700 words.
7,700 cubed is 456,533,000,000.
7,700 fourth is 3,515,304,100,000,000.

Example

spice trail realized bulletin.

If the access key space is super large, we can more easily defend against discovering whether a particular key actually exists. We can utilize a cache to help defend against obtaining the ciphertext and encrypted key.

Additional details can be found on the project's website.


iOS VPN

Using OpenBSD for this one. Requires a supervised device.

Who wrote this page?

I did!

You probably already noticed my name at the bottom of the page. Depending on how much of a nerd you are, you may have recognized the hex string as a sequence of utf-8 bytes with a non-ascii character at the end. If you'd like some help, open the developer consoler (F12 or try right-clicking on the page then chose inspect-element) and type the following code:

bytes = [0x6170,0x6577,0x82c5];
bytes = new Uint16Array(bytes);
(new TextDecoder()).decode(bytes)

I broke up the string into 2 byte words for you. If you click on the code I'll run it for you. You're welcome ☺️

Wait a minute β€” The byes are scrambled! It only looks that way. I actually wanted to use a Uint8Array so the bytes would appear in the right order, but the line is too long to display nicely on my phone since I need to append 0x before each byte. Even if I used decimal values, it would still be too long. Let's reason through this together.

A utf-8 string is a sequence of bytes and a parser goes through the bytes one at a time. The byte sequence is stored in memory at a particular address, let's say it's stored in memory at 0x00. This means the first byte is at 0x00 and the second byte is at 0x01. If we use a uint8 we are referring to a sequence of bytes one after the other. But we have a uint16 which takes up two bytes. Let's call this a word. If a word is made up of two bytes, which byte goes where in memory? That depends on your particular computer.

Byte Ordering Memory Layout
Word 61 70 65 77 82 c5
Address 00 01 02 03 04 05
Big Endian 61 70 65 77 82 c5
Little Endian 70 61 77 65 c5 82

Can you tell which byte order your computer is using? If you click on the code above and my name is legible, your computer is little endian.


Contact

You won't find me on social media but if you'd like to get in touch, you can send me an email. Choose a color according to your liking, do the same for some animal. Put the two words together and you have the part before the @ symbol. Use the domain of this website.