해시함수인 SHA-256을 Verilog HDL 언어로 만들어보려 한다.
참고한 코드는 c언어로, 코드를 해석한 글을 보고 싶으면 아래 글로 이동하면 된다.👇
전체적인 구성
위의 포스팅에서도 말하였지만, 다시 한번 설명하자면
SHA-256은 크게 3가지 단계로 이루어진다.
- Init(): 초기값 설정
- Process(): 평문 메시지를 512bit 크기씩 블록으로 나누어 Transform() 압축함수 실행
- Close(): 마지막 블록에 대한 Transform() 압축함수 실행 → 256bit의 해시값 생성
기본적인 입·출력은 다음과 같다.
- 입력: 평문 메시지, 평문 메시지의 길이
- 출력: 암호화된 메시지(256bit)
이를 FSM으로 만들기 위해서 state를 위의 단계 3개와 초기화 state를 추가해서 만들어 볼 것이다.
Transform()은 Process()와 Close() 내부에서 사용되는 함수이므로
state로 만들지 않고, task문으로 구현해보려 한다.
FSM
- 입력(X)
- 메시지를 입력하였는가(평문 메시지)
→ 입력했으면 X = 1, 입력 안했으면 X = 0
- 출력
- 암호화된 메시지
- 초기화
- 초기 신호 상태(IDLE)
: 모든 변수들의 값을 0 또는 NULL값 비슷한 걸로..
- 상태
- 초기 상태 (S0): 모든 신호들 초기화 ex. 0으로 초기화
X = 1일 때 S1으로 이동 - Init (S1): SHA256 초기값 설정
S2로 조건없이 이동 - Process (S2):
메시지 블록별로 암호화(여기서 블록 개수를 받아서count = 블록개수일 때, S3로 이동) - count는 내부 신호! - Close (S3): 마지막 메시지 블록 암호화
베릴로그에서 문자열 입력받기
베릴로그에서는 따로 문자열(string)이 없다.
문자열을 입력하면 8비트 ASCII 값으로 표현되는 unsigned 정수형 상수로 취급된다.
문자열 변수는 reg형의 변수이며, 문자열 내의 문자 수에 8을 곱한 크기의 비트 폭을 가진다.
ex) 길이가 3인 문자열 = reg [3*8:0] string
문자열을 아스키코드로 해석하면 다음과 같다.
test = {0x74, 0x65, 0x73, 0x74}
그래서 $display를 이용하여 입력 메시지의 값을 출력하면 0000000...00074657374이 나온다.
* Init
// Init
always @(*) begin
if (!i_rstn)
error = 1'b0;
else if (state == INIT) begin
uChainVar[0] = 'h6a09e667;
uChainVar[1] = 'hbb67ae85;
uChainVar[2] = 'h3c6ef372;
uChainVar[3] = 'ha54ff53a;
uChainVar[4] = 'h510e527f;
uChainVar[5] = 'h9b05688c;
uChainVar[6] = 'h1f83d9ab;
uChainVar[7] = 'h5be0cd19;
uHighLength = 1'b0;
uLowLength = 1'b0;
end
end
* Process
- 참고 -
'Hardware Security' 카테고리의 다른 글
[SHA256] FF 모듈 (0) | 2022.02.23 |
---|---|
FF 구성 모듈 (0) | 2022.02.17 |
[SHA256] FF() 구성 모듈 - (1): RR, Sigma0, Sigma1 (0) | 2022.02.04 |
RR(Rotate Right) (0) | 2022.02.04 |