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:
[client] --> [server] --> [db]
[browser crypto] --> [aws lambda url] --> [dynamodb]
Encryption
Let's use the browser's crypto library. This is what should happen.
- Show an input field on the webpage
- User puts in data
- User presses encrypt
- Generate a unique encryption key
- Encrypt the data
- Post the encrypted data to the backend
- Backend stores the encrypted blob
- 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.
- Show input field to get the encrypted blob
- Users gives the access token
- Backend fetches the encrypted blob for the key
- If the key doesn't exist, sometimes return random bytes
- Front end requests a decryption passphrase from the user
- 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.