199 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* 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);
 | 
						|
}
 | 
						|
 | 
						|
 |