STM32 - KVAS 인증서 메모리 구조 재설계

STM32의 SRAM을 확보하는 작업을 계속하다 보니 이제는 단순히 버퍼 크기를 줄이는 것만으로는 부족했다. LVGL Display Buffer를 줄이고 UART 수신 구조를 다시 설계하면서 큰 메모리부터 하나씩 정리했지만, 앞으로 추가해야 할 PnC 인증서 처리를 생각하면 여전히 여유가 부족했다. 결국 지금까지 별문제 없이 사용하던 인증서 메모리 구조도 다시 볼 필요가 있었다.

3KB 인증서를 계속 들고 있어야 할까

기존 구조에서는 약 3KB 크기의 KVAS 인증서 정보를 OCPP 관련 구조체가 상시 메모리에 갖고 있었다. 구현만 생각하면 이 방식이 편하다. 부팅 시 KVAS 인증서를 이용해 배터리팩 정보를 암호화하기 위한 세션키를 생성할 때 바로 인증서를 참조할 수 있고, 인증서 만료 시점에 서버에서 갱신된 인증서가 내려오더라도 이미 확보된 메모리를 그대로 사용하면 된다.

 

하지만 KVAS 인증서는 충전기가 동작하는 동안 계속 사용하는 데이터가 아니다. 주로 부팅 과정에서 세션키를 생성할 때 필요하고, 이후에는 인증서가 만료되어 서버에서 갱신된 인증서를 내려받는 경우에 다시 사용한다. 메모리가 충분하다면 굳이 이 구조를 바꿀 이유는 없다. 상시 보관하는 편이 구현도 단순하고 관리하기도 쉽다. 문제는 현재 SRAM 상태에서는 그 편의를 위해 약 3KB를 계속 묶어둘 여유가 없다는 점이었다.

PnC가 요구한 추가 메모리

PnC 기능을 고려하면서 상황은 더 빡빡해졌다. 차량 인증서를 설치하는 경우 서버에서 6KB가 넘는 DataTransfer 메시지가 내려올 수 있다. STM32는 이 데이터를 수신한 뒤 다시 SECC로 전달해야 한다.

Server
  │
  │  6KB+ DataTransfer
  ▼
STM32G484
  │
  │  Certificate
  ▼
SECC

반대 방향도 있다. PnC 인증 과정에서는 SECC에서 전달받은 계약 인증서 정보를 OCPP 메시지로 구성해 서버로 전송해야 한다.

SECC
  │
  │  Contract Certificate
  ▼
STM32G484
  │
  │  OCPP JSON
  ▼
Server

이때는 인증서 데이터만 저장할 공간이 있으면 끝나는 것이 아니다. 계약 인증서를 서버로 보내기 위해 OCPP JSON을 생성해야 하므로 6KB 수준의 작업 공간도 추가로 필요하다. 기존처럼 KVAS 인증서 약 3KB를 항상 들고 있으면서 PnC 인증서 처리와 대용량 JSON 생성에 필요한 메모리까지 따로 확보하는 구조는 현재 SRAM 상황에서는 부담이 컸다.

상시 보관에서 필요 시 할당으로

처음 구조대로라면 KVAS 인증서를 계속 메모리에 두고 사용하는 것이 가장 쉽다. 하지만 실제 사용 시점을 다시 보면 대부분의 시간에는 인증서를 참조하지 않는다. 결국 구현 편의성을 조금 포기하더라도 메모리 사용 방식을 바꾸는 쪽이 맞다고 판단했다. KVAS 인증서 정보를 OCPP의 상시 구조체에서 분리하고, 인증서 처리가 필요한 시점에만 CERT 전용 메모리 영역을 사용하도록 구조를 변경했다. 부팅 시 세션키를 생성할 때 필요한 인증서 데이터를 사용하고 처리가 끝나면 해당 영역을 다시 사용할 수 있게 하는 방식이다. 인증서 갱신이 발생했을 때도 같은 방식으로 필요한 시점에만 버퍼를 사용한다.

 

핵심은 인증서 자체의 크기를 줄인 것이 아니다. 항상 메모리를 점유하던 데이터를 실제로 필요한 순간에만 메모리에 올리도록 수명을 바꾼 것이다.

KVAS와 PnC의 메모리 공유

이렇게 분리한 CERT 영역은 KVAS 전용으로만 남겨둘 필요가 없었다. PnC 인증서 처리도 큰 임시 메모리가 필요하지만 KVAS 인증서와 사용 시점이 겹치지 않는다면 같은 영역을 공유할 수 있다. KVAS 처리가 필요할 때는 CERT 버퍼를 KVAS용으로 사용하고, 처리가 끝난 뒤에는 PnC 인증서 설치나 계약 인증서 처리에 다시 사용하는 방식이다.

CERT Buffer

시간 ─────────────────────────────────▶

[ KVAS 처리 ]
               [     Free     ]
                                [ PnC 처리 ]

각 기능에 독립적인 대형 버퍼를 하나씩 상시 확보하는 대신, 서로 동시에 필요하지 않은 데이터가 하나의 메모리 영역을 번갈아 사용하도록 만든 셈이다.

동시에 사용하지 않는다는 전제

물론 하나의 CERT 영역을 공유하려면 명확한 전제가 필요하다. PnC 인증서와 KVAS 인증서를 서버에서 동시에 설치하거나 갱신하지 않는다는 조건이다. 두 작업이 동시에 발생한다면 각각의 인증서 데이터를 동시에 유지할 수 있는 별도 메모리가 필요하다. 이번 구조는 시스템 운용상 두 인증서의 설치 및 갱신을 동시에 진행하지 않는다는 전제 아래 구현한다.

 

따라서 이 조건은 단순한 구현 편의를 위한 가정이 아니라 공유 버퍼 구조를 성립시키는 설계 조건이다. 이후 기능을 변경하거나 서버 동작 시나리오가 달라진다면 가장 먼저 다시 확인해야 할 부분이기도 하다.

메모리 크기보다 중요한 사용 시점

이번 작업에서 줄어든 것은 인증서 데이터 자체가 아니다. KVAS 인증서는 여전히 필요하고, PnC 인증서 역시 처리해야 한다. 달라진 것은 이 데이터를 메모리에 올려두는 시간이다. 상시 메모리에 KVAS 인증서를 유지하면 세션키 생성이나 인증서 갱신 로직은 훨씬 쉽게 구현할 수 있다. 하지만 지금의 STM32G484 SRAM 상태에서는 몇 KB의 메모리를 구현 편의만을 위해 계속 점유할 여유가 없다.

 

그래서 항상 들고 있는 구조 대신, 필요한 시점에 CERT 버퍼를 사용하고 처리가 끝나면 다른 인증서 작업에 다시 사용할 수 있도록 방향을 바꿨다. 결국 이번 변경에서 중요했던 것은 각각의 데이터가 몇 KB인가보다 어떤 데이터가 같은 순간에 실제로 메모리에 존재해야 하는가였다. PnC를 추가하기 위해 시작한 메모리 확보 작업이 단순한 버퍼 축소를 넘어, 메모리의 사용 시점과 수명까지 다시 설계하는 단계로 넘어갔다.