Несколько лет назад я реализовал алгоритм SHA-256 на моем TI-83. Я также осуществил AES-128-CFB. Я отказался от RSA и DSA из-за ограничений памяти, поэтому я никогда не создать полный набор сильных криптографических для TI-83 / z80. При всей заинтересованности в Bitcoin в эти дни, может быть, кто-то найдет мой SHA-256 код интересно (или я вернуться к нему --- хотя я лично считаю асимметричную криптографию или более сильный режим симметричного блока поинтереснее).
Если ~ 800 байт / сек от моих комментариев надежны, старый z80 должен делать ~ 7 ч / с, не так ли?
Код расчета:
Код:
; sha256up.z80 по timewave0
; 1twzU46whuMER6hhBPCGmdaLw8atyv9c4
;
; этот файл constains чистый, переносимый код z80,
; нет вызовов ROM TI-8x
; эта подпрограмма обновляет SHA256 хэш
; в Н0, чтобы H7 дали полный блок скопированный
; к началу WBUF
sha256update:
; Вторая часть графика сообщений (этап 1)
л.д. IX, WBUF + 64-4
LD C, 16-1
шаг 1: вкл IX
вкл IX ; IX отслеживает W (T)
вкл IX
вкл IX
вкл с ; счетчик ++
; строчная sigma_1
ЛД ч, (IX-8 + 2) ; повернуть 16 бит
LD л, (IX-8 + 3) ; как два байта
LD д, (IX-8 + 0) ; 0123 -> dehl
LD е, (IX-8 + 1)
LD B, 1
звоните rotrb ; один бит вправо
л.д. а, ч
LD (sigma_temp + 0 + 0), А ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 0), А ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 0), А
л.д. а, е
LD (sigma_temp + 9 + 0), А
LD B, 2
звоните rotrb ; два бита вправо
л.д. а, ч
LD (sigma_temp + 0 + 1), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 1), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 1),
л.д. а, е
LD (sigma_temp + 9 + 1),
л.д. ч, 0 ; сдвиг 8 бит
LD л, (IX-8 + 0) ; как байты
LD д, (IX-8 + 1)
LD е, (IX-8 + 2)
LD B, 2
вызов sharb ; еще два бита
л.д. а, ч
LD (sigma_temp + 0 + 2), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 2), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 2),
л.д. а, е
LD (sigma_temp + 9 + 2),
LD HL, sigma_temp
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (IX + 0), А
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (IX + 1),
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (IX + 2),
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (IX + 3),
; сделано с строчной sigma_1
; строчная sigma_0
ЛД ч, (IX-60 + 3) ; вращать 8 бит
LD л, (IX-60 + 0) ; как один байт
LD д, (IX-60 + 1)
LD е, (IX-60 + 2)
LD B, 1
slcb вызов ; один бит влево
л.д. а, ч
LD (sigma_temp + 0 + 0), А ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 0), А ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 0), А
л.д. а, е
LD (sigma_temp + 9 + 0), А
л.д. а, е
LD E, D
LD д, л
ЛД л, ч
л.д. ч, ; hlde -> ehld
LD B, 3
звоните rotrb ; еще три бита
л.д. а, ч
LD (sigma_temp + 0 + 1), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 1), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 1),
л.д. а, е
LD (sigma_temp + 9 + 1),
ЛД ч, (IX-60 + 0)
LD л, (IX-60 + 1)
LD д, (IX-60 + 2)
LD е, (IX-60 + 3)
LD B, 3
вызов sharb ; еще три бита
л.д. а, ч
LD (sigma_temp + 0 + 2), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 2), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 2),
л.д. а, е
LD (sigma_temp + 9 + 2),
LD HL, sigma_temp
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD D, A
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
л.д. е, а
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD B, A
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
добавить, (IX + 3)
LD (IX + 3),
LD A, (IX + 2)
АЦП а, б
LD (IX + 2),
LD A, (IX + 1)
АДЦ а, е
LD (IX + 1),
LD A, (IX + 0)
АЦП A, D
LD (IX + 0), А
толчок IX
толчок IX
поп гектолитров
вкл гектолитров
вкл гектолитров
вкл гектолитров
л.д. де, 3-28
добавить IX, де
звоните add32 ; + = W_t-7
вкл гектолитров
вкл гектолитров
вкл гектолитров
л.д. де, 28-64
добавить IX, де
звоните add32 ; + = W_t-16
поп-IX
LD A, 63
ф с ; повторение?
JP н.д., step1
; сделано с графиком сообщений
; шаг 2 является простой копией, даже облегчили
; сохраняя [A-H] и H [0-7] вместе в памяти
LD HL, H0
л.д. де, ABUF
LD BC, 32
LDIR
; Ничего себе, это было легко
; шаг 3 является наибольшей частью алгоритма
XOR A ; начать с т = 0
LD (step3_t), A ; Счетчик step3_t
шаг 3:
; прописные sigma_1 е
л.д. IX, EBUF
ЛД ч, (IX + 3)
LD л, (IX + 0)
LD д, (IX + 1)
LD е, (IX + 2)
LD B, 2
slcb вызов ; нетто 6 бит вправо
л.д. а, ч
LD (sigma_temp + 0 + 0), А ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 0), А ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 0), А
л.д. а, е
LD (sigma_temp + 9 + 0), А
л.д. а, е
LD E, D
LD д, л
ЛД л, ч
л.д. ч,
LD B, 3
slcb вызов ; 6 + 8-3 бит вправо
л.д. а, ч
LD (sigma_temp + 0 + 1), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 1), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 1),
л.д. а, е
LD (sigma_temp + 9 + 1),
Экс-де, гл
LD B, 2
slcb вызов ; 6 + 8-3 + 16-2
л.д. а, ч
LD (sigma_temp + 0 + 2), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 2), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 2),
л.д. а, е
LD (sigma_temp + 9 + 2),
LD HL, sigma_temp
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP1 + 0), А
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP1 + 1),
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP1 + 2),
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP1 + 3),
; сделано с прописной sigma_1 е
LD IX, HBUF + 3
LD HL, TEMP1 + 3
звоните add32 ; Т_1 + = HBUF
LD IX, WBUF + 3
LD A, (step3_t)
LD B, 0
ОАС
гх б ; * = 2
ОАС
гх б ; * = 2
л.д. с, а
добавить IX, бв
LD HL, TEMP1 + 3
звоните add32 ; Т_1 + = W_t
LD IX, Karray + 3
добавить IX, бв
LD HL, TEMP1 + 3
звоните add32 ; Т_1 + = K_t
; использовать XOR (г е и (F XOR г)) для Ch
л.д. IX, EBUF
LD A, (IX + 8 + 0) ; GBUF
XOR (IX + 4 + 0) ; исключающее FBUF
и (IX + 0 + 0) ; и EBUF
XOR (IX + 8 + 0) ; исключающее GBUF
LD D, A
LD A, (IX + 8 + 1) ; GBUF
XOR (IX + 4 + 1) ; исключающее FBUF
и (IX + 0 + 1) ; и EBUF
XOR (IX + 8 + 1) ; исключающее GBUF
л.д. е, а
LD A, (IX + 8 + 2) ; GBUF
XOR (IX + 4 + 2) ; исключающее FBUF
и (IX + 0 + 2) ; и EBUF
XOR (IX + 8 + 2) ; исключающее GBUF
LD B, A
LD A, (IX + 8 + 3) ; GBUF
XOR (IX + 4 + 3) ; исключающее FBUF
и (IX + 0 + 3) ; и EBUF
XOR (IX + 8 + 3) ; исключающее GBUF
добавить, (IX-20 + 3)
LD (IX-20 + 3),
LD A, (IX-20 + 2)
АЦП а, б
LD (IX-20 + 2),
LD A, (IX-20 + 1)
АДЦ а, е
LD (IX-20 + 1),
LD A, (IX-20 + 0)
АЦП A, D
LD (IX-20 + 0), А ; TEMP1 + = Ch
; прописные sigma_0 из
л.д. IX, ABUF
ЛД ч, (IX + 0)
LD л, (IX + 1)
LD д, (IX + 2) ; 0123 -> hlde
LD е, (IX + 3)
LD B, 2
звоните rotrb ; два бита вправо
л.д. а, ч
LD (sigma_temp + 0 + 0), А ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 0), А ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 0), А
л.д. а, е
LD (sigma_temp + 9 + 0), А
л.д. а, е
LD E, D
LD д, л
ЛД л, ч
л.д. ч,
LD B, 3
звоните rotrb ; 2 + 8 + 3
л.д. а, ч
LD (sigma_temp + 0 + 1), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 1), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 1),
л.д. а, е
LD (sigma_temp + 9 + 1),
л.д. а, е
LD E, D
LD д, л
ЛД л, ч
л.д. ч,
LD B, 1
звоните rotrb ; 2 + 8 + 3 + 8 + 1
л.д. а, ч
LD (sigma_temp + 0 + 2), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 2), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 2),
л.д. а, е
LD (sigma_temp + 9 + 2),
LD HL, sigma_temp
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP2 + 0), А
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP2 + 1),
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP2 + 2),
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP2 + 3),
; сделано с прописной sigma_0 из
; использовать (а и б) или (с и (а или б)) для Maj
; IX по-прежнему указывает на ABUF
LD A, (IX + 0 + 0) ; ABUF
или (IX + 4 + 0) ; или BBUF
и (IX + 8 + 0) ; и CBUF
LD D, A
LD A, (IX + 0 + 0) ; ABUF
и (IX + 4 + 0) ; и BBUF
или г
LD D, A
LD A, (IX + 0 + 1) ; ABUF
или (IX + 4 + 1) ; или BBUF
и (IX + 8 + 1) ; и CBUF
л.д. е, а
LD A, (IX + 0 + 1) ; ABUF
и (IX + 4 + 1) ; и BBUF
или е
л.д. е, а
LD A, (IX + 0 + 2) ; ABUF
или (IX + 4 + 2) ; или BBUF
и (IX + 8 + 2) ; и CBUF
LD B, A
LD A, (IX + 0 + 2) ; ABUF
и (IX + 4 + 2) ; и BBUF
или б
LD B, A
LD A, (IX + 0 + 3) ; ABUF
или (IX + 4 + 3) ; или BBUF
и (IX + 8 + 3) ; и CBUF
л.д. с, а
LD A, (IX + 0 + 3) ; ABUF
и (IX + 4 + 3) ; и BBUF
или с
добавить, (IX + 32 + 3)
LD (IX + 32 + 3),
LD A, (IX + 32 + 2)
АЦП а, б
LD (IX + 32 + 2),
LD A, (IX + 32 + 1)
АДЦ а, е
LD (IX + 32 + 1),
LD A, (IX + 32 + 0)
АЦП A, D
LD (IX + 32 + 0), А ; TEMP2 + = Maj
л.д. де, HBUF + 3 ; Н = G, G = F, F = Е,
LD HL, GBUF + 3 ; Е = D, D = С, С = В,
LD BC, 32 ; В = А, А = Т1
LDDR
LD HL, EBUF + 3
LD IX, TEMP1 + 3
звоните add32 ; Е + = Т1
LD HL, ABUF + 3
LD IX, TEMP2 + 3
звоните add32 ; А + = Т2
LD A, (step3_t)
вкл
LD (step3_t), A
ср 64 ; петля 64 раза
JP с, step_3
; часть 4 все 32-битовое дополнение
LD HL, H7 + 3
LD IX, HBUF + 3
звоните add32
LD IX, GBUF + 3
декабре гектолитров ; запомнить add32
звоните add32 ; делает гл - = 3
LD IX, FBUF + 3
декабре гектолитров
звоните add32
LD IX, EBUF + 3
декабре гектолитров
звоните add32
LD IX, DBUF + 3
декабре гектолитров
звоните add32
LD IX, CBUF + 3
декабре гектолитров
звоните add32
LD IX, BBUF + 3
декабре гектолитров
звоните add32
LD IX, ABUF + 3
декабре гектолитров
звоните add32
; конец не очень трудная часть 4
RET
; конец sha256update подпрограмму
; подпрограмма для выполнения 32-битный круговой
; правый сдвиг hlde итерации раза б
rotrb: SRL ч
р-р л
р-р д
р-р д
младший н.д., ncrce
набор 7, ч
ncrce: DJNZ rotrb
RET
; результат в hlde
; подпрограмма для выполнения 32-битной
; правый сдвиг hlde итерации раза б
sharb: SRL ч
р-р л
р-р д
р-р д
ncrh: DJNZ sharb
RET
; результат в hlde
; подпрограмма для выполнения 32-битный круговой
; сдвиг влево от hlde итерироваться раз б
slcb: ОАС е
гх д
гх л
ая ч
младший н.д., nclh
вкл е
nclh: DJNZ slcb
RET
; результат в hlde
; подпрограммы для выполнения 32-битного сложения
; добавляет (IX) к (гл)
; оба должны изначально указывать на LSB
add32: LD A, (HL)
добавить, (IX + 0) ; LSB
LD (HL), A
декабре гектолитров
LD A, (HL)
АЦП а, (IX-1) ; сложение с переносом
LD (HL), A
декабре гектолитров
LD A, (HL)
АЦП а, (IX-2)
LD (HL), A
декабре гектолитров
LD A, (HL)
АЦП а, (IX-3) ; MSB
LD (HL), A
RET
; изменения HL, и будут затерты
Str1: .db $ 04, $ AA, $ 00
; начальные значения
H0init: .db $ 6а, $ 09, $ е6, $ 67
H1init: .db $ бб, $ 67, $ ая, $ 85
H2init: .DB $ 3в, $ 6e, $ f3, $ 72
H3init: .db $ a5, $ 4f, $ f5, $ 3a
H4init: .DB $ 51, $ 0e, $ 52, $ 7F
H5init: .DB $ 9b, $ 05, $ 68, $ 8в
H6init: .DB $ 1е, $ 83, $ d9, $ аб
H7init: .db $ 5б, $ е0, $ кд, $ 19
; константы
Karray: .дБ $ 42, $ 8а, $ 2f, $ 98, $ 71, $ 37, $ 44, $ 91,
.дб $ b5, $ c0, $ фб, $ сравни, $ e9, $ b5, $ дб, $ a5,
.дБ $ 39, $ 56, $ с2, $ 5b, $ 59, $ f1, $ 11, $ f1,
.дБ $ 92, $ 3f, $ 82, $ а4, $ AB, $ 1c, $ 5e, $ d5,
.дБ $ d8, $ 07, $ аа, $ 98, $ 12, $ 83, $ 5b, $ 01,
.дБ $ 24, $ 31, $ 85, $ быть, $ 55, $ 0c, $ 7d, $ с3,
.дб $ 72, $ быть, $ 5d, $ 74, $ 80, $ де, $ b1, $ к,
.дб $ 9b, $ DC, $ 06, $ a7, $ c1, $ 9b, $ f1, $ 74,
.дб $ e4, $ 9b, $ 69, $ c1, $ эфф, $ быть, $ 47, $ 86,
.дб $ 0f, $ c1, $ 9г, $ c6, $ 24, $ 0C, $ a1, $ куб.см,
.дБ $ 2d, $ E9, $ 2c, $ 6f, $ 4а, $ 74, $ 84, $ аа,
.дб $ 5с, $ b0, $ a9, $ постоянного тока, $ 76, $ f9, $ 88, $ да,
.дБ $ 98, $ 3e, $ 51, $ 52, $ а8, $ 31, $ с6, $ 6d,
.дб $ b0, $ 03, $ 27, $ c8, $ бф, $ 59, $ 7F, $ c7,
.дб $ c6, $ е0, $ 0B, $ f3, $ d5, $ a7, $ 91, $ 47,
.дБ $ 06, $ са, $ 63, $ 51, $ 14, $ 29, $ 29, $ 67,
.дБ $ 27, $ b7, $ 0A, $ 85, $ 2е, $ 1b, $ 21, $ 38,
.дБ $ 4d, $ 2c, $ 6d, $ FC, $ 53, $ 38, $ 0D, $ 13,
.дБ $ 65, $ 0a, $ 73, $ 54, $ 76, $ 6а, $ 0a, $ бб,
.дБ $ 81, $ с2, $ с9, $ 2е, $ 92, $ 72, $ 2c, $ 85,
.дБ $ а2, $ Б.Ф., $ E8, $ a1, $ а8, $ 1а, $ 66, $ 4b,
.дБ $ с2, $ 4b, $ 8b, $ 70, $ с7, $ 6c, $ 51, $ а3,
.дБ $ d1, $ 92, $ E8, $ 19, $ d 6, $ 99, $ 06, $ 24,
.дб $ f4, $ 0e, $ 35, $ 85, $ 10, $ 6а, $ a0, $ 70,
.дБ $ 19, $ а4, $ с1, $ 16, $ 1е, $ 37, $ 6c, $ 08,
.дБ $ 27, $ 48, $ 77, $ 4c, $ 34, $ b0, $ BC, $ b5,
.дБ $ 39, $ 1c, $ 0c, $ b3, $ 4e, $ d8, $ аа, $ 4а,
.дБ $ 5b, $ 9с, $ CA, $ 4f, $ 68, $ 2е, $ 6f, $ f3,
.дб $ 74, $ 8х, $ 82, $ Й, $ 78, $ a5, $ 63, $ 6f,
.дб $ 84, $ c8, $ 78, $ 14, $ 8в, $ c7, $ 02, $ 08,
.дб $ 90, $ быть $ и далее, $ фа, $ a4, $ 50, $ 6c, $ Е.Б.,
.дБ $ быть, $ f9, $ а3, $ f7, $ с6, $ 71, $ 78, $ f2
; 1twzU46whuMER6hhBPCGmdaLw8atyv9c4
;
; этот файл constains чистый, переносимый код z80,
; нет вызовов ROM TI-8x
; эта подпрограмма обновляет SHA256 хэш
; в Н0, чтобы H7 дали полный блок скопированный
; к началу WBUF
sha256update:
; Вторая часть графика сообщений (этап 1)
л.д. IX, WBUF + 64-4
LD C, 16-1
шаг 1: вкл IX
вкл IX ; IX отслеживает W (T)
вкл IX
вкл IX
вкл с ; счетчик ++
; строчная sigma_1
ЛД ч, (IX-8 + 2) ; повернуть 16 бит
LD л, (IX-8 + 3) ; как два байта
LD д, (IX-8 + 0) ; 0123 -> dehl
LD е, (IX-8 + 1)
LD B, 1
звоните rotrb ; один бит вправо
л.д. а, ч
LD (sigma_temp + 0 + 0), А ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 0), А ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 0), А
л.д. а, е
LD (sigma_temp + 9 + 0), А
LD B, 2
звоните rotrb ; два бита вправо
л.д. а, ч
LD (sigma_temp + 0 + 1), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 1), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 1),
л.д. а, е
LD (sigma_temp + 9 + 1),
л.д. ч, 0 ; сдвиг 8 бит
LD л, (IX-8 + 0) ; как байты
LD д, (IX-8 + 1)
LD е, (IX-8 + 2)
LD B, 2
вызов sharb ; еще два бита
л.д. а, ч
LD (sigma_temp + 0 + 2), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 2), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 2),
л.д. а, е
LD (sigma_temp + 9 + 2),
LD HL, sigma_temp
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (IX + 0), А
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (IX + 1),
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (IX + 2),
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (IX + 3),
; сделано с строчной sigma_1
; строчная sigma_0
ЛД ч, (IX-60 + 3) ; вращать 8 бит
LD л, (IX-60 + 0) ; как один байт
LD д, (IX-60 + 1)
LD е, (IX-60 + 2)
LD B, 1
slcb вызов ; один бит влево
л.д. а, ч
LD (sigma_temp + 0 + 0), А ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 0), А ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 0), А
л.д. а, е
LD (sigma_temp + 9 + 0), А
л.д. а, е
LD E, D
LD д, л
ЛД л, ч
л.д. ч, ; hlde -> ehld
LD B, 3
звоните rotrb ; еще три бита
л.д. а, ч
LD (sigma_temp + 0 + 1), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 1), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 1),
л.д. а, е
LD (sigma_temp + 9 + 1),
ЛД ч, (IX-60 + 0)
LD л, (IX-60 + 1)
LD д, (IX-60 + 2)
LD е, (IX-60 + 3)
LD B, 3
вызов sharb ; еще три бита
л.д. а, ч
LD (sigma_temp + 0 + 2), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 2), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 2),
л.д. а, е
LD (sigma_temp + 9 + 2),
LD HL, sigma_temp
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD D, A
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
л.д. е, а
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD B, A
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
добавить, (IX + 3)
LD (IX + 3),
LD A, (IX + 2)
АЦП а, б
LD (IX + 2),
LD A, (IX + 1)
АДЦ а, е
LD (IX + 1),
LD A, (IX + 0)
АЦП A, D
LD (IX + 0), А
толчок IX
толчок IX
поп гектолитров
вкл гектолитров
вкл гектолитров
вкл гектолитров
л.д. де, 3-28
добавить IX, де
звоните add32 ; + = W_t-7
вкл гектолитров
вкл гектолитров
вкл гектолитров
л.д. де, 28-64
добавить IX, де
звоните add32 ; + = W_t-16
поп-IX
LD A, 63
ф с ; повторение?
JP н.д., step1
; сделано с графиком сообщений
; шаг 2 является простой копией, даже облегчили
; сохраняя [A-H] и H [0-7] вместе в памяти
LD HL, H0
л.д. де, ABUF
LD BC, 32
LDIR
; Ничего себе, это было легко
; шаг 3 является наибольшей частью алгоритма
XOR A ; начать с т = 0
LD (step3_t), A ; Счетчик step3_t
шаг 3:
; прописные sigma_1 е
л.д. IX, EBUF
ЛД ч, (IX + 3)
LD л, (IX + 0)
LD д, (IX + 1)
LD е, (IX + 2)
LD B, 2
slcb вызов ; нетто 6 бит вправо
л.д. а, ч
LD (sigma_temp + 0 + 0), А ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 0), А ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 0), А
л.д. а, е
LD (sigma_temp + 9 + 0), А
л.д. а, е
LD E, D
LD д, л
ЛД л, ч
л.д. ч,
LD B, 3
slcb вызов ; 6 + 8-3 бит вправо
л.д. а, ч
LD (sigma_temp + 0 + 1), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 1), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 1),
л.д. а, е
LD (sigma_temp + 9 + 1),
Экс-де, гл
LD B, 2
slcb вызов ; 6 + 8-3 + 16-2
л.д. а, ч
LD (sigma_temp + 0 + 2), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 2), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 2),
л.д. а, е
LD (sigma_temp + 9 + 2),
LD HL, sigma_temp
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP1 + 0), А
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP1 + 1),
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP1 + 2),
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP1 + 3),
; сделано с прописной sigma_1 е
LD IX, HBUF + 3
LD HL, TEMP1 + 3
звоните add32 ; Т_1 + = HBUF
LD IX, WBUF + 3
LD A, (step3_t)
LD B, 0
ОАС
гх б ; * = 2
ОАС
гх б ; * = 2
л.д. с, а
добавить IX, бв
LD HL, TEMP1 + 3
звоните add32 ; Т_1 + = W_t
LD IX, Karray + 3
добавить IX, бв
LD HL, TEMP1 + 3
звоните add32 ; Т_1 + = K_t
; использовать XOR (г е и (F XOR г)) для Ch
л.д. IX, EBUF
LD A, (IX + 8 + 0) ; GBUF
XOR (IX + 4 + 0) ; исключающее FBUF
и (IX + 0 + 0) ; и EBUF
XOR (IX + 8 + 0) ; исключающее GBUF
LD D, A
LD A, (IX + 8 + 1) ; GBUF
XOR (IX + 4 + 1) ; исключающее FBUF
и (IX + 0 + 1) ; и EBUF
XOR (IX + 8 + 1) ; исключающее GBUF
л.д. е, а
LD A, (IX + 8 + 2) ; GBUF
XOR (IX + 4 + 2) ; исключающее FBUF
и (IX + 0 + 2) ; и EBUF
XOR (IX + 8 + 2) ; исключающее GBUF
LD B, A
LD A, (IX + 8 + 3) ; GBUF
XOR (IX + 4 + 3) ; исключающее FBUF
и (IX + 0 + 3) ; и EBUF
XOR (IX + 8 + 3) ; исключающее GBUF
добавить, (IX-20 + 3)
LD (IX-20 + 3),
LD A, (IX-20 + 2)
АЦП а, б
LD (IX-20 + 2),
LD A, (IX-20 + 1)
АДЦ а, е
LD (IX-20 + 1),
LD A, (IX-20 + 0)
АЦП A, D
LD (IX-20 + 0), А ; TEMP1 + = Ch
; прописные sigma_0 из
л.д. IX, ABUF
ЛД ч, (IX + 0)
LD л, (IX + 1)
LD д, (IX + 2) ; 0123 -> hlde
LD е, (IX + 3)
LD B, 2
звоните rotrb ; два бита вправо
л.д. а, ч
LD (sigma_temp + 0 + 0), А ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 0), А ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 0), А
л.д. а, е
LD (sigma_temp + 9 + 0), А
л.д. а, е
LD E, D
LD д, л
ЛД л, ч
л.д. ч,
LD B, 3
звоните rotrb ; 2 + 8 + 3
л.д. а, ч
LD (sigma_temp + 0 + 1), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 1), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 1),
л.д. а, е
LD (sigma_temp + 9 + 1),
л.д. а, е
LD E, D
LD д, л
ЛД л, ч
л.д. ч,
LD B, 1
звоните rotrb ; 2 + 8 + 3 + 8 + 1
л.д. а, ч
LD (sigma_temp + 0 + 2), ; все байты,
LD A, L ; получат операции XOR
LD (sigma_temp + 3 + 2), ; позже должен
LD A, д ; быть последовательными
LD (sigma_temp + 6 + 2),
л.д. а, е
LD (sigma_temp + 9 + 2),
LD HL, sigma_temp
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP2 + 0), А
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP2 + 1),
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP2 + 2),
вкл гектолитров
LD A, (HL)
вкл гектолитров
XOR (гл)
вкл гектолитров
XOR (гл)
LD (TEMP2 + 3),
; сделано с прописной sigma_0 из
; использовать (а и б) или (с и (а или б)) для Maj
; IX по-прежнему указывает на ABUF
LD A, (IX + 0 + 0) ; ABUF
или (IX + 4 + 0) ; или BBUF
и (IX + 8 + 0) ; и CBUF
LD D, A
LD A, (IX + 0 + 0) ; ABUF
и (IX + 4 + 0) ; и BBUF
или г
LD D, A
LD A, (IX + 0 + 1) ; ABUF
или (IX + 4 + 1) ; или BBUF
и (IX + 8 + 1) ; и CBUF
л.д. е, а
LD A, (IX + 0 + 1) ; ABUF
и (IX + 4 + 1) ; и BBUF
или е
л.д. е, а
LD A, (IX + 0 + 2) ; ABUF
или (IX + 4 + 2) ; или BBUF
и (IX + 8 + 2) ; и CBUF
LD B, A
LD A, (IX + 0 + 2) ; ABUF
и (IX + 4 + 2) ; и BBUF
или б
LD B, A
LD A, (IX + 0 + 3) ; ABUF
или (IX + 4 + 3) ; или BBUF
и (IX + 8 + 3) ; и CBUF
л.д. с, а
LD A, (IX + 0 + 3) ; ABUF
и (IX + 4 + 3) ; и BBUF
или с
добавить, (IX + 32 + 3)
LD (IX + 32 + 3),
LD A, (IX + 32 + 2)
АЦП а, б
LD (IX + 32 + 2),
LD A, (IX + 32 + 1)
АДЦ а, е
LD (IX + 32 + 1),
LD A, (IX + 32 + 0)
АЦП A, D
LD (IX + 32 + 0), А ; TEMP2 + = Maj
л.д. де, HBUF + 3 ; Н = G, G = F, F = Е,
LD HL, GBUF + 3 ; Е = D, D = С, С = В,
LD BC, 32 ; В = А, А = Т1
LDDR
LD HL, EBUF + 3
LD IX, TEMP1 + 3
звоните add32 ; Е + = Т1
LD HL, ABUF + 3
LD IX, TEMP2 + 3
звоните add32 ; А + = Т2
LD A, (step3_t)
вкл
LD (step3_t), A
ср 64 ; петля 64 раза
JP с, step_3
; часть 4 все 32-битовое дополнение
LD HL, H7 + 3
LD IX, HBUF + 3
звоните add32
LD IX, GBUF + 3
декабре гектолитров ; запомнить add32
звоните add32 ; делает гл - = 3
LD IX, FBUF + 3
декабре гектолитров
звоните add32
LD IX, EBUF + 3
декабре гектолитров
звоните add32
LD IX, DBUF + 3
декабре гектолитров
звоните add32
LD IX, CBUF + 3
декабре гектолитров
звоните add32
LD IX, BBUF + 3
декабре гектолитров
звоните add32
LD IX, ABUF + 3
декабре гектолитров
звоните add32
; конец не очень трудная часть 4
RET
; конец sha256update подпрограмму
; подпрограмма для выполнения 32-битный круговой
; правый сдвиг hlde итерации раза б
rotrb: SRL ч
р-р л
р-р д
р-р д
младший н.д., ncrce
набор 7, ч
ncrce: DJNZ rotrb
RET
; результат в hlde
; подпрограмма для выполнения 32-битной
; правый сдвиг hlde итерации раза б
sharb: SRL ч
р-р л
р-р д
р-р д
ncrh: DJNZ sharb
RET
; результат в hlde
; подпрограмма для выполнения 32-битный круговой
; сдвиг влево от hlde итерироваться раз б
slcb: ОАС е
гх д
гх л
ая ч
младший н.д., nclh
вкл е
nclh: DJNZ slcb
RET
; результат в hlde
; подпрограммы для выполнения 32-битного сложения
; добавляет (IX) к (гл)
; оба должны изначально указывать на LSB
add32: LD A, (HL)
добавить, (IX + 0) ; LSB
LD (HL), A
декабре гектолитров
LD A, (HL)
АЦП а, (IX-1) ; сложение с переносом
LD (HL), A
декабре гектолитров
LD A, (HL)
АЦП а, (IX-2)
LD (HL), A
декабре гектолитров
LD A, (HL)
АЦП а, (IX-3) ; MSB
LD (HL), A
RET
; изменения HL, и будут затерты
Str1: .db $ 04, $ AA, $ 00
; начальные значения
H0init: .db $ 6а, $ 09, $ е6, $ 67
H1init: .db $ бб, $ 67, $ ая, $ 85
H2init: .DB $ 3в, $ 6e, $ f3, $ 72
H3init: .db $ a5, $ 4f, $ f5, $ 3a
H4init: .DB $ 51, $ 0e, $ 52, $ 7F
H5init: .DB $ 9b, $ 05, $ 68, $ 8в
H6init: .DB $ 1е, $ 83, $ d9, $ аб
H7init: .db $ 5б, $ е0, $ кд, $ 19
; константы
Karray: .дБ $ 42, $ 8а, $ 2f, $ 98, $ 71, $ 37, $ 44, $ 91,
.дб $ b5, $ c0, $ фб, $ сравни, $ e9, $ b5, $ дб, $ a5,
.дБ $ 39, $ 56, $ с2, $ 5b, $ 59, $ f1, $ 11, $ f1,
.дБ $ 92, $ 3f, $ 82, $ а4, $ AB, $ 1c, $ 5e, $ d5,
.дБ $ d8, $ 07, $ аа, $ 98, $ 12, $ 83, $ 5b, $ 01,
.дБ $ 24, $ 31, $ 85, $ быть, $ 55, $ 0c, $ 7d, $ с3,
.дб $ 72, $ быть, $ 5d, $ 74, $ 80, $ де, $ b1, $ к,
.дб $ 9b, $ DC, $ 06, $ a7, $ c1, $ 9b, $ f1, $ 74,
.дб $ e4, $ 9b, $ 69, $ c1, $ эфф, $ быть, $ 47, $ 86,
.дб $ 0f, $ c1, $ 9г, $ c6, $ 24, $ 0C, $ a1, $ куб.см,
.дБ $ 2d, $ E9, $ 2c, $ 6f, $ 4а, $ 74, $ 84, $ аа,
.дб $ 5с, $ b0, $ a9, $ постоянного тока, $ 76, $ f9, $ 88, $ да,
.дБ $ 98, $ 3e, $ 51, $ 52, $ а8, $ 31, $ с6, $ 6d,
.дб $ b0, $ 03, $ 27, $ c8, $ бф, $ 59, $ 7F, $ c7,
.дб $ c6, $ е0, $ 0B, $ f3, $ d5, $ a7, $ 91, $ 47,
.дБ $ 06, $ са, $ 63, $ 51, $ 14, $ 29, $ 29, $ 67,
.дБ $ 27, $ b7, $ 0A, $ 85, $ 2е, $ 1b, $ 21, $ 38,
.дБ $ 4d, $ 2c, $ 6d, $ FC, $ 53, $ 38, $ 0D, $ 13,
.дБ $ 65, $ 0a, $ 73, $ 54, $ 76, $ 6а, $ 0a, $ бб,
.дБ $ 81, $ с2, $ с9, $ 2е, $ 92, $ 72, $ 2c, $ 85,
.дБ $ а2, $ Б.Ф., $ E8, $ a1, $ а8, $ 1а, $ 66, $ 4b,
.дБ $ с2, $ 4b, $ 8b, $ 70, $ с7, $ 6c, $ 51, $ а3,
.дБ $ d1, $ 92, $ E8, $ 19, $ d 6, $ 99, $ 06, $ 24,
.дб $ f4, $ 0e, $ 35, $ 85, $ 10, $ 6а, $ a0, $ 70,
.дБ $ 19, $ а4, $ с1, $ 16, $ 1е, $ 37, $ 6c, $ 08,
.дБ $ 27, $ 48, $ 77, $ 4c, $ 34, $ b0, $ BC, $ b5,
.дБ $ 39, $ 1c, $ 0c, $ b3, $ 4e, $ d8, $ аа, $ 4а,
.дБ $ 5b, $ 9с, $ CA, $ 4f, $ 68, $ 2е, $ 6f, $ f3,
.дб $ 74, $ 8х, $ 82, $ Й, $ 78, $ a5, $ 63, $ 6f,
.дб $ 84, $ c8, $ 78, $ 14, $ 8в, $ c7, $ 02, $ 08,
.дб $ 90, $ быть $ и далее, $ фа, $ a4, $ 50, $ 6c, $ Е.Б.,
.дБ $ быть, $ f9, $ а3, $ f7, $ с6, $ 71, $ 78, $ f2
Код интерфейса:
Код:
; sha256.z80 по timewave0
; 1twzU46whuMER6hhBPCGmdaLw8atyv9c4
;
; см FIPS PUB 180-2
;
; ~ 800 байт / сек для очень больших
; программы, как измерено на VTI
;
; проверяется для случайных моделей байт длины:
; 0-10, 50-70, 255-257, 16383-16385, 19000
.СПИСОК
_chkfindsym .фас $ 442A
_findsym .фас $ 442E
_zeroop1 .фас $ 428E
_errundefined .фас $ 467B
_errsyntax .фас $ 466C
_createstrng .фас $ 4472
_delvar .фас $ 44AA
OP1 .фас $ 8039
progobj .фас $ 05
strngobj .фас $ 04
блок .фас $ 8265 ; магическое число
extra_bytes .фас блок + 2
H0 .фас extra_bytes + 1
H1 .фас Н0 + 4
H2 .фас H1 + 4
H3 .фас Н2 + 4
H4 .фас Н3 + 4
H5 .фас H4 + 4
H6 .фас Н5 + 4
H7 .фас Н6 + 4
; Начало переменных, которые не могут быть перемещены в памяти
TEMP1 .фас Н7 + 4
ABUF .фас TEMP1 + 4
BBUF .фас ABUF + 4
CBUF .фас BBUF + 4
DBUF .фас CBUF + 4
EBUF .фас DBUF + 4
FBUF .фас EBUF + 4
GBUF .фас FBUF + 4
HBUF .фас GBUF + 4
TEMP2 .фас HBUF + 4
; конец переменных, которые не могут быть перемещены в памяти
WBUF .фас TEMP2 + 4
sigma_temp .фас WBUF + (4 * 64)
DataPtr .фас sigma_temp + (3 * 4)
step3_t .фас DataPtr + 2
размер .фас step3_t + 1
.орг $ 9327 ; магическое число
вызов clearvars ; четкие переменные
; основанный на коде из повидла Пэт Milheron
звоните _zeroop1
LD HL, Str1
л.д. де, OP1
LD BC, 3
LDIR
звоните _findsym ; поиск Str1
JP с, _errundefined
и $ 1F
ф strngobj ; действительно ли это sring?
JP Н.З., _errsyntax
LD HL, op1
LD (HL), progobj
вкл гектолитров
LD A, (де) ; размер имени
л.д. с, а
LD B, 0
вкл де
вкл де ; (Де) это имя PTR
Экс-де, гл
LDIR ; имя для op1
звоните _chkfindsym ; Размер PTR -> де
JP с, _errundefined
; конец хлюпать на основе кода
Экс-де, гл
LD е, (гл) ; LSB -> е
вкл гектолитров
LD д, (гл) ; MSB -> d
вкл гектолитров
л.д. (размер), де
LD (DataPtr), гл
LD B, 6
XOR A
div64: SRL д
р-р д
р-р ; сохранить остаток
DJNZ div64
SRL
SRL
л.д. (блок), де ; # Из _whole_ блоков
LD (extra_bytes), A
LD HL, H0init
л.д. де, H0
LD BC, 64
LDIR
do_hash: ; ярлык или совет?
LD HL, (блок)
XOR A
ф ч
младший Н.З., no_check_l
ф л
младший г, do_padding
no_check_l:
декабре гектолитров
LD (блок), гл ; block--
LD HL, (DataPtr)
л.д. де, WBUF
LD BC, 64
LDIR ; копия блока
LD (DataPtr), гл ; DataPtr + 64 =
вызов sha256update
младший do_hash
do_padding:
LD A, (extra_bytes)
LD B, 0
л.д. с, а
LD HL, (DataPtr)
л.д. де, WBUF
ф 0
младший г, no_cpy
LDIR
no_cpy: Экс-де, гл
LD (HL), $ 80
вкл гектолитров
ср 63
младший г, need_another_block
load_0s:
нег
добавить, 63 ; 64-1-extra_bytes
LD B, A
zero_fill:
LD (HL), 0
вкл гектолитров
DJNZ zero_fill
ф 8 ; комната для длины?
младший с, need_another_block
; так как длина сообщения не может быть больше
; 16 бит, я в безопасности повторно использовать 32-битный циклический сдвиг
; из хэш-кода для умножения на 8
л.д. де (размер)
LD HL, $ 0000 ; обеспечить 0s сдвиг
LD B, 3
slcb вызов
л.д. а, е
LD (WBUF + 63), A
LD A, д
LD (WBUF + 62), A
LD A, L
LD (WBUF + 61), A
вызов sha256update
младший сделал
need_another_block:
вызов sha256update
XOR A
LD HL, WBUF
JR load_0s ; сделать еще один блок
; назвать этот парень, когда мы сделали хэширование
сделанный: звоните _zeroop1
LD HL, Str1
л.д. де, OP1
LD BC, 3
LDIR
звоните _chkfindsym
звоните _delvar
LD HL, 2 * 256/8
звоните _createstrng ; воссоздать str1
вкл де
LD B, 256/8
LD HL, H0-1
магазин: вкл гектолитров
LD A, (HL)
нажмите аф
и $ F0
SRL
SRL
SRL
SRL
вызов store_hex ; высокая клев
поп-аф
и $ 0F
вызов store_hex ; низкое откусывание
DJNZ магазин
вызов clearvars
RET
; конец проделанной подпрограммы
.включают "sha256up.z80" ; забавный материал
; подпрограмма, чтобы очистить все переменные
clearvars:
LD HL, блок
XOR A
LD (HL), A
л.д. де, блок + 1
LD BC, размер-блок ; последний вар - начало
LDIR
RET
; конец clearvars подпрограммы
; подпрограмма для хранения символа хэша
store_hex:
вкл де
ф $ A
младший н.д., письмо
добавить, «0»
л.д. (де),
RET
Письмо: добавить, 'A' - $ A
л.д. (де),
RET
; конец шестигранного характера магазин подпрограмма
.конец
; 1twzU46whuMER6hhBPCGmdaLw8atyv9c4
;
; см FIPS PUB 180-2
;
; ~ 800 байт / сек для очень больших
; программы, как измерено на VTI
;
; проверяется для случайных моделей байт длины:
; 0-10, 50-70, 255-257, 16383-16385, 19000
.СПИСОК
_chkfindsym .фас $ 442A
_findsym .фас $ 442E
_zeroop1 .фас $ 428E
_errundefined .фас $ 467B
_errsyntax .фас $ 466C
_createstrng .фас $ 4472
_delvar .фас $ 44AA
OP1 .фас $ 8039
progobj .фас $ 05
strngobj .фас $ 04
блок .фас $ 8265 ; магическое число
extra_bytes .фас блок + 2
H0 .фас extra_bytes + 1
H1 .фас Н0 + 4
H2 .фас H1 + 4
H3 .фас Н2 + 4
H4 .фас Н3 + 4
H5 .фас H4 + 4
H6 .фас Н5 + 4
H7 .фас Н6 + 4
; Начало переменных, которые не могут быть перемещены в памяти
TEMP1 .фас Н7 + 4
ABUF .фас TEMP1 + 4
BBUF .фас ABUF + 4
CBUF .фас BBUF + 4
DBUF .фас CBUF + 4
EBUF .фас DBUF + 4
FBUF .фас EBUF + 4
GBUF .фас FBUF + 4
HBUF .фас GBUF + 4
TEMP2 .фас HBUF + 4
; конец переменных, которые не могут быть перемещены в памяти
WBUF .фас TEMP2 + 4
sigma_temp .фас WBUF + (4 * 64)
DataPtr .фас sigma_temp + (3 * 4)
step3_t .фас DataPtr + 2
размер .фас step3_t + 1
.орг $ 9327 ; магическое число
вызов clearvars ; четкие переменные
; основанный на коде из повидла Пэт Milheron
звоните _zeroop1
LD HL, Str1
л.д. де, OP1
LD BC, 3
LDIR
звоните _findsym ; поиск Str1
JP с, _errundefined
и $ 1F
ф strngobj ; действительно ли это sring?
JP Н.З., _errsyntax
LD HL, op1
LD (HL), progobj
вкл гектолитров
LD A, (де) ; размер имени
л.д. с, а
LD B, 0
вкл де
вкл де ; (Де) это имя PTR
Экс-де, гл
LDIR ; имя для op1
звоните _chkfindsym ; Размер PTR -> де
JP с, _errundefined
; конец хлюпать на основе кода
Экс-де, гл
LD е, (гл) ; LSB -> е
вкл гектолитров
LD д, (гл) ; MSB -> d
вкл гектолитров
л.д. (размер), де
LD (DataPtr), гл
LD B, 6
XOR A
div64: SRL д
р-р д
р-р ; сохранить остаток
DJNZ div64
SRL
SRL
л.д. (блок), де ; # Из _whole_ блоков
LD (extra_bytes), A
LD HL, H0init
л.д. де, H0
LD BC, 64
LDIR
do_hash: ; ярлык или совет?
LD HL, (блок)
XOR A
ф ч
младший Н.З., no_check_l
ф л
младший г, do_padding
no_check_l:
декабре гектолитров
LD (блок), гл ; block--
LD HL, (DataPtr)
л.д. де, WBUF
LD BC, 64
LDIR ; копия блока
LD (DataPtr), гл ; DataPtr + 64 =
вызов sha256update
младший do_hash
do_padding:
LD A, (extra_bytes)
LD B, 0
л.д. с, а
LD HL, (DataPtr)
л.д. де, WBUF
ф 0
младший г, no_cpy
LDIR
no_cpy: Экс-де, гл
LD (HL), $ 80
вкл гектолитров
ср 63
младший г, need_another_block
load_0s:
нег
добавить, 63 ; 64-1-extra_bytes
LD B, A
zero_fill:
LD (HL), 0
вкл гектолитров
DJNZ zero_fill
ф 8 ; комната для длины?
младший с, need_another_block
; так как длина сообщения не может быть больше
; 16 бит, я в безопасности повторно использовать 32-битный циклический сдвиг
; из хэш-кода для умножения на 8
л.д. де (размер)
LD HL, $ 0000 ; обеспечить 0s сдвиг
LD B, 3
slcb вызов
л.д. а, е
LD (WBUF + 63), A
LD A, д
LD (WBUF + 62), A
LD A, L
LD (WBUF + 61), A
вызов sha256update
младший сделал
need_another_block:
вызов sha256update
XOR A
LD HL, WBUF
JR load_0s ; сделать еще один блок
; назвать этот парень, когда мы сделали хэширование
сделанный: звоните _zeroop1
LD HL, Str1
л.д. де, OP1
LD BC, 3
LDIR
звоните _chkfindsym
звоните _delvar
LD HL, 2 * 256/8
звоните _createstrng ; воссоздать str1
вкл де
LD B, 256/8
LD HL, H0-1
магазин: вкл гектолитров
LD A, (HL)
нажмите аф
и $ F0
SRL
SRL
SRL
SRL
вызов store_hex ; высокая клев
поп-аф
и $ 0F
вызов store_hex ; низкое откусывание
DJNZ магазин
вызов clearvars
RET
; конец проделанной подпрограммы
.включают "sha256up.z80" ; забавный материал
; подпрограмма, чтобы очистить все переменные
clearvars:
LD HL, блок
XOR A
LD (HL), A
л.д. де, блок + 1
LD BC, размер-блок ; последний вар - начало
LDIR
RET
; конец clearvars подпрограммы
; подпрограмма для хранения символа хэша
store_hex:
вкл де
ф $ A
младший н.д., письмо
добавить, «0»
л.д. (де),
RET
Письмо: добавить, 'A' - $ A
л.д. (де),
RET
; конец шестигранного характера магазин подпрограмма
.конец