2013 Математические основы информатики и программирования №3(21)
МАТЕМАТИЧЕСКИЕ ОСНОВЫ ИНФОРМАТИКИ И ПРОГРАММИРОВАНИЯ
УДК 004.43, 004.056
О КРИПТОГРАФИЧЕСКОМ РАСШИРЕНИИ И ЕГО РЕАЛИЗАЦИИ ДЛЯ РУССКОГО ЯЗЫКА ПРОГРАММИРОВАНИЯ
Г. П. Агибалов, В. Б. Липский, И. А. Панкратова
Национальный исследовательский Томский государственный университет, г. Томск,
Россия
E-mail: [email protected], [email protected], [email protected]
Представлено расширение русского языка программирования ЛЯПАС, получившее название ЛЯПАС-Т и заключающееся в увеличении длины операндов и расширении множества элементарных операций над ними. Необходимость в нём продиктована, в первую очередь, потребностями страны в доверенных и эффективных программной и аппаратной реализациях современных криптографических алгоритмов в безопасных компьютерных системах логического управления критически важными объектами, такими, как космические системы, энергетические установки, ядерное оружие, подводные лодки, беспилотники и т. п. Представлены также компилятор ЛЯПАСа-Т, генерирующий его загрузочный модуль для операционной системы Linux, и проекты процессора, реализующего ЛЯПАС-Т аппаратно, и препроцессора, конвертирующего программы на ЛЯПАСе-Т в исполняемый код процессора. Сообщается о процессоре для подмножества ЛЯПАСа-Т без подпрограмм, операций над комплексами и длинных операндов, описанном на VHDL, протестированном средствами компьютерного моделирования и реализованном на ПЛИС с помощью системы автоматизированного проектирования.
Ключевые слова: Русский язык программирования, ЛЯПАС-Т, компилятор, препроцессор, процессор, аппаратная реализация.
Введение
Здесь под Русским языком программирования подразумевается алгоритмический язык ЛЯПАС, разработанный в начале 1960-х годов в Томском государственном университете под руководством А. Д. Закревского и предназначенный для представления логико-комбинаторных алгоритмов решения задач прикладной дискретной математики, встречающихся в синтезе дискретных автоматов [1, 2]. Имя Русского языка программирования ему дали американские учёные [3]. До 1990-х годов ЛЯПАС интенсивно использовался в Советском Союзе [2], США [4], Германии, Польше, Чехословакии и многих других странах. В настоящее время ЛЯПАС успешно возрождается силами кафедры защиты информации и криптографии Томского государственного университета, главным образом, с целью разработки доверенного системного и прикладного программного обеспечения для автоматизированного проектирования безопасных компьютерных систем логического управления и для безопасной и эффективной реализации криптографических алгоритмов [5]. Среди многочисленных языков програм-
мирования, известных сегодня, ЛЯПАС предстаёт как наиболее подходящий для этих целей.
Вместе с тем есть один существенный и, возможно, единственный недостаток ЛЯПАСа — отсутствие в нём ряда элементарных операций, которые широко используются в современных криптографических алгоритмах: для арифметики длинных чисел, вычислений в многомерных пространствах над конечными полями и кольцами, решения комбинаторных задач над большими множествами и др. Кстати сказать, этот недостаток присущ всем современным языкам программирования, включая и те, что моложе ЛЯПАСа. В некоторых из них он преодолевается путём написания классов длинных чисел, больших дискретных функций и т. п. Что касается ЛЯПАСа, этот его недостаток более эффективно преодолевается расширением самого языка путём распространения элементарных операций в ЛЯПАСе на логические комплексы, которые, как известно, допускают арифметическую интерпретацию, и добавлением к нему некоторых новых элементарных операций, определённых над переменными и логическими комплексами. Последняя версия ЛЯПАСа — язык ЛЯПАС-М [6, 7], подвергнутый предварительно некоторой ревизии и затем расширенный (ехТе^е^ указанным образом, — называется ЛЯПАС-Т.
Ревизия ЛЯПАСа-М касается символики языка и арифметических операций умножения и деления целых чисел. Её результат назван уЛЯПАСом (от уЬУаРАБ, или reVised ЬУаРАБ). В нём вместо больших русских букв используются большие латинские буквы, символы некоторых операций заменены другими, более подходящими знаками, и операции умножения и деления определены с сохранением переполнения и остатка соответственно. Для хранения последних в язык введена специальная переменная Z.
Цель данной работы — представить информацию о некоторых из первых результатов, полученных в процессе возрождения ЛЯПАСа, а именно: о расширении ЛЯПАС-Т, обусловленном, главным образом, требованиями криптографических алгоритмов; о компиляторе ЛЯПАСа-Т, генерирующем код в формате исполняемого файла операционной системы (ОС) Ьтих; о процессоре, реализующем программы на ЛЯПАСе-Т аппаратно; о препроцессоре, транслирующем эти программы в исполняемый код процессора; о воплощении процессора в ПЛИС для подмножества уЛЯПАСа.
Начнём изложение с краткого обзора языка уЛЯПАС.
1. уЛЯПАС
Программа на уЛЯПАСе представляет собой последовательность предложений, каждое из которых (кроме, возможно, первого) начинается с §5, где в — целое неотрицательное число, и которые, в свою очередь, являются последовательностями операций над операндами языка.
1.1. Операнды
Операндами в уЛЯПАСе являются константы, переменные, комплексы и элементы комплексов. Они используются для представления неотрицательных целых чисел, булевых векторов, символов Ишс^е и последовательностей из них. Компоненты в булевом векторе нумеруются, начиная с 0 в направлении справа налево. В уЛЯПАСе неотрицательные целые ограничиваются числом 232 — 1, а длина булева вектора — числом 32. Булев вектор длины 32 называется словом и рассматривается также как неотрицательное целое, представленное в двоичном позиционном коде. Булев вектор любой длины п ^ 1 с одной единичной компонентой называется далее единичным вектором.
В vЛЯПАСе имеются натуральные, единичные и символьные константы. Натуральные константы записываются как десятичные, шестнадцатеричные, восьмеричные и двоичные числа. Единичная константа — это единичный вектор. Она обозначается Ii, если номер компоненты 1 в ней равен i. Символьная константа — это последовательность символов Unicode. В ней символы ' и \ записываются как пары \' и \\ соответственно.
Переменные в vЛЯПАСе принимают значения булевых векторов длины 32. Их количество равно 27. Они обозначаются буквами a, b, ... , z, Z и, как сказано выше, Z используется в специальных целях. Кроме того, есть ещё виртуальная переменная, называемая собственной или внутренней переменной языка. В отличие от остальных, реальных, переменных, она не участвует в записи программ на ЛЯПАСе, но появляется в них неявно как результат любой элементарной операции и может быть использована любой последующей операцией в программе. Для удобства изложения эту переменную принято называть т.
Комплекс есть конечное линейно упорядоченное множество элементов, которые в символьном комплексе суть коды символов (булевы векторы длины 8, или байты), а в логическом — булевы векторы длины 32, или слова. Каждый комплекс имеет уникальный номер из ряда 0, 1, 2, . . . Логический или символьный комплекс, имеющий номер i, обозначается Li или Fi соответственно. Действительное и максимально возможное количества элементов в комплексе являются параметрами комплекса и называются его мощностью и ёмкостью соответственно.
Далее все эти понятия вводятся формально:
— переменная и ::=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z;
— особая переменная Z;
— десятичная цифра д :: = 0|1|2|3|4|5|6|7|8|9, десятичая константа д ::= д{д};
— шестнадцатеричная цифра п ::= g|A|B|C|D|E|F, шестнадцатеричная константа
h ::= n{n}h;
— восьмеричная цифра ш ::= 0|1|2|3|4|5|6|7, восьмеричная константа w ::= ш{ш^;
— двоичная цифра е ::= 011, двоичная константа в ::= e{e}b ;
— натуральная константа i ::= д|h|w|e;
— символ о ::= любой символ Unicode, символьная константа Е ::=' о {а}';
— единичная константа I ::= Id|Iu; константа ::= i|E|I;
— символьный комплекс F::= Fd, логический комплекс L ::= Ld, комплекс к ::= F|L;
— индекс J ::= .д|и|(и + д)|(и — д); элемент комплекса ::= kJ;
— Qд ::= мощность комплекса с номером д, Бд ::= ёмкость комплекса с номером д;
— значение натуральной константы ::= неотрицательное целое|булев вектор;
— значение символьной константы ::= строка символов;
— значение переменной ::= неотрицательное целое|булев вектор;
— значение элемента логического комплекса ::= неотрицательное целое|булев вектор;
— значение элемента символьного комплекса :: = неотрицательное целое|булев вектор| символ.
В отличие от других языков программирования, типы значений в vЛЯПАСе не фиксированы. Тип значения (целое или вектор) для константы, переменной и элемента комплекса определяется типом операции (арифметической или логической соответственно), которая применяется к этому операнду.
1.2. Элементарные операции Передача значения
Пусть, как обычно, т есть собственная (внутренняя) переменная ЛЯПАСа, a — произвольные переменная или элемент комплекса, 7 — переменная, элемент комплекса или константа, х — значение на выходе генератора псевдослучайных чисел в компьютере (PRNG), Z — начальное состояние PRNG, в — значение на выходе таймера в компьютере. Тогда:
Oa — присвоение наименьшего значения (нулей): a := 00...0;
-a — присвоение наибольшего значения (единиц): a := 11... 1;
^ a — присвоение т: a := т;
Y — присвоение 7: т := 7;
^ (U1U2) —обмен значениями переменных U и и2;
^ (ku1u2), или ^ (кид), ^ (к.ди), или ^ (к.д1.д2) —обмен значениями элементов комплекса ки1 и ки2, или ки и к.д, или к.д1 и к.д2 соответственно;
X означает т := х; ^Х означает Z := т; T означает т := в.
Логические и арифметические операции
! —вычисление номера правой единицы: т := !т;
— — отрицание т := — т;
% — вычисление веса булева вектора: т := %т;
V7 — дизъюнкция: т := т V 7;
&7 — конъюнкция: т := т&7;
®7 — сложение по модулю 2: т := т ф 7;
< 7 — левый сдвиг: т := т < 7;
> 7 — правый сдвиг т := т > 7;
+7 — сложение по модулю 232: т := т + 7;
—7 — вычитание по модулю 232: т := т — 7;
*7 — умножение по модулю 232: т := т * 7, Z := переполнение;
: 7 — деление двойного числа: т := частное от деления Zт на 7, Z := остаток;
/7 — частное целочисленного деления: т := частное от деления т на 7, Z := остаток; ; 7 — остаток целочисленного деления: т := остаток от деления т на 7, Z := частное; Aa — увеличение на 1: т := a := a + 1;
Va — уменьшение на 1: т := a := a — 1.
1.3. Операции перехода м д — безусловный переход к параграфу д; м д — переход к параграфу д по условию т = 0; м д — переход к параграфу д по условию т = 0;
t (71 ° 72)д — переход к параграфу д по отношению о е {=, =,<,>, ^, ^};
^ д — уход к параграфу д с возвратом;
— возврат к точке, следующей за точкой ухода >-^ д; t (7)д — переход к параграфу д по времени 7;
tXдa1a2 — перечисление единиц: если a1 = 0, то a2 := 0 и м д,в противном случае правая 1 в a1 заменяется на 0, её номер присваивается a2 и выполняется следующая операция;
{assembly program} — ассемблерная вставка: выполняется программа на языке Ассемблера, указанная между { и }.
1.4. Операции над комплексами Пусть £ есть д или и; тогда:
@ + к(£) —образование (создание) комплекса к ёмкости £ и мощности 0;
@ — к — уничтожение комплекса к;
@%к — сокращение ёмкости комплекса до его мощности;
О к - очистка комплекса (в пределах его мощности): к ::= 00 ... 0;
...^т > Т — символы ^1,а2, ...,ат добавляются к символьному комплексу Т; @ > к£ — вставка элемента: значение т вставляется в комплекс к перед £-м элементом (в отсутствие £ — после последнего элемента);
@ < к£ — удаление элемента: £-й элемент (в отсутствие £ — последний элемент) комплекса к перемещается в т, мощность комплекса уменьшается на 1;
@#к1 к2(£1, £2, £3) — £1 элементов комплекса к1, начиная с £2-го элемента (в отсутствие £2 —первые £1 элементов к1), копируются в к2, начиная с £3-го элемента (в отсутствие £3 — в конец к2), мощности к1, к2 не изменяются.
Впредь комплекс, образованный с фиксированной ёмкостью (д), называется статическим, а комплекс с переменной ёмкостью (и) —динамическим.
Заметим также, что операция объявления части комплекса самостоятельным комплексом, существующая в ЛЯПАСе, не включена в уЛЯПАС по причине её потенциальной опасности.
1.5. Операции ввода-вывода
/Т >С — вывод символьного комплекса Т на консоль;
/Ч1 >С — вывод символьной константы <; на консоль;
/Т <С — ввод символьной константы с клавиатуры: вводимые символы добавляются к символьному комплексу Т, мощность комплекса увеличивается.
2. Расширение уЛЯПАСа
2.1. Длинная арифметика Натуральные константы в расширении ЛЯПАС-Т являются целыми из множества {0,1,..., 2П — 1}, где п кратно 32 и зависит от фактической реализации ЛЯПАСа-Т. В настоящее время значение п = 214 вполне приемлемо для криптографических приложений.
Обозначая число 232 символом $, любую натуральную константу с можно выразить в виде
С = Со + С^ + С2$2 + ... + СГ-1^Г 1 (1)
для некоторых г > 0 и с € П = {0,1,... , 232 — 1}, I = 0,1,... , г — 1. В стандартном двоичном представлении элементы множества П являются словами — булевыми векторами длины 32. Поэтому в ЛЯПАСе-Т последовательность с0,с1,... ,сг-1 представляется логическим комплексом мощности г с с в качестве г-го элемента.
Все операции, определённые в уЛЯПАСе над переменными, в ЛЯПАСе-Т могут применяться к логическим комплексам. В случае арифметической операции последовательность элементов комплекса рассматривается как натуральная константа с, заданная формулой (1). Различные операнды для одной и той же арифметической операции могут иметь различные длины и типы (один из них — переменная, другой — комплекс). В случае логической операции значение комплекса рассматривается как булев вектор, являющийся конкатенацией элементов комплекса. Логические комплексы мощности п/32 со значениями единичных векторов являются единичными константами в ЛЯПАСе-Т.
2.2. М н о ж е с т в е н н о с т ь с о б с т в е н н о й п е р е м е н н о й
Таким образом, в отличие от ЛЯПАСа, в ЛЯПАСе-Т есть два типа операндов для элементарных операций: переменные длины в одно слово и логические комплексы различных длин — от одного до n/32 слов. Соответственно этому, в ЛЯПАСе-Т имеются и два типа собственной переменной — простая и комплексная. Первая — из ЛЯПАСа, имеет длину одного слова. Она может принимать значение любой переменной языка. В любой реализации ЛЯПАСа-Т, программной или аппаратной, она представляется в регистре процессора. Собственные переменные 2-го типа имеют длины логических комплексов и могут принимать значения последних. В аппаратной реализации ЛЯПАСа-Т все они могут представляться в одном и том же регистре максимальной возможной длины — n разрядов. В программной реализации ЛЯПАСа-Т, из-за отсутствия такого регистра, роль комплексной собственной переменной на время выполнения цепочки операций, начинающейся с обращения к логическому комплексу, возлагается непосредственно на этот комплекс, и хранится она по месту его расположения в памяти компьютера.
В дальнейшем изложении, там, где это не вызывает двусмысленности, собственная переменная любого типа, будь то простая или комплексная, обозначается (как в ЛЯПАСе) буквой т и называется соответственно простой или комплексной т.
2.3. Д о п о л н и т е л ь н ы е о п е р а ц и и
В дополнение к операциям в vЛЯПАСе расширение ЛЯПАС-Т содержит некоторые новые логические операции, используемые в записи криптографических алгоритмов, включая следующие, где А ::= и|£|ки|к.д|д:
1) ft L — перестановка: компоненты булева вектора т переставляются в соответствии с их порядковыми номерами, указанными в элементах логического комплекса L;
2) _(£ь£2) —проекция: выбирается часть булева вектора т с компонентами, имеющими номера в интервале (£1,£2);
3) ft £1А(£2,£3) —вставка: часть булева вектора А с компонентами, имеющими номера в интервале (£2,£3), вставляется в т перед £1-й компонентой (в отсутствие £3 вставляется правая часть булева вектора А длины £2, в отсутствие (£2, £3) —весь булев вектор А);
4) ft (£1, £2) — редукция: часть булева вектора т с компонентами, имеющими номера в интервале (£ъ£2), вычёркивается из вектора;
5) | А — конкатенация: булев вектор А присоединяется к т;
6) ^ £1(£2,£3) или ^ £1(£2,£3) —левый или правый циклические сдвиги: часть булева вектора т с компонентами, имеющими номера в интервале (£2,£3), циклически сдвигается на £1 бит влево или вправо соответственно (в отсутствие £3 сдвигается правая часть булева вектора т длины £2, в отсутствие (£2,£3) —весь булев вектор т);
Т) ^ к — максимальный элемент комплекса к помещается в т, его номер — в Z;
8) ^ к — минимальный элемент комплекса к помещается в т, его номер — в Z.
Что касается арифметических операций по модулю N (для некоторого натурального N), таких, как сложение и вычитание (mod N), умножение (mod N), возведение в степень (mod N) и другие, широко используемые в криптографии, фактически нет никакой реальной возможности для включения их в список элементарных операций ЛЯПАСа-Т из-за существования великого множества алгоритмов их выполнения, имеющих разные эффективности в различных случаях. Вместо этого решено эти алгоритмы реализовывать по мере надобности и возможности на ЛЯПАСе-Т и (или) на
языке Ассемблера и включать их в библиотеку для использования в программах на ЛЯПАСе-Т в качестве подпрограмм.
3. Компилятор ЛЯПАСа-Т
3.1. Что это такое?
Далее для краткости любая программа на ЛЯПАСе-Т и её подпрограммы называются L-программой и L-подпрограммами соответственно.
Для выполнения L-программы компьютером она должна быть подана в качестве параметра компилятору, который преобразует её в загрузочный модуль (исполняемый код) для ОС Linux. Компилятор запускается по команде последней >$ lc <prog>.l,
где <prog>.l —это имя файла с L-программой, являющейся списком L-подпрограмм. (Рекомендуется файлу с L-программой давать имя с расширением l, но это не обязательно.) Первая в списке L-подпрограмма является головной. ОС Linux передаёт ей управление после загрузки файла в оперативную память компьютера. Порядок следования других L-подпрограмм в списке несущественный. Файл может содержать не все необходимые L-подпрограммы. В этом случае компилятор находит недостающие в файле liblO.l, являющемся библиотекой пользователя. В ней рекомендуется хранить наиболе часто используемые L-подпрограммы.
Результатом работы компилятора является загрузочный модуль, который хранится под именем <prog> (без расширения) в той же папке, где находится и L-программа. Запуск скомпилировангой программы на выполнение осуществляется по команде >$ ./<prog>.
Компилятор написан на языке C+—+ с использованием библиотеки регулярных выражений, делающим его максимально простым и прозрачным.
3.2. С т р у к т у р а з а г р у з о ч н о г о м о д у л я
Загрузочный модуль состоит из двух сегментов — сегмента программы (.text) и сегмента данных (.data). В свою очередь, первый сегмент состоит из подпрограмм, генерируемых компилятором для L-подпрограмм, вызываемых в процессе исполнения L-программы. Сегмент данных содержит: текущий адрес в памяти для размещения новых комплексов и границу памяти, отводимой ОС под комплексы; текущее состояние PRNG; единичные константы; веса всех булевых векторов в {0,1}8 (нужны для реализации операции взвешивания %); все символьные константы, встречающиеся в L-программе.
3.3. О р г а н и з а ц и я п а м я т и
Для каждой L-подпрограммы все её локальные переменные, начала, мощности и ёмкости её локальных комплексов размещаются в стеке, образующем фрейм в 1420 байтов. Доступ к локальным данным осуществляется по фиксированным смещениям от начала фрейма (регистр ebp). Значение регистра ebp фрейма родительской подпрограммы также сохраняется во фрейме, образуя список фреймов вызванных L-подпрограмм.
Локальные комплексы L-подпрограммы размещаются в «куче». Адрес свободного участка кучи на момент вызова подпрограммы также сохраняется во фрейме.
Создание локального комплекса сопровождается проверкой свободного места путём сравнения величин ёмкости создаваемого комплекса, адреса свободного участка и границы памяти, отводимой под комплексы. Если места достаточно, то адрес начала комплекса получает значение адреса свободного участка, а адрес свободного участка
увеличивается на значение ёмкости комплекса. Если места недостаточно, то выполняется обращение к ОС для увеличения границы доступной памяти.
Такая организация памяти защищена от атак переполнения стека и «кучи», поскольку, во-первых, буферы (комплексы) убраны из стека вместе с возможностью переписать адрес возврата и, во-вторых, нет операций для освобожения «кучи» посредством ОС.
4. Процессор ЛЯПАСа-Т
4.1. Параметры
В ЛЯПАСе-Т, реализованном аппаратно, длина операнда, наибольший номер комплекса и наибольшее количество подпрограмм в иерархической структуре программы обозначаются натуральными n, m и k соответственно. Следовательно, количества различных комплексов (логических и символьных) и переменных в программе на ЛЯПАСе-Т, исполняемой процессором, равны соответственно mk и 27k. В настоящее время максимальные значения m = 64, k =128 вполне достаточны для большинства практических алгоритмов.
4.2. И с п о л н я е м ы й к о д
Для исполнения процессором программа на ЛЯПАСе-Т должна быть предварительно представлена последовательностью инструкций в исполняемом коде (называемом LE-код) для процессора. Каждая инструкция в нём содержит в себе поля под код операции, тип операнда (константа или нет, тип комплекса — логический, символьный, статический или динамический, если операнд — комплекс или его элемент) и под адреса комплекса и переменной в памяти данных. Поле адреса комплекса используется, если операция имеет дело с данными вида ки или L. В первом случае адрес статического комплекса к, являющийся, по определению, адресом его первого элемента, записывается в этом поле явно, и адрес переменной и записывается в поле адреса переменной. Во втором случае поле адреса комплекса содержит адрес комплекса L и поле адреса переменной остаётся пустым (равно Q). Во всех других случаях поле адреса комплекса в инструкции пустое. То же самое справедливо и в отношении динамического комплекса с одним исключением: в поле адреса динамического комплекса указывается не сам адрес комплекса, а адрес, по которому он хранится.
4.3. А р х и т е к т у р а
Архитектура процессора, реализующего ЛЯПАС-Т аппаратно, содержит блоки: Память, Арифметико-логическое устройство (АЛУ), Устройство управления (CD — Control Device), Счётчик инструкций (IC — Instruction Counter), Регистр инструкций (IR —Instruction Register) и два Дешифратора — адреса (ADec) и операции (ODec).
Память
Память процессора подразделяется на два сегмента — IM (Instruction Memory) и DM (Data Memory), используемых для запоминания соответственно последовательности инструкций в LE-коде, представляющей некоторую программу P на ЛЯПАСе-Т, и данных для неё — единичных констант Ii, переменных и комплексов для каждой подпрограммы в иерархической структуре программы P, а также параметров (мощностей и ёмкостей) и адресов этих комплексов в DM. Соответственно, для P с k подпрограммами, DM подразделяется условно на четыре секции: секция I — для хранения векторов Ii, i = 0,1,... , n — 1; секции C и G, разбитые на k подсекций Cj и Gj —для хранения соответственно статических и динамических комплексов в j-й подпрограмме; и секция W, также разбитая на k подсекций Wj — для хранения принадлежащих
j-й подпрограмме локальных переменных a, b, ..., z, параметров и адресов всех комплексов j-й подпрограммы.
Секции I, C и W образуют так называемую статическую память, а секция G — динамическую память процессора. Размещение данных в первой выполняет препроцессор (до исполнения программы P), во второй — сам процессор (во время исполнения P).
Инструкции в IM и данные в DM располагаются плотно, без пропусков элементов памяти, в порядке следования секций I, C, W и G. Количество занятых элементов подсекции Gj в DM отображается значением одного из элементов в Wj. Адрес этого элемента обозначается далее aj. Его значение есть наименьший из адресов свободных элементов в Gj. В частности, до запуска процессора все aj совпадают с числом элементов в статической памяти DM.
Статические комплексы, создаваемые в j-й подпрограмме, размещаются в Cj препроцессором путём указания их параметров и адресов в Wj. Ёмкость и адрес в Wj динамического комплекса препроцессор оставляет неопределёнными. Динамический комплекс, создаваемый в j -й подпрограмме с ёмкостью, задаваемой значением некоторой переменной £, располагается в Gj в массиве требуемого размера с начальным элементом по адресу, записанному по адресу aj. Это делается аналогичным образом процессором в момент исполнения им данной операции: параметры и адрес комплекса запоминаются в Wj, значение по адресу aj увеличивается на £.
АЛУ
АЛУ состоит из трёх регистров т, Z и O максимальной возможной длины n, называемых регистрами общего назначения (CURs - Common Use Registers) и предназначенных для представления соответственно переменных т, Z и операнда, считываемого из DM, а также операционных устройств (OD — Operational Devices) и схемы CEA (Complex Element Address) определения адреса элемента комплекса в DM.
Операционные устройства используются для выполнения арифметических и логических операций в ЛЯПАСе-Т с участием операндов и результатов операций, представленных в регистрах т, Z и O.
Для элемента комплекса ки его адрес в DM вычисляется схемой CEA как в = + 4и, если к = L, или как в = ^ + и, если к = F, где ^ есть адрес в DM
первого элемента в к (называемый также адресом самого комплекса к).
Устройство управления
Основные функции блока CD следующие: получать и анализировать информационные сигналы от других блоков, выбирать следующую инструкцию из IM, идентифицировать код операции в ней, определять адрес операнда в DM и адрес следующей инструкции в IM, формировать и посылать управляющие сигналы к другим исполнительным блокам.
4.4. А л г о р и т м ф у н к ц и о н и р о в а н и я
1. Устройство управления CD выбирает из IM инструкцию по адресу, указанному в IC, и записывает её в IR.
2. ODec дешифрует содержимое поля кода операции, а ADec — содержимое полей типа и адреса операнда (комплекса и/или переменной) из инструкции в IR.
3. CD по информации от ODec и ADec генерирует сигналы либо для выбора из DM (возможно, посредством схемы CEA) операнда (константы, переменной, комплекса или элемента комплекса) по соответствующему адресу и для его записи в один из CURs, либо, если операнд является константой, заданной в инструкции явно, для записи его в регистр O или в IC.
4. Если операция в инструкции относится к функциональному типу, т. е. является арифметической или логической, то СВ генерирует сигнал, инициализирующий соответствующее ОВ.
5. Это ОВ выполняет данную операцию, и результат записывается в СиИй в соответствии с кодом операции.
6. Если код операции указывает на переход, то содержимое поля адреса переменной в инструкции в Ш записывается в 1С; в противном случае содержимое в 1С увеличивается для выбора следующей инструкции из 1М.
7. Если инструкция в Щ указывает на создание некоторого динамического комплекса с переменной ёмкостью £ в ]-й подпрограмме, то мощность 0 и ёмкость £ этого комплекса записываются по адресам его параметров в Wj, а значение по адресу aj запоминается в Wj как адрес этого комплекса в Gj и затем увеличивается на величину £.
В этом алгоритме функционирования процессора поведение устройства управления СВ описывается формально на языке конечных автоматов.
4.5. Ь-препроцессор
Для трансляции программы на ЛЯПАСе-Т в ЬЕ-код используется специальный компилятор, называемый Ь-препроцессор. Он может быть написан на любом языке программирования (на ЛЯПАСе-Т, например) для исполнения на любом компьютере, снабжённом соответствующим компилятором. Ь-препроцессор должен выполнять следующую последовательность действий над заданной Ь-программой Р:
1) каждой подпрограмме в иерархической структуре программы Р назначить уникальный номер из ряда 1, 2, ... , к;
2) для каждого ] = 1, 2,..., к каждой локальной переменной и каждому статическому локальному комплексу ]-й подпрограммы в структуре программы Р поставить в соответствие уникальный адрес в Wj;
3) для каждого вызова ^'-й подпрограммы из г-й подпрограммы в Р, г,^ € {1, 2, . . . , к}, подставить реальные параметры, указанные в вызове, вместо соответствующих абстрактных (внешних) параметров в теле ]-й подпрограммы и вместо самого вызова — инструкции а^, ^ аj и текст ]-й подпрограммы, в котором вместо имени всякого динамического комплекса указан адрес в Wj, где лежит адрес этого комплекса в Gj;
4) всякую другую операцию в программе заменить эквивалентной ей цепочкой инструкций в ЬЕ-коде — непосредственно либо с промежуточной заменой на цепочку унарных операций, т. е. таких, которые используют самое большее один операнд, отличный от т.
4.6. А л ь т е р н а т и в н ы й в а р и а н т
В альтернативном варианте процессора в сегменте 1М хранятся исполняемые коды как головной программы, так и всех подпрограмм в её иерархической структуре. В этом случае Ь-препроцессор вместо вызова подпрограммы подставляет в содержащую его (вызов) программу инструкцию А с кодом операции перехода по адресу исполняемого кода данной подпрограммы в 1М и в конец последнего записывает инструкцию с кодом операции возврата, т. е. перехода по адресу инструкции, следующей в 1М за А. Кроме того, в процессе исполнения программы процессор перед исполнением инструкции А пересылает значения входных операндов подпрограммы, указанных в её вызове, по соответствующим адресам ВМ в её исполняемом коде, а перед возвратом к инструкции, следующей за А, пересылает результаты исполнения кода подпрограммы по адресам соответствующих её выходных операндов, указанных в её вызове.
Пересылка значений операндов подпрограмм существенно снижает скорость работы процессора по сравнению с его базовым вариантом, но значительно сокращает объём требуемой памяти сегмента IM. Вместе с тем отсутствие пересылок между операндами в базовом варианте не гарантирует сохранения значений входных операндов подпрограммы, если это не предусмотрено программистом.
4.7. Применения Есть, по меньшей мере, два возможных применения процессора ЛЯПАСа-Т: в качестве криптопроцессора и как управляющего процессора. В первом случае сегмент памяти IM заполняется LE-кодом некоторой программы на ЛЯПАСе-Т, реализующей некоторый криптографический алгоритм, а данные для него (открытый или шифрованный тексты, ключи и др.) записываются в сегмент DM. Во втором случае IM и DM используются для запоминания соответственно LE-кода ЛЯПАС-Т-программы, реализующей некоторый алгоритм, предназначенный для безопасного управления критически важным объектом (космическим, энергетическим, транспортным, технологическим и т. п.), и данных для этой программы.
5. Процессор для подмножества уЛЯПАСа
Пусть Li является подмножеством vЛЯПАСа, которое включает все операции первого уровня vЛЯПАСа и не содержит (вызовов) подпрограмм и операций над комплексами. Архитектура процессора для L1 (называемого также L1-процессором) была впервые разработана и описана на VHDL в 2012 г. С.Е. Солдатовым, студентом кафедры защиты информации и криптографии Томского государственного университета. С целью предварительной верификации все отдельные блоки в L1-процессоре и его архитектура в целом промоделированы с помощью программного продукта ModelSim PE Student Edition 10.1d. Кроме того, с использованием автоматизированной системы проектирования ISE WebPACK 9.2i фирмы «Xilinx» синтезирована программируемая логическая интегральная схема ^-процессора. Максимальная рабочая частота схемы равна 50 МГц, что эквивалентно схемной задержке в 20 нс. Cхема занимает 1/3 часть отладочной платы Nexys2 FPGA, Digilent Inc.
Этот результат показывает, что аппаратная реализация процессора для ЛЯПАСа-Т является совершенно реальным проектом, обещающим создание доверенных средств для эффективного исполнения криптографических и безопасных управляющих алгоритмов.
Результаты работы доложены на 12 Всероссийской конференции «Сибирская научная школа-семинар с международным участием „Компьютерная безопасность и криптография"— SIBECRYPT’13» [8, 9]. Там же был продемонстрирован алгоритм шифрования AES, представленный на языке vЛЯПАС [10].
ЛИТЕРАТУРА
1. LYaPAS, a Programming Language for Logic and Coding Algorithms / eds. M.A. Gavrilov and A. D. Zakrevskii. New York, London: Academic Press, 1969. 475 p.
2. Торопов Н. Р. Язык программирования ЛЯПАС // Прикладная дискретная математика. 2009. №2(4). С. 9-25.
3. Nadler N. User group for Russian programming language // IEEE, Newsletter for Computer-Aided Design. 1971. Iss.3.
4. Charles J. and Albright Jr. An Interpreter for the Language LYaPAS. University of North Carolina at Chapel Hill: Department of Computer Science. 1974. 125 p.
5. Агибалов Г. П. К возрождению русского языка программирования // Прикладная дискретная математика. 20І2. №3(17). С. 77-84.
6. Закревский А. Д., Торопов Н. Р. Система программирования ЛЯПАС-М. Минск: Наука и техника, І978. 240 с.
7. Торопов Н. Р. Диалоговая система программирования ЛЕС. Минск: Наука и техника, І985. 2б3с.
8. Agibalov G. P., Lipsky V. B., and Pankratova I. A. Cryptographic extension of Russian programming language jj Прикладная дискретная математика. Приложение. 20І3. №б. С. 93-98.
9. Agibalov G. P., Lipsky V. B., and Pankratova I. A. Project of hardware implementation of Russian programming language jj Прикладная дискретная математика. Приложение. 20І3. №б. P. 98-І02.
10. Broslavskiy O. V. AES in LYaPAS jj Прикладная дискретная математика. Приложение. 20І3. №б. С. 102-104.