- Công cụ Xilinx Platform Studio (XPS): dùng để thiết kế nền tảng phần cứng cho hệ thống nhúng dựa trên FPGA. Từ đây chúng ta có thể tích hợp vào hệ thống các lõi IP phần cứng được hỗ trợ bởi nhà sản xuất hoặc các lõi IP của người sử dụng (User IP), ví dụ như lõi AES-256 và SHA-512 của luận án này, Hình 4.3. Sau đó, nền tảng phần cứng (Hardware Platform) này được xuất sang cho các thiết kế tiếp theo trong các công cụ Xilinx PlanAhead và Xilinx Software Development Kit.
77 - Công cụ Xilinx Software Development Kit hỗ trợ thiết kế các phần mềm nhúng code C, C++, Hình 4.4. Ngồi ra, từ bộ cơng cụ này ta có thể xây dựng các trình điều khiển, ví dụ như trình quản lý cập nhật từng phần FPGA.
Hình 4.4 Cơng cụ thiết kế Software Development Kit
- Cuối cùng là công cụ thiết kế Xilinx PlanAhead, Hình 4.5, dùng để thiết kế cho việc thực hiện cấu hình lại được từng phần. Cơng cụ này cho phép chúng ta bố trí khu vực và xác định kích thước các phân vùng để chứa các mô đun thành phần khi cấu hình vào hệ thống để thực hiện các chức năng đã mô tả trước đó.
78
4.1.3. Thiết lập vi xử lý nhúng MicroBlaze và giao thức TCP/IP
Trên FPGA Virtex-6 XC6VLX240T, luận án này nhúng một bộ vi xử lý lõi mềm MicroBlaze bằng cách sử dụng bộ công cụ Xilinx Platform Studio (XPS) phiên bản 14.1. Bộ công cụ XPS cho phép các nhà thiết kế dễ dàng tạo ra các nền tảng nhúng dựa trên bộ vi xử lý MicroBlaze hoặc PowerPC-405. XPS cung cấp một loạt các thiết bị ngoại vi như UARTs, bộ đếm, Ethernet, bộ điều khiển bộ nhớ, các cổng vào ra mục đích chung GPIOs…, và một giải pháp kết nối dựa trên cấu trúc bus IBM CoreConnect [100]. Các công cụ biên dịch GNU [106] của MicroBlaze và PowerPC-405 đã được sử dụng trong các quy trình thiết kế phần mềm. Các mã nguồn cho các ứng dụng có thể được viết bằng ngôn ngữ cấp cao như C và C + +.
Đối với hệ thống mẫu thử nghiệm hiện tại, luận án này sử dụng hệ điều hành Xilkernel [107] của Xilinx, Hình 4.6. Xilkernel là một kernel nhỏ nhưng rất mạnh mẽ. Nó có các thư viện mở được cung cấp trong công cụ EDK cho phép người d ng t y biến mức độ cao cả về mặt kích thước lẫn chức năng. Nó đạt được các tính năng địi hỏi cho một kernel nhúng nhỏ gọn. Xilkernel làm việc được trên Microblaze và PowerPC. Nó có thể được sử dụng để phục vụ cho các mục đích ở mức cao hơn như là kết nối mạng, xử lý hình ảnh và âm thanh.
Các đặc trưng của Xilkernel
- Là một hệ điều hành nhúng điển hình.
- Ứng dụng riêng rẽ trên hệ điều hành này rất trực quan. - Cho phép người sử dụng lập trình ở mức độ trừu tượng.
- Có rất nhiều ứng dụng trên hệ điều hành này như: Hệ thống tập tin, quản lý thời gian. - Có một thư viện nhỏ nhưng lại cung cấp đầy đủ các dịch vụ thiết yếu.
79 Như đã đề cập ở trên, luận án này sử dụng bộ công cụ phần mềm XPS để thực hiện và thiết lập bộ vi xử lý MicroBlaze. Sự lựa chọn các thông số và các thành phần khác nhau cho MicroBlaze được thực hiện thông qua trình Base System Builder [108]. Với nền tảng mẫu thử nghiệm, luận án này lựa chọn các thông số và các thành phần như trong Bảng 4.2.
Để thực hiện giao thức kết nối TCP/IP, luận án này sử dụng giao thức Lightweight IP (lwIP), đây là một giao thức mạng mã nguồn mở cho các hệ thống nhúng. EDK của Xilinx cung cấp lwIP t y biến để chạy trên các hệ thống nhúng có chứa một bộ xử lý PowerPC hoặc là MicroBlaze.
Để trao đổi dữ liệu, FPGA cần xác định rõ địa chỉ IP và lắng nghe bản tin trên một cổng cụ thể. Nếu bản tin này là bản tin cập nhật một kết nối sẽ được thiết lập cho phép FPGA và máy tính giao tiếp với nhau.
Bảng 4.2 Các tham số và các thành phần của MicroBlaze
Tham số/Thành phần Giá trị
Tần số làm việc 100 MHz
I cache 16 KB
D cache 64 KB
Ethernet Controller Tri-mode EMAC
Serial interface RS232_UART lite
DRAM controller MCB_DDR3
Các bước thực hiện kết nối tại FPGA:
- Chương trình được thực hiện bắt đầu từ hàm main(). Việc cấu hình cho Xilkernel với luồng tĩnh được gọi là main_thread. Luồng này thiết lập LwIP bằng việc sử dụng các hàm lwip_init() và tạo ra một luồng mạng mới có tên là network_thread sử dụng hàm sys_thread_new(). Main () {…. sys_thread_new("main_thrd", (void(*)(void*))main_thread, 0, THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); …..}
- Network_thread sẽ thiết lập cho một giao thức mạng gồm các thông số địa chỉ MAC và IP sử dụng hàm xemac_add(). Hàm này này sẽ lấy địa chỉ MAC và IP cho giao tiếp và khởi chạy nó.
80
Unsigned char mac_ethernet_address [] = {0x00,0x0a,0x35,0x00,0x01,0x02}; netif = &server_netif;
/*Khởi tạo địa chỉ IP để sử dụng*/ IP4_ADDR(&ipaddr, 192, 168, 1, 10); IP4_ADDR(&netmask, 255, 255, 255, 0); IP4_ADDR(&gw, 192, 168, 1, 1);
xemac_add(netif, &ipaddr, &netmask, &gw, mac_ethernet_address, EMAC_BASEADDR)
- Tạo ra một luồng mới để xử lý các yêu cầu được gửi tới :
sys_thread_new("testethernet",test_ethernet_thread,0,THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
- Luồng mới này sẽ lắng nghe các yêu cầu và chấp nhận chúng sử dụng hai hàm được hỗ trợ bởi thư viện Lwip là lwip_listen() và lwip_accept().
- Quá trình truyền nhận dữ liệu được thực hiện bằng hàm read(sd, recv_buf, RECV_BUF_SIZE). Hàm này trả về số byte đã nhận được với ý nghĩa của các thông số như sau: recv_buf là địa chỉ v ng nhớ để lưu dữ liệu, RECV_BUF_SIZE là kích thước v ng chứa dữ liệu tạm thời.
/* đọc và lưu dữ liệu */
read_len = read(sd, recv_buf, RECV_BUF_SIZE)
- Khi toàn bộ dữ liệu được lưu trữ vào DDRAM, FPGA sẽ đóng kết nối, thực hiện các lệnh nội tại và chờ cho những bản tin cập nhật tiếp theo.
Các bước thực hiện kết nối tại máy tính:
- Tạo một đối tượng Clientsocket() với các thông số MAC và IP /* Initialize IP */
IPAddress[] ipAddress = Dns.GetHostAddresses("192.168.1.10"); IPEndPoint ipEnd = new IPEndPoint(ipAddress[0], 9999);
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
- Sau khi khởi tạo các thơng số máy tính sẽ xử lý dữ liệu từ một File thành dạng byte, đóng gói chúng thành dạng mảng của byte rồi chuyển chúng tới bộ đệm.
/* Convert data to a sequence of bytes */
byte[] fileNameByte = Encoding.ASCII.GetBytes(fileName);
/* read contents of the file into a byte array*/
byte[] fileData = File.ReadAllBytes(filePath + fileName);
byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length]; byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);
81 /* init buff */
fileNameLen.CopyTo(clientData, 0); fileNameByte.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 + fileNameByte.Length);
- Máy tính sẽ gửi yêu cầu kết nối với FPGA khi FPGA chấp nhận yêu cầu thì kết nối được hình thành và bắt đầu gửi dữ liệu đi.
/* connect */
clientSock.Connect(ipEnd); /* send data */
clientSock.Send(clientData);
- Máy tính sẽ gửi file bitstream đến FPGA và đợi cho tới khi file được gửi thành cơng thì máy tính sẽ tự động đóng luồng và socket.
/* wait for reached file and close socket */ clientSock.wait(clientdata);
clientSock.Close();
- Giao diện chương trình quản lý cập nhật máy chủ SuM
Hình 4.7 Trình quản lý cập nhật máy chủ SuM
Mỗi khi có bitstream mới, trình quản lý cập nhật máy chủ SuM, Hình 4.7, sẽ gửi thơng báo đến cho các thiết bị người dùng cuối có trong cơ sở dữ liệu người dùng được lưu trữ ở trong máy chủ. Khi phía thiết bị người dùng cuối đồng ý cập nhật thì hai bên chính thức thực hiện kết nối qua giao thức cập nhật an tồn. Q trình bắt tay và thống nhất các thuật tốn mã hóa và xác thực thành công, SuM sẽ gửi bitstream từng phần cần cập nhật cho thiết bị người dùng.
82
4.1.4. Xây dựng hệ thống cấu hình lại đƣợc từng phần
Hình 4.8 Sơ đồ quá trình thực hiện cấu hình từng phần
Quy trình xây dựng và thiết kế hệ thống cấu hình từng phần dựa trên FPGA của Xilinx được thực hiện nhờ công cụ PlanAhead [109] mà hãng cung cấp kèm theo trong bộ công cụ ISE như được trình bày trong Hình 4.8:
Trong đó
- ngc: là các tập tin dữ liệu *.ngc ở dạng netlist chứa các mơ-đun chức năng sau q trình tổng hợp của các cơng cụ thiết kế như ISE, XPS của Xilinx.
- ucf: là các tập tin dữ liệu *.ucf chứa thông tin ràng buộc và gán chân cho các khối trong hệ thống.
- elf: là các tập tin ảnh *.elf chứa các chương trình phần mềm nhúng chạy trên vi xử lý nhúng. *elf được sinh ra sau q trình biên dịch từ bộ cơng cụ SDK.
- Full bitstream: là tập tin *.bit, đây là tập tin cấu hình đầy đủ cho FPGA trong hệ thống cấu hình lại được từng phần.
- Partial bitstream: là tập tin *.bit, là tập tin từng phần, đại diện cho một mơ-đun từng phần có thể cấu hình lại được.
Các bước thực hiện cấu hình lại từng phần FPGA:
- Các tập tin *.ngc, *.ucf và *.elf được đưa vào PlanAhead để xác định vị trí các module (Floor) trên FPGA đâu là phần tài nguyên mà các mô-đun từng phần sẽ được cấu hình lên đó.
- Sau đó, PlanAhead sẽ thực hiện hai q trình Implement và Timing để tạo ra các tập tin “Bitstream đầy đủ” d ng cho việc cấu hình tồn bộ FPGA và các tập tin “Bitstream từng phần” d ng để cấu hình cho các khu vực cấu hình lại được từng phần.
83
Giao diện chương trình quản lý cập nhật từng phần
Hình 4.9 Trình quản lý cập nhật từng phần máy trạm CuM
Để thực hiện mơ hình thử nghiệm, tác giả xây dựng hai mơ đun cấu hình lại được từng phần là: mơ đun thực hiện phép nhân hai tốn hạng Mult và mơ đun thực hiện phép cộng hai tốn hạng Adder.
Hai mô đun Mult và Adder sau khi được cập nhật từ máy chủ cập nhật sẽ được lưu
vào bộ nhớ RAM trên thiết bị. Chúng sẽ sử dụng chung một phân vùng cấu hình lại được từng phần trên FPGA của người dùng. Trình quản lý cập nhật từng phần ở máy trạm sẽ quyết định chọn và cho phép mô đun chức năng nào cần nạp vào hệ thống và để thực hiện nhiệm vụ của mình. Nếu khơng cần sử dụng đến, các mơ đun này có thể được giải phóng bằng cách cấu hình lên phân vùng đó một mơ đun Blank.
Mơ đun Blank là một mô đun trắng không thực hiện bất cứ chức năng nào. Vì vậy nó hồn tồn khơng tiêu thụ điện năng, điều này sẽ có ích trong việc tiết kiệm năng lượng của hệ thống.
4.2 Kết quả và đánh giá
Để thể hiện tính linh hoạt và tính đa dạng trong thực hiện bảo mật bitstream như framework đã đề xuất, luận án này xây dựng các khối mã hóa và xác thực theo hai cách:
- Hoàn toàn bằng phần mềm
84 Việc mã hóa và xác thực bitstream là bắt buộc trong framework và giao thức an toàn cập nhật của luận án này cũng như trong các hệ thống bảo mật hiện đại. Vì vậy, tốc độ thực hiện của các bộ mã hóa và xác thực có yếu tố quyết định trong tồn bộ q trình cập nhật hệ thống. T y thuộc vào tài nguyên của từng thiết bị và nhu cầu thực tế của người dùng, việc lựa chọn thực hiện bằng phần cứng, phần mềm hoặc kết hợp sẽ cho một kết quả thích hợp.
4.2.1. Giải pháp bằng phần mềm
Để thực hiện phần mềm, luận án này sử dụng các bộ giải mã AES-256, bộ xác thực SHA-512, bộ giải mã RSA và bộ giải nén RLE được cung cấp từ nguồn [110] và [111]. Khi thực hiện các thuật toán này trên MicroBlaze, luận án này đã có một vài sửa đổi và tối ưu để ph hợp hệ thống của mình. Bảng 4.3 tóm tắt kết quả thực hiện bằng phần mềm của các thuật toán được xem xét trong hai tham số: kích thước bộ nhớ và thơng lượng của từng thuật tốn.
Có thể thấy rằng tốc độ thực hiện bằng phần mềm trên hệ thống của luận án này là tương đương với việc thực hiện AES-128 và SHA-256 chạy trên MicroBlaze của FPGA Virtex-II Pro [112]. Mặc d việc thực hiện bằng phần mềm là chậm hơn so với việc thực hiện bằng phần cứng, nhưng nó khơng tiêu thụ thêm bất kỳ nguồn tài nguyên phần cứng nào của FPGA. Trong khi việc thực hiện bằng phần cứng chiếm xấp xỉ 31,5% tài nguyên Slice của FPGA Spartan-6 LX45, xem Bảng 4.4. Con số 31,5% cho chúng ta thấy rằng, việc thực hiện bằng phần cứng các thuật toán mã hóa và xác thực đối với các hệ thống dựa trên FPGA chi phí thấp là rất lớn so với tổng số tài nguyên sẵn có của nó. Trong khi đó, chi phí về bộ nhớ dùng cho các thuật toán này khi thực hiện bằng phần mềm là khá nhỏ so với kích thước của bộ nhớ flash và DDRAM có sẵn trong các hệ thống nhúng hiện nay. Với thông lượng như trong Bảng 4.3, phải mất vài giây để cập nhật thành công một bitstream từng phần (thường có dung lượng vài chục đến vài trăm KB). Luận án này tin rằng điều này là có thể chấp nhận được vì việc cập nhật xảy ra là không thường xuyên.
Bảng 4.3 Kết quả thực hiện bằng phần mềm với FPGA Atlys Spartan-6
Thuật toán Số dịng lệnh trong C Thơng lượng (Kbps) Kích thước bộ nhớ (KB) AES-256 488 62.5 17 SHA-512 500 135 17 RSA 66 0.29 2 RLE 120 247 5
85
4.2.2. Giải mã và xác thực bằng phần cứng
Ở trong phần này, luận án này chọn thực hiện các bộ giải mã AES-256 và bộ xác thực SHA-512 trong phần cứng. Bộ giải nén RLE và thuật toán RSA vẫn được thực hiện trong phần mềm nhúng. Để thực hiện phần cứng, luận án này sử dụng lõi IP AES-256 và SHA- 512 được cung cấp từ OpenCores [113], và đã nhiều lần sửa đổi, bổ sung và tối ưu cho ph hợp với hệ thống của mình.
Kết quả về tài nguyên sử dụng và tốc độ thực hiện được thể hiện tương ứng trong các Bảng 4.4 và Bảng 4.5. Kết quả này cho thấy tài nguyên phần cứng sử dụng cho bộ giả mã AES-256 và bộ xác thực SHA-512 là tương đối lớn, chiếm lần lượt 18,95% và 12,48% tài nguyên Slice của FPGA Spartan-6 LX45. Tuy nhiên, thông lượng của hệ thống là tăng đáng kể so với việc sử dụng bằng phần mềm như đã nêu trên.
Bảng 4.4 Sử dụng tài nguyên phần cứng của AES-256 và SHA-512 (Atlys Spartan-6)
Lõi IP Tài nguyên sử dụng
Registers LUTs Slice
AES-256 3.096 (5,67%) 3.751 (13,74%) 1.293 (18,95%)
SHA-512 2.246 (4,11%) 2.299 (8,42%) 848 (12,48%)
Bảng 4.5 Hiệu năng thực hiện trên FPGA Atlys Spartan-6.
Thuật tốn Thơng lượng
AES-256 13.8 Mbps
SHA-512 30 Mbps
Từ phân tích trên, giải pháp mà luận án này đề xuất là thực hiện các bộ mã hóa AES- 512 và bộ xác thực SHA-512 trong khu vực cấu hình lại được từng phần sẽ giải quyết được hai vấn đề sau:
- Tiết kiệm tài nguyên hệ thống bằng cách giải phóng các bộ mã hóa và xác thực khi khơng cần d ng đến. Đối với hệ thống sử dụng FPGA chi phí thấp như FPGA Spartan- 6 LX45 thì tài ngun slice sẽ giải phóng lên đến 31,43% tài nguyên của cả FPGA. - Nâng cao hiệu năng và tính an tồn của hệ thống so với việc thực hiện bằng phần
mềm. Căn cứ vào số liệu trong Bảng 4.3 và Bảng 4.5, thông lượng của AES-256 sẽ tăng lên gấp khoảng 220 lần và thông lượng của SHA-512 sẽ tăng lên gấp khoảng 222 lần.
86 Luận án này cũng tiến hành thực hiện bằng phần cứng trên FPGA ML605 Virtex-6 XC6VLX240T và kết quả đạt được như thể hiện trong Bảng 4.6 và Bảng 4.7. Kết quả này cho ta thấy, các bộ mã hóa và xác thực chiếm một phần rất nhỏ trong tổng số tài nguyên của FPGA Virtex-6 của Xilinx, trong lúc đó tốc độ thực hiện cũng nhanh hơn rất nhiều. Ngun nhân chính để có được kế quả này là tài nguyên sẵn có và tốc độ của các FPGA