PKCS#11 API-강좌6(EC Key 생성 및 Signing)

PKCS#11 API-강좌6(EC Key 생성 및 Signing)

C 언어 Sample Code(ECCKeyGen.c)

지난 PKCS#11 API-강좌5(2016.10.11) 에서, C 언어로 작성된 Sample Code를 제시 하였습니다. 이번 강좌6 에서는 C 언어로 된, EC(ECDSA) Key Generation(생성) 및 Signing 하는 Sample Code를 제시하고자 합니다.

이번 강좌의 목적은 당사가 공급하는 HSM장비인 KeyperPlus를 가지고, ECDSA Key를 어떤 방식으로 생성하는 지, 그리고 어떻게 Signing 하는 지를 보여주고자 하는 것입니다.

Windows 와 LINUX 환경에서 동작되는 Source Code를 제공하기 위하여, #define 변수를 사용하여 OS별 차이점을 구별하였습니다.

실행 결과

EC Parameter로 secp256r1(P-256) curve를 선택한 경우, 결과는 아래와 같이 나옵니다.

C> ECCKeyGen  0  1234  PriTestKey  PubTestKey  3

--- Start to generate ECC Key Pair --------------

--- ECC Key Pair Generation Completed ----

--- ECC Private-Key Signing Test ----

--- Start ECC Signing--------------------

Signed Data : 64 bytes

 36  93  DE  71  A3  28  F6  1E  7C  DC  DF  A8  42  30  FB  7F  70  19  5E  7C

 88  9B  42  2D  DC  57  B5  17  17  E4  C9  5E  D3  63  4F  17  FC  BC  10  B0

 B9  AE  2D  C0  75  A1  B6  89  E9  07  93  8D  91  DB  9E  3E  27  77  61  A8

 A8  22  BE  6F
 

P-256 즉 P size가 256-bit 사용 시, Signed Size는 64-byte 가 됩니다. 참고로, P-512 사용 시, Signed Size는 136-byte 가 됩니다

EC Parameter

ECDSA Key를 HSM에서 Generation하는 C_GenerateKey() 함수를 call 할 때, EC Parameter 즉 CKA_EC_PARAMS 에 해당되는 값은, Public Key Object 에게만 입력해야 합니다. 이 때 EC Parameter는 해당 알고리즘을 나타내는 OID(Object Identifier) 값입니다. EC Parameter 외에 입력해야 하는 EC 관련 값은 없습니다.

EC를 만들 때, 타원곡선을 정의하는 Parameter인 “Domain Parameter”를 사용해야 하는 데, Domain Parameter를 만드는 작업은 시간이 많이 소요되고 까다로운 Curve상의 Point 연산이므로, 여러 표준 단체에서 각 Field Size에 맞는 타원곡선에 대한 Domain Parameter를 발표 하였습니다. 그리고 Domain Parameter는 2가지 방식으로 표현하도록 하였습니다. value(p,a,b,G,n,h) 또는 name(P-256 or secp256k1) 방식입니다. PKCS#11 API 에서는 name 방식을 사용합니다. 즉 name 애 대응되는 OID 값을 사용합니다.

아래는, Source Code에 들어 있는 내용으로, 각 EC Parameter는 타원곡선(Elliptic Curve)를 나타내는 OID 값입니다.

FIPS 186-3 에서는 5개의 Prime Field를 recommend하고 있는 데, P size가 192-bit , 224-bit , 256-bit , 384-bit , 521-bit인 5개입니다. P-256 은 secp256r1 로 표시하기도 합니다. secp256k1은 비트코인 시스템에서 사용하고 있는 ECDSA의 parameter 입니다.

참고로, secp256r1 이 무엇을 의미하는 지를 보다 자세히 알기 위해서는, 본 블로그 “비트코인에서 사용하는 타원곡선암호기술” 기사를 참조하시기 바랍니다

KeyperPlus의 FIPS mode

당사가 공급하는, FIPS 140-2 Level 4 인증을 받은 HSM 장비인, KeyperPlus는 암호키 사용 시, FIPS mode 와 non-FIPS mode를 함께 지원하고 있습니다. HSM 장비 설정에서 지정하여 사용합니다.

FIPS mode는 FIPS 에서 인증받은 암호 알고리즘만 지원합니다. non-FIPS mode는 KeyperPlus에서 지원하는 모든 알고리즘을 지원합니다.

secp256k1은 FIPS mode에서 지원하지 않고 있기 때문에, secp256k1를 사용하려면, non-FIPS mode를 설정해서 사용해야 합니다. FIPS mode에서 secp256k1를 사용하면, 0x121A 라는 Error Code를 return합니다.

ECCKeyGen.c file 내용

Last updated