Utilizando totalmente o acelerador HW

9

Eu gostaria de usar o OpenSSL para lidar com toda a nossa comunicação SSL (cliente e servidor). Gostaríamos de usar o cartão de aceleração HW para descarregar os pesados cálculos criptográficos.

Percebemos que no teste de 'velocidade' do OpenSSL, há chamadas diretas para as funções criptográficas (por exemplo, RSA_sign/decrypt , etc.). Para utilizar totalmente a capacidade HW, foram necessários vários encadeamentos (até 128 encadeamentos) que carregam a placa com solicitações e garantem que a placa HW nunca esteja inativa.

Gostaríamos de usar a API OpenSSL de alto nível para manipular conexões SSL (por exemplo, SSL_connect/read/write/accept ), mas essa API não expõe o ponto em que a operação criptográfica real é executada. Por exemplo, ao chamar SSL_connect , não estamos cientes do ponto em que as operações de RSA são concluídas e não sabemos com antecedência quais chamadas levarão a cálculos criptográficos pesados e referiremos apenas aquelas ao acelerador.

Perguntas:

  1. Como posso usar a API de alto nível enquanto ainda utilizo totalmente o acelerador HW? Devo usar vários segmentos?
  2. Existe uma maneira "padrão" de fazer isso? (exemplo de implementação)
  3. (respondido em UPDATE) Você está familiarizado com o OpenSSL assíncrono ? Parece que eles estavam tentando resolver esse problema exato, mas não podemos encontrar o código real ou exemplos de uso.

UPDATE

  1. Em Acelerando o OpenSSL * usando Tecnologia Intel® QuickAssist , você pode ver que a Intel também menciona a utilização de vários threads / processos:

      

    O lançamento padrão do OpenSSL é de natureza serial, o que significa que   lida com uma conexão dentro de um contexto. Do ponto de vista de   operações criptográficas, a liberação é baseada em um   modelo de programação de bloqueio. Uma limitação importante é que a produtividade pode ser   escalado apenas adicionando mais threads (ou seja, processos) para   vantagem da paralelização do núcleo, mas isso também aumentará o contexto   sobrecarga de gerenciamento.

  2. A ramificação do OpenSSL da Intel é finalmente encontrada aqui . Mais informações podem ser encontradas em pdf contido aqui .

    Parece que a Intel mudou a maneira como o OpenSSL ENGINE funciona - ele envia o trabalho ao driver e retorna imediatamente, enquanto o resultado correspondente deve ser pesquisado.

    Se você usar outro acelerador SSL, o correspondente OpenSSL ENGINE também deverá ser modificado.

por dimba 07.10.2015 в 16:29

2 respostas

3

De acordo com Interpretando a saída de velocidade openssl para rsa com opção múltipla , -multi não "paraleliza" o trabalho ou algo assim, apenas executa vários testes de desempenho em paralelo.

Assim, a carga do seu cartão HW será essencialmente limitada pela quantidade de trabalho disponível no momento (note que na indústria em geral, 80% da carga de capacidade planejada é tradicionalmente considerada ótima no caso de picos de carga). Naturalmente, a execução de vários processos / processos do servidor proporcionará o mesmo efeito que vários testes de desempenho.

O OpenSSL suporta vários encadeamentos desde que você dê retorno de chamada para bloquear dados compartilhados . Para vários processos, ele alerta sobre o reutilização do estado dos dados herdado do pai.

É isso para escalar verticalmente. Para dimensionamento horizontal:

  • openssl suporta E / S assíncrona por meio de BIOs assíncronos
  • mas, suas operações de criptografia elementares e chamadas internas do ENGINE são síncronas e a alteração disso exigiria uma revisão lógica
  • esforços privados para que eles forneçam uma operação assíncrona tenham recebido severas críticas devido ao grande projeto falhas

Intel anunciou alguns "OpenSSL assíncrono" projeto (08.2014) para usar com seu hardware, mas o white paper vinculado fornece poucos detalhes sobre seu estado de implementação e desenvolvimento. Um desenvolvedor publicou algum código relacionado (10.2015), observando que é "estável o suficiente para obter uma visão geral ".

    
por ivan_pozdeev 21.10.2015 / 00:18
1

Como jww mencionou nos comentários, você deve usar o API do motor para realizar a tarefa. Há um exemplo no link acima sobre como usar essa API. Normalmente, o provedor acelerador de hardware implementa uma biblioteca que é chamada de "ENGINE". Esse mecanismo fornece aceleração criptográfica e pode ser usado internamente pelo OpenSSL. Supondo que o acelerador que você deseja usar tenha um ENGINE implementado (por exemplo, "cswitft"), você deve obter o mecanismo chamando ENGINE *e = ENGINE_by_id("cswift"); e, em seguida, inicializá-lo ENGINE_init(e); e configurá-lo como padrão para as operações que deseja usar , por exemplo ENGINE_set_default_RSA(e);

Depois de chamar essas funções, você pode usar a API de alto nível do OpenSSL (por exemplo, SSL_connect/read/write/accept )

    
por borisp 10.10.2015 / 10:26