2023년 1월 26일 목요일

Raspberry Pi 4와 Zymbit Zymkey 4i 연동하기

이번 시간에는 Raspberry Pi 4와 i2c 장치인 Zymbit Zymkey 4i HSM(Hardware Security Module)을 연동하는 내용을 다뤄 보고자 한다. 😎



i2c device + HSM(crypto chip)


목차
1. Zymbit Zymkey4i HSM 디바이스 소개
2. Raspberry Pi4에 Zymkey4i 붙이기
3. Zymkey4i API 사용해 보기
4. References

Keyword: Zynkey4i, HSM, i2c

1.  Zymbit Zymkey4i HSM 디바이스 소개

Zymbit Zymkey4i는 아래와 같은 용도로 사용되는 hardware security module이다. HSM이 무엇을 하는 것인지는 아래 site에 잘 설명되어 있으니, 한번 훑어 보시기 바란다.

https://blog.naver.com/PostView.nhn?blogId=mds_datasecurity&logNo=221950138311&parentCategoryNo=&categoryNo=36&viewDate=&isShowPopularPosts=false&from=postView


[그림 1.1] Zymbit Zymkey4i 개요(1)


[그림 1.2] Zymbit Zymkey4i 개요(2)

Zymkey4i는 Raspberry Pi 4와 i2c 통신을 한다. 따라서 Raspberry Pi 4에서는 i2c controller가 사용 가능하도록 enable되어 있어야만 한다.


[그림 1.3] Zymkey4i hardware(1)

[그림 1.4] Zymkey4i hardware(2) - pinmap

Zymkey4i는 Microchip ATECC508A CryptoAuthentication chip(이게 핵심이구먼 😍)을 기반으로 하고 있다.

[그림 1.5] Zymkey4i main MCU - microchip ATECC508A

Microchip ATECC508A CryptoAuthentication chip(ARM Cortex-M0 급) 관련 datasheet는 참고 문헌 [6, 7]을 참고하기 바란다.
참고: 국내 제품 중에 위 chip과 유사한 제품으로 ICTK Holdings 사에서 개발한 PUF(Physically Unclonable Function) G3K가 있다. 😝


__________________________________________________________

<여기서 잠깐>

그렇다면, Microchip ATECC508A를 직접 제어하는 i2c device driver source나 다른 example code는 없을까 ? 우선 Linux kernel source code를 뒤져 보니, 아래 코드가 보인다.

https://github.com/torvalds/linux/blob/master/drivers/crypto/atmel-ecc.c

좀 더 찾아 보니, 아래 site에 Microchip ATECC508A 등을 사용하기 위한 다양 library와 example이 있다.

https://github.com/MicrochipTech/cryptoauthlib

[그림 1.6] Microchip CryptoAuthLib github

[그림 1.7] Microchip CryptoAuthLib library architecture [출처: 참고문헌 9]

개발 보드도 판매한다. Hmm, 조금 비싼 것 같긴 한데, 그래도 한번 구매해서 사용해 보아야겠다 ㅋ.


[그림 1.8] Microchip Cryptochip 관련 개발 board - AT88CKSCKTSOIC-XPRO

참고: chip을 하나 만들었으면, 최소한 이런 정도의 내용은 구비되어 있어야 하지 않을까 ? 그래야 남들이 그 chip을 제대로 사용하지 ... 갑자기 반만을 😂

__________________________________________________________


2. Raspberry Pi4에 Zymkey4i 붙이기

이번 장에서는 Zymjkey4i를 Raspberry Pi 4에 설치하는 과정을 소개하고자 한다. 이 장에서 소개하는 내용은 아래 site의 문서 내용을 기초로 하였다.

https://www.farnell.com/datasheets/2674017.pdf

https://docs.zymbit.com/getting-started/zymkey4/quickstart/


<Zymkey4i setup 절차 요약>
Zymkey4i는 아래와 같은 절차에 따라 h/w & s/w 설치 후, test program을 만들어 돌려 보면 된다.

[1] Installing the hardware : h/w device 장착
Install the battery on the Zymkey4, and connect it to the host single-board computer (SBC).
[2] Establish an I2C connection : raspberry pi 4 i2c 설정 enable
Enable the I2C bus on the host device in order to be able to communicate with the Zymkey.
[3] Install the client software : zymkey s/w package 설치
These utilities provided by Zymbit are necessary to interact with the hardware module.
[4] Test the installation : test program 시험
Your Zymkey is now temporarily bound to your SBC and ready for use in developer mode.

