Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 [ 57 ] 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

.ENDIF inc edi

mov al,byte ptr[esi] and al,OFh .IF al<=9

add al,"0"

mov byte ptr[edi],al

. ELSE

sub al,10 add al,"A"

mov byte ptr [edi],al

.ENDIF

inc inc dec cmp ecx,I jnz XX

edi esi ecx

mov xor ret

ByteToStr ENDP

byte ptr[edi],0 eax,eax

End DllEntry mscapit.def

LIBRARY EXPORTS

mscapit TestFunction

Целью MS Crypto API является предоставить разработчику программ универсальный способ для использования криптографических модулей, поэтому интерфейс не ограничен какими-либо конкретными алгоритмами. Выбор конкретного алгоритма задается параметрами функций и зависит от используемого криптопровайдера. Перечислим основные задачи, решаемые с помощью крипторафйческого API Windows: шифрование и расшифровка данных, выработка и проверка цифровой подписи (контрольной суммы), средства работы с цифровыми сертификатами, кодирование и декодирование данных, выработка и хранение криптофафических ключей.

Порядок взаимодействия приложений с криптофафическими модулями операционной системы регламентирует документ, который называется Microsoft Cryptographic Application Programming Interface (MS Crypto API). Функции, описанные в нем, поддерживаются Windows 95/98, Windows NT, 2000, XP. В последней ОС функции Crypto API содержатся в модулях crypt32.dll и advapi32.dll. На самом деле эти модули не реализуют криптофафИ ческие алгоритмы, а обращаются к другим модулям, называемым Cryptographic Service Providers (CSP). Одновременно в операционной системе можно установить несколько CSP-При первом обращении к Crypto API прикладная профамма выбирает, с каким именно

дудем CSP она будет работать, в зависимости от того, какие криптофафические алго-

ритмы

ей необходимы.

