| /* NOCW */ |
| /* |
| Please read the README file for condition of use, before |
| using this software. |
| |
| Maurice Gittens <mgittens@gits.nl> January 1997 |
| */ |
| |
| #include <unistd.h> |
| #include <stdio.h> |
| #include <netinet/in.h> |
| #include <fcntl.h> |
| #include <strings.h> |
| #include <stdlib.h> |
| |
| #include <openssl/rsa.h> |
| #include <openssl/evp.h> |
| #include <openssl/objects.h> |
| #include <openssl/x509.h> |
| #include <openssl/err.h> |
| #include <openssl/pem.h> |
| #include <openssl/ssl.h> |
| |
| #include "loadkeys.h" |
| |
| #define PUBFILE "cert.pem" |
| #define PRIVFILE "privkey.pem" |
| |
| #define STDIN 0 |
| #define STDOUT 1 |
| |
| void main_encrypt(void); |
| void main_decrypt(void); |
| |
| static const char *usage = "Usage: example1 [-d]\n"; |
| |
| int main(int argc, char *argv[]) |
| { |
| |
| ERR_load_crypto_strings(); |
| |
| if ((argc == 1)) |
| { |
| main_encrypt(); |
| } |
| else if ((argc == 2) && !strcmp(argv[1],"-d")) |
| { |
| main_decrypt(); |
| } |
| else |
| { |
| printf("%s",usage); |
| exit(1); |
| } |
| |
| return 0; |
| } |
| |
| void main_encrypt(void) |
| { |
| unsigned int ebuflen; |
| EVP_CIPHER_CTX ectx; |
| unsigned char iv[EVP_MAX_IV_LENGTH]; |
| unsigned char *ekey[1]; |
| int readlen; |
| int ekeylen, net_ekeylen; |
| EVP_PKEY *pubKey[1]; |
| char buf[512]; |
| char ebuf[512]; |
| |
| memset(iv, '\0', sizeof(iv)); |
| |
| pubKey[0] = ReadPublicKey(PUBFILE); |
| |
| if(!pubKey[0]) |
| { |
| fprintf(stderr,"Error: can't load public key"); |
| exit(1); |
| } |
| |
| ekey[0] = malloc(EVP_PKEY_size(pubKey[0])); |
| if (!ekey[0]) |
| { |
| EVP_PKEY_free(pubKey[0]); |
| perror("malloc"); |
| exit(1); |
| } |
| |
| EVP_SealInit(&ectx, |
| EVP_des_ede3_cbc(), |
| ekey, |
| &ekeylen, |
| iv, |
| pubKey, |
| 1); |
| |
| net_ekeylen = htonl(ekeylen); |
| write(STDOUT, (char*)&net_ekeylen, sizeof(net_ekeylen)); |
| write(STDOUT, ekey[0], ekeylen); |
| write(STDOUT, iv, sizeof(iv)); |
| |
| while(1) |
| { |
| readlen = read(STDIN, buf, sizeof(buf)); |
| |
| if (readlen <= 0) |
| { |
| if (readlen < 0) |
| perror("read"); |
| |
| break; |
| } |
| |
| EVP_SealUpdate(&ectx, ebuf, &ebuflen, buf, readlen); |
| |
| write(STDOUT, ebuf, ebuflen); |
| } |
| |
| EVP_SealFinal(&ectx, ebuf, &ebuflen); |
| |
| write(STDOUT, ebuf, ebuflen); |
| |
| EVP_PKEY_free(pubKey[0]); |
| free(ekey[0]); |
| } |
| |
| void main_decrypt(void) |
| { |
| char buf[520]; |
| char ebuf[512]; |
| unsigned int buflen; |
| EVP_CIPHER_CTX ectx; |
| unsigned char iv[EVP_MAX_IV_LENGTH]; |
| unsigned char *encryptKey; |
| unsigned int ekeylen; |
| EVP_PKEY *privateKey; |
| |
| memset(iv, '\0', sizeof(iv)); |
| |
| privateKey = ReadPrivateKey(PRIVFILE); |
| if (!privateKey) |
| { |
| fprintf(stderr, "Error: can't load private key"); |
| exit(1); |
| } |
| |
| read(STDIN, &ekeylen, sizeof(ekeylen)); |
| ekeylen = ntohl(ekeylen); |
| |
| if (ekeylen != EVP_PKEY_size(privateKey)) |
| { |
| EVP_PKEY_free(privateKey); |
| fprintf(stderr, "keylength mismatch"); |
| exit(1); |
| } |
| |
| encryptKey = malloc(sizeof(char) * ekeylen); |
| if (!encryptKey) |
| { |
| EVP_PKEY_free(privateKey); |
| perror("malloc"); |
| exit(1); |
| } |
| |
| read(STDIN, encryptKey, ekeylen); |
| read(STDIN, iv, sizeof(iv)); |
| EVP_OpenInit(&ectx, |
| EVP_des_ede3_cbc(), |
| encryptKey, |
| ekeylen, |
| iv, |
| privateKey); |
| |
| while(1) |
| { |
| int readlen = read(STDIN, ebuf, sizeof(ebuf)); |
| |
| if (readlen <= 0) |
| { |
| if (readlen < 0) |
| perror("read"); |
| |
| break; |
| } |
| |
| EVP_OpenUpdate(&ectx, buf, &buflen, ebuf, readlen); |
| write(STDOUT, buf, buflen); |
| } |
| |
| EVP_OpenFinal(&ectx, buf, &buflen); |
| |
| write(STDOUT, buf, buflen); |
| |
| EVP_PKEY_free(privateKey); |
| free(encryptKey); |
| } |
| |
| |