보안토큰기반의공인인증서이용기술규격 Accredited Certificate Usage Specification for Hardware Security odule v2.20 2013 년 10 월
목차 1. 개요 1 2. 규격의구성및범위 1 3. 관련표준및규격 1 3.1 국외표준및규격 1 3.2 국내표준및규격 2 3.3 기타 2 4. 정의 2 4.1 전자서명법용어정의 2 4.2 용어의정의 3 4.3 용어의효력 3 5. 약어 4 6. 보안토큰 API(PKCS#11) 개요 4 6.1 가입자소프트웨어와보안토큰간인터페이스모델 4 6.2 보안토큰요구사항 5 6.3 구동프로그램요구사항 6 6.4 공인인증기관요구사항 6 7. 보안토큰 API(PKCS#11) 프로파일 7 7.1 저장객체 7 7.2 함수 8 7.3 메커니즘 9 부록 1. 보안토큰 API(PKCS#11) 객체속성프로파일 10 부록 2. 보안토큰 API(PKCS#11) 함수프로파일 21 부록 3. 보안토큰 API(PKCS#11) 메카니즘프로파일 24 부록 4. 환경파일을이용한보안토큰구동프로그램위치정보관리 26 부록 5. 보안토큰구동프로그램검증정보처리 28 부록 6. 보안토큰 API(PKCS#11) 반환값프로파일 30 부록 7. PKCS#11 사용예 37 부록 8. PKCS#11 자바인터페이스사용예 44 부록 9. 규격연혁 47
보안토큰기반공인인인증서이용기술규격 Accredited Certificate usage specification for Hardware Security odule 1. 개요가입자의개인키를안전하게관리및휴대할수있는저장매체로써 USB, 스마트카드등보안토큰에대한요구가증대됨에따라, 응용프로그램에서이러한보안토큰의호환성을제공할수있도록규격이필요하다. 이에, 본규격은 SA사의 PKCS#11 인터페이스에기반을두고보안토큰의기능중반드시필요하거나구현이권고되는부분을기술하여개별적인구현간의상호연동이보장될수있도록한다. 2. 규격의구성및범위본규격은공인인증서가입자소프트웨어에서전자서명생성키등비밀정보를안전하게저장 보관할수있도록키생성 전자서명생성등이기기내부에서처리되는보안토큰의기본요구사항과보안토큰을이용함에있어필요한보안토큰 API의기능적요구사항을명시한다. 첫번째로, 보안토큰기반공인인인증서이용을위한보안토큰과보안토큰 API 및공인인증서가입자소프트웨어의인터페이스모델및보안토큰, 보안토큰구동프로그램, 공인인증기관에대한요구사항을정의한다. 두번째로, 보안토큰의객체, 함수, 메커니즘등보안토큰API(PKCS#11) 프로파일을정의한다. 3. 관련표준및규격 3.1 국외표준및규격 [PKCS1] SA Laboratories PKCS#1, SA Cryptography Standard v2.1, 2001 [PKCS5] SA Laboratories PKCS#5, Password-Based Cryptography Standard v2.0, 1999 [PKCS8] SA Laboratories PKCS#8, Private-Key Information Syntax Standard, 1993
[PKCS11] SA Laboratories PKCS#11, Cryptographic Token Interface Standard v2.11, 2001 [P11POF] SA Laboratories PKCS#11 Profile, Conformance Profile Specification, 2001 [FC2511] IETF, FC 2511, Internet X.509 Certificate equest essage Format, arch 1999 [PKCS12] SA Laboratories PKCS#12, Personal Information Exchange Syntax Standard v1.0, 1999 3.2 국내표준및규격 [TTA-120012] TTA, TTAS.KO-12.0012, 전자서명인증서프로파일표준, 2000 [TTA-120004] TTA, TTAS.KO-12.0004, 128비트블록암호알고리즘표준, 2000 [KCAC.TS.SIVID] KISA, KCAC.TS.SIVID, v1.30, 식별번호를이용한본인확인기술규격, 2009 [Bio보안토큰] 조달청, Bio보안토큰이용기술규격, v1.0, 나라장터 Bio보안토큰이용기술규격, 2009 3.3 기타 해당사항없음 4. 정의 4.1 전자서명법용어정의본규격에서사용된다음의용어들은전자서명법및동법시행령, 공인인증기관의시설및장비등에관한규정 ( 행정안전부고시 ) 에정의되어있다. 가 ) 인증서나 ) 공인인증서다 ) 공인인증기관라 ) 전자서명인증체계
마 ) 가입자 바 ) 가입자설비 4.2 용어의정의가 ) 보안토큰 (HS) : 전자서명생성키등비밀정보를안전하게저장 보관하기위하여키생성, 전자서명생성등이기기내부에서처리되도록구현된하드웨어기기나 ) 보안토큰 API : 보안토큰에대한응용프로그래밍인터페이스다 ) 메커니즘 : 암호기능을구현하는절차라 ) 슬롯 (Slot) : 보안토큰과의입출력을수행할수있는논리적리더기마 ) 템플릿 (Template) : 객체속성집합으로서객체의생성, 수정, 검색등을위하여사용됨바 ) 보안토큰구동프로그램 : 보안토큰 API를구현한프로그램을말하며, 보안토큰과가입자소프트웨어간의인터페이스를담당사 ) utexes(utual Exclusion) : 다중프로세스내에서동기화를위해사용되는상호배제객체아 ) 보안토큰제품정보 (ID) : 보안토큰구동프로그램을식별하기위해사용하는정보. USB형보안토큰의보안토큰제품정보는 Vendor ID와 Product ID를연접하여사용하고, 스마트카드형보안토큰은 AT 정보를사용함자 ) 바이오보안토큰 : 보안토큰의기능을만족하면서바이오정보를이용하여인증을수행할수있도록구현된기기차 ) 모바일토큰 : 스마트폰과같은모바일기기의 USI, ese 등보안모듈을모바일통신을통해 PC와같은타기기에연결하여전자서명생성키등비밀정보를안전하게저장 보관하고, 키생성및전자서명생성등을처리하는하드웨어와소프트웨어의총칭 4.3 용어의효력본규격에서사용된다음의용어들은전자서명인증체계의공인인증서가입자소프트웨어가보안토큰의기능을이용함에있어서보안토큰구동프로그램 ( 이하구동프로그램 ) 및가입자소프트웨어구현정도를의미하는것으로 [FC2119] 를준용하며다음과같은의미를지닌다. 가 ) 해야한다, 필수이다, 강제한다. ( 기호 : )
반드시준수해야한다. 나 ) 권고한다. ( 기호 : ) 보안성및상호연동을고려하여준수할것을권장한다. 다 ) 할수있다, 쓸수있다. ( 기호 : O) 주어진상황을고려하여필요한경우에한해선택적으로사용할수있다. 라 ) 권고하지않는다. ( 기호 : N) 보안성및상호연동을고려하여사용하지말것을권장한다. 마 ) 금지한다, 허용하지않는다. ( 기호 : X) 반드시사용하지않아야한다. 바 ) 언급하지않는다, 정의하지않는다. ( 기호 : -) 준수여부에대해기술하지않는다. 5. 약어본규격에서는다음의약어들에대해추가적으로정의한다. 가 ) API : Application Programming Interface 나 ) AT : Answer to eset, 보안토큰초기화정보다 ) ese : Embedded Secure Element 라 ) HS : Hardware Security odules 마 ) microsd : micro Secure Digital 바 ) OID : Object Identifier 사 ) PKCS : Public Key Cryptography Standard 아 ) PIN : Personal Identification Number, 개인식별번호자 ) USI : Universal Subscriber Identity odule, 범용사용자식별모듈 6. 보안토큰개요 6.1 가입자소프트웨어와보안토큰간인터페이스모델보안토큰은구현된하드웨어기기에따라 USB 토큰, 스마트카드, USI, ese, microsd 등다양한형태를가진다. 보안토큰하드웨어기기와보안토큰을이용하는플랫폼및가입자소프트웨어간의보안토큰 API(PKCS#11) 의일반적인적용모델은 [ 그림 1] 과같이도식화된다.
[ 그림 2] 공인인증서가입자소프트웨어와보안토큰인터페이스모델 일반적인보안토큰 API 적용모델에서보안토큰 API는보안토큰하드웨어기기와의인터페이스, PKCS#11 라이브러리로구성된다. 하나의보안토큰 API는 [ 그림 1] 과같이다중슬롯을통하여하나이상의보안토큰에대한인터페이스를제공해야한다. 가입자소프트웨어는보안토큰 API를통해보안토큰하드웨어기기를이용하게된다. 가입자소프트웨어와보안토큰 API 간의인터페이스구현은 [PKCS11] 및 [ 부록 7] 의 PKCS#11 자바인터페이스사용예를참조한다. 6.2 보안토큰요구사항보안토큰은전자서명키및전자서명이하드웨어내부에서생성되는기능을제공하여야하며, 이경우암호프로세서 (Crypto-processor) 를이용하여야한다. 보안토큰은인가되지않는사용자또는가입자소프트웨어의접근 이용에적절히대처하기위해 PIN 인증및 PIN 입력오류회수제한기능을갖춰야하며, 입력오류허용회수를초과하는경우해당보안토큰잠금기능을제공하여야한다. 또한, 보안토큰의전자서명생성키등비밀정보는기기외부로노출 유출되지않도록안전성을보장해야한다. 또한차분전력분석기법등공격에대한대비책을
마련해야한다. 다만, 보안토큰외부에서생성된전자서명생성키등을보안토큰에 저장하는것은허용한다. 6.3 구동프로그램요구사항구동프로그램은한개의읽기 / 쓰기세션과다중의읽기세션을반드시지원해야한다. 또한, 구동프로그램은공개키알고리즘으로 SA 1024비트및 2048비트를지원해야하며안전한쓰레드사용을위한 utexes를지원해야한다. 보안토큰 PIN은가입자소프트웨어, 구동프로그램및보안토큰에서입력가능하며, 입력된 PIN을보호하기위해보안토큰과암호채널을생성할수있다. 가입자소프트웨어는시스템에존재하는구동프로그램의위치정보를파악할수있도록 [ 부록 4] 에서명시한환경파일을이용한위치정보관리를지원해야한다. 가입자소프트웨어는 [ 부록 5] 의구동프로그램검증정보를확인하여구동프로그램의무결성및구현적합성을확인할수있다. 가입자소프트웨어에서구동프로그램검증정보확인처리기능의구현은선택사항으로한다. 6.4 공인인증기관요구사항공인인증기관은보안토큰기반으로발급되는공인인증서에는 확장키사용목적확장필드 에보안토큰식별자를추가하여공인인증서를발급하여야한다. 이경우, 공인인증서에추가되는식별자는 id-kisa-hs으로한다. id-kisa-hs OBJECT IDENTIFIE ::= { } iso(1) member-body(2) korea(410) kisa(200004) npki(10) attributes(1) kisa-hs(2) 공인인증기관은보안토큰기반으로공인인증서를발급하기위해서는 [ 부록 5] 의구동프로그램검증정보를확인하여공인인증서발급신청자의보안토큰구동프로그램의무결성및구현적합성을확인하여야한다. 이러한확인결과는 [FC2511] 에서정의하는메시지구조를가지는 ir 메시지의 reginfo 부분에부가정보로입력하여전자서명키가보안토큰기반으로생성되었음을표시하여야한다. reginfo 부분에전자서명키가보안토큰내에서생성되었음을표시하는부가정보로 Attribute 형태는 id-kisa-hs 명칭형식을이용하고, Value 값은공인인
증기관의필요에따라선택적으로사용할수있다. Value 값을사용하지않고자 하는경우, 그값은 NULL 인코딩한다. 7. 보안토큰 API(PKCS#11) 프로파일 본장에서는전자서명인증체계가입자소프트웨어에게구동프로그램기능의호 환성을제공하기위해필요한 PKCS#11 저장객체, 함수, 메커니즘등을정의한다. 7.1 저장객체 (Storage Object) 본규격을준용하는구동프로그램및가입자소프트웨어는저장객체로써, 데이터객체, 인증서객체및키객체를생성하거나처리시부록 1. PKCS#11 객체속성프로파일에서명시한객체속성템플릿을준용하여야한다. 7.1.1 데이터객체 (Data Object) 구동프로그램이 CKA_OBJECT_ID 속성을지원하는경우다수데이터객체를구별하기위해해당객체의 OID를속성값으로사용해야한다. [KCAC.TS.SIVID] 에서정의한난수 () 를저장하는데이터객체가하나이상존재할경우이를구분하기위하여, 구동프로그램은레이블속성 (CKA_LABEL) 을지원해야하며, 이레이블속성에키및인증서객체의식별자로이용되는 CKA_ID 값을 4VID=CKA_ID(16진수표기 ) 와같이표현하여하나이상의데이터객체난수 () 를구분할수있어야한다. 여기서 '4VID' 은 [KCAC.TS.SIVID] 에서정의한난수 () 을위한식별자를나타내며, CKA_ID값은 16진수로표기하고이들의값은 = 로연결한다. 난수 () 는비밀객체속성을가져야한다. 바이오보안토큰구동프로그램이바이오보안토큰등록정보및사용자등록정보를지원하는경우데이터객체를사용하여야한다. 이경우, 구동프로그램은바이오보안토큰등록정보및사용자등록정보를식별하기위해 CKA_LABEL 을지원하여야한다. 바이오보안토큰등록정보의레이블속성 (CKA_LABEL) 은하나이상의보안토큰등록정보를구분할수있도록 DevAuth= 일련번호 로표기한다 ( 이경우 일련번호 는 1바이트 16진수로표기하고 DevAuth 와 = 로연결한다 ). 또한, 사용자등록정보의레이블속성 (CKA_LABEL) 은법인의경우 Corporation, 개인의경우 Person 으로표기한다.
CKA_VALUE 에표기되는바이오보안토큰등록정보및사용자등록정보는비밀 객체속성을가져야한다. 7.1.2 인증서객체 (Certificate Object) 인증서는공개객체이며하나이상의인증서를구분하기위하여키및인증서객 체의식별자로이용되는 CKA_ID 속성을지원해야한다. 7.1.3 키객체 (Key Object) 키객체는개인키, 공개키, 비밀키를저장하기위하여이용되며, 개인키및비밀키객체는비밀객체속성을가져야한다. 하나이상의개인키구분을위해키및인증서객체의식별자로이용되는 CKA_ID 속성을지원해야한다. CKA_ID 속성값은인증서확장필드의소유자키식별자값을사용할것을권고한다. 공개키는공개객체이며하나이상의공개키를구분하기위하여키및인증서객체의식별자로이용되는 CKA_ID 속성을지원해야한다. 개인키및공개키객체는인증서에명시된키사용목적에부합하는속성을가져야하며부록 1. PKCS#11 객체속성프로파일을준용해야한다. 7.2 함수본절에서는전자서명인증체계가입자소프트웨어가보안토큰의기능을이용하기위해구동프로그램이지원해야하는함수및반환값을정의하며, 구동프로그램은부록 2. 보안토큰API(PKCS#11) 함수프로파일및부록 6. 보안토큰 API(PKCS#11) 반환값프로파일을각각준용하여야한다. 보안토큰의초기화, 자원해제, 일반적인정보획득의기능함수로, 구동프로그램은 C_initialize, C_Finalize, C_GetInfo, C_GetFunctionList를지원해야한다. 보안토큰의슬롯및토큰에대한정보획득, 토큰이지원할수있는메커니즘집합획득등토큰과슬롯간의연결관리기능함수로, 구동프로그램은 C_GetSlotList, C_GetSlotInfo, C_GetTokenInfo, C_GetechanismList, C_GetechanismInfo를지원해야한다.
보안토큰의세션관리기능함수로, 구동프로그램은 C_OpenSession, C_CloseSession, C_CloseAllSessions, C_GetSessionInfo, C_Login, C_Logout을지원해야한다. 보안토큰의객체생성, 객체검색등객체관리기능함수로, 구동프로그램은 C_CreateObject, C_DestroyObject, C_FindObjectsInit, C_FindObjects, C_FindObjectsFinal, C_GetAttributeValue, C_SetAttributeValue 를지원해야한다. 보안토큰의전자서명생성기능함수로, 구동프로그램은 C_SignInit, C_Sign, C_SignUpdate, C_SignFinal 를지원해야한다. 보안토큰의암호키복호화기능함수로, 구동프로그램은 C_DecryptInit, C_Decrypt, C_Unwrap을지원해야한다. 보안토큰의전자서명키쌍생성기능함수로, 구동프로그램은 C_GenerateKeyPair, C_Seedandom, C_Generateandom을지원해야한다. 7.3 메커니즘 (echanism) 본절에서는전자서명인증체계가입자소프트웨어가보안토큰기능을이용하기위해구동프로그램이지원해야하는메커니즘을정의하며, 구동프로그램은부록 3. 보안토큰 API(PKCS#11) 메커니즘프로파일을준용하여야한다. SA 알고리즘을이용한전자서명생성및암호키복호화등의기능을지원하기위해, 구동프로그램은 PKCS#11에기반을둔 CK_SA_PKCS 메커니즘을지원해야한다. 보안토큰의처리용량을고려하여전자문서에대한해쉬값은가입자소프트웨어에서생성또는보안토큰내부에서생성할수있다.
부록 1. 보안토큰 API(PKCS#11) 객체속성프로파일 1. 일반객체 (Common Object Attribute) 속성 데이터타입 내용 처리 CKA_CLASS CK_OBJECT_CLASS Object class o 본프로파일은 CKA_CLASS로다음아래와같은객체를지원해야한다. - CKO_DATA, CKO_CETIFICATE, CKO_PUBLIC_KEY, CKO_PIVATE_KEY o 본프로파일은 CKA_CLASS로다음아래와같은객체지원을권고한다. - CKO_SECET_KEY, CKO_DOAIN_PAAETES 2. 저장객체 (Storage Object) 2.1 저장공통객체 (Common Storage Object Attribute) 속성 데이터타입 내용 처리 CKA_TOKEN CK_BBOOL IF True : 토큰객체, IF False : 세션객체 CKA_PIVATE CK_BBOOL IF True : Private 객체 CKA_ODIFIABLE CK_BBOOL IF True : 객체수정 CKA_LABEL FC2279 string 객체설명 2.2 데이터객체 (Data Object) 속성 데이터타입 내용 처리 CKA_APPLICATION FC2279 String 어플리케이션설명 CKA_OBJECT_ID Byte Array DE 인코딩된 OID(Object identifier) O CKA_VALUE Byte Array 객체값 데이터객체속성템플릿 : CK_OBJECT_CLASS class = CKO_DATA; CK_UTF8CHA label[] = "4VID=FF3082A0..."; CK_UTF8CHA application[] = Accredited PKI Application ; CK_BYTE data[] = Sample data ; CK_BBOOL true = TUE; CK_ATTIBUTE template[] = { {CKA_CLASS, &class, sizeof(class)}, {CKA_TOKEN, &true, sizeof(true)}, {CKA_PIVATE, &true, sizeof(true)}, {CKA_LABEL, label, sizeof(label)-1}, {CKA_APPLICATION, application, sizeof(application)-1}, {CKA_VALUE, data, sizeof(data)} };
바이오보안토큰등록정보데이터객체속성템플릿 ( 바이오보안토큰사용시 ) : CK_OBJECT_CLASS class = CKO_DATA; CK_UTF8CHA label[] = "DevAuth=FF"; CK_UTF8CHA application[] = Accredited PKI Application ; CK_BYTE data[] = "FEDCBA98... ; CK_BBOOL true = TUE; CK_ATTIBUTE template[] = { {CKA_CLASS, &class, sizeof(class)}, {CKA_TOKEN, &true, sizeof(true)}, {CKA_PIVATE, &true, sizeof(true)}, {CKA_LABEL, label, sizeof(label)-1}, {CKA_APPLICATION, application, sizeof(application)-1}, {CKA_VALUE, data, sizeof(data)} }; 법인사용자등록정보데이터객체속성템플릿 ( 바이오보안토큰사용시 ) : CK_OBJECT_CLASS class = CKO_DATA; CK_UTF8CHA label[] = "Corporation"; CK_UTF8CHA application[] = Accredited PKI Application ; CK_BYTE data[] = "7C25... ; CK_BBOOL true = TUE; CK_ATTIBUTE template[] = { {CKA_CLASS, &class, sizeof(class)}, {CKA_TOKEN, &true, sizeof(true)}, {CKA_PIVATE, &true, sizeof(true)}, {CKA_LABEL, label, sizeof(label)-1}, {CKA_APPLICATION, application, sizeof(application)-1}, {CKA_VALUE, data, sizeof(data)} }; 개인사용자등록정보데이터객체속성템플릿 ( 바이오보안토큰사용시 ) : CK_OBJECT_CLASS class = CKO_DATA; CK_UTF8CHA label[] = "Person"; CK_UTF8CHA application[] = Accredited PKI Application ; CK_BYTE data[] = "AFFBC... ; CK_BBOOL true = TUE; CK_ATTIBUTE template[] = { {CKA_CLASS, &class, sizeof(class)}, {CKA_TOKEN, &true, sizeof(true)}, {CKA_PIVATE, &true, sizeof(true)}, {CKA_LABEL, label, sizeof(label)-1}, {CKA_APPLICATION, application, sizeof(application)-1}, {CKA_VALUE, data, sizeof(data)} }; 2.3 인증서객체 (Certificate Object) 2.3.1 X.509 인증서공통객체 (Common X.509 Certificate Object Attribute)
속성데이터타입내용처리 CKA_CETIFICATE_TYPE CK_CETIFICATE_TYPE 인증서타입 CKA_TUSTED CK_BBOOL 어플리케이션은신뢰된인증서로간주 O CKA_TUSTED 속성은특정어플리케이션에의해설정되어져서는안되며, 토큰을초기화할 때설정되어야함. 2.3.2 X.509 공개키인증서객체 (X.509 Public Key Certificate Object Attribute) 속성 데이터타입 내용 처리 CKA_SUBJECT Byte Array DE 인코딩된인증서가입자이름 CKA_ID Byte Array Key identifier(public/private) CKA_ISSUE Byte Array DE 인코딩된인증서발급자이름 O CKA_SEIAL_NUBE Byte Array DE 인코딩된인증서일련번호 O CKA_VALUE Byte Array BE 인코딩된인증서 X.509 공개키인증서객체속성템플릿 : CK_OBJECT_CLASS class = CKO_CETIFICATE; CK_CETIFICATE_TYPE certtype = CKC_X_509; CK_UTF8CHA label[] = LABEL 명 ; CK_BYTE subject[] = {...}; CK_BYTE id[] = {123}; CK_BYTE certificate[] = {...}; CK_BBOOL true = TUE; CK_BBOOL false = FALSE; CK_ATTIBUTE template[] = { {CKA_CLASS, &class, sizeof(class)}, {CKA_CETIFICATE_TYPE, &certtype, sizeof(certtype)}; {CKA_TOKEN, &true, sizeof(true)}, {CKA_LABEL, label, sizeof(label)-1}, {CKA_SUBJECT, subject, sizeof(subject)}, {CKA_ID, id, sizeof(id)}, {CKA_PIVATE, false, sizeof(false)}, {CKA_VALUE, certificate, sizeof(certificate)} }; 2.3.3 X.509 속성인증서객체 (X.509 Attribute Certificate Object Attribute) 속성 데이터타입 내용 처리 CKA_OWNE Byte Array DE 인코딩된속성인증서소유자이름 CKA_AC_ISSUE Byte Array DE 인코딩된속성인증서발급자이름 O KA_SEIAL_NUBE Byte Array DE 인코딩된인증서일련번호 O CKA_ATT_TYPES Byte Array BE 인코딩된속성 OID O CKA_VALUE Byte Array BE 인코딩된속성인증서
속성인증서를사용할경우위속성인증서의객체속성을준용할것을권고함. X.509 속성인증서객체템플릿 : CK_OBJECT_CLASS class = CKO_CETIFICATE; CK_CETIFICATE_TYPE certtype = CKC_X_509_ATT_CET; CK_UTF8CHA label[] = "An attribute certificate object"; CK_BYTE owner[] = {...}; CK_BYTE certificate[] = {...}; CK_BYTE subject[] = {...}; CK_BYTE id[] = {123}; CK_BBOOL true = TUE; CK_BBOOL false = FALSE; CK_ATTIBUTE template[] = { {CKA_CLASS, &class, sizeof(class)}, {CKA_CETIFICATE_TYPE, &certtype, sizeof(certtype)}; {CKA_TOKEN, &true, sizeof(true)}, {CKA_LABEL, label, sizeof(label)-1}, {CKA_OWNE, owner, sizeof(owner)}, {CKA_SUBJECT, subject, sizeof(subject)}, {CKA_ID, id, sizeof(id)}, {CKA_PIVATE, false, sizeof(false)}, {CKA_VALUE, certificate, sizeof(certificate)} }; 2.4 키객체 (Key Object) 2.4.1 키공통객체 (Common Key Attribute) 속성 데이터타입 내용 처리 CKA_KEY_TYPE CKA_KEY_TYPE 키타입 CKA_ID Byte Array KEY Identifier CKA_STAT_DATE CK_DATE 키의유효시작날짜 - CKA_END_DATE CK_DATE 키의유효만료날짜 - CKA_DEIVE CK_BBOOL IF TUE : 키유도지원 O CKA_LOCAL CK_BBOOL IF TUE : 토큰내에서키생성 O CKA_KEY_GEN_ECHANIS CK_ECHANIS_TYPE 키생성메카니즘 Identifier O 보안토큰 API 키속성과 X.509V3 인증서와의 apping Table
공개키 / 개인키를위한 X.509 v3 인증서 Key Usage dataencipherment digitalsignature, keycertsign, clsign digitalsignature, keycertsign, clsign keyagreement keyencipherment nonepudiation nonepudiation 공개키 / 개인키를위한보안토큰 API 속성 CKA_ENCYPT CKA_VEIFY CKA_VEIFY_ECOVE CKA_DEIVE CKA_WAP CKA_VEIFY CKA_VEIFY_ECOVE 2.4.2 공개키객체 (Public Key Object) 2.4.2.1 공개키공통객체 (Common Public Key Object Attribute) 속성 데이터타입 내용 처리 CKA_SUBJECT Byte array DE 인코딩된소유자이름 CKA_ENCYPT CK_BBOOL 암호화 O CKA_VEIFY CK_BBOOL 부가형전자서명검증 CKA_VEIFY_ECOVE CK_BBOOL 복원형전자서명검증 O CKA_WAP CK_BBOOL 키암호화 CKA_TUSTED CK_BBOOL 신뢰되는키 O CKA_VEIFY 속성은전자서명검증공개키에설정되어야하며, CKA_WAP 속성은암호키 분배공개키에설정되어야함. 2.4.2.2 SA 공개키객체 (SA Public Key Object Attribute) 속성 데이터타입 내용 처리 CKA_ODULUS Big integer odulus n CKA_ODULUS_BITS CK_ULONG n의길이 ( 비트 ) CKA_PUBLIC_EXPONENT Big integer Public exponent e SA 공개키객체템플릿 (C_GenerateKeyPair 함수이용시 ) : CK_OBJECT_CLASS class = CKO_PUBLIC_KEY; CK_KEY_TYPE keytype = CKK_SA; CK_UTF8CHA label[] = An SA public key object ; CK_BYTE exponent[] = {...}; CK_ULONG bits = 1024; CK_BYTE id[] = {123}; CK_BBOOL true = TUE; CK_BBOOL false = FALSE; CK_ATTIBUTE template[] = { {CKA_CLASS, &class, sizeof(class)}, {CKA_KEY_TYPE, &keytype, sizeof(keytype)},
{CKA_TOKEN, &true, sizeof(true)}, {CKA_LABEL, label, sizeof(label)-1}, {CKA_ID, id, sizeof(id)}, {CKA_WAP, &false, sizeof(false)}, {CKA_ENCYPT, &false, sizeof(false)}, {CKA_ODULUS_BITS, &bits, sizeof(bits)}, {CKA_PIVATE, false, sizeof(false)}, {CKA_VEIFY, true, sizeof(true)}, {CKA_PUBLIC_EXPONENT, exponent, sizeof(exponent)} }; SA공개키객체템플릿 (C_CreateObject 함수이용시 ) : CK_OBJECT_CLASS class = CKO_PUBLIC_KEY; CK_KEY_TYPE keytype = CKK_SA; CK_UTF8CHA label[] = An SA public key object ; CK_BYTE exponent[] = {...}; CK_BYTE modulus[] = {...}; CK_BYTE subject[] = {...}; CK_BYTE id[] = {123}; CK_BBOOL true = TUE; CK_BBOOL false = FALSE; CK_ATTIBUTE template[] = { {CKA_CLASS, &class, sizeof(class)}, {CKA_KEY_TYPE, &keytype, sizeof(keytype)}, {CKA_TOKEN, &true, sizeof(true)}, {CKA_LABEL, label, sizeof(label)-1}, {CKA_ID, id, sizeof(id)}, {CKA_WAP, &false, sizeof(false)}, {CKA_ENCYPT, &false, sizeof(false)}, {CKA_ODULUS, modulus, sizeof(modulus)}, {CKA_SUBJECT, subject, sizeof(subject)}, {CKA_PIVATE, false, sizeof(false)}, {CKA_VEIFY, true, sizeof(true)}, {CKA_PUBLIC_EXPONENT, exponent, sizeof(exponent)} }; 전자서명검증공개키에는 CKA_VEIFY 를 TUE 로설정하고, CKA_WAP 및 CKA_ENCYPT 을 FALSE 로설정하여야함 암호키분배공개키에는 CKA_VEIFY 를 FALSE 로설정하고, CKA_WAP 및 CKA_ENCYPT 을 TUE 로설정하여야함 2.4.2.3 EC 공개키객체 (Elliptic Curve Public Key Object Attribute) 속성 데이터타입 내용 처리 CKA_EC_PAAS (CKA_ECDSA_PAAS) Byte Array DE인코딩된 ASNI X9.62 파라메터값 CKA_EC_POINT Byte Array DE인코딩된 ASNI X9.62 ECPoint 값 Q EC 공개키를사용할경우위객체속성을준용할것을권고함.
EC 공개키객체템플릿 (C_CreateObject 함수이용시 ) : CK_OBJECT_CLASS class = CKO_PUBLIC_KEY; CK_KEY_TYPE keytype = CKK_EC; CK_UTF8CHA label[] = An EC public key object ; CK_BYTE ecparams[] = {...}; CK_BYTE ecpoint[] = {...}; CK_BBOOL true = TUE; CK_ATTIBUTE template[] = { {CKA_CLASS, &class, sizeof(class)}, {CKA_KEY_TYPE, &keytype, sizeof(keytype)}, {CKA_TOKEN, &true, sizeof(true)}, {CKA_LABEL, label, sizeof(label)-1}, {CKA_EC_PAAS, ecparams, sizeof(ecparams)}, {CKA_EC_POINT, ecpoint, sizeof(ecpoint)} }; 2.4.3 개인키객체 (Private Key Object) 2.4.3.1 개인키공통객체속성 (Common Private Key Object Attribute) 속성 데이터타입 내용 처리 CKA_SUBJECT Byte Array DE인코딩된인증서소유자이름 CKA_SENSITIVE CK_BBOL TUE : Plain-Text 형태로 Export 불가 CKA_SECONDAY_AUTH CK_BBOL IF TUE : 두번의인증요구 O CKA_AUTH_PIN_FLAGS CK_FLAGS IF TUE : 두번의 PIN 인증, IF FALSE : 속성값 0 O CKA_DECYPT CK_BBOL TUE : 복호화 O CKA_SIGN CK_BBOL TUE : 부가형전자서명 CKA_SIGN_ECOVE CK_BBOL IF TUE : 복원형전자서명 O CKA_UNWAP CK_BBOL TUE : 키복호화 CKA_EXTACTABLE CK_BBOL FALSE : 키의 Export 불가 CKA_ALWAYS_SENSITIVE CK_BBOL IF TUE : 항상 Plain-Text 형태로 Export 불가 O CKA_NEVE_EXTACTABLE CK_BBOL IF TUE : 키가 Plain-Text 형태로나오지않음 CKA_SIGN 속성은전자서명생성개인키에설정되어야하며, CKA_UNWAP 속성은암호 키분배개인키에설정되어야함. 2.4.3.2 SA 개인키객체 (SA Private Key Object Attribute) 속성 데이터타입 내용 처리 CKA_ODULUS Big integer odulus n CKA_PUBLIC_EXPONENT Big integer Public exponent e CKA_PIVIATE_EXPONENT Big integer Private exponent d CKA_PIE_1 Big integer Prime p CKA_PIE_2 Big integer Prime q
속성데이터타입내용처리 CKA_EXPONENT_1 Big integer Private exponent d modulo p-1 CKA_EXPONENT_2 Big integer Private exponent d modulo p-2 CKA_COEFFICIENT Big integer CT coefficient q-1mod p SA 개인키객체템플릿 (C_GenerateKeyPair 함수이용시 ) : CK_OBJECT_CLASS class = CKO_PIVATE_KEY; CK_KEY_TYPE keytype = CKK_SA; CK_UTF8CHA label[] = "LABEL 명 " ; CK_BYTE id[] = {123}; CK_BBOOL true = TUE; CK_BBOOL false = FALSE; CK_ATTIBUTE template[] = { {CKA_CLASS, &class, sizeof(class)}, {CKA_KEY_TYPE, &keytype, sizeof(keytype)}, {CKA_TOKEN, &true, sizeof(true)}, {CKA_LABEL, label, sizeof(label)-1}, {CKA_ID, id, sizeof(id)}, {CKA_SENSITIVE, &true, sizeof(true)}, {CKA_DECYPT, &false, sizeof(false)}, {CKA_SIGN, &true, sizeof(true)}, {CKA_UNWAP, &false, sizeof(false)}, {CKA_PIVATE, &true, sizeof(true)}, }; SA 개인키객체템플릿 (C_CreateObject 함수이용시 ) : CK_OBJECT_CLASS class = CKO_PIVATE_KEY; CK_KEY_TYPE keytype = CKK_SA; CK_UTF8CHA label[] = "LABEL 명 " ; CK_BYTE subject[] = {...}; CK_BYTE id[] = {123}; CK_BYTE modulus[] = {...}; CK_BYTE publicexponent[] = {...}; CK_BYTE privateexponent[] = {...}; CK_BYTE prime1[] = {...}; CK_BYTE prime2[] = {...}; CK_BBOOL true = TUE; CK_BBOOL false = FALSE; CK_BYTE exponent1[] = {...}; CK_BYTE exponent2[] = {...}; CK_BYTE coefficient[] = {...}; CK_ATTIBUTE template[] = { {CKA_CLASS, &class, sizeof(class)}, {CKA_KEY_TYPE, &keytype, sizeof(keytype)}, {CKA_TOKEN, &true, sizeof(true)}, {CKA_LABEL, label, sizeof(label)-1}, {CKA_SUBJECT, subject, sizeof(subject)}, {CKA_ID, id, sizeof(id)},
{CKA_SENSITIVE, &true, sizeof(true)}, {CKA_SIGN, &true, sizeof(true)}, {CKA_UNWAP, &false, sizeof(false)}, {CKA_DECYPT, &false, sizeof(false)}, {CKA_PIVATE, &true, sizeof(true)}, {CKA_ODULUS, modulus, sizeof(modulus)}, {CKA_PUBLIC_EXPONENT, publicexponent, sizeof(publicexponent)}, {CKA_PIVATE_EXPONENT, privateexponent, sizeof(privateexponent)}, {CKA_PIE_1, prime1, sizeof(prime1)}, {CKA_PIE_2, prime2, sizeof(prime2)}, {CKA_EXPONENT_1, exponent1, sizeof(exponent1)}, {CKA_EXPONENT_2, exponent2, sizeof(exponent2)}, {CKA_COEFFICIENT, coefficient, sizeof(coefficient)} }; 전자서명생성개인키에는 CKA_SIGN을 TUE로설정하고, CKA_UNWAP 및 CKA_DECYPT 을 FALSE 로설정하여야함 암호키분배개인키에는 CKA_SIGN 을 FALSE 로설정하고, CKA_UNWAP 및 CKA_DECYPT 을 TUE 로설정하여야함 2.4.3.3 EC 개인키객체속성 (Elliptic Curve Private Key Object Attribute) 속성 데이터타입 내용 처리 CKA_EC_PAAS (CKA_ECDSA_PAAS) Byte Array DE인코딩된 ASNI X9.62 파라메터값 CKA_VALUE Big integer ASNI X9.62 개인키값 d EC 개인키를사용할경우위객체속성을준용할것을권고함. EC 개인키객체템플릿 (C_CreateObject 함수이용시 ) : CK_OBJECT_CLASS class = CKO_PIVATE_KEY; CK_KEY_TYPE keytype = CKK_EC; CK_UTF8CHA label[] = An EC private key object ; CK_BYTE subject[] = {...}; CK_BYTE id[] = {123}; CK_BYTE ecparams[] = {...}; CK_BYTE value[] = {...}; CK_BBOOL true = TUE; CK_BBOOL false = FALSE; CK_ATTIBUTE template[] = { {CKA_CLASS, &class, sizeof(class)}, {CKA_KEY_TYPE, &keytype, sizeof(keytype)}, {CKA_TOKEN, &true, sizeof(true)}, {CKA_LABEL, label, sizeof(label)-1}, {CKA_SUBJECT, subject, sizeof(subject)}, {CKA_ID, id, sizeof(id)}, {CKA_SENSITIVE, &true, sizeof(true)}, {CKA_DEIVE, &true, sizeof(true)},
{CKA_PIVATE, & true, sizeof(true)}, {CKA_EC_PAAS, ecparams, sizeof(ecparams)}, {CKA_VALUE, value, sizeof(value)} }; 2.4.4 비밀키객체 (Secret Key Object) 속성 데이터타입 내용 처리 CKA_SENSITIVE CK_BBOL IF TUE : 민감한정보 CKA_ENCYPT CK_BBOL IF TUE : 암호화 CKA_DECYPT CK_BBOL IF TUE : 복호화 CKA_SIGN CK_BBOL IF TUE : 부가형서명 - CKA_VEIFY CK_FLAGS IF TUE : 부가형서명검증 - CKA_WAP CK_BBOL IF TUE : 키암호화 CKA_UNWAP CK_BBOL IF TUE : 키복호화 CKA_EXTACTABLE CK_BBOL IF TUE : 키의 Export 지원 CKA_ALWAYS_SENSITIVE CK_BBOL IF TUE : 항상 Plain-Text 형태로 Export 불가 O CKA_NEVE_EXTACTABLE CK_BBOL IF TUE : 키의 Export 지원절대금지 O 2.4.4.1 비밀키공통객체 (Common Secret Key Object) 비밀키객체를사용할경우위객체속성을준용할것을권고함. 2.4.4.2 3DES 비밀키객체 (3DES secret key objects) 속성데이터타입내용처리 CKA_VALUE Byte Array 키값 3DES 비밀키객체템플릿 : CK_OBJECT_CLASS class = CKO_SECET_KEY; CK_KEY_TYPE keytype = CKK_DES3; CK_UTF8CHA label[] = A DES3 secret key object ; CK_BYTE value[24] = {...}; CK_BBOOL true = TUE; CK_ATTIBUTE template[] = { {CKA_CLASS, &class, sizeof(class)}, {CKA_KEY_TYPE, &keytype, sizeof(keytype)}, {CKA_TOKEN, &true, sizeof(true)}, {CKA_LABEL, label, sizeof(label)-1}, {CKA_PIVATE, & true, sizeof(true)}, {CKA_ENCYPT, &true, sizeof(true)}, {CKA_DECYPT, &true, sizeof(true)}, {CKA_VALUE, value, sizeof(value)} };
2.4.4.3 SEED 비밀키객체 (SEED secret key objects) 속성데이터타입내용처리 CKA_VALUE Byte Array 키값 SEED 비밀키객체템플릿 : CK_OBJECT_CLASS class = CKO_SECET_KEY; CK_KEY_TYPE keytype = CKK_SEED; CK_UTF8CHA label[] = A SEED secret key object ; CK_BYTE value[24] = {...}; CK_BBOOL true = TUE; CK_ATTIBUTE template[] = { {CKA_CLASS, &class, sizeof(class)}, {CKA_KEY_TYPE, &keytype, sizeof(keytype)}, {CKA_TOKEN, &true, sizeof(true)}, {CKA_LABEL, label, sizeof(label)-1}, {CKA_PIVATE, & true, sizeof(true)}, {CKA_ENCYPT, &true, sizeof(true)}, {CKA_DECYPT, &true, sizeof(true)}, {CKA_VALUE, value, sizeof(value)} };
부록 2. 보안토큰 API(PKCS#11) 함수프로파일 API 함수정의 내용 처리 기본목적 (General Purpose) C_Initialize 보안토큰 API를초기화 C_Finalize 보안토큰 API와연관된다양한자원을해제 C_GetInfo 보안토큰 API에대한일반적인정보를획득 C_GetFunctionList 지원하는보안토큰 API 함수집합을획득 슬롯 & 토큰관리 (Slot and Token anagement) C_GetSlotList 시스템에있는슬롯집합을획득 C_GetSlotInfo 특정슬롯에관한정보를획득 C_GetTokenInfo 특정토큰에관한정보를획득 C_WaitForSlotEvent 슬롯이벤트 ( 토큰추가, 제거 ) 발생에따른대기상태 O C_GetechanismList 토큰이지원하는메커니즘집합을획득 C_GetechanismInfo 특정메커니즘에관한정보를획득 C_InitToken 토큰초기화 O C_InitPIN 사용자 PIN 초기화 O C_SetPIN 사용자 PIN 수정 O 세션관리 (Session anagement) C_OpenSession 응용시스템과토큰간의연결을생성 C_CloseSession 세션을종료 C_CloseAllSessions 특정토큰과연관된모든세션을종료 C_GetSessionInfo 세션에대한정보획득 C_GetOperationState 세션의암호오퍼레이션상태획득 O C_SetOperationState 세션암호오퍼레이션상태수정 O C_Login 토큰에로그인 C_Logout 토큰으로부터로그아웃 객체관리 (Object management) C_CreateObject 객체생성 C_CopyObject 복사본객체생성 O C_DestroyObject 객체파기 C_GetObjectSize 객체사이즈획득 O C_GetAttributeValue 객체속성획득 C_SetAttributeValue 객체속성수정 C_FindObjectInit 객체검색초기화 C_FindObjects 객체검색 C_FindObjectsFinal 객체검색종료 암호화 (Encryption) C_EncryptInit 암호화기능을초기화 O C_Encrypt 단일부분에대한암호화수행 O C_EncryptUpdate 다중부분에대한암호화수행 O
API 함수정의 내용 처리 C_EncryptFinal 다중부분에대한암호화수행종료 O 복호화 (Encryption) C_DecryptInit 복호화기능초기화 C_Decrypt 단일암호화부분에대한복호화수행 C_DecryptUpdate 다중암호화부분에대한복호화수행 O C_DecryptFinal 다중암호화부분에대한복호화수행종료 O 메시지압축 (essage Digesting) C_DigestInit 메시지압축수행초기화 O C_Digest 단일부분데이터압축수행 O C_DigestUpdate 다중부분에대한압축수행 O C_DigestKey 키압축수행 O C_DigestFinal 다중부분에대한압축수행종료 O 전자서명및 AC (Signing & ACing) C_SignInit 서명기능을초기화 C_Sign 단일부분서명을수행 C_SignUpdate 다중부분에대한서명수행 O C_SignFinal 다중부분에대한서명수행종료 O C_SignecoverInit 복원형서명기능초기화 O C_Signecover 복원형서명수행 O 전자서명및 AC 검증 C_VerifyInit 검증기능을초기화 O C_Verify 단일부분서명에대한검증을수행 O C_VerifyUpdate 다중부분에대한검증수행 O C_VerifyFinal 다중부분에대한검증종료 O C_VerifyecoverInit 복원형검증기능초기화 - C_Verifyecover 복원형검증기능수행 - Dual-purpose cryptographic C_DigestEncryptUpdate 압축및암호화수행 O C_DecryptDigestUpdate 복호화및압축수행 O C_SignEncryptUpdate 서명및암호화수행 O C_DecryptVerifyUpdate 복호화및검증수행 O 키관리 (Key anagement) C_GenerateKey 비밀키혹은도메인파라미터생성 O C_GenerateKeyPair 비대칭키쌍생성 C_WrapKey 키암호화 O C_UnWrapKey 키복호화 C_DeriveKey 기본키로부터키호출 (Vendor-defined) - 렌덤넘버생성 (andom Number Generation) C_Seedandom seed 값추가 C_Generateandom 랜덤혹은의사랜덤을생성
API 함수정의 내용 처리 Parallel 함수관리 (Parallel function 관리 ) C_GetFunctionStatus Legacy 함수는항상 CK_FUNCTION_NOT_PAALLEL 리턴함 - C_CancelFunction Legacy 함수는항상 CK_FUNCTION_NOT_PAALLEL 리턴함 -
부록 3. 보안토큰 API(PKCS#11) 메커니즘프로파일 SA 메카니즘 CK_SA_PKCS 메카니즘정의내용처리 PKCS#1 Version1.5 에정의된 SA 암호시스템과블록형식에기반한메커니즘 CK_SA_PKCS_KEY_PAI_GEN PKCS#1 에정의된 SA 키를생성하는메커니즘 CK_SA_PKCS_OAEP PKCS#1 Version2.0 에정의된 SA 암호시스템과블록형식에기반한메커니즘 CK_SHA1_SA_PKCS SHA-1 해쉬알고리즘에기반한전자서명메커니즘 O CK_SHA256_SA_PKCS SHA256 해쉬알고리즘에기반한전자서명메커니즘 O ECDSA 메카니즘 CK_ECDSA_PKCS_KEY_PAI_GEN 키를생성하는메커니즘 O CK_SHA1_ECDSA_PKCS SHA-1 해쉬알고리즘에기반한전자서명메카니즘 O ECDH 메카니즘 CK_ECDH1_DEIVE ANSI X9.63 에기반한키유도메카니즘 O CK_ECDH1_COFACTO_DEIVE ANSI X9.63 에기반한 ECDH 키유도메카니즘 O CK_ECDH1_COFACTO_DEIVE ANSI X9.63 에기반한 Cofactor ECDH 키유도메카니즘 O Block cipher 메커니즘 CK_DES3_GEN 블록 Cipher 키생성메커니즘 O CK_DES3_ECB ECB(Electronic codebook) 메커니즘 ( 암 / 복호화 ) O CK_DES3_CBC CBC(Cipher-block chaining) 메커니즘 ( 암 / 복호화 ) O CK_DES3_CBC_PAD CBC_PAD (PKCS Padding 이추가된 Cipher-block chaining) 메커니즘 ( 암 / 복호화 ) CK_DES3_AC_GENEAL General-legnth ACing 메커니즘 ( 서명 / 검증 ) O CK_DES3_AC General ACing 메커니즘 ( 서명 / 검증 ) O CK_SEED_GEN 블록 Cipher 키생성메커니즘 O CK_SEED_ECB ECB(Electronic codebook) 메커니즘 ( 암 / 복호화 ) O CK_SEED_CBC CBC(Cipher-block chaining) 메커니즘 ( 암 / 복호화 ) O CK_SEED_CBC_PAD CBC_PAD (PKCS Padding 이추가된 Cipher-block chaining) 메커니즘 ( 암 / 복호화 ) CK_AIA_KEY_GEN 블록 Cipher 키생성메커니즘 O CK_AIA_ECB ECB(Electronic codebook) 메커니즘 ( 암 / 복호화 ) O CK_AIA_CBC CBC(Cipher-block chaining) 메커니즘 ( 암 / 복호화 ) O CK_AIA_CBC_PAD CBC_PAD (PKCS Padding 이추가된 Cipher-block chaining) 메커니즘 ( 암 / 복호화 ) CK_AIA_AC_GENEAL General-legnth ACing 메커니즘 ( 서명 / 검증 ) O CK_AIA_AC General ACing 메커니즘 ( 서명 / 검증 ) O CK_AES_KEY_GEN 블록 Cipher 키생성메커니즘 O CK_AES_ECB ECB(Electronic codebook) 메커니즘 ( 암 / 복호화 ) O CK_AES_CBC CBC(Cipher-block chaining) 메커니즘 ( 암 / 복호화 ) O CK_AES_CBC_PAD CBC_PAD (PKCS Padding 이추가된 Cipher-block chaining) 메 O O O O O
메카니즘정의내용처리 커니즘 ( 암 / 복호화 ) CK_AES_AC_GENEAL General-legnth ACing 메커니즘 ( 서명 / 검증 ) O CK_AES_AC CK_SHA_1 FIPS PUB 180-1 에정의된해쉬메커니즘 O CK_SHA_1_HAC_GENEAL General-length SHA-1-HAC 메커니즘 O CK_SHA_1_HAC SHA-1-HAC 메커니즘 O CK_SHA_1_KEY_DEIVATION SHA-1 Key 유도메커니즘 O SHA-256 메커니즘 CK_SHA256 FIPS PUB 180-2 에정의된해쉬메커니즘 O CK_SHA256_HAC_GENEAL General-length SHA-256-HAC 메커니즘 O CK_SHA256_HAC SHA-256-HAC 메커니즘 O CK_SHA256_KEY_DEIVATION SHA-256 Key 유도메커니즘 O PKCS#5 and PKCS#5-style password-based encryption 메커니즘 CK_PKCS5_PBKD2 PKCS#5 에정의된패스워드기반암호화키생성메커니즘 O PKCS#12 password-based encryption/authentication 메커니즘 CK_PBE_SHA1_DES3_EDE_CBC 3DES 를이용한패스워드기반암호화메커니즘 O CK_PBE_SHA1_SEED_EDE_CBC SEED 를이용한패스워드기반암호화메커니즘 O CK_PBA_SHA1_WITH_SHA1_HAC Salt 와패스워드로부터 160bit secret 키를생성하기위한메커니즘 O
부록 4. 환경파일을이용한보안토큰구동프로그램위치정보관리 1. 위치정보관리보안토큰 API와관련한구동프로그램이설치되어있는위치정보및구동프로그램에대한정보를관리하기위해환경파일을이용한다. 환경파일의파일명및위치는다음의 [ 표 1] 과같이정의한다. 스마트폰등모바일플랫폼과같이구동프로그램이별도로설치및제공되지않고모바일앱의구성모듈로존재하는경우구동프로그램위치정보관리가필요치않으며, 별도의환경파일을구성하지않는다. 데스크톱 플랫폼 구분 Windows 계열 Unix, Linux 계열 ac 환경파일 %SYSTE%\npki_pkcs11.cnf ( 사용자계정 )/.npki_pkcs11.cnf ( 사용자계정 )/.npki_pkcs11.cnf [ 표 1] 보안토큰구동프로그램환경파일 2. 환경파일구성환경파일은 [PKCS#11.Driver] 섹션으로시작하며, 하나의키 (Driver) 로구성된다. Driver에는하위섹션명이나열되며하나이상의하위섹션명은공백문자로구분한다. 하위섹션명은보안토큰제품정보 (ID) 를사용한다. 하위섹션명은네개의키 (Info, Name, Programs, SignatureToken) 로구성된다. Info에는구동프로그램정보와구동프로그램버전정보를나열하며두정보는 : 로구분한다. 단, 바이오보안토큰의경우구동프로그램정보앞에 BIO_ 를연접하여사용하고모바일토큰의경우 obile_ 을연접하여사용한다. Name은보안토큰 API 관련구동프로그램위치정보및구동프로그램명이며, Programs에기타보안토큰관련구동프로그램위치정보및구동프로그램명을나열하며하나이상의구동프로그램은, 로구분한다. SignatureToken은구동프로그램검증정보의위치정보및파일명을기입하며, 보안토큰구동프로그램검증정보는공인인증체계기술규격에적합한보안토큰에대해서만생성된다.
3. 환경파일 (npki_pkcs11.cnf) 예제 [PKCS#11.Driver] // 섹션 Driver=Vid_0000&Pid_0001 Vid_0001&Pid_0001 Vid_0002&Pid_0001 USI_001// 하위섹션명 [Vid_0000&Pid_0001] // 하위섹션명 Info=KISA Token:0.0.0.1 //Info 키 Name=C:\Program Files\pkcs11.dll //Name 키 Programs=C:\Program Files\cert.dll,C:\Program Files\device.sys [Vid_0001&Pid_0001] Info=KISA Token2:0.0.0.2 Name=C:\Windows\npki_pkcs11.dll Programs=C:\Program Files\cert1.dll,C:\Program Files\device1.sys SignatureToken=C:\Program Files\Vid_0001&Pid_0001.der [Vid_0002&Pid_0001] Info=BIO_KISA Token3:0.0.0.3 Name=C:\Program Files\npki2_pkcs11.dll Programs=C:\Program Files\cert2.dll,C:\Program Files\device2.sys SignatureToken=C:\Program Files\Vid_0002&Pid_0001.der [USI_0001] Info=obile_KISA Token4:0.0.0.4 Name=C:\Program Files\usim\npki3_pkcs11.dll Programs=C:\Program Files\usim\cert3.dll,C:\Program Files\usim\device3.sys SignatureToken=C:\Program Files\usim\USI_0001.der
부록 5. 보안토큰구동프로그램검증정보처리 1. 보안토큰구동프로그램검증정보보안토큰구동프로그램검증정보 ( 이하검증정보 ) 는해당플랫폼에설치된구동프로그램의무결성및구현적합성을확인할수있는정보로써, SignatureValue의 DE 인코딩값으로구성된다. 2. 검증정보확인가입자소프트웨어는 [ 부록 4.] 환경파일위치정보를통해검증정보파일의위치를확인하고, 해당검증정보의해쉬값 (hashvalue) 및전자서명값 (signature) 검증을통해구동프로그램의무결성및구현적합성을확인할수있다. 특히, 전자서명값검증은해당플랫폼에설치된최상위인증기관인증서또는정보통신망을통해안전하게획득한최상위인증기관인증서를통해검증하여야한다. 모바일플랫폼의경우 [ 부록 4] 의구동프로그램위치정보환경파일을사용하지않으며, 구동프로그램이모바일앱의구성모듈로사용되는경우별도의검증정보를사용하지않는다. 3. 검증정보 ASN.1 ClientHS DEFINITIONS ::= BEGIN IPOTS -- Imports from FC 3280 [POFILE], Appendix A.1 AlgorithmIdentifier, Certificate, CertificateList, CertificateSerialNumber, Name FO PKIX1Explicit88 { iso(1) identified-organization(3) dod(6) internet(1) security(5) mechanisms(5) pkix(7) mod(0) pkix1-explicit(18) }; SignatureToken ::= SEQUENCE { drivername PrintableString, -- 보안토큰구동프로그램 DLL 이름 hashid AlgorithmIdentifier, -- 해쉬알고리즘 hashvalue OCTET STING -- 보안토큰구동프로그램 DLL에대한해쉬값으로, 가입자소프트웨어는 -- 시스템에설치된 drivername의 DLL을입력값으로해쉬하여 hashvalue와
} -- 비교함으로서사용자 PC 에설치된무결성을검증 SignerAndSerialNumber ::= SEQUENCE { issuer Name, serialnumber CertificateSerialNumber } SignatureValue ::= SEQUENCE { tobesigned SEQUENCE OF SignautreToken, -- 보안토큰구동프로그램 DLL이여러 DLL로구성되어있을경우 -- 각 DLL에대한무결성을보증하기위해 SEQUENCE OF로구성 signaturealgorithm AlgorithmIdentifier, -- 전자서명알고리즘의 OID signerandserialnumber SignerAndSerialNumber, -- 전자서명생성자의 (KISA 3280 루트인증서 ) signature OCTET STING -- tobesigned에대한전자서명값 } END
부록 6. 보안토큰 API(PKCS#11) 반환값프로파일 종류반환값및내용처리 일반 세션 보안토큰 순차수행 utex CK_OK 보안토큰이성공적으로기능을수행 CK_GENEAL_EO 보안토큰에어떠한복구불가능한에러가발생하였음을의미함. CK_HOST_EOY, CK_FUNCTION_FAILED 와함께발생하는경우, CK_GENEAL_EO 가우선반환됨 CK_HOST_EOY 보안토큰구동프로그램을구동하는컴퓨터에메모리가부족할경우발생 CK_FUNCTION_FAILED 보안토큰구동프로그램특정함수의기능이수행될수없을경우발생. 해당함수가세션을사용하였다면 CK_SESSION_INFO 구조체의 uldeviceerror 항목에서오류발생원인을찾을수있음 CK_SESSION_HANDLE_INVALID 함수가호출될당시해당세션핸들이유효하지않을경우발생하는오류임. CK_DEVICE_EOVED, CK_SESSION_CLOSED 와함께발생하는경우, CK_SESSION_HANDLE_INVALID 가우선반환됨 CK_DEVICE_EOVED 보안토큰이함수실행도중제거될경우발생 CK_SESSION_CLOSED 세션이함수도중종료된경우발생 CK_DEVICE_EOY 보안토큰에메모리가부족할경우발생. CK_DEVICE_EO, CK_DEVICE_EOVED 와함께발생하는경우, CK_DEVICE_EOY 가우선반환됨 CK_DEVICE_EO 보안토큰또는슬롯에어떠한문제가발생할경우발생 CK_DEVICE_EOVED 보안토큰이함수실행도중제거될경우발생 CK_TOKEN_NOT_PESENT 보안토큰이함수실행시점에존재하지않을경우발생 CK_CANCEL 보안토큰구동프로그램이가입자 S/W 와함께기능을상호순차적으로수행할때, 가입자 S/W 가 CK_CANCEL 를반환하면보안토큰구동프로그램은 CK_FUNCTION_CANCEL 을반환한다. CK_UTEX_BAD utex 를처리하는함수가잘못된 mutex 객체를전달받을경우발생
종류반환값및내용처리 입출력 CK_UTEX_NOT_LOCKED utex 잠김을해제하고자하는함수가해당 mutex 가잠겨있지않음을발견할경우발생 CK_AGUENTS_BAD 보안토큰구동프로그램으로전달되는함수인자가잘못돼있을경우발생 CK_ATTIBUTE_EAD_ONLY 가입자 S/W 가변경할수없는속성의값을변경하고자하는경우발생 CK_ATTIBUTE_TYPE_INVALID 가입자 S/W 가템플릿에유효하지않는속성타입을명시하여함수를호출하는발생 CK_BUFFE_TOO_SALL 가입자 S/W 의버퍼메모리가작아서보안토큰구동프로그램결과를전달할수없는경우발생 CK_CANT_LOCK C_Initialize 함수에만해당하는오류로써, 가입자 S/W 가안전한기능수행을위해 thread-safety Locking 을요청하였는데, 보안토큰구동프로그램이해당기능을제공하지않을경우발생 CK_CYPTOKI_ALEADY_INITIALIZED C_Initialize 함수에만해당하는오류로써, 보안토큰구동프로그램이이미초기화되어있음을의미 CK_CYPTOKI_NOT_INITIALIZED C_Initialize 및 C_GetFunctionList 이외의함수에해당하는오류로써, 보안토큰구동프로그램이초기화되지않는상황임을의미 CK_DATA_INVALID 보안토큰구동프로그램에입력되는입력값이유효하지않을경우발생. CK_DATA_LEN_ANGE 보다낮은우선순위를가짐. 단, 본반환값은 CK_SA_X_509 메커니즘에만해당 CK_DATA_LEN_ANGE 보안토큰구동프로그램에입력되는입력값의길이가유효하지않을경우발생 CK_DOAIN_PAAS_INVLALID 유효하지않거나지원되지않는도메인파라미터가보안토큰구동프로그램에입력되는경우발생 CK_ENCYPTED_DATA_INVALID 복호화함수에입력되는암호문이유효하지않을경우발생. CK_ENCYPTED_DATA_LEN_ANGE 보다낮은우선순위를가짐 CK_ENCYPTED_DATA_LEN_ANGE 복호화함수에입력되는암호문의길이가유효하지않을경우발생. CK_FUNCTION_CANCELED
종류반환값및내용처리 보안토큰구동프로그램이가입자 S/W 와함께기능을상호순차적으로수행할때, 가입자 S/W 가 CK_CANCEL 를반환하면보안토큰구동프로그램은 CK_FUNCTION_CANCEL 을반환한다. 보호된경로를통한 PIN 입력수행도중발생할수있음 CK_FUNCTION_NOT_PAALLEL 지정된세션에 parallel 로시행되는함수가없음을알림, C_GetFunctionStatus 와 C_CancelFunction. 에의해반환됨 CK_FUNCTION_NOT_SUPPOTED 해당함수가구동프로그램에서지원되지않을경우발생 CK_INFOATION_SENSITIVE 정보가민감하여제공되어질수없음을나타냄 CK_KEY_CHANGED 기존에저장된키가변경되었음을알림 CK_KEY_FUNCTION_NOT_PEITTED 허가되지않은키의속성을사용하고자했을때나타나는메시지 CK_KEY_HANDLE_INVALID 키를위한핸들이유효하지않을때발생 CK_KEY_INDIGESTIBLE C_DigestKey 함수에만해당하는메시지로써, 지정된키의값이특정이유로인해받아질수없을때발생 CK_KEY_NEEDED C_SetOperationState 함수에만해당하는메시지로써, 하나이상의키가있어야하는데없기때문에발생 CK_KEY_NOT_NEEDED 해당사항이없는키가추가적으로제공되었을경우발생 CK_KEY_NOT_WAPPABLE CKA_UNEXTACTABLE 속성이 TUE 로설정되어있지않더라도, 보안토큰구동프로그램은해당키를 Wrap 할수없음 CK_KEY_SIZE_ANGE 요청된 cryptographic 처리과정이원칙상문제가없어도키사이즈가범위밖일경우발생 CK_KEY_TYPE_INCONSISTENT 지정된키가해당메커니즘의키가아닐경우발생 CK_KEY_UNEXTACTABLE CKA_UNEXTACTABLE 속성이 TUE 로설정되어있기때문에, 해당개인키또는비밀키는 Wrap 될수없음 CK_ECHANIS_INVALID 지정되지않거나지원되지않는메커니즘사용시발생 CK_ECHANIS_PAA_INVALID
종류반환값및내용처리 유효하지않는메커니즘매개변수가사용될경우발생 CK_NEED_TO_CEATE_THEADS C_Initialize 가새로운 thread 를만들수없는상황, library 가제역할을하지못해새로운 thread 를만들수없을때발생 (C_Initialize 에만해당하는메시지 ) CK_NO_EVENT C_GetSlotEvent 함수에만해당하는메시지로써, non-blocking 모드에서 C_GetSlotEvent 호출되고새로운슬롯이벤트가없을때발생 CK_OBJECT_HANDLE_INVALID 지정된 object 핸들이유효하지않을때발생 CK_OPEATION_ACTIVE 이미처리과정이진행되고있어지정된처리과정을진행시키지못하게될때발생 CK_OPEATION_NOT_INITIALIZED 해당세션에해당하는적절한타입의액티브한실행이일어나지않을경우발생 CK_PIN_EXPIED 지정된 PIN 이만료되고요청된처리가 PIN 값이바뀔때까지실행되지않음 CK_PIN_INCOECT 저장된 PIN 과일치하지않을경우발생 CK_PIN_INVALID 지정된 PIN 에유효하지않는문자가존재할경우발생 CK_PIN_LEN_ANGE 지정된 PIN 이너무길거나너무짧을경우발생 CK_PIN_LOCKED 지정된 PIN 이 lock 되어있다. 보안토큰이인증과정중더이상의과정을허용치않을때발생 CK_ANDO_NO_NG 지정된토큰이랜덤변수생성기가없을때발생. CK_ANDO_SEED_NOT_SUPPOTED 보다높은우선순위를가짐 CK_ANDO_SEED_NOT_SUPPOTED 보안토큰의랜덤변수생성기가응용프로그램으로부터 seeding 을받지않고자할때발생. 본메시지는 C_Seedandom 함수에의해서만이용. CK_SAVED_STATE_INVALID 제공된저장된암호화처리상태가유효하지않아, 지정된세션에저장될수없을경우발생 CK_SESSION_COUNT
종류반환값및내용처리 세션을열려는시도가실패할경우발생. C_OpenSession 함수에서만이용. CK_SESSION_EXISTS 토큰이있는세션이이미열려있음 CK_SESSION_PAALLEL_NOT_SUPPOTED parallel 세션을지원하지않음. C_OpenSession 함수에서만이용. CK_SESSION_EAD_ONLY 읽기만허용되는세션임을설명. CK_TOKEN_WITE_POTECTED 보다낲은우선순위를가짐 CK_SESSION_EAD_ONLY_EXISTS 읽기세션이이미존재하여 SO 가 logged in 되지않음 CK_SESSION_EAD_WITE_SO_EXISTS 읽기 / 쓰기세션이이미존재, 읽기세션은열리지않음 CK_SIGNATUE_LEN_ANGE 전자서명길이가유효하지않을경우발생. CK_SIGNATUE_INVALID 보다우선순위를가짐 CK_SIGNATUE_INVALID 전자서명값이유효하지않을경우발생 CK_SLOT_ID_INVALID 지정된슬롯아이디가유효하지않을경우발생 CK_STATE_UNSAVEABLE 단순히토큰이현상태를저장하지못할경우발생. CK_OPEATION_NOT_INITIALIZED 보다낮은우선순위를가짐 CK_TEPLATE_INCOPLETE object 를만들기위해지정된템플릿이미완성되고필요한요소들이부족한상황일경우발생 CK_TEPLATE_INCONSISTENT object 를만들기위해지정된템플릿에충돌요소가존재할경우발생 CK_TOKEN_NOT_ECOGNIZED 슬롯에있는토큰을인식하지못할경우발생 CK_TOKEN_WITE_POTECTED 보안토큰에쓰기보호가되어있어업무를수행하지못할경우발생. CK_SESSION_EAD_ONLY 보다높은우선순위를가짐 CK_UNWAPPING_KEY_HANDLE_INVALID 다른키를풀 (Unwrap) 려고사용되는키핸들이유효하지않을경우발생 CK_UNWAPPING_KEY_SIZE_ANGE 제공된키의키사이즈가허용범위를넘어선경우발생 CK_UNWAPPING_KEY_TYPE_INCONSISTENT 메커니즘이맞지않아키를풀수없을경우발생
종류반환값및내용처리 바이오보안토큰관리 CK_USE_ALEADY_LOGGED_IN 이미로그인한상태를알림 CK_USE_ANOTHE_ALEADY_LOGGED_IN 다른사용자가로그인하여로그인이안됨 CK_USE_NOT_LOGGED_IN 로그인을하지않아작업이수행되지않을경우발생 CK_USE_PIN_NOT_INITIALIZED 사용자의핀이초기화되지않을경우발생 CK_USE_TOO_ANY_TYPES 보안토큰이수용할수있는이상의동시접속이이루어질때발생 CK_USE_TYPE_INVALID CK_USE_TYPE 에유효하지않는값이입력되었을경우발생 CK_WAPPED_KEY_INVALID 제공된 wrapped key 가유효하지않을경우발생 CK_WAPPED_KEY_LEN_ANGE wrapped key 의길이가유효하지않을경우발생. CK_WAPPED_KEY_INVALID 보다낮은우선순위를가짐 CK_WAPPING_KEY_HANDLE_INVALID 다른키를 wrap 하기위한키핸들이유효하지않을경우발생 CK_WAPPING_KEY_SIZE_ANGE 키길이로인해 wrapping 에러난경우발생 CK_WAPPING_KEY_TYPE_INCONSISTENT 지정되지않은메카니즘으로 wrap 한경우발생 CK_BIO_FINGE_AUTH_NEEDED 지문인증없이카드사용 CK_BIO_SENSO_EO 지문센서 H/W 에러 CK_BIO_NO_FINGE_INFO 지문템플릿없음. 지문정보가등록되어있지않아오류발생 CK_BIO_SENSO_TIEOUT 지문센서타임아웃 CK_BIO_FINGE_AUTH_FAILED 지문인증실패 CK_BIO_NO_FINGE_AUTH_ID 지문인증 ID 없음 CK_BIO_FINGE_ALGO_FAILED 지문알고리즘비정상종료 CK_BIO_INVALID_USE
종류반환값및내용처리 사용자등록정보불일치 바이오보안토큰 API 반환값헤더파일 : #define CK_BIO_FINGE_AUTH_NEEDED #define CK_BIO_SENSO_EO #define CK_BIO_NO_FINGE_INFO #define CK_BIO_SENSO_TIEOUT #define CK_BIO_FINGE_AUTH_FAILED #define CK_BIO_NO_FINGE_AUTH_ID #define CK_BIO_FINGE_ALGO_FAILED #define CK_BIO_INVALID_USE 0x89000001 0x89000002 0x89000003 0x89000004 0x89000005 0x89000006 0x89000007 0x89000008 바이오보안토큰관리와관련된반환값처리요구사항 '' 은바이오보안토큰구동프로그램의 경우 '' 으로처리한다.
부록 7. PKCS#11 사용예 1. 개요공인인증서사용자가공인인증서저장매체로보안토큰을이용할수있도록가입자소프트웨어에서 PKCS#11 관련기능을구현할때참고할수있도록구현예를제공한다. 2. PKCS#11 헤더 include 표준규격 API를이용하여구현하기위해서는 cryptoki 헤더파일을 include 시켜야한다. - PKCS#11 v2.20 이후버전 #include cryptoki.h - PKCS#11 v2.20 이전버전 #include pkcs11.h 3. 토큰세션열기 // 출력값 CK_SESSION_HANDLE hsession; /* 토큰과의세션핸들 */ // ------------------------------------------------------------------------------ // 변수선언 CK_V nv = CK_OK; /* 에러코드확인 */ unsigned long i = 0; unsigned long ulslotcnt = 0; /* 토큰이꽂혀있는슬롯의개수 */ unsigned long pslotlist[5]; /* 토큰이꽂혀있는슬롯목록 */ CK_TOKEN_INFO tokeninfo; /* 토큰정보 */ // PKCS11 모듈초기화 if ((nv = C_Initialize(NULL_PT))!= CK_OK) goto FINISH; // 토큰이꽂혀있는슬롯의개수확인 if ((nv = C_GetSlotList(TUE, NULL_PT, &ulslotcnt))!= CK_OK) goto FINISH; if (ulslotcnt <= 0) goto FINISH;
// 토큰이꽂혀있는슬롯목록획득 if ((nv = C_GetSlotList(TUE, pslotlist, &ulslotcnt))!= CK_OK) goto FINISH; // 각슬롯의토큰정보를확인하여사용할토큰선택 for (i=0; i<ulslotcnt; i++) { if ((nv = C_GetTokenInfo(pSlotList[i], &tokeninfo))!= CK_OK) goto FINISH; } // 획득한토큰정보출력 // 사용하고자하는토큰선택 (index) // 세션열기 nv = C_OpenSession(pSlotList[index], CKF_W_SESSION CKF_SEIAL_SESSION, &papplication, NULL_PT, &hsession); goto FINISH; FINISH: C_Finalize(NULL_PT); return nv; 4. 토큰에있는인증서목록중사용하고자하는인증서선택 // 입력값 CK_SESSION_HANDLE hsession; /* 토큰과의세션핸들 (2. 단계에서획득 ) */ // 출력값 ( 인증서, keyid) CK_BYTE poutcert[3072], poutkeyid[32]; CK_ULONG loutcertlen = 0, loutkeyidlen = 0; //----------------------------------------------------------------------------------- // 변수선언 CK_V nv = CK_OK; /* 에러코드확인 */ Unsigned long i = 0; CK_OBJECT_HANDLE hcertary[15]; /* 인증서객체핸들목록 */ Unsigned long ulcertcnt = 0; /* 인증서개수 */ /* 인증서검색을위한템플릿선언 */ CK_OBJECT_CLASS certobject = CKO_CETIFICATE; CK_CETIFICATE_TYPE x509cert = CKC_X_509; CK_ATTIBUTE px509certtemplate[] = { {CKA_CLASS, &certobject, sizeof(certobject)}, {CKA_CETIFICATE_TYPE, &x509cert, sizeof(x509cert)}}; /* 인증서, keyid 획득을위한템플릿선언 */
BYTE pcertval[2200] = {0x00, }; BYTE pkeyid[20] = {0x00, }; CK_ATTIBUTE pvaluetemplate[] = { {CKA_VALUE, pcertval, 0}, {CKA_ID, pkeyid, 0}}; // 인증서객체를찾기위한초기화 if ((nv = C_FindObjectsInit(hSession, px509certtemplate, 2))!= CK_OK) goto FINISH; if ((nv = C_FindObjects(hSession, hcertary, 15, &ulcertcnt))!= CK_OK) goto FINISH; for (i=0; i<ulcount; i++) { // 템플릿초기화 pvaluetemplate[0].ulvaluelen = sizeof(pcertval); CK_OK) } if ((nv = C_GetAttributeValue(hSession, hcertary[i], pvaluetemplate, 1))!= goto FINISH; // 획득한인증서사용자선택을위해보여줌 // 인증서 : pvaluetemplate[0].pvalue, pvaluetemplate[0].ulvaluelen // 사용하고자하는인증서선택 (index) // 선택된인증서와 keyid 리턴 // keyid 는인증서와쌍인개인키, 공개키, 랜덤값을찾는데사용됨. pvaluetemplate[0].ulvaluelen pvaluetemplate[1].ulvaluelen = sizeof(pcertval); = sizeof(pkeyid); if ((nv = C_GetAttributeValue(hSession, hcertary[index], pvaluetemplate, 2))!= CK_OK) goto FINISH; memcpy(poutcert, pvaluetemplate[0].pvalue, pvaluetemplate[0].ulvaluelen); loutcertlen = pvaluetemplate[0].ulvaluelen; memcpy(poutkeyid, pvaluetemplate[1].pvalue, pvaluetemplate[1].ulvaluelen); loutkeyidlen = pvaluetemplate[1].ulvaluelen; FINISH: C_FindObjectsFinal(hSession); return nv;
5. 선택한인증서를이용한서명 // 입력값 CK_SESSION_HANDLE hsession; /* 토큰과의세션핸들 (2. 단계에서획득 ) */ unsigned char keyid[20]; /* 인증서의 keyid 값 (3. 단계에서획득 ) */ CK_ECHANIS_TYPE hashalg; /* 서명시사용할해쉬알고리즘 */ unsigned char *pdata; /* 서명하고자하는원본 */ int ndatalen; /* 서명하고자하는원본길이 */ // 출력값 ( 서명값 ) CK_BYTE out[1024]; CK_ULONG outlen = 0; //-------------------------------------------------------------------------------------- // 변수선언 CK_V nv = CK_OK; /* 에러코드확인 */ CK_OBJECT_HANDLE hprikeyary[5]; /* 개인키객체핸들목록 */ Unsigned long ulprikeycnt = 0; /* 개인키개수 */ CK_KEY_TYPE key_type = 0; /* 개인키종류 ( 알고리즘 ) */ CK_ATTIBUTE pkeytypetmpl[] = {{ CKA_KEY_TYPE, &key_type, sizeof(ck_key_type) }}; /* keyid에해당하는개인키핸들획득 */ CK_OBJECT_CLASS objprikey = CKO_PIVATE_KEY; CK_ATTIBUTE pprikeytemplate[] = { {CKA_CLASS, &objprikey, sizeof(objprikey)}, { CKA_ID, &keyid, sizeof(keyid)}}; // 개인키객체를찾기위한초기화 if ((nv = C_FindObjectsInit(hSession, pprikeytemplate, 2))!= CK_OK) goto FINISH; if ((nv = C_FindObjects(hSession, hprikeyary, 5, &ulprikeycnt))!= CK_OK) goto FINISH; // 해당 keyid 와일치하는개인키개수확인 // E_NOT_EXIST, E_KEY_ID_COINCIDE 에러값정의 if (ulprikeycnt == 0) { nv = E_NOT_EXIST; goto FINISH; } else if (ulpriikeycnt!= 1) { nv = E_KEY_ID_COINCIDE, goto FINISH; } // 개인키알고리즘확인 if ((nv = C_GetAttributeValue(hSession, hprikeyary[0], pkeytypetmpl, 1))!= CK_OK) goto FINISH; if (key_type == CKK_SA) { // SA 서명인경우많은보안토큰들이해쉬알고리즘을이용한서명이아닌 // SA_PKCS 즉, SA 개인키암호화를지원하므로원본메시지에대한 DigestInfo
// 구성후개인키암호화수행한다. CK_BYTE pdigestinfo[100]; CK_ULONG ldigestinfolen = 0; if ((nv = akedigestinfo(data, pdata, ndatalen, &pdigestinfo, &ldigestinfolen))!= CK_OK) goto FINISH; CK_ECHANIS mechanism = { CK_SA_PKCS, NULL, 0 }; if ((nv = C_SignInit(hSession, goto FINISH; &mechanism, hprikeyary[0]))!= CK_OK) CK_OK) } else { if ((nv = C_Sign(hSession, pdigestinfo, ldigestinfolen, out, &outlen))!= goto FINISH; CK_ECHANIS signech = { 0, 0, 0 }; if (hashalg == CK_SHA_1) signech.mechanism = CK_KCDSA_SHA1; else if (nhash == ALGID_HS_SHA256) signech.mechanism = CK_KCDSA_SHA256; else { // E_INVALID_HASH_ALG 값정의 nv = E_INVALID_HASH_ALG; goto FINISH; } } FINISH: if ((nv = C_SignInit(m_hSession, goto FINISH; if ((nv = C_Sign(hSession, pdata, goto FINISH; &signech, hprikeyary[0]))!= CK_OK) ndatalen, psign, &lsignlen))!= CK_OK) C_FindObjectsFinal(hSession); return nv; int akedigestinfo(ck_echanis_type hashalg, unsigned char *pdata, int ndatalen, unsigned char **pdigestinfo, int *pdigestinfolen) { CK_V nv = CK_OK; /* 에러코드확인 */ CK_BYTE pdigest[32]; CK_ULONG ldigestlen = 32;
CK_OK) CK_ECHANIS hashech = { hashalg, 0, 0 }; C_DigestInit(m_hSession, &hashech); if ((nv = C_Digest(m_hSession, pdata, ndatalen, pdigest, &ldigestlen))!= return nv; 0x60, } // 지원되는각해쉬알고리즘의 DigestInfo 구성을위한헤더정보 static const BYTE SHA1_PADDING[] = {0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14 }; static const BYTE SHA256_PADDING[] = {0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20 }; if (hashalg == CK_SHA_1) { memcpy(pdigestinfo, 0, SHA1_PADDING, sizeof(sha1_padding)); memcpy(pdigestinfo, sizeof(sha1_padding), pdigest, ldigestlen); *pdigestinfolen = sizeof(sha1_padding) + ldigestlen; } else if (nhash == ALGID_HS_SHA256) { memcpy(pdigestinfo, SHA256_PADDING, sizeof(sha256_padding)); memcpy(pdigestinfo, sizeof(sha256_padding), pdigest, ldigestlen); *pdigestinfolen = sizeof(sha256_padding) + ldigestlen; } else { // E_INVALID_HASH_ALG 값정의 return E_INVALID_HASH_ALG; } return 0; 6. 본인확인을위한랜덤값획득 // 입력값 CK_SESSION_HANDLE hsession; /* 토큰과의세션핸들 (2. 단계에서획득 ) */ unsigned char keyid[20]; /* 인증서의 keyid 값 (3. 단계에서획득 ) */ // 출력값 ( 랜덤값 ) unsigned char out[32]; int outlen = 0; //-------------------------------------------------------------------------------------- // 변수선언 CK_OBJECT_CLASS objdata = CKO_DATA; CK_ATTIBUTE datatemplate = { CKA_CLASS, & objdata, sizeof(ck_object_class)}; CK_OBJECT_HANDLE hary[10]; CK_ULONG ulcount = 0;
CK_ULONG i = 0; CK_BYTE plabel[512] = {0x00, }; CK_BYTE pandom[64]; // 찾고자하는 random 값의라벨을만든다. sprintf(plabel, "4VID=%s", tohexstring(keyid)); // data 객체의개수확인 if ((nv = C_FindObjectsInit(hSession, &datatemplate, 1))!= CK_OK) goto FINISH; if ((nv = C_FindObjects(hSession, hary, 10, &ulcount))!= CK_OK) goto FINISH; if (ulcount == 0) { nv = DATA_OBJ_NOT_EXIST; goto FINISH; } // data 객체중라벨이동일한객체를찾는다. for (i = 0; i<ulcount; i++) { CK_BYTE ckalabel[32]; CK_ATTIBUTE randomtemplate = {{CKA_LABEL, (CK_VOID_PT) ckalabel, sizeof(ckalabel)}, {CKA_VALUE, pandom, sizeof(pandom)}}; CK_OK) if ((nv = C_GetAttributeValue(hSession, hary[i], &randomtemplate, 2))!= goto FINISH; } FINISH: // 라벨값비교 ( 대소문자구분하지않음 ) if ((randomtemplate[0].ulvaluelen == strlen(plabel)) && (_memicmp(randomtemplate[0].pvalue, (char*)plabel, randomtemplate[0].ulvaluelen) == 0)) { // 동일한라벨에해당하는객체의값즉, 랜덤값을리턴한다. memcpy(out, randomtemplate[1].pvalue, randomtemplate[1].ulvaluelen); outlen = randomtemplate[1].ulvaluelen; return 0; } C_FindObjectsFinal(hSession); return nv;
부록 8. PKCS#11 자바인터페이스사용예 1. 개요 1.1. 인터페이스모델자바를이용하여가입자소프트웨어를구현하는경우, 보안토큰이용을위해자바에서지원하는 Sun PKCS#11 Provider와 IB, IAIK 등써드파티의솔루션을이용할수있다. 본규격에서는성능및플랫폼상의제한을받지않는한 Sun PKCS#11 Provider의이용을권장한다. C/C++ 등으로구현된 PKCS#11 네이티브라이브러리를이용하기위해아래와같이자바 Wrapper 클래스와 Wrapper 네이티브모듈로구성된 PKCS#11 Wrapper와 PKCS#11 SPI를갖춘 JCA/JCE 프로바이더를이용할수있다. 또한, 직접자바를이용하여 PKCS#11 라이브러리를구현하여이용되는경우에도 PKCS#11 Wapper 등을구성하여 JCA/JCE 프로바이더와동일한인터페이스를유지할수있다. 1.2. Sun PKCS#11 Provider 자바기반의가입자소프트웨어구현시보안토큰과관련한부분은 Sun PKCS#11 Provider 를참고한다. 자바 5.0부터자바플랫폼에서네이티브 PKCS#11 토큰이용을보장하기위해 Sun PKCS#11 Provider가추가되었으며, 이프로바이더는자바기반으로구현된가입자소프트웨어가네이티브 PKCS#11 토큰에접근할수있도록한다. 2. Sun PKCS#11 Provider 사용예
2.1. 프로바이더설정 자바 PKCS#11 프로바이더 (SunPKCS11) 를사용하기위해서는설정파일을이용 하여등록하여사용하거나프로그램에서동적으로등록하여사용가능하다. String pkcs11config = "name = SmartCard" + "library = C:\Windows\system32\pkcs11.dll"; byte[] pkcs11configbyte = pkcs11config.getbyte(); ByteArrayInputStream configstream = new ByteArrayInputStream(pkcs11Config.getByte); Provider pkcs11provider = new sun.security.pkcs11.sunpkcs11(configstream); Security.addProvider(pkcs11Provider); 2.2. 보안토큰로그인 보안토큰을사용하기위해서는자바의키저장객체 (KeyStore) 를프로바이더와 보안토큰비밀번호 (PIN) 를이용하여로딩함으로서보안토큰에로그인가능하다. char[] pin =...; KeyStore ks = KeyStore.getInstance("PKCS11"); ks.load(null, pin); 2.3. 키쌍생성 키쌍을생성하기위해서는 KeyPairGenerator 클래스를프로바이더와알고리즘을 이용하여객체를생성한후 genkeypair 메소드를호출하여키쌍을생성한다. KeyPairGenerator kpg = KeyPairGenerator.getInstance("SA", pkcs11provider); KeyPair kp = kpg.genkeypair(); 2.4. 전자서명생성키불러오기 보안토큰에저장되어있는전자서명생성키를얻기위해서는키저장객체의 getkey() 메소드를이용한다. 키저장객체 (Key store) 에는실제전자서명생성키가
저장되는것이아니라해당키에대한참조값이저장된다. PrivateKey mykey = (PrivateKey)keystore.getKey( 키저장객체명칭, 비밀번호 ); 2.5. 인증서저장및가져오기 getcertificate 및 setcertificate 메소드를호출하여인증서또는인증서체인을 저장하거나가져오기가능하다. 인증서불러오기 Certificate mycert = keystore.getcertificate( 키저장객체명칭 ); 인증서저장 keystore.setcertificateentry( 키저장객체명칭, 인증서객체 ); 2.6. 전자서명생성 Signature 클래스에프로바이더와알고리즘을지정하여인스턴스객체를생성한 후 sign() 메소드를이용하여문자열에대한전자서명을생성한다. Signature sig = Signature.getInstance("SHA256withSA",pkcs11Provider); sig.initsign( 전자서명생성키객체 ); sig.update( 전자서명하고자하는문자열 ); byte[] sigbytes = sig.sign();
부록 8. 규격연혁 버전제 개정일제 개정내역 v1.00 2003 년 9 월 o 암호토큰을위한 PKCS#11 프로파일규격 으로제정 v1.20 2007년 3월 v1.50 2007년 8월 v1.70 2007 년 11월 v1.80 2008 년 10월 v1.90 2009년 9월 v2.00 2010년 7월 v2.10 2012 년 11월 v2.20 2013년 10월 o TTA 정보통신용어사전의토큰표준용어를준용하기위해규격내 암호토큰 을 보안토큰 으로용어변경 o 보안토큰기반공인인증서이용기술규격 으로규격명변경 o 본규격이보안토큰관련표준 API 로이용될수있도록 7.2.1 및 7.2.3 에서개인키외부유출관련규정삭제등 o 공인인증서가입자 S/W 가보안토큰구동프로그램을이용하여객체를생성하거나처리할경우, 해당객체속성템플릿이이용되도록 [ 부록 1.] 준용규정신설 o 공인인증서가입자 S/W 가보안토큰에서발생하는비정상적인오류상황에대해적절히대처할수있도록, 구동프로그램이지원해야하는반환값프로파일준용규정신설 o [ 부록 4] 환경파일을이용한보안토큰구동프로그램위치정보관리의환경파일구성내용변경 o 보안토큰보안기능강화를위해암호프로세서탑재및차분전력분석기법등공격에대비할수있는기능추가 o 공인인증서암호체계고도화에따른알고리즘변경사항반영 o 바이오보안토큰정의 o 바이오보안토큰등록정보및사용자등록정보를위한데이터객체추가 o 바이오보안토큰 API 반환값프로파일추가 o 모바일플랫폼환경의위치정보환경파일및검증정보처리내용추가 o PKCS#11 구현예시추가 o 자바를이용한 PKCS#11 구현예시추가 o 모바일토큰정의및위치정보관리내용추가 o 금융 IC 카드표준개정사항반영