위의 quickstart 문서에 설치 과정이 상세히 요약되어 있으니, 여기에서는 주요 부분만 언급하고 넘어가도록 하자.

a) Zymkey4i h/w 장착하기

아래와 같이 zymkey4i를 Raspberry 확장 pin(처음 10개)에 스르륵 연결한다(꽂는다는 표현이 맞겠다).

[그림 2.1] Zymkey4i를 Raspberry Pi 4에 붙이기(1)



[그림 2.2] Zymkey4i를 Raspberry Pi 4에 붙이기(2)

참고: 문서에는 coin battery가 필요한 것으로 되어 있는데, 없어도 기본 동작에는 (아직까지는) 문제가 없는 것 같다.


다음으로 해 주어야 할 일은 Raspberry Pi 4의 i2c 설정을 enable 시켜 주는 것이다.

$ sudo raspi_config

[그림 2.3] raspberry pi raspi_config 설정 - i2c enable 설정

참고: 위의 설정 대신 raspberry pi 4 cpu BCM2711의 device tree를 직접 수정하는 방법도 생각해 볼 수 있다. 일단 나중에 해 보기로 하고 일단은 pass~

____________________________________________________________

<여기서 잠깐>

Raspberry pi용 linux kernel source를 build 후 사용해 보고 싶다면 어찌해야 하나 ? 아래 site에 관련 내용이 잘 설명되어 있으니, 참조하기 바란다.

http://www.wearedev.net/298?PHPSESSID=6130f2208f35379a121a8f83cd827e6d

Device tree는 아래 파일 내용을 살펴 보아야 한다.
-rw-rw-r-- 1 chyi chyi 10072 Jan 26 18:26 bcm2711-rpi-4-b.dts
-rw-rw-r-- 1 chyi chyi 10199 Jan 26 18:26 bcm2711-rpi-400.dts
-rw-rw-r-- 1 chyi chyi 10915 Jan 26 18:26 bcm2711-rpi-cm4.dts
-rw-rw-r-- 1 chyi chyi  7270 Jan 26 18:26 bcm2711-rpi-cm4s.dts
-rw-rw-r-- 1 chyi chyi  3985 Jan 26 18:26 bcm2711-rpi-ds.dtsi
-rw-rw-r-- 1 chyi chyi  1818 Jan 26 18:26 bcm2711-rpi.dtsi
-rw-rw-r-- 1 chyi chyi 26015 Jan 26 18:26 bcm2711.dtsi
chyi@sun:~/linux/arch/arm/boot/dts$ ls -l bcm2711*

____________________________________________________________


b) Zymkey4i 용 s/w 설치하기
Zymkey4i는 Raspberry Pi에서만 동작하는 모양이다. 아래 방법을 이용하여 설치를 진행하도록 한다.

pi@raspberrypi:~/workspace/zymkey $ curl -G https://s3.amazonaws.com/zk-sw-repo/install_zk_sw.sh | sudo bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5399  100  5399    0     0   6079      0 --:--:-- --:--:-- --:--:--  6073
armv7l
Get:1 http://raspbian.raspberrypi.org/raspbian bullseye InRelease [15.0 kB]
Get:2 http://archive.raspberrypi.org/debian bullseye InRelease [23.6 kB]     
Get:3 http://raspbian.raspberrypi.org/raspbian bullseye/main armhf Packages [13.2 MB]
Get:4 http://archive.raspberrypi.org/debian bullseye/main armhf Packages [311 kB]
Get:5 http://raspbian.raspberrypi.org/raspbian bullseye/contrib armhf Packages [60.2 kB]       
Get:6 http://raspbian.raspberrypi.org/raspbian bullseye/non-free armhf Packages [106 kB]       
Fetched 13.8 MB in 10s (1327 kB/s)                                                             
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
135 packages can be upgraded. Run 'apt list --upgradable' to see them.
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting inotify
  Downloading https://www.piwheels.org/simple/inotify/inotify-0.2.10-py3-none-any.whl (13 kB)
