예제
- 인쇄
- PDF
예제
- 인쇄
- PDF
기사 요약
이 요약이 도움이 되었나요?
의견을 보내 주셔서 감사합니다.
VPC 환경에서 이용 가능합니다.
마스터 키와 자식 키를 파생하는 예제를 통해 BIP32 메커니즘을 구현하는 방법을 실습할 수 있습니다.
참고
BIP32 메커니즘 구현은 Thales 공식 문서를 기반으로 작성되었습니다. 사용 가이드에서 안내하는 내용 외에 더 많은 내용을 살펴보려면 BIP32 Mechanism Support and Implementation을 참고해 주십시오.
전제 조건
실습을 시작하기 전, 다음의 전제 조건을 준수해 주십시오.
- 네이버 클라우드 플랫폼 콘솔에서 HSM 생성, 연결 생성 완료
/usr/safenet/lunaclient/samples/source
경로의 main.c 파일을 수정/빌드한 상태로 실습을 수행해야 하므로 main.c 파일을 다운로드- 실습 서버의 사양: centos-7.8-64, [Standard] 2vCPU, 4GB Mem [g1]
테스트 환경 설정
키를 파생하기 전에 다음의 절차를 따라 테스트 환경을 설정해 주십시오.
/usr/safenet/lunaclient/samples/source
의 기존main.c
를 다운로드한 코드로 교체해 주십시오.- 기존
main.c
는 백업해 주십시오.
- 기존
- 코드 12번째 라인의 PASSWORD 변수에 슬롯의 비밀번호(암호화 관리자 비밀번호)를 입력해 주십시오.
make -f Makefile.linux.32
로 빌드해 주십시오.p11Sample
을 실행해 주십시오.
마스터 키 페어 파생
마스터 키 페어를 파생하는 예제는 다음과 같습니다. 파생에 필요한 hSeedKey는 HSM에서 AES 키를 생성하고 C_UnwrapKey()
를 실행하여 사용하였습니다.
CK_RV DeriveMasterKey (CK_SESSION_HANDLE hSession,
CK_OBJECT_HANDLE* hPubKey,
CK_OBJECT_HANDLE* hPriKey
)
{
CK_RV rv=CKR_OK;
CK_BBOOL bToken;
CK_BBOOL bTrue=CK_TRUE;
CK_BBOOL bFalse=CK_FALSE;
CK_CHAR pbLabel[] = "BIP32 MasterKey Derive";
CK_ATTRIBUTE pubTemplate[] =
{
{CKA_TOKEN, &bToken, sizeof(bToken)},
{CKA_PRIVATE, &bTrue, sizeof(bTrue)},
{CKA_DERIVE, &bTrue, sizeof(bTrue)},
{CKA_MODIFIABLE, &bTrue, sizeof(bTrue)},
{CKA_LABEL, pbLabel, strlen(pbLabel)},
};
CK_ATTRIBUTE privTemplate[] =
{
{CKA_TOKEN, &bToken, sizeof(bToken)},
{CKA_PRIVATE, &bTrue, sizeof(bTrue)},
{CKA_SENSITIVE, &bTrue, sizeof(bTrue)},
{CKA_DERIVE, &bTrue, sizeof(bTrue)},
{CKA_EXTRACTABLE, &bFalse, sizeof(bFalse)},
{CKA_MODIFIABLE, &bTrue, sizeof(bTrue)},
{CKA_LABEL, pbLabel, strlen(pbLabel)},
};
CK_BIP32_MASTER_DERIVE_PARAMS mechParams;
mechParams.pPublicKeyTemplate = pubTemplate;
mechParams.ulPublicKeyAttributeCount = ARRAY_SIZE(pubTemplate);
mechParams.pPrivateKeyTemplate = privTemplate;
mechParams.ulPrivateKeyAttributeCount = ARRAY_SIZE(privTemplate);
CK_MECHANISM mechanism = {CKM_BIP32_MASTER_DERIVE, &mechParams, sizeof(mechParams)};
rv = P11Functions->C_DeriveKey(hSession, &mechanism, hUnwrappedKey, NULL, 0, NULL);
if (rv != CKR_OK)
{
printf("DeriveMasterKey rv= 0x%lx\n", rv);
goto doneDeriveMasterKey;
}
// fail if rv != CKR_OK
printf("DeriveMasterKey Done\n");
*hPubKey = mechParams.hPublicKey;
*hPriKey = mechParams.hPrivateKey;
doneDeriveMasterKey:
return rv;
}
하위 리프 키 파생
하위 리프 키를 파생하는 예제는 다음과 같습니다.
CK_RV DeriveChildKeyPair(
CK_SESSION_HANDLE hPrivateSession,
CK_OBJECT_HANDLE hParent,
CK_OBJECT_HANDLE* hPubKey,
CK_OBJECT_HANDLE* hPriKey
) {
CK_RV retCode = CKR_OK;
CK_BBOOL bToken;
CK_BBOOL bTrue=CK_TRUE;
CK_BBOOL bFalse=CK_FALSE;
CK_OBJECT_HANDLE tmpHandle;
CK_CHAR pbLabel[] = "BIP32 Childkey Derive";
CK_ATTRIBUTE pubKeyTemplate[] = {
{CKA_TOKEN, &bToken, sizeof(bToken)},
{CKA_PRIVATE, &bTrue, sizeof(bTrue)},
{CKA_ENCRYPT, &bTrue, sizeof(bTrue)},
{CKA_VERIFY, &bTrue, sizeof(bTrue)},
{CKA_MODIFIABLE, &bTrue, sizeof(bTrue)},
{CKA_LABEL, pbLabel, strlen(pbLabel)},
};
CK_ATTRIBUTE priKeyTemplate[] = {
{CKA_TOKEN, &bToken, sizeof(bToken)},
{CKA_PRIVATE, &bTrue, sizeof(bTrue)},
{CKA_SENSITIVE, &bTrue, sizeof(bTrue)},
{CKA_SIGN, &bTrue, sizeof(bTrue)},
{CKA_DECRYPT, &bTrue, sizeof(bTrue)},
{CKA_MODIFIABLE, &bTrue, sizeof(bTrue)},
{CKA_LABEL, pbLabel, strlen(pbLabel)},
};
CK_ULONG path[] = {
CKF_BIP32_HARDENED | CKG_BIP44_PURPOSE,
CKF_BIP32_HARDENED | CKG_BIP44_COIN_TYPE_BTC,
CKF_BIP32_HARDENED | 1,
CKG_BIP32_EXTERNAL_CHAIN,
0
};
CK_BIP32_CHILD_DERIVE_PARAMS mechParams;
mechParams.pPublicKeyTemplate = pubKeyTemplate;
mechParams.ulPublicKeyAttributeCount = ARRAY_SIZE(pubKeyTemplate);
mechParams.pPrivateKeyTemplate = priKeyTemplate;
mechParams.ulPrivateKeyAttributeCount = ARRAY_SIZE(priKeyTemplate);
mechParams.pulPath = path;
mechParams.ulPathLen = ARRAY_SIZE(path);
CK_MECHANISM mechanism = {CKM_BIP32_CHILD_DERIVE, &mechParams, sizeof(mechParams)};
printf("Derive Child\n");
retCode = P11Functions->C_DeriveKey(hPrivateSession, &mechanism, hParent, NULL, 0, NULL);
if (retCode != CKR_OK)
{
printf("DeriveChildKeyPair retCode 0x%lx\n", retCode);
goto DeriveChildKeyPair;
}
// fail if rv != CKR_OK
printf("DeriveChildKeyPair Done\n");
*hPubKey = mechParams.hPublicKey;
*hPriKey = mechParams.hPrivateKey;
DeriveChildKeyPair:
return retCode;
}
하위 리프 키 확인
제공되는 유틸리티인 ckdemo를 통해 파생된 하위 리프 키를 확인하는 방법은 다음과 같습니다.
- ckdemo를 실행해 주십시오.
- Linux 서버:
cd /usr/safenet/lunaclient/bin
입력 >./ckdemo
입력 - Windows 서버: 클라이언트 설치 경로로 이동(
C:\Program Files\SafeNet\LunaClient
) > ckdemo 실행 파일 더블 클릭
- Linux 서버:
- 옵션 입력란에
1
을 입력하여Open Session
을 실행해 주십시오.Enter your choice : 1 Status: Doing great, no errors (CKR_OK)
- 옵션 입력란에
3
을 입력하여Login
을 실행해 주십시오.Enter your choice : 3 Partition SO [0] Crypto Officer [1] Crypto User [2]: 1 Enter PIN : *********** Status: Doing great, no errors (CKR_OK)
- 옵션 입력란에
27
을 입력하여Display Object
를 실행해 주십시오.- 로그인한 계정의 권한으로 볼 수 있는 모든 객체가 표시됩니다.
- 테스트에서 생성한 Childkey label을 확인할 수 있습니다.
- 개체별 자세한 내용을 보려면 핸들 입력값에 0이 아닌 핸들의 번호를 입력해 주십시오.
Enter your choice : 27 Enter handle of object to display (0 to list available objects) : 0 Handle 175 (0x000000af) -- label: BIP32 Childkey Derive Handle 158 (0x0000009e) -- label: BIP32 Childkey Derive Handle 153 (0x00000099) -- label: BIP32 Seed Handle 150 (0x00000096) -- label: AES Encryption Key Handle 4293918721 (0xfff00001) -- label: Clock Handle 4293918722 (0xfff00002) -- label: Monotonic Counter Handle 4293918720 (0xfff00000) -- label: Partition SO Handle 4293918723 (0xfff00003) -- label: Crypto Officer Handle 4293918724 (0xfff00004) -- label: Crypto User Number of objects found = 9
이 문서가 도움이 되었습니까?