Функции обратного вызова пользовательских расширений Openssl - PullRequest
0 голосов
/ 12 декабря 2018

Я создаю собственное расширение, используя API пользовательских расширений OpenSSL.

Функции SSL_CTX_add_client_custom_ext и SSL_CTX_custom_ext возвращают 1, т.е. успех, но проблема в том, что существуют определенные функции обратного вызова, которые вызываются для работы с нужными нам даннымидобавить или разобрать.Я добавил некоторые операторы отладки, чтобы узнать, вызваны они или нет, и я думаю, что нет.

static int old_add_cb(SSL *s, unsigned int ext_type, const unsigned 
char **out, size_t *outlen, int *al, void *add_arg) {

 printf("called!!");
     return 1;
}

static void old_free_cb(SSL *s, unsigned int ext_type, const unsigned 
char *out, void *add_arg) {

    printf("called!!");
    OPENSSL_free((unsigned char *)out);
}

static int old_parse_cb(SSL *s, unsigned int ext_type, const 
 unsigned char *in, size_t inlen, int *al, void *parse_arg) {

       printf("called!!");     
       return 1;
}

Код, связанный с SSL_CTX:

int main(int count, char *strings[]) {   

   SSL_CTX *ctx;
   int server;
   SSL *ssl;
   char buf[1024];
   int bytes;
   char *hostname, *portnum;

   if ( count != 3 ) {
    printf("usage: %s <hostname> <portnum>\n", strings[0]);
    exit(0);
           }

   SSL_library_init();

   hostname=strings[1];
   portnum=strings[2];

   ctx = InitCTX();
   int result = SSL_CTX_add_custom_ext(ctx, 1000, 
                            SSL_EXT_CLIENT_HELLO, old_add_cb, 
                          old_free_cb, NULL, old_parse_cb, 
                                                 NULL);
   printf("Extension Register %d", result);

   server = OpenConnection(hostname, atoi(portnum));
   ssl = SSL_new(ctx);      /* create new SSL connection state */
   SSL_set_fd(ssl, server);    /* attach the socket descriptor */

   if ( SSL_connect(ssl) == FAIL )   /* perform the connection */
       ERR_print_errors_fp(stderr);

  else {   char *msg = "Hello???";

    printf("Connected with %s encryption\n", SSL_get_cipher(ssl));
    ShowCerts(ssl);        /* get any certs */
    SSL_write(ssl, msg, strlen(msg));   /* encrypt & send message */
    bytes = SSL_read(ssl, buf, sizeof(buf)); /* get reply & decrypt */
    buf[bytes] = 0;
    printf("Received: \"%s\"\n", buf);
    SSL_free(ssl);        /* release connection state */
   }
  close(server);         /* close socket */
  SSL_CTX_free(ctx);        /* release context */
  return 0;
   }

SSL_CTX_add_custom_ext 'функция возвращает 1, но операторы print в функциях обратного вызова не выполняются.

1 Ответ

0 голосов
/ 15 мая 2019

Из Openssl doc о SSL_extension_supported мы можем видеть следующие утверждения:

Для сообщений ServerHello и EncryptedExtension каждый зарегистрированный add_cb вызывается один раз, если и только если требованияуказанный контекст встречаются, и соответствующее расширение было получено в ClientHello.То есть, если в ClientHello не было получено соответствующего расширения, add_cb вызываться не будет.

Я имею в виду, что обратные вызовы с обеих сторон (здесь клиент и сервер) будут выполняться , только если Сервер проверяет и принимает ClientHello, который включает в себя расширения.Таким образом, вы должны добавить расширение (здесь обратный вызов) на сервер, как клиент, чтобы убедиться, что обратный вызов будет выполнен.Вот мой пример:

static int ext_add_cb(SSL *s, unsigned int ext_type,
                      const unsigned char **out,
                      size_t *outlen, int *al, void *add_arg)
{
    switch (ext_type) {
        case 65280:
            printf("ext_add_cb from client called!\n");
            break;

        default:
            break;
    }
    return 1;
}

static void ext_free_cb(SSL *s, unsigned int ext_type,
                        const unsigned char *out, void *add_arg)
{
    printf("ext_free_cb from client called\n");

}

static int ext_parse_cb(SSL *s, unsigned int ext_type,
                        const unsigned char *in,
                        size_t inlen, int *al, void *parse_arg)
{
    printf("ext_parse_cb from client called!\n");
    return 1;
}

сервер похож на клиент.И затем добавить регистр в main:

    int result = SSL_CTX_add_client_custom_ext(ctx, 65280, ext_add_cb, ext_free_cb, NULL, ext_parse_cb, NULL);

Запустить сервер и затем запустить клиент, я получил это сообщение:

# server:
ext_parse_cb from server called!
ext_add_cb from server called!
ext_free_cb from server called!


# client:
ext_add_cb from client called!
ext_free_cb from client called
ext_parse_cb from client called!
...