📬 Toda semana, um resumo de segurança, Clean Code e IA no seu e-mail Inscreva-se →

Confiabilidade em PUFs de Ring Oscillator: por que o bit flipa e como corrigir

Se você já leu o artigo geral sobre PUFs aqui no blog, viu que o maior problema prático dessa tecnologia não é a teoria de segurança — é confiabilidade. Mesmo chip, mesmo challenge, e ainda assim a resposta pode vir diferente dependendo da hora do dia. Ring Oscillator PUF (RO-PUF) é onde esse problema aparece com mais força e é mais estudado na literatura, porque a variável que ele mede — frequência de oscilação — é particularmente sensível a tudo que muda no ambiente do chip.

Este artigo não repete o que já expliquei sobre PUF em geral. Aqui o foco é específico: por que o RO-PUF perde bits, e o que dá pra fazer no projeto pra reduzir isso.

Como o RO-PUF gera o bit, rapidamente

Um Ring Oscillator PUF monta vários osciladores em anel — loops de portas lógicas invertendo sinal continuamente — e compara a frequência de oscilação entre pares deles. Pequenas variações de fabricação fazem cada oscilador rodar numa frequência ligeiramente diferente do vizinho, e comparar dois deles (qual é mais rápido, qual é mais lento) dá uma resposta determinística para aquele chip específico, mas imprevisível a partir do design.

O problema é que “frequência de oscilador” não é uma propriedade fixa do silício. É uma medida física sujeita a tudo que afeta velocidade de propagação de sinal — e é exatamente aí que a confiabilidade quebra.

Por que o bit flipa

Temperatura e tensão de alimentação. Delay-based PUFs em geral, e RO-PUF em particular, são sensíveis a condições ambientais. Conforme a temperatura sobe, a frequência do oscilador cai. Isso por si só não seria problema se afetasse os dois osciladores do par igualmente — mas não afeta. Dois osciladores com processo de fabricação levemente diferente respondem à temperatura em taxas diferentes, e em alguns casos isso é suficiente para inverter a ordem: o oscilador que era mais rápido a 25°C vira o mais lento a 70°C. Quando isso acontece, o bit que o par gerava vira o oposto do valor originalmente calibrado.

Envelhecimento do circuito. Componentes desaceleram com o tempo de uso, e não desaceleram na mesma taxa. Essa discrepância de envelhecimento entre os dois osciladores de um par afeta a consistência do delay ao longo da vida útil do dispositivo — um par que era estável no primeiro ano de uso pode ficar instável no quinto.

Erro de medição. Além de ambiente e envelhecimento, o próprio processo de captura da comparação de frequência introduz ruído. Uma imprecisão pequena na medição pode alterar o resultado da comparação entre os dois osciladores e mudar o bit de forma inesperada, sem que nada tenha mudado fisicamente no chip.

Cenário real que costuma pegar quem não testou sob variação: o RO-PUF funciona perfeitamente em bancada, com fonte estável e temperatura de laboratório. Vai para o campo, onde o dispositivo aquece dentro de um gabinete fechado ou opera numa faixa de temperatura ambiente mais ampla, e a taxa de erro de bit sobe para um nível inaceitável para geração de chave criptográfica. Isso não é falha do PUF — é falha de não ter validado a faixa operacional real antes de assumir que o comportamento de bancada generaliza.

Estratégias de projeto para melhorar a confiabilidade

1. Aumentar a diferença de delay entre os osciladores do par. A solução mais direta: selecionar, entre todos os pares disponíveis no chip, apenas aqueles cuja diferença de frequência ultrapassa um limiar mínimo. Quando essa diferença é grande, a chance de inversão por temperatura ou envelhecimento cai bastante, porque a margem entre “rápido” e “lento” é grande o suficiente para resistir à variação.

2. Aumentar o conjunto de osciladores disponíveis. Em vez de comparar apenas um par fixo, você pode escolher o mais rápido e o mais lento dentre um conjunto maior de osciladores, maximizando a diferença de delay. Funciona, mas tem custo: boa parte dos osciladores do conjunto acaba não sendo usada, o que é desperdício de área de silício.

3. Códigos corretores de erro (ECC) por cima do PUF. Mesmo com as duas técnicas acima, eliminar erro completamente não é realista. Um fuzzy extractor ou código corretor aplicado sobre a resposta do PUF corrige bits que ainda flipam, garantindo que a aplicação final — autenticação, geração de chave, identificação — receba um valor estável. O ponto de atenção aqui é que essa camada de correção precisa ser implementada com cuidado: se vazar informação sobre a resposta original do PUF (o chamado “helper data” mal protegido), você recria o problema que o PUF existe para resolver.

4. Cooperação entre pares de osciladores. Uma ideia menos óbvia, mas útil: durante a calibração do chip, identificar pares que se comportam de forma instável em determinada faixa de temperatura, e associar a cada um deles um par secundário que permanece estável naquela mesma faixa. Se a temperatura sobe e o par primário flipa, o sistema recorre ao bit do par secundário — e, se necessário, aplica uma inversão para recuperar o valor original esperado. É essencialmente redundância direcionada: em vez de proteger o par problemático, você tem um plano B calibrado especificamente para a condição em que ele falha.

5. Arquitetura configurável de inversores. Esta é a mais interessante do ponto de vista de engenharia. Em vez de usar todos os inversores de um oscilador em anel de forma fixa, você insere multiplexadores que decidem, individualmente, se cada inversor entra no caminho de oscilação ou é contornado. Isso dá:

  • Flexibilidade de construção: ajuste fino da diferença de delay entre osciladores, selecionando quais inversores compõem cada anel.
  • Otimização pós-fabricação: durante o teste pós-silício, o sistema identifica quais combinações de inversores produzem a maior diferença de delay para aquele chip específico e configura o oscilador de acordo — calibração por unidade, não por lote.
  • Redução de erro: com configuração mais precisa, erro de medição e variação ambiental têm menos impacto sobre o resultado final.

O que eu recomendo antes de assumir que seu RO-PUF está pronto

Se você está avaliando adotar Ring Oscillator PUF num projeto, valide antes de comprometer o design:

  1. Taxa de erro de bit sob toda a faixa de temperatura e tensão operacional real do produto — não só condição de bancada.
  2. Comportamento ao longo do tempo de vida esperado do dispositivo, considerando envelhecimento — se possível, com dados acelerados de envelhecimento, não só simulação.
  3. Se a arquitetura configurável de inversores compensa a complexidade adicional de projeto para o seu caso, ou se aumentar o pool de osciladores resolve com menos esforço de engenharia, mesmo custando mais área.
  4. Se a camada de correção de erro (ECC/fuzzy extractor) foi projetada e revisada para não vazar informação sobre a resposta original.

Nenhuma dessas técnicas sozinha resolve o problema — na prática, projetos sérios combinam pelo menos duas ou três delas. Se você ainda não leu o artigo geral sobre PUFs aqui no blog, vale como base antes deste; e se o seu projeto usa FPGA para implementar o RO-PUF, o artigo sobre as vantagens de FPGA em segurança também é leitura complementar direta, porque a reconfigurabilidade do FPGA é justamente o que viabiliza a arquitetura de inversores selecionáveis que descrevi acima.

Leandro Rosendo Candido

Leandro Rosendo Candido

Engenheiro de Computação, mestre pela USP, 10+ anos com Embedded Linux. Escreve e grava sobre segurança, Clean Code e IA aplicada à programação.

Rolar para cima