Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-сен-22 02:09

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Пример работа с крипто-блоком
СообщениеДобавлено: 2013-дек-23 15:09 
Не в сети

Зарегистрирован: 2011-сен-19 08:43
Сообщения: 25
Попытались работать с аппаратным модулем шифрования из под RISC ядра. Работает в режиме простой замены, но с глюками. Иногда (через раз) не выставляются флаги READY или ERROR (стоит в нуле). При пошаговой отладке вроде работает лучше, но тоже не стабильно. В остальных режимах вообще работает непредсказуемо. При установке режимов гаммирования выходит по ошибке, как будто не хватает данных.
Экспериментировали с ожидпнием окончания транзакции. Вроде частично помогло, но походу нужно еще что-то.
Скорость в режиме простой замены до 8 МБ/сек.
Кто-нибудь работал с модулем? Подскажите, что не так.
Код:
Код:
//настройка генератора
void ClockConfigure(void)
{
   RST_CLK->PER_CLOCK = 0xFFFFFFFF;

   RST_CLK->PER_CLOCK |= 1<<4;   //RST_CLK
   //RST_CLK->DSP_CONTROL_STATUS = 0x1F;

   RST_CLK->CPU_CLOCK = 0;   //CPU_C1= HSI
   RST_CLK->DSP_CLOCK = 0;   //DSP_C1= HSI
   
   //--------------------------------------------------------------
   //            Включаем HSE=8мГц
   //--------------------------------------------------------------
   //Включаем HSE
   RST_CLK->HS_CONTROL = 1;
   //ждем инициализации HSE
   while (!(RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_HSE_RDY)); // Ждем старта HSE
   //переключаемся на HSE
   RST_CLK->CPU_CLOCK = 2;   //CPU_C1= HSE
   RST_CLK->DSP_CLOCK = 2;   //DSP_C1= HSE

   RST_CLK->PER_CLOCK |= (1<<3);   
   EEPROM->CMD =(3<<3);       // 3 такта ожидания
   RST_CLK->PER_CLOCK &= ~(1<<3);   

   //--------------------------------------------------------------
   //            Настройка множителей для CPU и DSP PLL
   // CPUPLL=(9+1)*8мГц=80мГц
   // DSPPLL=(11+1)*8мГц=96мГц
   //--------------------------------------------------------------
   RST_CLK->PLL_CONTROL =    (9 << RST_CLK_PLL_CONTROL_PLL_CPU_MUL_Pos) |
                        (11 << RST_CLK_PLL_CONTROL_PLL_DSP_MUL_Pos) ;

   //--------------------------------------------------------------
   //            Включаем CPU PLL
   //--------------------------------------------------------------
   //включаем PLL
   RST_CLK->PLL_CONTROL |= RST_CLK_PLL_CONTROL_PLL_CPU_ON;
   //ждем инициализации CPU PLL
   while (!(RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_PLL_CPU_RDY));
   //CPU тактируется от CPU PLL
   RST_CLK->CPU_CLOCK = 0x106;

   //--------------------------------------------------------------
   //              Включаем DSP PLL
   //--------------------------------------------------------------
   //включаем PLL
   RST_CLK->PLL_CONTROL |= RST_CLK_PLL_CONTROL_PLL_DSP_ON;
   //ждем инициализации DSP PLL
   while (!(RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_PLL_DSP_RDY));
   //DSP тактируется от DSP PLL
   RST_CLK->DSP_CLOCK = 0x106;

   RST_CLK->PER_CLOCK |= (1<<31); //CRYPT
   RST_CLK->DSP_CONTROL_STATUS = (1<<1);

   //RST_CLK->DSP_CONTROL_STATUS = 0x8012;
   //включаем периферийные блоки DSP и память
   
//   RST_CLK->DSP_CONTROL_STATUS &= ~(RST_CLK_DSP_CONTROL_STATUS_RST_DSP_MEM | RST_CLK_DSP_CONTROL_STATUS_RST_DSP_PER | RST_CLK_DSP_CONTROL_STATUS_RST_DSP_ALL);
//   RST_CLK->DSP_CONTROL_STATUS |= RST_CLK_DSP_CONTROL_STATUS_HOLD;

   //разрешаем тактирование
   DSP_CLK->CLKMD = (1<<15) | (1<<14) | (1<<13) | (1<<3);

    SysTickStart(80000); // 1 ms HCLK=8Meg
}

/*
uint16_t crpt_key[]   = {
   0x6D54, 0x3320, 0x6568, 0x326C,
   0x7369, 0x2065, 0x7373, 0x626E,
   0x6120, 0x7967, 0x6769, 0x7474,
   0x6573, 0x6568, 0x2c20, 0x733d
};
*/

//S1
uint16_t crpt_sync[]   = {
   0x802a, 0xc3a7, 0xa8ff, 0x47e3
};

//КЗУ-1
uint16_t crpt_key[]   = {
   0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000,
   0xffff,   0xffff,   0xffff,   0xffff,   
   0xffff,   0xffff,   0xffff,   0xffff
};

uint16_t crpt_const[]   = {
   0x5f24, 0x8019, 0xcb3e, 0x6a7d,
   0xef9c, 0xa318, 0xd472, 0x5b06,
   0xce8d, 0xa937, 0x4251, 0xb0f6,
   0x2b9e, 0x17f5, 0x6cd0, 0x834a,
   0x95e3, 0xd086, 0xc7ba, 0x4f12,
   0xb6f8, 0x5c91, 0xa73d, 0x42e0,
   0x0cb9, 0x5763, 0xfe84, 0xd2a1,
   0x256c, 0xd90b, 0xa7e3, 0x814f
};
/*
uint16_t crpt_const[]   = {
   0x29a4, 0xe08d, 0xc1b6, 0x35f7,
   0xc4be, 0xafd6, 0x1832, 0x9570,
   0xd165, 0x243a, 0x7cfe, 0xb906,
   0x1ad7, 0xf980, 0xc64e, 0x352b,
   0x17c6, 0x8df5, 0xe9a4, 0x2b30,
   0x0ab4, 0xd127, 0x5863, 0xefc9,
   0x14bd, 0x95f3, 0x7ea0, 0xc286,
   0x0df1, 0x4a75, 0xe329, 0xc8b6,
};
*/

uint16_t _crpt_data[]   = {
   0x0, 0x0, 0x0, 0x0
};

//To1
uint16_t crpt_data[]   = {
   0xcccc, 0xcccc, 0x3333, 0x3333
};
/*
//To2
uint16_t crpt_data[]   = {
   0x3333, 0x3333, 0xcccc, 0xcccc
};
*/

// Простая замена
void simple_substitute(void)
{
   uint32_t   i, j;
   uint32_t   test, sr;

   //ждем окончания транзакции
   while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
   DSP_CRPT->ITER = 0x60;   // ITER_EN_CRPT; //on crypt module   
   
   //ждем окончания транзакции
   while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
   DSP_CRPT->CWR  = 0x40;   // CWR_RST | CWR_MODE_0; //reset простая замена

   //ввод ключа
   for(i=0; i< sizeof(crpt_key)/2; i++){

      //ждем окончания транзакции
      while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
      
      DSP_CRPT->KR = crpt_key[i];   
      //SysTickDelay(1);
   }
   
   //ввод узлов замены
   for(i=0; i< sizeof(crpt_const)/2; i++){
      //ждем окончания транзакции
      while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));

      DSP_CRPT->CR = crpt_const[i];   
      //SysTickDelay(1);
   }

   test = QuantitySysTick;
   for(j=0; j< 1024*1024; j++)
        {   
      //ввод данных
      for(i=0; i< sizeof(crpt_data)/2; i++)
      {
         //ждем окончания транзакции
         while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));

         DSP_CRPT->DATA = crpt_data[i];
   //      SysTickDelay(1);
      }

   //   sr = DSP_CRPT->SR;

      //ждем окончания транзакции
      while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
      //запуск
      DSP_CRPT->CWR = 0x8; //|= CWR_START;

//      sr = DSP_CRPT->SR;

      //ждем готовности
      while(!(DSP_CRPT->SR & 0x3));
   
      if(DSP_CRPT->SR & SR_ERROR_CRPT)
      {
         //ERROR
         while(1);
      }   
   
      for(i=0; i< sizeof(crpt_data)/2; i++)
         _crpt_data[i] = DSP_CRPT->DATA;
   }

   test = QuantitySysTick - test;
}

//режим гаммирования с обратной связью
void crypt_gamma_fb(void)
{
   uint32_t   i, j;
   uint32_t   test, sr;

   //ждем окончания транзакции
   while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
   DSP_CRPT->ITER = 0x60;   // ITER_EN_CRPT; //on crypt module   
   
   //ждем окончания транзакции
   while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
   DSP_CRPT->CWR  = 0x40;   // CWR_RST | CWR_MODE_0; //reset простая замена

   //ввод ключа
   for(i=0; i< sizeof(crpt_key)/2; i++){
      //ждем окончания транзакции
      while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
      DSP_CRPT->KR = crpt_key[i];
   }
   
   //ввод узлов замены
   for(i=0; i< sizeof(crpt_const)/2; i++){
      //ждем окончания транзакции
      while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
      DSP_CRPT->CR = crpt_const[i];
   }

   DSP_CRPT->CWR  = CWR_MODE_2; //гаммирование с обратной связью

   //ввод синхропосылки
   for(i=0; i< sizeof(crpt_sync)/2; i++){
      //ждем окончания транзакции
      while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
      DSP_CRPT->SYNR = crpt_sync[i];
   }

   test = QuantitySysTick;

   for(j=0; j< 1024*1024; j++){   
      //ввод данных
      for(i=0; i< sizeof(crpt_data)/2; i++) {
         //ждем окончания транзакции
         while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
         DSP_CRPT->DATA = crpt_data[i];
      }

      //ждем окончания транзакции
      while(!(RST_CLK->DSP_CONTROL_STATUS & RST_CLK_DSP_CONTROL_STATUS_BRTRD));
      //запуск
      DSP_CRPT->CWR = 0x8; //|= CWR_START;

      //ждем готовности
      while(!(DSP_CRPT->SR & 0x3));

      if(DSP_CRPT->SR & SR_ERROR_CRPT) { //ERROR
         while(1);
      }   
   
      for(i=0; i< sizeof(crpt_data)/2; i++)
         _crpt_data[i] = DSP_CRPT->DATA;
   }
   test = QuantitySysTick - test;
}




Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Пример работа с крипто-блоком
СообщениеДобавлено: 2013-дек-23 15:12 
Не в сети

Зарегистрирован: 2011-сен-19 08:43
Сообщения: 25
Интересуе вопрос о сертификации крипто-блока. Т.е. есть ли сертификат на данную аппаратную реализацию (отдельно модуля или в составе МК 1901ВЦ или 1886)? Или с кем связаться по тому вопросу?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Пример работа с крипто-блоком
СообщениеДобавлено: 2013-дек-23 15:26 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1271
Откуда: АО "ПКК Миландр"
markinvv писал(а):
Интересуе вопрос о сертификации крипто-блока. Т.е. есть ли сертификат на данную аппаратную реализацию (отдельно модуля или в составе МК 1901ВЦ или 1886)? Или с кем связаться по тому вопросу?


Нет, никто не сертифицировал. И не планируем, так как нет соответствующей лицензии на разработку криптоаппаратуры.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Пример работа с крипто-блоком
СообщениеДобавлено: 2014-авг-07 08:59 
Не в сети

Зарегистрирован: 2011-авг-29 07:45
Сообщения: 2
Приведённый пример не работает. Кто-нибудь смог поработать с криптомодулем из RISC?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB