Автор Тема: Тонкости программирования и использования AVR  (Прочитано 34627 раз)

0 Пользователей и 1 Гость просматривают эту тему.

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
8-разрядной - это как? Ты имеешь в виду 8-разрядный в 16-ричной системе? То есть 32 bit (4 байта)?

А в чем проблема? Результат должен быть одинаков.
Если в порядке байтов в Printbin, то посмотри какое число в нормальном Print выводится. Если 1717986907, то это фича Printbin-а, а вычисляется нормально.

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Цитировать
8-разрядной - это как? Ты имеешь в виду 8-разрядный в 16-ричной системе? То есть 32 bit (4 байта)?
Совершенно верно. Может быть собака порылась в том, что в баскоме переменая типа Long - знаковая, и принимает значения -2147483648 to 2147483647  :\'(

А арифметические вычислениях всегда производятся с учетом знака... Видимо если сложить два числа с переполнением- все ништяк, но толко сложи два числа в пределах знаков - все, финиш... Может на ассемблере подпрограмму нарулить для сложения-вычитания с отбрасыванием старших переполняющих байт.... Мозги кипят...
« Последнее редактирование: 11 Ноября 2009, 15:45:18 от admin »
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
Но результат в обоих случаях ведь который нужен
получается - 0x6666665B (или 1717986907)? При беззнаковых DWord-ах тот же самый результат получается.


pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
Или в первом случае просто вылетает с ошибкой?

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Думаю, эксперементирую....  :o
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

Форум проекта "Минилаб-Мастер"


Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Нашел ошибку, попаравил, код должен выглядеть так:

Цитировать
\' Код Pumpkin-Andy для BASCOM-AVR
\' Для шифрования-дешифрования по алгоритму XTEA 256 бит
\' Блоками по 128 бит
\' http://minilabmaster.com/cgi-bin/yabb2/YaBB.pl?num=1252818839/30

$crystal = 10000000
$regfile = "m32def.dat"

Dim Plain(4) As Long
Dim Key(8) As Long
Dim Iterations2 As Byte

Const Iterations = 32
Const Delta = &H51EB850

Dim X1 As Long
Dim X2 As Long
Dim X3 As Long
Dim X4 As Long
Dim X5 As Long

\'--------------------------------------------
Dim A As Long
Dim B As Long
Dim C As Long
Dim D As Long
Dim Sum As Long
Dim R As Long
Dim T As Long


Plain(1) = 174
Plain(2) = 175
Plain(3) = 176
Plain(4) = 177

Key(1) = &HFAAAAAAA
Key(2) = &HBBBBBBBB
Key(3) = &HCCCCCCCC
Key(4) = &HDDDDDDDD
Key(5) = &HEEEEEEEE
Key(6) = &HFFFFFFFF
Key(7) = &H11111111
Key(8) = &H22222222

Gosub Crypt

Gosub Decrypt

Print Plain(1)  \'174
Print Plain(2)  \'175
Print Plain(3)  \'176
Print Plain(4)  \'177




Crypt:

   Sum = 0
    A = Plain(1) + Key(1)
    B = Plain(2) + Key(2)
    C = Plain(3) + Key(3)
    D = Plain(4) + Key(4)
Iterations2 = Iterations - 1

For R = 0 To Iterations2

 X1 = B
 Shift X1 , Left , 4
 X2 = Sum Mod 4
 X2 = Key(x2 + 5)
 X3 = B
 X4 = Low(b)
 Rotate X2 , Left , X4
 X1 = X1 + X2
 X2 = D + Sum
 X1 = X1 Xor X2

X2 = B
 Shift X2 , Right , 5
X3 = Sum Mod 4
X3 = Key(x3 + 1)
 X4 = B
 Shift X4 , Right , 27
 X5 = Low(x4)
 Rotate X3 , Left , X5
 X2 = X2 + X3
 X1 = X1 Xor X2
 A = A + X1

 Sum = Sum + Delta

X1 = D
Shift X1 , Left , 4
X2 = Sum
Shift X2 , Right , 11
X2 = X2 Mod 4
X2 = X2 + 5
X2 = Key(x2)
X3 = Low(d)
Rotate X2 , Left , X3
X1 = X1 + X2

X2 = B + Sum
X1 = X1 Xor X2

X2 = D
Shift X2 , Right , 5
X3 = Sum
Shift X3 , Right , 11
X3 = X3 Mod 4
X3 = X3 + 1
X3 = Key(x3)
X4 = D
Shift X4 , Right , 27
X4 = Low(x4)
Rotate X3 , Left , X4
X2 = X2 + X3
X1 = X1 Xor X2
C = C + X1

      T = A
      A = B
      B = C
      C = D
      D = T

Next

    Plain(1) = A Xor Key(5)
    Plain(2) = B Xor Key(6)
    Plain(3) = C Xor Key(7)
    Plain(4) = D Xor Key(8)

Return



Decrypt:

Sum = 0
   Gosub Slog

    D = Plain(4) Xor Key(8)
    C = Plain(3) Xor Key(7)
    B = Plain(2) Xor Key(6)
    A = Plain(1) Xor Key(5)
Iterations2 = Iterations - 1

For R = Iterations2 To 0 Step -1

      T = D
      D = C
      C = B
      B = A
      A = T

X1 = D
Shift X1 , Left , 4
X2 = Sum
Shift X2 , Right , 11
X2 = X2 Mod 4
X2 = X2 + 5
X2 = Key(x2)
X3 = Low(d)
Rotate X2 , Left , X3
X1 = X1 + X2

X2 = B + Sum
X1 = X1 Xor X2

X2 = D
Shift X2 , Right , 5
X3 = Sum
Shift X3 , Right , 11
X3 = X3 Mod 4
X3 = X3 + 1
X3 = Key(x3)
X4 = D
Shift X4 , Right , 27
X4 = Low(x4)
Rotate X3 , Left , X4
X2 = X2 + X3
X1 = X1 Xor X2
C = C - X1

Sum = Sum - Delta

X1 = B
Shift X1 , Left , 4
X2 = Sum
X2 = X2 Mod 4
X2 = X2 + 5
X2 = Key(x2)
X3 = Low(b)
Rotate X2 , Left , X3
X1 = X1 + X2

X2 = D + Sum
X1 = X1 Xor X2

X2 = B
Shift X2 , Right , 5
X3 = Sum Mod 4
X3 = X3 + 1
X3 = Key(x3)
X4 = B
Shift X4 , Right , 27
X4 = Low(x4)
Rotate X3 , Left , X4
X2 = X2 + X3
X1 = X1 Xor X2

A = A - X1

Next

    Plain(4) = D - Key(4)
    Plain(3) = C - Key(3)
    Plain(2) = B - Key(2)
    Plain(1) = A - Key(1)
 Return


Slog:
For Z = 1 To 32
Sum = Sum + Delta
Next
Return

End

End
« Последнее редактирование: 19 Ноября 2009, 09:45:52 от admin »
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Пропустил одно X2 = Key(x2)

Но чертов Sum один фиг глючит при переполнении! Я даже его умножение циклом сделал - не помогает. Как только Const Delta = &H51EB850 перевалит за &H51EB850  (макс значение ffffffff /32 )- идут глюки... Хотя и Sum не добовляет к крепости крипто ничего, но блин в чем дело- не пойму....
« Последнее редактирование: 12 Ноября 2009, 15:54:15 от admin »
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
Так. Я тут Bascom AVR IDE поставил и потестил :) . Не знаю насколько точно он эмулирует железный AVR, но после устранения пары граблей, результат в нем в точности соответствует писишному. Итак:

- Первые грабли. Умножение Delta*32 = переполнение. Умножение на 32 - это фактически сдвиг влево на 5 бит. Таким образом надо заменить
Sum = Delta*32
на
Sum = Delta
Shift Sum, Left, 5
.

- Далее, вторые грабли - это сочетание Mod и отрицательного числа (в знаковых числах Long). В итоге получаем отрицательные индексы массива. Однако при беззнаковых числах Dword выражение X mod 4 просто оставляет 2 младших бита, зануляя остальное, то есть оно идентично выражению X and 3.

Ну и от констант избавился. Что-то с ними не так было. Искажались значения. И End-ы перепроверь еще, а то у меня на второй круг уходило, пока не поставил End перед процедурами.

После выполнения должен быть выведен следующий текст:
--Original--:
000000AE
000000AF
000000B0
000000B1
--Encrypted--:
AFE206E2
586DC5DD
D60B7876
3AE90B31
--Decrypted--:
000000AE
000000AF
000000B0
000000B1

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля

А вот собственно и сам код:
Цитировать
\' Код Pumpkin-Andy для BASCOM-AVR
\' Для шифрования-дешифрования по алгоритму XTEA 256 бит
\' Блоками по 128 бит
\' http://minilabmaster.com/cgi-bin/yabb2/YaBB.pl?num=1252818839/30

$crystal = 10000000
$regfile = "m32def.dat"

Dim Plain(4) As Long
Dim Key(8) As Long
Dim Iterations As Long
Dim Delta As Long

Iterations = 32
Delta = &H9E3779B9   

Dim X1 As Long
Dim X2 As Long
Dim X3 As Long
Dim X4 As Long
Dim X5 As Long

Dim A As Long
Dim B As Long
Dim C As Long
Dim D As Long
Dim Sum As Long
Dim R As Long
Dim T As Long

\'Тестовый запуск
Plain(1) = 174
Plain(2) = 175
Plain(3) = 176
Plain(4) = 177

Key(1) = &HFAAAAAAA
Key(2) = &HBBBBBBBB
Key(3) = &HCCCCCCCC
Key(4) = &HDDDDDDDD
Key(5) = &HEEEEEEEE
Key(6) = &HFFFFFFFF
Key(7) = &H11111111
Key(8) = &H22222222

Print "--Original--:"
Print Hex(plain(1))  \'174
Print Hex(plain(2))  \'175
Print Hex(plain(3))  \'176
Print Hex(plain(4))  \'177

Gosub Crypt

Print "--Encrypted--:"
Print Hex(plain(1)) 
Print Hex(plain(2)) 
Print Hex(plain(3)) 
Print Hex(plain(4)) 

Gosub Decrypt

Print "--Decrypted--:"
Print Hex(plain(1)) 
Print Hex(plain(2)) 
Print Hex(plain(3)) 
Print Hex(plain(4)) 

End

\'Процедура шифрования
Crypt:

Sum = 0
A = Plain(1) + Key(1)
B = Plain(2) + Key(2)
C = Plain(3) + Key(3)
D = Plain(4) + Key(4)

For R = 1 To Iterations

X1 = B
Shift X1 , Left , 4
X2 = Sum And 3
X2 = Key(x2 + 5)
X3 = B
X4 = Low(b)
Rotate X2 , Left , X4
X1 = X1 + X2
X2 = D + Sum
X1 = X1 Xor X2

X2 = B
Shift X2 , Right , 5
X3 = Sum And 3
X3 = Key(x3 + 1)
X4 = B
Shift X4 , Right , 27
X5 = Low(x4)
Rotate X3 , Left , X5
X2 = X2 + X3
X1 = X1 Xor X2
A = A + X1

Sum = Sum + Delta

X1 = D
Shift X1 , Left , 4
X2 = Sum
Shift X2 , Right , 11
X2 = X2 And 3
X2 = X2 + 5
X2 = Key(x2)
X3 = Low(d)
Rotate X2 , Left , X3
X1 = X1 + X2

X2 = B + Sum
X1 = X1 Xor X2

X2 = D
Shift X2 , Right , 5
X3 = Sum
Shift X3 , Right , 11
X3 = X3 And 3
X3 = X3 + 1
X3 = Key(x3)
X4 = D
Shift X4 , Right , 27
X4 = Low(x4)
Rotate X3 , Left , X4
X2 = X2 + X3
X1 = X1 Xor X2
C = C + X1

      T = A
      A = B
      B = C
      C = D
      D = T

Next

    Plain(1) = A Xor Key(5)
    Plain(2) = B Xor Key(6)
    Plain(3) = C Xor Key(7)
    Plain(4) = D Xor Key(8)

Return


\'Процедура дешифрования
Decrypt:

Sum = Delta
Shift Sum , Left , 5

    D = Plain(4) Xor Key(8)
    C = Plain(3) Xor Key(7)
    B = Plain(2) Xor Key(6)
    A = Plain(1) Xor Key(5)

For R = Iterations To 1 Step -1

      T = D
      D = C
      C = B
      B = A
      A = T

X1 = D
Shift X1 , Left , 4
X2 = Sum
Shift X2 , Right , 11
X2 = X2 And 3
X2 = X2 + 5
X2 = Key(x2)
X3 = Low(d)
Rotate X2 , Left , X3
X1 = X1 + X2

X2 = B + Sum
X1 = X1 Xor X2

X2 = D
Shift X2 , Right , 5
X3 = Sum
Shift X3 , Right , 11
X3 = X3 And 3
X3 = X3 + 1
X3 = Key(x3)
X4 = D
Shift X4 , Right , 27
X4 = Low(x4)
Rotate X3 , Left , X4
X2 = X2 + X3
X1 = X1 Xor X2
C = C - X1

Sum = Sum - Delta

X1 = B
Shift X1 , Left , 4
X2 = Sum
X2 = X2 And 3
X2 = X2 + 5
X2 = Key(x2)
X3 = Low(b)
Rotate X2 , Left , X3
X1 = X1 + X2

X2 = D + Sum
X1 = X1 Xor X2

X2 = B
Shift X2 , Right , 5
X3 = Sum And 3
X3 = X3 + 1
X3 = Key(x3)
X4 = B
Shift X4 , Right , 27
X4 = Low(x4)
Rotate X3 , Left , X4
X2 = X2 + X3
X1 = X1 Xor X2

A = A - X1

Next

    Plain(4) = D - Key(4)
    Plain(3) = C - Key(3)
    Plain(2) = B - Key(2)
    Plain(1) = A - Key(1)
Return

End

End
« Последнее редактирование: 19 Ноября 2009, 09:45:08 от admin »

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Браво, pumpkin! Спасибо!

Но почему не работало сложение в цикле?
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

Форум проекта "Минилаб-Мастер"


pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
Цитировать
Но почему не работало сложение в цикле? 
У меня вообще не компилировался, пока я Z не объявил.
Потом пошли неправильные результаты в этом цикле, пока я не обратил внимание на то, что Delta вместо &H9E3779B9 стала &H9E3879B9. Все дело оказалось в Const, косяк именно с ним. К числам больше 0x7FFFFFFF (то есть, отрицательным) для чего-то прибавляет 0x00010000. Вот, например такой код Const Delta1 = &HFFFF1100
Const Delta2 = &H990000AA

Dim X1 As Long
Dim X2 As Long

X1 = Delta1
X2 = Delta2
Print Hex(x1)
Print Hex(x2)

X1 = &HFFFF1100
X2 = &H990000AA
Print Hex(x1)
Print Hex(x2)

должен по идее вывести
FFFF1100
990000AA
FFFF1100
990000AA


а реально выводит такую фигню
00001100
990100AA
FFFF1100
990000AA


Возможно у Const-а еще сюрпризы имеются, я бы им не пользовался больше.
« Последнее редактирование: 14 Ноября 2009, 09:21:45 от pumpkin »

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Криптованый загрузчик близок к завершению. Влез в 4 килобайта памяти, что для бейсика очень неплохо, считаю. Во первых - четырехбайтовые переменные и операции с ними жрут прорву ресурсов у 8-ми разрядного контроллера. Во-вторых загрузчик уменет обновлятся с I2C eepirom с заранее залитой криптованой прошивкой.  А в третих - навороченый для меня алгоритм - данные побайтово читаюся из eepirom, собираются в 4 четырехбайтовые перемные, расшифровываются, снова разбираются на байты и собираются в 128 байтовые страницы для прошивки (особенность самопрограммирования AVR...). Без советов pumpkin-а не знаю, чтобы делал... Очень прригодился алгоритм сдвига бит в пепеменной - ключевой для сборки и разборки переменных на байты.
По сравнению с умножением и делением - выигрывает в размере и производительности в несколько раз! Спасибо, pumpkin!
« Последнее редактирование: 24 Ноября 2009, 14:17:06 от admin »
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
MEMCOPY используешь? Типо так (грубо):

Dim Block(128) As Byte
Dim Plane(4) As Long
Dim J,K As Byte
\'Тут вытаскиваем в массив Block очередные зашифрованные 128 байт (страница)
.........................................
For J = 0 To 7
  K = J * 16 + 1
  J = Memcopy(block(K) , Plane(1) , 16)
  Gosub Decrypt
  J = Memcopy(Plane(1) , block(K) , 16)
Next
\' Расшифрована очередная страница
« Последнее редактирование: 24 Ноября 2009, 21:52:36 от pumpkin »

Andy

  • Администратор Форумa
  • Эксперт
  • *
  • Сообщений: 1803
  • Карма: 15
  • Пол: Мужской
  • Нельзя отремонтировать то, что не сломано...
    • minilabmaster
    • Просмотр профиля
    • Форум "Минилаб-Мастер"
Не, там расшифровка идет блоками по 128 БИТ. (четыре терырехбайтовые переменные сам же алгоритм помогаал до ума доводить :-)
А страницы по 128 БАЙТ прошиваются хитро, там в помощи баскома образец есть, его взял за основу....
« Последнее редактирование: 25 Ноября 2009, 02:35:49 от admin »
Заклинило деталь - надави на нее, если она сломалась - ничего, ее все равно надо было менять.

pumpkin

  • Профи
  • ****
  • Сообщений: 240
  • Карма: 2
  • Пол: Мужской
  • Это Я :-)
    • Просмотр профиля
Это я просто размышлял над вариантами оптимизации вот этого места:
Цитировать
данные побайтово читаюся из eepirom, собираются в 4 четырехбайтовые перемные, расшифровываются, снова разбираются на байты и собираются в 128 байтовые страницы для прошивки
чтоб не собирать-разбирать вручную из байтов, а кидать в Plain и обратно разом куски по 16 байт = 128 бит (4*Long).

Еще один вариант оптимизации - посмотреть в сторону конструкции
Dim Page(128) As Byte
Dim Plain(32) As Long At Block(1) Overlay

То есть Page и Plain - фактически один участок памяти, но обращаться к нему можно двумя путями.
« Последнее редактирование: 25 Ноября 2009, 21:11:17 от pumpkin »

Форум проекта "Минилаб-Мастер"