Знакомимся с Gentoo Часть II: базовые настройки и работа с Portage Сергей Супрунов # cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime <действие><порядок><имя> depend() { use clock logger need localmount provide cron } rc-update <действие> [<программа>] <уровень> # env-update config_eth1=("10.0.0.103/24") routes_eth1=("default gw 10.0.0.254") #config_eth0=( # "192.168.0.2/24" # "4321:0:1:2:3:4:567:89ac" #) # emerge --search apache # emerge --searchdesc http-server # emerge -pv links # emerge -f iproute2 # emerge --info # emerge --newuse mc # emerge -u gentoo-sources # emerge --sync # emerge emerge-delta-webrsync # cd /usr/portage/app-misc/mc # ls | grep ebuild # emerge -u world # USE=”-X” emerge mc # USE=”slang” emerge mc KEYMAP=”ru4” SET_WINDOWKEYS=”yes” # USE=”-X” emerge terminus-font KEYMAP=”-u ru4” SET_WINDOWKEYS=”yes” DUMPKEYS_CHARSET=”koi8-r” # echo $LANG # date # touch файл # ls -a # cat файл # alias см=”view” # см файл # USE=”unicode slang -ncurses” emerge mc # USE=”gentoo” emerge freedom ;) ----------------------------------------------------------------------------------------------------------------- Как устроена файловая система reiser4 Андрей Пешеходов bmap_block = 8 * (BLOCK_SIZE-4) * N union reiser4_key { __le64 el[KEY_LAST_INDEX]; int pad; }; /* Значение каждого элемента этого перечисления есть индекс в массиве reiser4_key->el */ typedef enum { /* dirid – ObjectID родитесльcкого каталога, расположен в первом элементе, т.н. major "locale" */ KEY_LOCALITY_INDEX = 0, /* Тип итема, расположен в первом элементе, т.н. minor "locale" */ KEY_TYPE_INDEX = 0, /* Существует только в длинных ключах */ ON_LARGE_KEY(KEY_ORDERING_INDEX,) /* «Объектная связь», второй элемент */ KEY_BAND_INDEX, /* objectid, второй элемент */ KEY_OBJECTID_INDEX = KEY_BAND_INDEX, /* Полный objectid, второй элемент */ KEY_FULLOID_INDEX = KEY_BAND_INDEX, /* Смещение, третий элемент */ KEY_OFFSET_INDEX, /* Хэш имени, в третьем элементе */ KEY_HASH_INDEX = KEY_OFFSET_INDEX, KEY_CACHELINE_END = KEY_OFFSET_INDEX, KEY_LAST_INDEX } reiser4_key_field_index; /* На сколько бит влево должен быть сдвинут элемент ключа для получения значения конкретного поля */ typedef enum { KEY_LOCALITY_SHIFT = 4, KEY_TYPE_SHIFT = 0, KEY_BAND_SHIFT = 60, KEY_OBJECTID_SHIFT = 0, KEY_FULLOID_SHIFT = 0, KEY_OFFSET_SHIFT = 0, KEY_ORDERING_SHIFT = 0, } reiser4_key_field_shift; { fibration :7 h :1 prefix-1 :56 } /* Дисковый формат internal item */ typedef struct internal_item_layout { reiser4_dblock_nr pointer; } internal_item_layout; len[0] = node_end – offset[0] +1 typedef struct reiser4_stat_data_base { __le16 extmask; } PACKED reiser4_stat_data_base; typedef struct reiser4_light_weight_stat { __le16 mode; __le32 nlink; __le64 size; } PACKED reiser4_light_weight_stat; typedef struct reiser4_unix_stat { /* owner id */ __le32 uid; /* group id */ __le32 gid; /* время последнего доступа */ __le32 atime; /* время последней модификации */ __le32 mtime; /* время последнего изменения */ __le32 ctime; union { /* пара (minor,major) для файлов устройств */ __le64 rdev; /* размер в байтах для регулярных файлов */ __le64 bytes; } u; } PACKED reiser4_unix_stat; typedef struct reiser4_symlink_stat { char body[0]; } PACKED reiser4_symlink_stat typedef struct reiser4_plugin_slot { __le16 pset_memb; __le16 id; } PACKED reiser4_plugin_slot; typedef struct reiser4_plugin_stat { /* Количество дополнительных плагинов, ассоциированных с объектом */ __le16 plugins_no; reiser4_plugin_slot slot[0]; } PACKED reiser4_plugin_stat; typedef struct reiser4_flags_stat { __le32 flags; } PACKED reiser4_flags_stat; typedef struct reiser4_capabilities_stat { __le32 effective; __le32 permitted; } PACKED reiser4_capabilities_stat; typedef struct reiser4_cluster_stat { d8 cluster_shift; } PACKED reiser4_cluster_stat; typedef struct reiser4_crypto_stat { d16 keysize; /* размер секретного ключа в битах */ d8 keyid[0]; /* ID секретного ключа */ } PACKED reiser4_crypto_stat; typedef struct reiser4_large_times_stat { d32 atime; d32 mtime; d32 ctime; } PACKED reiser4_large_times_stat; typedef struct sd_stat { int dirs; int files; int others; } sd_stat; typedef struct { reiser4_dblock_nr start; reiser4_dblock_nr width; } reiser4_extent; typedef enum { HOLE_EXTENT, UNALLOCATED_EXTENT, ALLOCATED_EXTENT } extent_state; creat(); truncate(4096); typedef struct ctail_item_format { d8 cluster_shift; /* Двоичный логарифм размера дискового кластера */ d8 body[0]; /* Тело итема */ } __attribute__ ((packed)) ctail_item_format; данные {дополнение контрольный_байт контрольная_сумма} ----------------------------------------------------------------------------------------------------------------- Создаем порт для FreeBSD своими руками Часть II: расширенные возможности Рашид Ачилов DISTFILES= file1.tar.bz2 \ file2.tar.bz2 \ file3.tar.bz2 DISTFILES= file1.tar.bz2 \ file2.tar.bz2:foobar \ file3.tar.bz2:foobar MASTER_SITES= http://www.foobar.com/:foobar \ http://www.nichego.net MASTER_SITES= http://www.foobar.com/:foobar,DEFAULT GSI_VERSION= 2005-01-20 DISTFILES+= gsi-$(GSI_VERSION)-sorted.txt.bz2:oorus,oorus2 INFRA_PATCHEXT= OOo_1.1.4_infra_patches DISTFILES+= ${INFRA_PATCHEXT}.tar.gz:DEFAULT,oorus MASTER_SITES+= http://ootrans.i-rs.ru/out/:oorus MASTER_SITES+= ftp://ftp.i-rs.ru/pub/openoffice/1.1.4/ru/:oorus2 MASTER_SITES+= ftp://ftp/granch.ru/pub/openoffice PATCH_SITES= ftp://ftp.cis.upenn.edu/pub/xv/ PATCHFILES= ${DISTNAME}.JPEG-patch ${DISTNAME}.TIFF-patch \ croppad.patch grabpatch vispatch \ deepcolor.patch gifpatch exceed_grab.patch \ tiff1200.patch gssafer.patch # make WITHOUT_IMAGEMAGICK_JPEG=yes WITH_WINDOWS_FONT_DIR=/tmp/blabla WITHOUT_IMAGEMAGICK_PNG=yes WITHOUT_IMAGEMAGICK_BZIP2=yes ... # make config OPTIONS= LDAP "With LDAP support" on \ ADS "With Active Directory support" off \ CUPS "With CUPS printing support" on \ WINBIND "With WinBIND support" on \ ACL_SUPPORT "With ACL support" off \ SAM_XML "SAM with XML support" off .include # processing WITH_SOMEWHERE here .include .if defined(WITH_SAM_XML) LIB_DEPENDS+= xml2.5:${PORTSDIR}/textproc/libxml2 CONFIGURE_ARGS+= --with-xml-prefix=${LOCALBASE} WANT_EXPSAM_MODULES+= xml PLIST_SUB+= SAMXML="" .else PLIST_SUB+= SAMXML="@comment " .endif pre-extract: @${ECHO_MSG} "" @${ECHO_MSG} "For debugging information support you should specify" @${ECHO_MSG} "WITH_DEBUG=yes (press Ctrl-C here and start make WITH_DEBUG=yes)" @${ECHO_MSG} "" @sleep 2 post-deinstall: @${ECHO_MSG} "" @${ECHO_MSG} "Do not forget delete filter description from /etc/mail/freebsd.mc" @${ECHO_MSG} "and rebuild sendmail.cf file!" @${ECHO_MSG} "" pre-configure: .if defined(WITHOUT_RC_NG) @${SED} -e "s=%%PREFIX%%=${PREFIX}=" ${FILESDIR}/milter-sid.sh \ > ${WRKSRC}/milter-sid.sh .endif PORTNAME= mountsmb2 PORTVERSION= 0.90.1 CATEGORIES= sysutils net MASTER_SITES= ftp://ftp.granch.ru/pub/other/ MAINTAINER= shelton@granch.ru COMMENT= SMB/CIFS shares mounting scripts to do it at login RUN_DEPENDS= findsmb:${PORTSDIR}/net/samba3 \ sudo:${PORTSDIR}/security/sudo \ gawk:${PORTSDIR}/lang/gawk USE_BZIP2= yes NO_BUILD= yes .include do-install: .for i in smb2awk smb2nsmbrc mountsmb2 ${INSTALL_SCRIPT} ${WRKSRC}/${i} ${PREFIX}/bin .endfor -@${MKDIR} ${EXAMPLESDIR} .for i in sudoers .login .nsmbrc .mssmbrc ${INSTALL_DATA} ${WRKSRC}/${i} ${EXAMPLESDIR} .endfor -@${MKDIR} ${DOCSDIR} ${INSTALL_DATA} ${WRKSRC}/README.FreeBSD ${DOCSDIR} @${SED} -e "s,%%EXAMPLESDIR%%,${EXAMPLESDIR},g" -i .old ${PKGMESSAGE} @${CAT} ${PKGMESSAGE} @${RM} -f ${PKGMESSAGE} @${MV} ${PKGMESSAGE}.old ${PKGMESSAGE} .include CATEGORIES= russian .if !defined (LANG) && !defined(USE_LANG) USE_LANG= ru_RU.KOI8-R .endif LANG_LIST= ru_RU.KOI8-R uk_UA.KOI8-U LANG_PKGNAME= ru LANG_EXT= 07 LANG_CONFIGURE_ARG= RUSS MASTERDIR= ${.CURDIR}/../../editors/openoffice-1.1 USE_RUSSIAN_GSI= yes USE_INFRA_PATCHSET= yes .include "${MASTERDIR}/Makefile" .if defined(USE_RUSSIAN_GSI) MASTER_SITES+= http://ootrans.i-rs.ru/out/:oorus .endif .if defined(USE_INFRA_PATCHSET) MASTER_SITES+= ftp://ftp.i-rs.ru/pub/openoffice/1.1.4/ru/:oorus .endif .if !defined(WITHOUT_MOZILLA) DISTFILES+= ${MOZILLA_PROJECT}:moz \ ${MOZILLA_SOURCE}:mozsrc USE_GNOME+= orbit gtk12 .endif .if defined(USE_RUSSIAN_GSI) GSI_VERSION= 2005-01-20 GSI_DIR= rusgsi DISTFILES+= gsi-$(GSI_VERSION)-sorted.txt.bz2:oorus .endif .if defined(USE_INFRA_PATCHSET) INFRA_PATCHDIR= infrapatch INFRA_PATCHEXT= OOo_1.1.4_infra_patches DISTFILES+= ${INFRA_PATCHEXT}.tar.gz:oorus .endif # When USE_RUSSIAN_GSI was defined, ensure, that PREBUILD_TRANSEX3 and RUSSIAN_GSI were also defined .if defined(USE_RUSSIAN_GSI) .if !defined(PREBUILD_TRANSEX3) PREBUILD_TRANSEX3= yes GSI_PREBUILD= ${WRKDIR}/${GSI_DIR}/btransex .endif .if !defined(RUSSIAN_GSI) RUSSIAN_GSI= ${WRKDIR}/${GSI_DIR}/gsi-${GSI_VERSION}-sorted.txt .endif .endif # When USE_INFRA_PATCHSET was defined, ensure, # that INFRA_PATCHER was also defined .if defined(USE_INFRA_PATCHSET) INFRA_PATCHER= ${WRKDIR}/${INFRA_PATCHDIR}/${INFRA_PATCHEXT}/do_infrapatch .endif .if defined(USE_RUSSIAN_GSI) @${ECHO_MSG} "===> Extracting russian GSI file" @${MKDIR} ${WRKDIR}/${GSI_DIR} @${CP} ${DISTDIR}/${DIST_SUBDIR}/gsi-${GSI_VERSION}-sorted.txt.bz2 ${WRKDIR}/${GSI_DIR} @cd ${WRKDIR}/${GSI_DIR} && \ ${BZIP2_CMD} -d gsi-${GSI_VERSION}-sorted.txt.bz2 .endif .if defined(USE_INFRA_PATCHSET) @${ECHO_MSG} "===> Extracting Infra patches set" @${MKDIR} ${WRKDIR}/${INFRA_PATCHDIR} @${CP} ${DISTDIR}/${DIST_SUBDIR}/${INFRA_PATCHEXT}.tar.gz ${WRKDIR}/${INFRA_PATCHDIR} @cd ${WRKDIR}/${INFRA_PATCHDIR} && \ ${TAR} -xzvf ${INFRA_PATCHEXT}.tar.gz .endif post-patch: .if defined(USE_INFRA_PATCHSET) @${ECHO_MSG} "===> Patching OOo with Infra patches set" @cd ${WRKDIR}/${INFRA_PATCHDIR}/${INFRA_PATCHEXT} && \ ${SH} ${INFRA_PATCHER} .endif .if defined(PREBUILD_TRANSEX3) @${ECHO_MSG} "===> Pre-build TRANSEX3" @${ECHO} "source ${WRKSRC}/FreeBSDEnv.Set" > ${GSI_PREBUILD} @${ECHO} "cd transex3 && build --all && deliver" >> ${GSI_PREBUILD} @${CHMOD} +x ${GSI_PREBUILD} @cd ${WRKSRC} && PATH="${PATH}:${LOCALBASE}/bin:${LOCALBASE}/sbin" && ${TCSH} ${GSI_PREBUILD} .endif .if defined(USE_RUSSIAN_GSI) @${ECHO_MSG} "===> Build russian GSI" @cd ${WRKSRC} && PATH="${PATH}:${LOCALBASE}/bin:${LOCALBASE}/sbin" && ${TCSH} -c 'source FreeBSDEnv.Set && localize -m -i ru-RU -l ${LANG_EXT} -f ${RUSSIAN_GSI}' .endif ----------------------------------------------------------------------------------------------------------------- Управляем инсталляторами Иван Коробко WindowsInstaller- -x86.exe [] "%SystemRoot%\System32\msiexec.exe" /i "your_filename.msi" Pro11.msi /qb или Setup.exe /qb Pro11.msi Transforms=FileName.mst /qb Setup.exe Transforms=FileName.mst /qb Setup /a Office2003SP1-KB842532-fullfile-enu.exe /q /c /t:С:\Office2003\SP1 MsiExec /p C:\Office2003\SP1\MainSp1f.msp /a C:\Office2003\Office\Pro11.msi ShortFileNames=True /qb MsiExec /p C:\Office2003\SP1\Owc11Sp1ff.msp /a C:\Office2003\Office\OWC11.msi ShortFileNames=True /qb XXX_KB######_YYY_ZZZ.exe Office2003_KB######_FullFile_Enu.exe C:\Install\Office\setup.exe transforms=C:\Install\Office\answer.mst /qb- /noreboot ie6setup.exe /Q:A /C:"ie6wzd /S:""#e"" /Q:C /R:N /V:I" setup.exe /SILENT c:\Install\Nero\Nero551054.exe /silent /noreboot/sn=xxxx-xxxx-xxxx-xxxx-xxxx-xxxx /write_sn C:\Install\Wrar\Wrar340ru.exe /s installer.exe /NCRC installer.exe /S installer.exe /D=C:\Program Files\NSIS installer.exe /NCRC /S /D=C:\Program Files\NSIS C:\Install\Wrar\Adware.exe /s start /wait %systemdrive%\install\setup.exe /s [Setup.bat] start /wait %systemdrive%\install\filename.exe /SILENT /SP- taskkill.exe /F /IM filename.exe ----------------------------------------------------------------------------------------------------------------- Используем средства библиотеки OpenSSL для криптографической защиты данных Владимир Мешков Листинг 1. Генерация ПСП #include void main() { int outf; unsigned char buf[1024]; if(RAND_bytes(buf, sizeof(buf))) { /* 1 succes, 0 otherwise */ outf = open("./rnd_bytes", O_CREAT|O_TRUNC|O_RDWR, 0600); write(outf, buf, sizeof(buf)); } else printf("-ERR: RAND_bytes\n"); } gcc –o rand_test rand_test.c -lssl unsigned char * MD5(const unsigned char *d, unsigned long n, unsigned char *md) void MD5_Init(MD5_CTX * ctx); void MD5_Update(MD5_CTX * ctx, const void * data, unsigned long len); void MD5_Final(unsigned char * md, MD5_CTX * ctx); typedef struct MD5state_st { MD5_LONG A,B,C,D; MD5_LONG Nl,Nh; MD5_LONG data[MD5_LBLOCK]; /* MD5_LBLOCK = 16 */ int num; } MD5_CTX; #define INIT_DATA_A (unsigned long)0x67452301L #define INIT_DATA_B (unsigned long)0xefcdab89L #define INIT_DATA_C (unsigned long)0x98badcfeL #define INIT_DATA_D (unsigned long)0x10325476L int MD5_Init(MD5_CTX *c) { c->A=INIT_DATA_A; c->B=INIT_DATA_B; c->C=INIT_DATA_C; c->D=INIT_DATA_D; c->Nl=0; c->Nh=0; c->num=0; return 1; } Листинг 2. Вычисление MD5-хэша для файла большого размера #include #define BUFSIZE (1025*16) void main(int argc, char **argv) { MD5_CTX c; /* контекст хэша */ unsigned char buf[BUFSIZE]; unsigned char md_buf[MD5_DIGEST_LENGTH]; /* В командной строке передается имя файла, для которого вычисляется хэш */ int inf = open(argv[1], O_RDWR); /* Инициализируем контекст */ MD5_Init(&c); /* Вычисляем хэш */ for(;;) { int i = read(inf, buf, BUFSIZE); if(i <= 0) break; MD5_Update(&c, buf, (unsigned long)i); } /* Помещаем вычисленный хэш в буфер md_buf */ MD5_Final(md_buf, &c); /* Отображаем результат */ for(i = 0; i < MD5_DIGEST_LENGTH; i++) printf("%02x", md_buf[i]); } struct env_md_st { int type; int pkey_type; int md_size; unsigned long flags; int (*init)(EVP_MD_CTX *ctx); int (*update)(EVP_MD_CTX *ctx,const void *data,unsigned long count); int (*final)(EVP_MD_CTX *ctx,unsigned char *md); int (*copy)(EVP_MD_CTX *to,const EVP_MD_CTX *from); int (*cleanup)(EVP_MD_CTX *ctx); /* FIXME: prototype these some day */ int (*sign)(); int (*verify)(); int required_pkey_type[5]; /*EVP_PKEY_xxx */ int block_size; int ctx_size; /* how big does the ctx->md_data need to be */ } /* EVP_MD */; struct env_md_ctx_st { const EVP_MD *digest; ENGINE *engine; unsigned long flags; void *md_data; } /* EVP_MD_CTX */; EVP_DigestInit(EVP_MD_CTX * ctx, EVP_MD * md) ctx->digest = md; int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt); int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); Листинг 3. Вычисление MD5-хэша файла с использованием высокоуровневых функций библиотеки #include #include #define BUFSIZE (1025*16) void main(int argc, char **argv) { EVP_MD_CTX mdctx; /* контекст для вычисления хэша */ const EVP_MD * md; /* структура с адресами функций алгоритма */ unsigned char md_value[EVP_MAX_MD_SIZE]; int md_len; /* размер вычисленного хэша */ /* В командной строке передаем имя файла, для которого вычисляется хэш */ int inf = open(argv[1], O_RDWR); /* Добавляем алгоритмы хэширования во внутреннюю таблицу библиотеки */ OpenSSL_add_all_digests(); /* Получаем адреса функций алгоритма MD5 и инициализируем контекст для вычисления хэша */ md = EVP_get_digestbyname("md5"); EVP_DigestInit(&mdctx, md); /* Вычисляем хэш */ for(;;) { i = read(inf, buf, BUFSIZE); if(i <= 0) break; EVP_DigestUpdate(&mdctx, buf, (unsigned long)i); } /* Копируем вычисленный хэш в выходной буфер. Размер хэша сохраняем в переменной md_len */ EVP_DigestFinal(&mdctx, md_value, &md_len); /* Очищаем контекст */ EVP_MD_CTX_cleanup(&mdctx); /* Отобразим результат */ for(i = 0; i < md_len; i++) printf("%02x", md_value[i]); } typedef unsigned char DES_cblock[8]; Листинг 4. Генератор ключей для алгоритма Triple-DES #include int main() { int key, i = 0, j = 0; DES_cblock cb; DES_key_schedule ks; /* Создаем ключевой файл */ key = open(KEYS, O_CREAT|O_TRUNC|O_RDWR, 0600); /* Генерируем три ключа */ for(; i < 3; i++) { DES_random_key(&cb); if((j = DES_set_key_checked(&cb, &ks)) != 0) return j; if(write(key, (unsigned char *)&ks, DES_SCHEDULE_SZ) < 0) return -1; } } void DES_ede3_ofb64_encrypt(const unsigned char *in, unsigned char *out, long length, DES_key_schedule *ks1, DES_key_schedule *ks2, DES_key_schedule *ks3, DES_cblock *ivec, int *num); Листинг 5. Фрагмент программы для криптопреобразования файла по алгоритму Triple-DES с использованием трех ключей и 64-битной обратной связи по выходу /* Буферы для входных и выходных (зашифрованных) данных */ unsigned char inbuf[1024], outbuf[1024]; /* Структура для хранения ключевых данных */ DES_key_schedule ks1, ks2, ks3; /* Считываем три ранее созданных ключа (key – дескриптор ключевого файла) */ read(key,(unsigned char *)&ks1, DES_SCHEDULE_SZ); read(key,(unsigned char *)&ks2, DES_SCHEDULE_SZ); read(key,(unsigned char *)&ks3, DES_SCHEDULE_SZ); /* Открываем входной и создаем выходной файлы */ . . . . /* Шифруем файл */ for(;;) { inlen = fread(inbuf, 1, 1024, in); if(inlen <= 0) break; DES_ede3_ofb64_encrypt(inbuf, outbuf, (long)inlen, &ks1, &ks2, &ks3, (DES_cblock *)ivec, &num); fwrite(outbuf, 1, inlen, out); } void BF_set_key(BF_KEY *key, int len, const unsigned char *data); void BF_cfb64_encrypt(const unsigned char *in, unsigned char *out, long length, const BF_KEY *schedule, unsigned char *ivec, int *num, int enc); #define BF_ENCRYPT 1 #define BF_DECRYPT 0 Листинг 6. Функция криптографического преобразования информации по алгоритму Blowfish, режим 64-битной обратной связи (CFB-64) #include #define BUFSIZE 1024 /* Функция криптопреобразования информации. Параметры функции: дескрипторы входного и выходного файлов и режим работы – BF_ENCRYPT для шифрования и BF_DECRYPT для дешифрования */ int do_crypt(FILE *in, FILE *out, int mode) { int num = 0; unsigned char inbuf[BUFSIZE], outbuf[BUFSIZE]; /* Ключ шифрования длиной 128 бит и вектор инициализации */ const unsigned char key[16]; unsigned char iv[8]; BF_KEY bfkey; /* Помещаем ключ в структуру bfkey */ BF_set_key(&bfkey, sizeof(key), key); /* Шифруем блоки входного файла */ for(;;) { int inlen = fread(inbuf, 1, BUFSIZE, in); if(inlen <= 0) break; BF_cfb64_encrypt(inbuf, outbuf, (long)inlen, &bfkey, iv, &num, mode); fwrite(outbuf, 1, inlen, out); } return 1; } Листинг 7. фрагмент функции криптографического преобразования информации по алгоритму Blowfish, режим 64-битной обратной связи по выходу (OFB-64) void do_crypt(FILE *in, FILE *out) { unsigned char inbuf[BUFSIZE]; unsigned char outbuf[BUFSIZE]; /* Ключ и вектор инициализации */ . . . BF_set_key(&bfkey, KEY_SIZE, key); for(;;) { int inlen = fread(inbuf, 1, BUFSIZE, in); if(inlen <= 0) break; BF_ofb64_encrypt(inbuf, outbuf, (long)inlen, &bfkey, iv, &num); fwrite(outbuf, 1, inlen, out); } } struct evp_cipher_st { int nid; int block_size; int key_len; /* Default value for variable length ciphers */ int iv_len; unsigned long flags; /* Various flags */ int (*init)(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc); /* init key */ int (*do_cipher)(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl);/* encrypt/decrypt data */ int (*cleanup)(EVP_CIPHER_CTX *); /* cleanup ctx */ int ctx_size; /* how big ctx->cipher_data needs to be */ int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr); void *app_data; /* Application data */ } /* EVP_CIPHER */; OpenSSL_add_all_ciphers(); const EVP_CIPHER * cipher = EVP_get_cipherbyname("des_cbc"); const EVP_CIPHER *cipher = EVP_des_cbc(); EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *ctx); EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, const unsigned char *key, const unsigned char *iv); int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl); int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); Листинг 8. Шифрование файла по алгоритму AES, длина ключа 256 бит, режим 64-битовой шифрованной обратной связи #include #define BUFSIZE 1024 int do_crypt(char *infile) { int outlen, inlen; FILE *in, *out; unsigned char key[32]; /* 256-битный ключ */ unsigned char iv[8]; /* вектор инициализации */ unsigned char inbuf[BUFSIZE], outbuf[BUFSIZE]; EVP_CIPHER_CTX ctx; const EVP_CIPHER * cipher; /* Обнуляем структуру контекста */ EVP_CIPHER_CTX_init(&ctx); /* Выбираем алгоритм шифрования */ cipher = EVP_aes_256_cfb(); /* Инициализируем контекст алгоритма */ EVP_EncryptInit(&ctx, cipher, key, iv); /* Шифруем данные */ for(;;) { inlen = fread(inbuf, 1, BUFSIZE, in); if(inlen <= 0) break; if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, inbuf, inlen)) return 0; fwrite(outbuf, 1, outlen, out); } if(!EVP_EncryptFinal(&ctx, outbuf, &outlen)) return 0; fwrite(outbuf, 1, outlen, out); EVP_CIPHER_CTX_cleanup(&ctx); return 1; } cipher = EVP_aes_256_cfb(); cipher = EVP_bf_ofb(); Листинг 9. Дешифрование файла, зашифрованного по алгоритму AES, длина ключа 256 бит, режим 64-битовой шифрованной ОС int do_decrypt(char *infile) { /* Объявляем переменные */ . . . . /* Обнуляем контекст и выбираем алгоритм дешифрования */ EVP_CIPHER_CTX_init(&ctx); EVP_DecryptInit(&ctx, EVP_aes_256_cfb(), key, iv); /* Открываем входной и создаем выходной файлы */ . . . . /* Дешифруем данные */ for(;;) { inlen = fread(inbuf, 1, BUFSIZE, in); if(inlen <= 0) break; if(!EVP_DecryptUpdate(&ctx, outbuf, &outlen, inbuf, inlen)) return 0; fwrite(outbuf, 1, outlen, out); } /* Завершаем процесс дешифрования */ if(!EVP_DecryptFinal(&ctx, outbuf, &outlen)) return 0; . . . . } ----------------------------------------------------------------------------------------------------------------- Создаем VPN с помощью SSL-Explorer Сергей Яремчук # sh sslexplorer_linux_0_1_16.sh # service sslexplorer start; chkconfig sslexplorer on # sslexplorer-console ----------------------------------------------------------------------------------------------------------------- Собираем беспроводной роутер 802.11g на базе ОС Linux Михаил Платов # lspci # modpobe ath_pci # wlanconfig ath0 create wlandev wifi0 wlanmode ap # iwconfig ath0 essid superspot # iwconfig ath0 key 1111-1111-11 # iwconfig ath0 channel 13 # ifconfig ath0 192.168.2.1 netmask 255.255.255.0 broadcast 192.168.2.255 up # echo "ath_pci" >>/etc/modules.autoload.d/kernel-2.6 # echo “options ath_pci autocreate=ap” >>/etc/modules.d/ath_pci modules_ath0=( "iwconfig" ) ifconfig_ath0=( "192.168.2.1 netmask 255.255.255.0 broadcast 192.168.2.255" ) essid_ath0="superspot" channel_ath0="13" key_super_spot="1111-1111-1111-11" # ln -s /etc/init.d/net.lo /etc/init.d/net.ath0 # rc-update add net.ath0 default # iptables -F # iptables -t nat -F # iptables -A FORWARD -i ath0 -s 192.168.2.0/255.255.255.0 -j ACCEPT # iptables -A FORWARD -i eth1 -d 192.168.1.0/255.255.255.0 -j ACCEPT # iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE # /etc/init.d/iptables save # /etc/init.d/iptables start # rc-update add iptables default domain-needed bigus-priv Interface = eth0, ath0 Dhcp-range=192.168.2.0,192.168.2.255,1h Dhcp-host= 11:22:33:44:55:66, 192.168.2.1 # /etc/init.d/dnsmasq start # rc-update add default dnsmasq bridge_br0=( "ath0" ) config_ath0=( "null" ) config_br0=( "192.168.2.1 netmask 255.255.255.0 brd 192.168.2.255" ) # ln –s /etc/init.d/net.lo /etc/init.d/net.br0 # rc-update add net.br0 default # ifconfig br0 # brctl show modules_ath0=( "iwconfig" ) essid_ath0="superspot" channel_ath0="13" interface=ath0 # интерфейс беспроводного адаптера bridge=br0 # имя устройства-моста, содержащего беспроводной адаптер driver=madwifi # тип используемого драйвера ssid=superspot # идентификатор беспроводной сети auth_algs=1 # используемый алгоритм аутентификации, 1- open ieee8021x=1 # аутентификация согласно 802.1X #RADIUS own_ip_addr=127.0.0.1 # IP-адрес сервера RADIUS nas_identifier=superspot auth_server_addr=127.0.0.1 auth_server_port=1812 auth_server_shared_secret=supersecretpassword radius_retry_primary_interval=600 #WPA/IEEE 802.11i wpa=3 # в двоичном представлении – 11, что означает использовать WPA и WPA2 wpa_key_mgmt=WPA-EAP # будем использовать EAP-вариант аутентификации wpa_pairwise=CCMP # будем использовать AES для шифрования трафика wpa_group_rekey=600 wpa_strict_rekey=1 wpa_gmk_rekey=86400 rsn_preauth=1 use_mppe = yes require_encryption = yes require_strong = yes with_ntdomain_hack = yes realm ntdomain { format = prefix delimiter = "\\" ignore_default = no ignore_null = no } files { usersfile = ${confdir}/users acctusersfile = ${confdir}/acct_users preproxy_usersfile = ${confdir}/preproxy_users } authorize { preprocess mschap ntdomain eap files } files { usersfile = ${confdir}/users compat = no } client 127.0.0.1 { secret = supersecretpassword shortname = superspot nastype = other } realm DEFAULT { type = radius authhost = LOCAL accthost = LOCAL } eap { default_eap_type = peap timer_expire = 60 ignore_unknown_eap_types = no cisco_accounting_username_bug = no tls { private_key_password = пароль для доступа к секретному ключю сервера private_key_file = ${raddbdir}/certs/cert-srv.pem certificate_file = ${raddbdir}/certs/cert-srv.pem CA_file = ${raddbdir}/certs/cacert.pem dh_file = ${raddbdir}/certs/dh random_file = ${raddbdir}/certs/random } peap { default_eap_type = mschapv2 } mschapv2 { } } user1 User-Password == "password1" user2 User-Password == "password2" user3 User-Password == "password3" # rc-update add radiusd default # hostapd –Kdddd # radiusd –X default_eap_type = tls