| @@ -15,14 +15,16 @@ | |||
| ############################################################################### | |||
| 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) ) | |||
| OBJ := \ | |||
| sockets.o \ | |||
| lc6_ssl.o \ | |||
| libchat6.o \ | |||
| $(MAINS) | |||
| DEPS := | |||
| @@ -31,11 +33,18 @@ DEPS := | |||
| all: $(TARGETS) | |||
| clean: | |||
| rm -f $(TARGETS) $(OBJ) | |||
| rm -f $(TARGETS) $(OBJ) test test.o | |||
| $(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) | |||
| @@ -0,0 +1,56 @@ | |||
| #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; | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| #ifndef LC6_SSL_H | |||
| #define LC6_SSL_H | |||
| #include "libchat6.h" | |||
| libchat_user* ssl_create_keypair(libchat_user*); | |||
| #endif | |||
| @@ -0,0 +1,31 @@ | |||
| #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); | |||
| } | |||
| @@ -0,0 +1,19 @@ | |||
| #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 | |||
| @@ -0,0 +1,21 @@ | |||
| #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; | |||
| } | |||