|
![]() |
Интеграция C-кода в Tcl-программу |
![]() |
|
| Главная | Программные продукты | Freesource программные продукты | Статьи по Tcl/Tk | Статьи | Контакт | Карта сайта | |||
|
![]() |
Интеграция C-кода в Tcl-программуМне известны два способа интеграции C-кода в Tcl-программу:
В этой статье рассмотрим способ встраивания C-кода в Tcl-программу с помощью Critcl библиотеки, на примере создания Tcl-функции AESDecrypt для декриптования данных по AES128 алгоритму ECB методом. C-код, реализующий этот метод криптования, представлен в следующих файлах: Для встраивания C-кода в исходный текст Tcl-программы, воспользуемся процедурой critcl::ccode библиотеки Critcl.
# Загружаем Critcl библиотеку
package require critcl
# Подключение файла aesarm.h
critcl::ccode {
сюда помещаем содержимое файла aesarm.h
. . .
. . .
. . .
}
# Подключение файла aesarm.c
critcl::ccode {
сюда помещаем содержимое файла aesarm.c
. . .
. . .
. . .
}
Для создания Tcl-процедуры по декриптованию данных, вызывающей C-код, воспользуемся процедурой critcl::ccommand библиотеки Critcl.
# Создание Tcl-процедуры AESDecrypt
critcl::ccommand AESDecrypt { dummy ip objc objv } {
int i, dlen, klen;
unsigned char *data, *key;
aes_context ctx;
if (objc != 3) {
Tcl_WrongNumArgs(ip, 1, objv, "key data");
return TCL_ERROR;
}
data = Tcl_GetByteArrayFromObj(objv[2], &dlen);
key = Tcl_GetByteArrayFromObj(objv[1], &klen);
Tcl_Obj *result = Tcl_NewObj();
unsigned char *output = Tcl_SetByteArrayLength(result, dlen);
aes_setkey_dec(&ctx, key, 128);
for(i=0;i<(dlen>>4);i++) aes_crypt_ecb(&ctx, (int) AES_DECRYPT, data+(i<<4), output+(i<<4));
Tcl_SetObjResult(ip, result);
return TCL_OK;
}
# Вызов процедуры AESDecrypt из Tcl-кода
set decryptedData [AESDecrypt $myKey $myEncryptedData]
|
||||||
| Copyright © Эдуард Зозуля | ||||||||
|
|
||||||||