############################################################################### | ############################################################################### | ||||
CC := gcc | CC := gcc | ||||
#CCFLAGS := -Wall -Werror -pedantic -O2 -fPIC | |||||
CCFLAGS := -Wall -Werror -pedantic -g -fPIC | |||||
LDFLAGS := -lopenssl -lpthread | |||||
#CCFLAGS := -fPIC -Wall -Werror -std=c11 -pedantic -O2 | |||||
CCFLAGS := -fPIC -Wall -Werror -std=c11 -pedantic -g | |||||
LDFLAGS := | |||||
LIBS := -lchat6 -lssl -lpthread -lcrypto | |||||
TARGETS:= libchat6.so | |||||
TARGETS:= libchat6.so libchat6.a | |||||
MAINS := $(.o, $(TARGETS) ) | MAINS := $(.o, $(TARGETS) ) | ||||
OBJ := \ | OBJ := \ | ||||
sockets.o \ | |||||
lc6_ssl.o \ | |||||
libchat6.o \ | |||||
$(MAINS) | $(MAINS) | ||||
DEPS := | DEPS := | ||||
all: $(TARGETS) | all: $(TARGETS) | ||||
clean: | clean: | ||||
rm -f $(TARGETS) $(OBJ) | |||||
rm -f $(TARGETS) $(OBJ) test test.o | |||||
$(OBJ): %.o : %.c $(DEPS) | $(OBJ): %.o : %.c $(DEPS) | ||||
$(CC) -c -o $@ $< $(CCFLAGS) | |||||
$(CC) $(CCFLAGS) $< -c -o $@ | |||||
$(TARGETS): $(OBJ) | |||||
$(CC) -o $@ $(LIBS) $^ $(CCFLAGS) $(LDFLAGS) | |||||
libchat6.so: $(OBJ) | |||||
$(CC) $(LDFLAGS) -shared $^ $(LIBS) -o $@ | |||||
libchat6.a: $(OBJ) | |||||
$(AR) rcs $@ $^ | |||||
ranlib $@ | |||||
test: test.o | |||||
$(CC) $(LDFLAGS) $^ -o $@ $(LIBS) | |||||
#include <openssl/rsa.h> | |||||
#include <openssl/pem.h> | |||||
#include <string.h> | |||||
#include <assert.h> | |||||
#include "lc6_ssl.h" | |||||
libchat_user* ssl_create_keypair(libchat_user *user) { | |||||
BIGNUM *bn; | |||||
RSA *rsa; | |||||
BIO *pub; | |||||
BIO *priv; | |||||
size_t publen; | |||||
size_t privlen; | |||||
if ( user == NULL ) { | |||||
user = malloc(sizeof(&user)); | |||||
assert(user); | |||||
memset(user, 0, sizeof(&user)); | |||||
} | |||||
bn = BN_new(); | |||||
BN_set_word(bn, RSA_F4); | |||||
rsa = RSA_new(); | |||||
RSA_generate_key_ex(rsa, 2048, bn, NULL); | |||||
priv = BIO_new(BIO_s_mem()); | |||||
pub = BIO_new(BIO_s_mem()); | |||||
PEM_write_bio_RSAPrivateKey(priv, rsa, NULL, NULL, 0, NULL, NULL); | |||||
PEM_write_bio_RSAPublicKey(pub, rsa); | |||||
RSA_free(rsa); | |||||
privlen = BIO_pending(priv); | |||||
publen = BIO_pending(pub); | |||||
user->priv_key = malloc(privlen+1); | |||||
user->pub_key = malloc(publen+1); | |||||
BIO_read(priv, user->priv_key, privlen); | |||||
BIO_read(pub, user->pub_key, publen); | |||||
user->priv_key[privlen] = '\0'; | |||||
user->pub_key[publen] = '\0'; | |||||
BIO_free_all(priv); | |||||
BIO_free_all(pub); | |||||
BN_free(bn); | |||||
// RSA_free(rsa); | |||||
return user; | |||||
} |
#ifndef LC6_SSL_H | |||||
#define LC6_SSL_H | |||||
#include "libchat6.h" | |||||
libchat_user* ssl_create_keypair(libchat_user*); | |||||
#endif |
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include <assert.h> | |||||
#include "lc6_ssl.h" | |||||
int libchat_init(libchat_user *user) { | |||||
if ( user == NULL ) | |||||
return LIBCHAT_ERROR_INPUT_NULL; | |||||
return 0; | |||||
} | |||||
libchat_user* libchat_create_user(libchat_user *user) { | |||||
return ssl_create_keypair(user); | |||||
} | |||||
void libchat_free_user(libchat_user *user) { | |||||
if ( !user ) | |||||
return; | |||||
if ( user->pub_key ) | |||||
free(user->pub_key); | |||||
if ( user->priv_key ) | |||||
free(user->priv_key); | |||||
free(user); | |||||
} |
#ifndef LC6_LIBCHAT6_H | |||||
#define LC6_LIBCHAT6_H | |||||
typedef struct libchat_user { | |||||
char nickname[256]; | |||||
char *pub_key; | |||||
char *priv_key; | |||||
char icon[32768]; | |||||
} libchat_user; | |||||
enum LIBCHAT_ERRORS { | |||||
LIBCHAT_ERROR_INPUT_NULL = 1 | |||||
}; | |||||
int libchat_init(libchat_user*); | |||||
libchat_user* libchat_create_user(libchat_user*); | |||||
void libchat_free_user(libchat_user*); | |||||
#endif |
#include <stdio.h> | |||||
#include <string.h> | |||||
#include <stdlib.h> | |||||
#include "libchat6.h" | |||||
int main(int argc, char **argv) { | |||||
libchat_user *user; | |||||
user = libchat_create_user(NULL); | |||||
strcpy(user->nickname,"Päscu"); | |||||
printf("pub\n%s\n", user->pub_key); | |||||
printf("priv\n%s\n", user->priv_key); | |||||
libchat_free_user(user); | |||||
user = NULL; | |||||
return 0; | |||||
} |