Эффективность криптозащиты зависит не только от использования определенных Mexai Лйзмов (криптопротоколов), таких, как шифрование или цифровая подпись, но и от выбора конкретных алгоритмов (криптопримитивов), реализуемых конкретным CSP. Список всех (-§р (криптопровайдеров), установленных в Windows 2000, можно получить в разделе jY LOCAL MACHINE\SOFTWARE\ Microsoft\Cryptography\Defeults\Provider системногс реестра Windows.

Большинство протоколов защиты данных фебует использования конкретных криптоалгоритмов. Для того чтобы прикладные профаммы соответствовали общепринятым стандартам. Crypto API вводит специальные типы CSP, например PROVRSAFULL mv PR0V RSA SCHANNEL. Криптопровайдер указанного типа должен реализовывать все криптоалгоритмы, определенные соответствующим стандартом. Так, к примеру PROV RSA SCHANNEL используется для реализации протокола SSL и должен поддерживать алгоритм RSA для цифровой подписи и обмена ключами, алгоритмы хеширования SHA и MD5 и специальную функцию CALG SSL3 SHAMD5 и т. д.

Наша библиотека mscapit.dll организовьшает простой интерфейс к MS Crypto API а точнее, к его средствам хеширования MD5. Рассмофим текст функции TestFunction.

TestFunction proc uses esi edi lpstring:DWORD

LOCAL hCryptProv:HCRYPTPROV LOCAL hHas:HCRYPTHASH LOCAL dwLength:DWORD LOCAL sHash[512]:BYTE (хеш-образа)

описатель криптопровайдера описатель объекта хеширования ; длина входной строки ; массив контрольной суммь

invoke CryptAcquireContext,ADDI

hCryptProv,NULL,NULL, PROV RSA FULL,CRYPT VERIFYCONTEXT

.IF eax==0 .ELSE

jmp error

invoke CryptCreateHash,hCryptProv,CALG MD5,0,0,ADDR hHash

.IF eax==0

jmp error

.ELSE

invoke Istrlen,Ipstring mov dwLength,eax

invoke СryptHashData, hHash, Ipstring, dwLength,0 .IF eax==0



dwLength, О

jmp error

.ELSE

mov invoke

CryptGetHashParam,hHash,HP HASHVAL,ADDR

dwLength,SIZEOF sHash

sHash,Ac-

.IF eax==0

jmp error

.ELSE

invoke ByteToStr,dwLength,ADDR sHash,Ipstring /convert byte array to hex string

invoke . CryptDestroyHash,hHash xor eax,eax

jmp exit

.ENDIF

.ENDIF

invoke CryptReleaseContext,hCryptProv,0

.ENDIF error:

exit:

.ENDIF

invoke GetLastError

invoke DisplayError,eax

mov . eax,-1

TestFunction endp

DisplayError PROC Error ID;DWORD

Директива LOCAL резервирует память в стеке для локальных переменных функций Все директивы LOCAL должны следовать непосредственно за директивой PROC. Обращение к локальным переменным в тексте программы происходит без каких бы то ни бы ло команд манипулирования стеком.

Вызов CryptAcquireContext требуется любой программе, работающей с MS Сгур API, именно этой функцией пользователь задает имя используемого криптопровайдер его тип и имя рабочего ключевого контейнера. Функция CryptAcquireContext возврат описатель криптопровайдера, который в дальнейщем может быть использован при р те его функционалом.

CryptAcquireContext proto hpProv: DWORD, / pszContainer: DWORD, / pszProvider: DWORD, / dwProvType: DWORD, / dwFlags: DWORD

hpProv - указатель на описатель криптопровайдера.-pszContainer - имя контейнера ключей. pszProvider - имя криптопровайдера. dwProvType - тип запрашиваемого криптопровайдера. dwFlags - дополнительные флаги.

Для инициализации операции хэширования потока данных нам потребуется вызов ryptCreateHash, который создаст новый объект хэщ-функции и вернет его описатель.

CryptCreateHash proto hProv:DWORD, / Algid: DWORD, / hKey: DWORD, / dwFlags: DWORD, phHash: DWORD

hpProv - описатель криптопровайдера.

Algid - идентификатор используемого алгоритма хэширования.

hKey - описатель сессионного ключа, используется в алгоритмах .эширования с секретным ключом.

dwFlags - зарезервирован для дальнейшего использования

phHash - адрес переменной, в которую возвращается описатель но-":эго объекта хэш-функции.

Следующей операцией, выполняемой функцией TestFunction, является вычисление значения контрольной суммы (хэша) переданной строки - вызов CryptHashData. Он используется для добавления данных к объекту хэщ-функции. Многократный вызов функции CryptHashData позволяет вычисление значения хэша для последовательностей, разбитых на блоки.

CryptHashData proto hHash:DWORD, / pbData: DWORD, / dwDataLen: DWORD, / dwFlags: DWORD,

hHash - описатель объекта хэш-функции. pbData - буфер, содержащий хэшируемые данные. dwDataLen - размер хэшируемых данных в байтах. dwFlags - флаги.



Следующая задача - получить результат работы криптоалгоритма. И эту операщ,, для операций хэширования выполняет вызов CryptGetHashParam, возвращающий пара, метры объекта хэщ-функции.

CryptGetHashParam proto hHash:DHORD, /

dwParam: DWORD, /

pbData: DWORD, / pbDataLen: DWORD, dwFlags: DWORD,

hHash - описатель объекта хэш-функции. dwParam - тип получаемой информации, результат хэширования ид список поддерживаемых алгоритмов. pbData - буфер для запрашиваемых данных. dwDataLen - указатель на размер буфера данных в байтах. dwFlags - флаги.

Для корректного завершения работы с криптопровайдером необходимо разрушить объект хэш-функции и освободить описаталь криптопровайдера. Это, соответственно, реализуют вызовы CryptDestroyHash и CryptReleaseContext.

CryptDestroyHash proto hHash:DWORD

Функция уничтожает объект хэш-функции, определенный описателем hHash, после уничтожения его описатель становится недействительным.

CryptDestroyHash proto hProv:DWORD, /

dwFlags-. DWORD

Эта функция освобождает описатель криптопровайдера hProv, созданный вызовом CrypAcquireContext. Параметр dwFlags зарезервирован для использования в будущем.

Полученное значение контрольной суммы в функции TestFunction дополнительно конвертируется в символьную строку шестнадцатеричного дампа для удобного отображения на экране.

В заключение еще раз перечислим круг вопросов, обсуждавшихся на протяжении данной главы:

Ш предпосылки к выбору инструментария разработки программ на языке ассемблер для ОС Windows;

структура приложения ОС Windows на языке ассемблер;

т механизмы взаимодействия приложения с системными сервисами ОС Windows на ассемблере;

Ш разработка динамически загружаемых библиотек на языке ассемблер для Windows; т криптофафические средства ОС Windows и их использование в профаммах на языке ассемблере.

Глава 6

Оптимизация для процессоров семейства Pentium

6.1. Введение

В этой главе подробно рассказывается о том, как писать оптимизированный код на ассемблере для семейства микропроцессоров Intel Pentium. В табл. 6.1 приводятся аббревиатуры, используемые в тексте для ссылки на то или иное поколение процессоров Pentium, подчеркивая его уникальные особенности:

Табл. 6.1. Основные поколения семейства процессоров Intel Pentium

Аббревиатура

Семейство

Pentium

РММХ

Pentium с ММХ

РРго

Pentium Pro

Pentium II (включая Celeron и Xeon)

Pentium III (включая Celeron и Xeon)

Поколение микропроцессоров PI и РММХ, в отличие от остальных более поздних, имеет много уникальных особенностей оптимизации часто используемых операций и их комбинаций. Поэтому можно сказать, что не существует общих методик оптимизации для всех поколений.

Правила оптимизации кода весьма сложны и имеют много исключений, но возможный выигрыш в производительности весьма значителен. У процесоров РРго, Р2 и РЗ также существуют значительные отличия внутренней реализации архитертуры Х86 в том, как процессор оптимизирует исполнение потока инструкций, не говоря уже про Постоянное расширение их набора.

Современное поколение микропроцессоров Pentium 4 наиболее значительно отличается от предыдущих поколений своей внуфенней реализацией. По этому обсуждение приемов оптимизации для него - отдельная тема исследования и в данной главе будет Опущена - читатель может обратиться к соответствующим руководствам от Intel.

Прежде чем начать реализовывать на некотором языке профаммирования решение Поставленной задачи, следует убедиться, что используемый в нем алгоритм оптимален. Зачас-



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 [ 57 ] 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88