| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- ----------------------------
- Security Design of openais
- ----------------------------
- The openais project uses code from the libtomcrypt package (www.libtomcrypt.org)
- for most of the algorithms described in this document. The libtomcrypt code has
- a public domain license.
- The openais project intends to mitigate the following threats:
- 1. forged group messaging messages which are intended to fault the openais
- executive
- 2. forged group messaging messages which are intended to fault applications
- using openais apis
- 3. monitoring of network data to capture sensitive information
- The openais project does not intend to mitigate the following threats:
- 1. physical access to the hardware which could expose the private key
- 2. privledged access to the operating system which could expose the private key
- or be used to inject errors into the ais executive.
- 3. library user creates requests which are intended to fault the openais
- executive
- The openais project mitigates the threats using two mechanisms:
- 1. Authentication
- 2. Secrecy
- Library Interface
- -----------------
- The openais executive authenticates every library user. The library is only
- allowed to access services if it's GID is ais or 0. Unauthorized library
- users are rejected.
- The ais group is a trusted group. If the administrator doesn't trust the
- application, it should not be added to the group! Any member of the ais group
- could potentially send a malformed request to the executive and cause it to
- fault.
- Group Messaging Interface
- -------------------------
- Group messaging uses UDP/IP to communicate with other openais executives using
- messages. It is possible without authentication of every packet that an
- attacker could forge messages. These forged messages could fault the openais
- executive distributed state machines. It would also be possible to corrupt
- end applications by forging updates
- Since messages are sent using UDP/IP it would be possible to snoop those
- messages and rebuild sensitive data.
- To solve these problems, the group messaging interface uses two new interfaces
- interal to it's implementation:
- 1. ctr_encrypt_and_sign - encrypts and signs a message securely
- 2. ctr_authenticate_and_decrypt - authenticates and decrypts a message securely
- When the executive wants to send a message over the network, it uses
- ctr_encrypt_and_sign to prepare the message to be sent. When the executive
- wants to receive a message from the network, it uses
- ctr_authenticate_and_decrypt to verify the message is valid and decrypt it.
- These two functions utilize the following algorithms:
- yarrow - secure pseudo random number generator
- pkcs #5 alg #2 - Converts a random and secret key into a larger key
- md4 - hash algorithm secure for using with yarrow and pkcs
- sha1 - hash algorithm secure for using with hmac
- hmac - produces a 20 byte sha1 digest from any length input and a 16 byte key
- blowfish - cipher algorithm - encrypts one block of data
- ctr - Counter mode of ciphering - encrypts variable length data blocks
- The hmac algorithm requires a 16 byte key.
- The blowfish algorithm requires a 16 byte key.
- The ctr algorithm requires a 16 byte nonce.
- The private key is read from disk and stored in memory for use with the
- pkcs #5 alg #2 operation.
- Every message starts with a
- struct digest {
- unsigned char digest[20]; A one way hash digest
- };
- struct salt {
- unsigned char salt[16]; A securely generated random number
- };
- struct sec_hdr {
- struct digest;
- struct salt;
- }
- The sec_hdr.digest is never hashed or encrypted by the algorithms described.
- The sec_hdr.salt is never encrypted, but is hashed by the algoriths described.
- When a message is sent (ctr_encrypt_and_sign):
- ----------------------------------------------
- 1. yarrow is used to create a 16 byte random number (salt) using the md4
- algorithm
- 2. pkcs #5 alg #2 is used with the salt and private key to create a 48 byte
- key. This 48 byte key is split into 3 16 byte keys. The keys are the
- hmac key, the blowfish key, and the ctr nonce key. pkcs uses the md4
- algorithm.
- 3. The ctr nonce and blowfish key from step #2 are used to setup the ctr cipher
- for use with blowfish.
- 4. The data of the packet, except for the sec_hdr, is encrypted using
- the ctr cipher that was initialized in step #3.
- 5. The salt is stored in the sec_hdr header of the outgoing message.
- 6. The hmac is initialized with the hmac key generated in step #2.
- 7. The message, except for the sec_hdr.digest, is hmaced to produce a digest
- using the sha1 algorithm.
- 8. The digest is stored in the outgoing message.
- 9. The message is transmitted.
- When a message is received (ctr_decrypt_and_authenticate):
- ---------------------------------------------------------
- 1. yarrow is used to create a 16 byte random number (salt) using the md4
- algorithm
- 2. pkcs #5 alg #2 is used with the salt and private key to create a 48 byte
- key. This 48 byte key is split into 3 16 byte keys. The keys are the
- hmac key, the blowfish key, and the ctr nonce key. pkcs uses the md4
- algorithm.
- 3. The ctr nonce and blowfish key from step #2 are used to setup the ctr cipher
- for use with blowfish.
- 4. The hmac is setup using the hmac key generated in step #2 using sha1.
- 5. The message is authenticated, except for the sec_hdr.digest.
- 6. If the message was not authenticated, the caller is told of the result.
- The caller ignores the message.
- 7. The message is decrypted, except for the sec_hdr, using the ctr
- initialized in step #3.
- 8. The message is processed.
- This does consume some resources. It ensures the private key is never shared
- openly. All messages are authenticated and encrypted. An exposure of
- one of the nonce key, blowfish key, or hmac key can only be used to
- attack the key relating to the algorithm. Finally every key used is
- randomly unique (within the 2^128 search space of the input to pkcs) to ensure
- that keys are never reused, nonce's are never reused, and hmac's are never
- reused in combination with each other.
- Comments welcome mailto:openais@lists.osdl.org
|