Collecting nose
  Downloading https://www.piwheels.org/simple/nose/nose-1.3.7-py3-none-any.whl (154 kB)
     |████████████████████████████████| 154 kB 186 kB/s 
Installing collected packages: nose, inotify
Successfully installed inotify-0.2.10 nose-1.3.7
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting pycurl
  Downloading https://www.piwheels.org/simple/pycurl/pycurl-7.45.2-cp39-cp39-linux_armv7l.whl (294 kB)
     |████████████████████████████████| 294 kB 127 kB/s 
Installing collected packages: pycurl
Successfully installed pycurl-7.45.2
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting progress
  Downloading https://www.piwheels.org/simple/progress/progress-1.6-py3-none-any.whl (11 kB)
Installing collected packages: progress
Successfully installed progress-1.6
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting python-gnupg
  Downloading https://www.piwheels.org/simple/python-gnupg/python_gnupg-0.5.0-py2.py3-none-any.whl (18 kB)
Installing collected packages: python-gnupg
Successfully installed python-gnupg-0.5.0
done.
Importing Zymbit Packages gpg key... done.
Installing /etc/apt/sources.list.d/zymbit.list...done...Updating now.
Hit:1 http://raspbian.raspberrypi.org/raspbian bullseye InRelease                              
Hit:2 http://archive.raspberrypi.org/debian bullseye InRelease                                 
Get:3 https://s3.amazonaws.com/zk-sw-repo-rc-23.01/apt-repo-bullseye bullseye InRelease [2504 B]
Get:4 https://s3.amazonaws.com/zk-sw-repo-rc-23.01/apt-repo-bullseye bullseye/main armhf Packages [1784 B]
Fetched 4288 B in 2s (2340 B/s)    
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
131 packages can be upgraded. Run 'apt list --upgradable' to see them.
Installing Zymkey Packages...  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11491  100 11491    0     0  13471      0 --:--:-- --:--:-- --:--:-- 13455
Rebooting now...
Connection to 192.168.8.224 closed by remote host.
Connection to 192.168.8.224 closed.


부팅 후, 설치된 내용을 대략적으로 확인해 보면 다음과 같다.

$ ps aux|grep zk
zymbit     784  0.1  0.1  24744  4356 ?        S<sl 08:48   0:00 /usr/bin/zkifc -s /var/lib/zymbit/
참고: zymkey4i는 위와 같이 zkifc라는 daemon이 항상 떠 있는 구조이다.

pi@raspberrypi:~ $ systemctl status zkifc
● zkifc.service - Zymkey Interface Connector
     Loaded: loaded (/etc/systemd/system/zkifc.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-01-23 08:48:36 GMT; 31s ago
    Process: 781 ExecStartPre=/bin/bash -c mkdir -p /run/zkstatus && chown -R zymbit.zymbit /ru>
    Process: 783 ExecStartPre=/bin/sleep 0.5 (code=exited, status=0/SUCCESS)
   Main PID: 784 (zkifc)
      Tasks: 3 (limit: 4915)
        CPU: 172ms
     CGroup: /system.slice/zkifc.service
             └─784 /usr/bin/zkifc -s /var/lib/zymbit/

Jan 23 08:48:35 raspberrypi systemd[1]: Starting Zymkey Interface Connector...
Jan 23 08:48:36 raspberrypi systemd[1]: Started Zymkey Interface Connector.


[그림 2.4] zkifc service start/stop 모습

zkifc daemon을 구동할 때 사용되는 /var/lib/zymbit 디렉토리도 새로 만들어 졌다.

pi@raspberrypi:/var/lib/zymbit $ ls -al
total 20
drwxr-xr-x  4 zymbit zymbit    4096 Jan 20 00:52 .
drwxr-xr-x 27 root   root      4096 Jan 20 00:52 ..
drwx------  2 zymbit zymbit    4096 Jan 25 00:22 32EAF189356E232311B66890A0152E4382BB9A5BE93442DBC11F703A45E9204A
-rw-r--r--  1 root   root       251 Dec 10  2021 ntp_str.json
drwxrwxr-x  3 root   zk_pkcs11 4096 Jan 20 00:52 zk_pkcs11

pi@raspberrypi:/var/lib/zymbit $ sudo ls -l 32EAF189356E232311B66890A0152E4382BB9A5BE93442DBC11F703A45E9204A/
total 8
-rw------- 1 zymbit zymbit  32 Jan 25 00:22 s1_fp_salt.bin
-rw------- 1 zymbit zymbit 600 Jan 26 04:35 state

끝으로, 아래 위치에 C, C++용으로 application을 개발하기 위해 필요한 library와 header 파일이 보인다.

$ cd /lib; ls -l libzk*
lrwxrwxrwx  1 root root     12 Jan 23 08:46 libzk.so -> libzk.so.1.1
-rw-r--r--  1 pi   pi    42244 Sep 23 22:21 libzk.so.1.1
-rw-r--r--  1 root root  54576 Sep 23 22:21 libzkAppUtilsClassCPP.so
-rw-r--r--  1 root root  50328 Sep 23 22:21 libzk_app_utils.so
-rw-r--r--  1 root root 663240 Jan  9  2020 libzk_pkcs11.so

pi@raspberrypi:~/workspace/zymkey/C $ ls -l /usr/include/zymkey/
total 128
-rw-r--r-- 1 root root 58460 Sep 23 22:21 zkAppUtilsClass.h
-rw-r--r-- 1 root root 65060 Sep 23 22:21 zk_app_utils.h
-rw-r--r-- 1 root root   395 Sep 23 22:21 zk_b64.h

지금까지의 내용을 토대로 대략적인 s/w 구조를 예상해 보면 다음과 같다. 

[1] Example(with API & zk library) => zkifc daemon => i2c => zymkey4i(Microchip ATECC508A)
or
[2] Example(with API) => zk library => i2c => zymkey4i(Microchip ATECC508A)



3. Zymkey4i API 사용해 보기

이번 장에서는 아래 site의 내용을 기초로 하여 Zymkey4i API를 사용하는 방법을 소개해 보고자 한다.


a) python example 돌려 보기
우선, Quickstart 문서에 있는 python 예제 코드 2개를 내려 받아 돌려 보도록 한다.

pi@raspberrypi:~/workspace/zymkey $ python3 ./zk_app_utils_test.py 
Testing data lock...
Original Data
01 02 03 04
Encrypted Data
68 4E CE 63 00 00 15 D8 C1 32 59 4C 17 4A 1F 2F
2D 3E 01 1E 7A CF 5C F6 5B 7F CA 54 86 65 2D 7B
7A 74 A8 F0 0A CA 2C 33 6A 1A 15 7D E9 BF 62 E4
C2 06 30 31 75 7E F1 6F 1C 6E CD D3 7C 57 72 5E
1E 33 08 D7 12 83 65 A2 8E 96 FE FA A1 A8 7C 39
8C 56 5C 77 40 85 CC E4
Testing data unlock...
Decryped Data
01 02 03 04
Turning LED on...
Testing get_random() with 512 bytes...
86 D0 64 73 B7 15 1F C5 90 CC 48 A8 A5 80 C2 C3
3F 15 4C EC F5 B4 5D 10 63 B8 D1 FA 4E 88 60 AB
7F 30 51 27 7D C7 71 F9 5E 3D 06 59 C9 8B AF DC
B4 74 68 BA FE 2A 01 B7 82 DA 4E CB D1 4A 96 3F
0C 41 64 CC 72 AA ED C3 93 51 95 B4 47 9F 07 C1
B0 47 1D 18 9A 98 76 6C 20 43 72 AD A3 6A A6 40
BC A3 F3 C6 F0 AE D9 F4 2E 6D 7A 0F A9 7D 08 2E
4C 28 0B D5 DA B7 4A 6C 7C 3B 2C 6D 45 5C 25 D2
B6 90 E2 00 FC 11 09 FF 64 E2 B7 43 E2 86 26 63
6D D1 76 95 3A 5D 32 11 9F 91 0E 66 D5 AD 79 6F
F9 B9 38 86 FE 8B C6 95 29 8C 28 B8 1D 48 54 B6
8F 99 2F DB 95 0E 33 26 BF C9 8A E6 E5 DB 56 F5
BE BC 11 17 2E 0C 8B 56 63 45 5C 81 79 CB 18 8E
FE 7D 69 40 BE 5F A2 71 0F FD 46 F4 0F EB 8D 1F
7C 77 F3 FD 4D E9 5F E2 CB D8 C1 ED AA 1B 2C 87
48 54 43 35 5C A8 35 94 6C BD 5C 7A F1 D9 B3 91
4C CE 0F FE 73 C6 AC 05 F5 67 E6 4B D3 D3 A1 EC
A8 1E 93 E6 A7 AD B9 31 B7 74 91 8A 4A C6 E9 14
F0 95 64 C0 C1 77 1E 0A E3 75 7D B8 D6 77 07 24
7A 30 1E B7 23 B3 90 55 E2 3F E6 E6 C2 6A 82 50
FA 2D 08 9C 3D 71 0A BA 62 A9 D3 D2 A4 58 19 A8
41 E5 49 28 B9 88 6F 8F 38 56 82 17 F2 86 61 36
72 80 8E 32 84 66 C7 FF 82 86 D2 74 AF 87 91 05
97 E5 35 70 38 83 3F 8E F4 BF 7B 21 84 96 78 A7
8B 47 C4 78 3F C2 51 D4 35 89 9A EA A5 8E 52 D8
96 5F 23 4E BA BA 95 81 35 F2 6E B1 B5 2E A4 C7
7B EE D3 8A 69 00 32 D7 44 39 B1 35 D1 47 F7 65
1A 21 01 D4 10 28 F3 38 9F E3 8C 86 7C A2 76 C2
86 4D D8 B1 F2 99 96 61 9E BF 4B 81 A1 22 CE 4B
13 35 0C 98 1E 73 A8 CE A5 DB F0 8D B9 55 42 64
FC 40 03 1C E6 0D F8 21 77 D2 23 C9 4D D1 75 B9
62 71 24 D5 10 89 13 30 D2 3A 72 ED 1E 29 5E 84
Turning LED off...
Flashing LED off, 500ms on, 100ms off...
Testing zkCreateRandDataFile with 1MB...

Turning LED off...
Testing get_ecdsa_public_key()...
38 21 3C 8C E8 3C CF 42 7A EE F5 13 FD 3A 02 3F
C8 80 88 60 73 A5 95 A7 1C C4 C5 C4 21 61 38 17
EC C0 B4 D6 66 FC 66 7D 29 32 E0 1E 21 E8 A2 C1
7F 83 CD 57 5D 2B F7 91 9B D6 14 F3 EB 6D 40 AA
Testing create_ecdsa_public_key_file()...

pi@raspberrypi:~/workspace/zymkey $ python3 ./zk_crypto_test.py 
Signing data...OK
Verifying data...OK
Verifying tainted data...FAIL, yay!
Generating random block from Zymkey (131072 bytes)...
Encrypting random block...
Decrypting encrypted block...
PASS: Decrypted data matches original random data
Done!

뭔가 제대로 동작하는 느낌이다. 이 대목에서 python code 내용 설명은 생략 ~ 😋


b) C API를 이용한 초간단 예제 프로그램 작성하기
아무리 찾아 보아도 API 설명 부분만 있고, C or C++ example code가 안 보인다. 사용하기 쉽게 만들어져 있어서 그런가 추측해 본다. 암튼, API 문서를 참조하여 간단한 예제를 하나 만들어 보도록 하자.

__________________________________________________________________________
#include <stdio.h>
#include <stdlib.h>
#include "zk_app_utils.h"
int main()
{
    zkCTX ctx;
    int ret;

    ret = zkOpen(&ctx);
    if (ret != 0)
        printf("zkOpen() failed\n");
    else
        printf("zkOpen() is OK\n");

    ret = zkCreateRandDataFile(ctx, "./test1.txt", 512);
    if (ret != 0)
        printf("zkCreateRandDataFile() failed\n");
    else
        printf("zkCreateRandDataFile() is OK\n");

    uint8_t *rdata = (uint8_t *)malloc(sizeof(uint8_t) * 512);
    ret = zkGetRandBytes(ctx, &rdata, 512);
    if (ret != 0)
        printf("zkGetRandBytes() failed\n");
    else
        printf("zkGetRandBytes() is OK\n");
    if (rdata)
        free(rdata);

    ret = zkSaveECDSAPubKey2File(ctx, "./publickey", 1);
    if (ret != 0)
        printf("zkSaveECDSAPubKey2File() failed\n");
    else
        printf("zkSaveECDSAPubKey2File() is OK\n");

    ret = zkLEDOff(ctx);
    if (ret != 0)
        printf("zkLEDOff() failed\n");
    else
        printf("zkLEDOff() is OK\n");

    ret = zkLEDOn(ctx);
    if (ret != 0)
        printf("zkLEDOn() failed\n");
    else
        printf("zkLEDOn() is OK\n");

    char *model_str = malloc(sizeof(char) * 128);
    ret = zkGetModelNumberString(ctx, &model_str);
    if (ret != 0)
        printf("zkGetModelNumberString() failed\n");
    else
        printf("zkGetModelNumberString() is OK\n");
    if (model_str) {
        printf("model_str --------------> [%s]\n", model_str);
        free(model_str);
    }

    char *serial_num_str = malloc(sizeof(char) * 128);
    ret = zkGetModelNumberString(ctx, &serial_num_str);
    if (ret != 0)
        printf("zkGetModelNumberString() failed\n");
    else
        printf("zkGetModelNumberString() is OK\n");
    if (serial_num_str) {
        printf("serial_num_str --------------> [%s]\n", serial_num_str);
        free(serial_num_str);
    }

    ret = zkClose(ctx);
    if (ret != 0)
        printf("zkClose() failed\n");
    else
        printf("zkClose() is OK\n");

    return ret;
}
__________________________________________________________________

Raspberry Pi 내에 library와 header 파일이 있으니, Pi에서 직접 compile해 보도록 하자. 간단한 program이니 Makefile 까지 만들 필요도 없다.

$ gcc -o test1 test1.c -I/usr/include/zymkey/ -lzk_app_utils
$ ./test1

OK가 출력되고, LED도 on/off되는 것으로 보아 정상 동작하는 것 같다.

[그림 3.1] zymbit C example 돌려 보기

참고: 관련 library와 header 파일을 Ubuntu PC로 꺼내어 cross-compile해 보는 것도 하나의 방법이 될 수 있겠다.


c) C API를 이용한 좀 더 복잡한 예제 코드 작성해 보기
이 절에서는 아래 header file 내용을 기초로하여, 좀 더  심오한(?) 기능 시험(ECDH, ECDSA, TLS ...)을 진행해 보도록 하겠다.

[그림 3.2] /usr/include/zymkey/zk_app_utils.h 파일 내용


이 부분은 독자 여러분의 몫이다. 앗, 뭣이라고요 ~ 😋


지금까지 Zymkey4i i2c device를 Raspberry Pi 4에 붙이고, zymkey4i가 제공하는 다양한 API를 이용하여 HSM의 맛(?)을 살짝 확인해 보는 시간을 가져 보았다.

내용 중 부족한 부분은 다음 blog post를 통해 계속 보강하도록 하겠다. 끝까지 읽어 주셔서 감사드린다. 💢


4. References

[1] https://www.zymbit.com/wp-content/uploads/2018/12/Zymbit-Data-Sheet-Zymkey-4i-DATA-SHEET-04100910A2.pdf
[2] https://docs.zymbit.com/getting-started/zymkey4/quickstart/
[3] https://www.hackster.io/sabrinaZ/zymkey4i-security-module-for-raspberry-pi-259d84
[4] https://docs.zymbit.com/api/c_api/
[5] https://www.farnell.com/datasheets/2674017.pdf
[6] https://ww1.microchip.com/downloads/en/DeviceDoc/20005928A.pdf
[7] https://content.arduino.cc/assets/mkr-microchip_atecc508a_cryptoauthentication_device_summary_datasheet-20005927a.pdf
[8] https://ww1.microchip.com/downloads/en/Appnotes/Atmel-8984-CryptoAuth-CryptoAuthLib-ApplicationNote.pdf - microchip cryptoauthlib 설명서
[9] https://www.microchip.com/en-us/products/security/security-ics/cryptoauthentication-family
[10] Integration of Security Hardware Module Zymkey 4i With Raspberry Pi, Rizzo Mungka Rechie 1 ; Nur Nabila Mohamed2; Yusnani Mohd Yussoff 3 ; Lucyantie Mazalan 4 ; Suhairi Mohd Jawi 5 ; Mohd Saufy Rohmad 6




Slowboot



댓글 없음:

댓글 쓰기