minha lib ssl #1

Então depois de alguma leitura e uns testes com o protocolo OAuth2, decidi partir para minha biblioteca utilizando a Google Drive API. Pretendo colocá-la em alguns projetos pessoais com o Simple File Manager mas antes precisava fazer o básico que era a conexão SSL com o servidor, tive como base a documentação do OpenSSL que não é lá essas coisas e ficou assim:

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <openssl/rand.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

#define BUF_MAX 4096

typedef struct {
    int socket;
    char *hostname;
    SSL *ssl;
    SSL_CTX *ssl_ctx;
} conn;

int mlt_handle(char *servname)
{
    int ret, soq;
    struct hostent *host;
    struct sockaddr_in server;

    host = gethostbyname (servname);
    if ((soq = socket (AF_INET, SOCK_STREAM, 0)) == -1) {
        perror ("Socket");
        return -1;
    }

    server.sin_family = AF_INET;
    server.sin_port = htons (443);
    server.sin_addr = *((struct in_addr *) host->h_addr);

    if ( ( ret = connect(soq, (struct sockaddr *)&server, 
                    sizeof(struct sockaddr)) ) == -1 ) {
       perror ("Connect");
       return -1;
    }

    return soq;
}

conn *mlt_ssl_connect(char *servname)
{
    conn *p;

    p = (conn *)malloc(sizeof(conn));
    p->ssl = NULL;
    p->ssl_ctx = NULL;
    p->hostname = servname;

    SSL_load_error_strings ();
    SSL_library_init ();

    if ( (p->socket = mlt_handle(p->hostname)) == -1)
        return NULL;

    if ( (p->ssl_ctx = SSL_CTX_new(SSLv23_client_method ())) == NULL)
        ERR_print_errors_fp (stderr);

    if ( (p->ssl = SSL_new(p->ssl_ctx)) == NULL)
        ERR_print_errors_fp (stderr);

    if (!SSL_set_fd(p->ssl, p->socket))
        ERR_print_errors_fp (stderr);

    if (SSL_connect(p->ssl) != 1)
        ERR_print_errors_fp (stderr);

    return p;
}

void mlt_disconnect(conn *p)
{
    SSL_shutdown(p->ssl);
    close(p->socket);

    SSL_free(p->ssl);
    SSL_CTX_free(p->ssl_ctx);

    free(p);
}

int mlt_ssl_read(conn *p, char *buffer)
{
    int bytes;

    memset(buffer, '', BUF_MAX);
    bytes = SSL_read (p->ssl, buffer, BUF_MAX-1);

    return bytes;
}

int mlt_ssl_write(conn *p, char *cmd)
{
    int ret;

    ret = SSL_write(p->ssl, cmd, strlen(cmd));

    return ret;
}

int main (int argc, char **argv)
{
    conn *server;
    char buffer[BUF_MAX];
    int bytes;

    server = mlt_ssl_connect("www.google.com");

    mlt_ssl_write(server, "GET /rnrn");

    while (1)
    {
        bytes = mlt_ssl_read(server, buffer);
        if (!bytes) {
            fprintf(stderr, ".-. server disconnected.n");
            mlt_disconnect(server);
            break;
        }

        fprintf(stdout, "%s", buffer);
   }

    return 0;
}

Tô feliz com o resultado até agora e estou começando a melhorar minha api pra o google drive que breve devo metê-la no github 😉

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: