LINUX.ORG.RU

Сообщения stD

 

Вопрос про шифрование AES

Здравствуйте.

У меня есть программа (для микроконтроллера), которая должна посылать пакет данных по UART'у. Эти данные я зашифровываю с помощью этой библиотеки https://github.com/kokke/tiny-AES-c

Принимающее устройство расшифровывает этот пакет.

Собственно вот функция шифрования...


void encrypt_cbc(uint8_t *in_buf, uint16_t count_byte)
{
    uint8_t key[] = {0x62, 0x4d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
                      0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4};

    uint8_t iv[]  = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};

    struct AES_ctx ctx;
    AES_init_ctx_iv(&ctx, key, iv);
    AES_CBC_encrypt_buffer(&ctx, in_buf, count_byte);
}

Вот так я подаю свой (не зашифрованный) массив (небольшой байт 10) в эту функцию...

encrypt_cbc(crypt_buff, SIZE_PACKET);

И на выходе получаю зашифрованный массив.

Функция в свою очередь передаёт всё хозяйство в библиотечный файл aes.c https://github.com/kokke/tiny-AES-c/blob/master/aes.c#L76

Вопрос вот в чём. Скажите пожалуйста, можно ли сделать так, чтоб в зашифрованном пакете НЕ встречался символ 0x7E ?

Этот символ служит у меня маркером конца передачи. Других вариантов маркеров нет и сделать их не возможно.

 

stD
()

Удалить определённые строки из нескольких файлов

Здравствуйте.

Собственно вопрос в заголовке - мне нужно «пройтись» по нескольким вложенным каталогам с файлами, найти в этих файлах определённые строки, и удалить эти строки.

Делаю так…

grep -r 'assert' /home/dima/dir/ | sed -i '/assert/d'

…пытаясь удалить строки, в которых есть словосочетание «assert».

Однако это не работает, пишет - "sed: отсутствуют входные файлы ". Суть ошибки я понимаю, но не знаю как сделать правильно.

Подскажите решение?

 

stD
()

Поддержка Debian

Здравствуйте.

Скажите, вот у Ubuntu есть долгосрочные релизы с поддержкой в течении пяти лет, а какова ситуация с Debian в этом плане. То есть я хочу отказаться от Ubuntu и поставить Debian 11 (сервер), сколько лет у него будет поддержка (обновления) ?

Спасибо.

 

stD
()

Pthread в своей библиотеке

Здравствуйте.

ОС Ubuntu, язык СИ.

У меня сделана своя библиотека (файл.so), функции которой вызываются из Питоновского скрипта. Скажите, могу ли я создавать в этой своей библиотеке (файл.so) потоки (pthread)?

То есть, я запустил питовский скрипт, а он в свою очередь вызвал функции запускающие несколько pthread находящихся в файл.so.

Если так можно делать, то нужно ли мне эти потоки как-то останавливать перед остановкой питоновского скрипта?

И заодно попутный вопрос: как можно в данной ситуации отлаживать файл.so в valgrind, и можно ли вообще?

Спасибо.

 

stD
()

Как очистить терминал

Здравствуйте.

Программа на СИ. Linux.

Скажите как очистить терминал из своей программы?

Я в терминал вывожу строку с разными значениями и хочу чтоб было не куча бегущих строк, а одна.

Пробовал «clear», «reset», «printf(»\033c");", но строчка дёргается. Может есть какой способ сделать чтоб было без дерганий-морганий.

Ещё можно очистить с помощью «Ctrl + L», но я не знаю как послать такую команду.

Или может я вообще неправильно мыслю и надо как-то по другому делать, чтоб в терминал выводилась только одна строка?

Спасибо.

 

stD
()

Как уменьшать увеличивающееся значение?

Здравствуйте.

Есть переменная «А», значение которой меняется от 0 до 5000, мне нужно уменьшать переменную «В» относительно переменной «А». То есть, когда переменная «А» увеличивается, переменная «В» должна уменьшаться, и наоборот.

Например, если переменная «А» равна 2435, тогда в переменную «В» должно записываться 2433.

Подскажите, как это сделать? Может какие-то битовые операции подойдут для этого, или ещё что-то?

 

stD
()

Как запустить Java-приложение с конкретной версией

Здравствуйте.

У меня на компьютере (Ubuntu) установлены две версии Java, 8 и 11.

Версия 11 стоит по умолчанию, и все программы работают с ней, но есть программа, которая требует версию 8. Скажите, как мне запускать эту программу, чтоб она использовала версию 8, а не 11.

Может скрипт какой-то нужен? Раньше никогда с этим не сталкивался, поэтому даже не знаю с какой стороны к этому подходить.

 

stD
()

Как посчитать кол-во байт в массиве

Здравствуйте.

Предположим есть массив…

uint8_t buf[] = {0x01,0x06,0x00,0x07,0x00,0x08};

Как посчитать количество байт в этом массиве. strlen() не подходит так как есть нули.

Может вопрос простой, но что-то я не соображу как это сделать?

 

stD
()

Про сервер

Здравствуйте.

Есть сервер на WIZnet W5500, и вроде бы работает. Но, ситуация вот в чём: когда я открываю страничку в браузере, то она открывается, но при этом «кружочек» у браузера продолжает крутится, как будто что-то не догрузилось. Крутится бесконечно.

Посмотрел в wireshark, там есть запрос от клиента «GET /bla-bla», но нет ответа от сервера (должно прилететь «HTTP/1.1 200 OK»).

Как только я нажимаю на «крестик» в браузере (чтоб он перестал ожидать) то сразу же в wireshark появляется ожидаемая строчка - «HTTP/1.1 200 OK».

Скажите, почему так происходит?

Да, забыл. Сервер после получения запроса посылает клиенту стандартные строчки…

«HTTP/1.1 200 OK\r\n» «Content-Type: text/html; charset=UTF-8\r\nConnection: close\r\n\r\n»

«<meta http-equiv="Content-type" content="text/html;charset=utf-8">CRMBLA_BLA»

 

stD
()

Вопрос про выделение размера буфера для сокетов

Здравствуйте.

Речь идёт о железке W5500 https://www.chipdip.ru/catalog/popular/w5500 подключаемой к различным МК для работы с сетью. Имеет tcp стек и т.д.

У неё можно инициализировать до восьми сокетов (они там у неё внутри), так вот, для этих сокет есть внутренняя память - 32Кб.

Эту память можно распределять между сокетами самостоятельно, на свое усмотрение. Память эта делится условно на два (для входящих и исходящих буферов), то есть по 16Кб.

Я хочу создать три сокета - один для DNS, второй только для отправки, третий для сервера. Понятно что для сервера хочется выделить побольше этой самой внутренней памяти.

Отсюда вопрос:

Сколько памяти нужно выделить для сокета работающего с DNS (DNS-клиент). Этот сокет открывается один раз при старте, узнаёт ip для доменного имени и зарывается. Дальше он будет использоваться редко, напрмер раз в сутки.

В документации нет никаких рекомендаций потому что это видемо должен знать тот кто делает устройство и разбирается в сети.

В общем, какой размер входящего буфера порекомендуете установить для DNS сокета?

 

stD
()

Вопрос про правильность оформления/написания кода

Здравствуйте.

Вот есть буфер...

char str[20] = {0,}; 

И мне нужно записать в этот буфер что-то, но не в начало, в допустим в середину. Можно сделать так...

memcpy(str + 10, source, 5);

А можно так...

memcpy(&str[10], source, 5);

Как будет правильней с точки зрения оформления кода, удобочитаемости и т.п.?

 

stD
()

Конечный автомат

Здравствуйте.

Есть задача - распарсить строку «s x1 y1\nm x2 y2\n» разложив x1, y1, x2, y2 по отдельным массивам...

  #define VARBUF 8
  char mystr[] = "s x1 y1\nm x2 y2\n";
  char *str = mystr;
  char var1[VARBUF] = {0,};
  char var2[VARBUF] = {0,};
  char var3[VARBUF] = {0,};
  char var4[VARBUF] = {0,};
  int flag = 1, i = 0, i2 = 0;
  int str_len = (int)strlen(mystr);
  
  for(; i < str_len; i++)
  {
	  if(flag == 1 && *str == ' ')
	  {                               
		  flag = 2;
		  str++;
		  i++;
		  i2 = 0;
		  for(; i < str_len && i2 < VARBUF - 1; i++, i2++, str++)
		  {
			  var1[i2] = *str;
			  if(*str == ' ') 
			  {
				  var1[i2] = 0;
				  break;
			  }
		  }
	  }
	  
	  if(flag == 2 && *str == ' ')
	  {                               
		  flag = 3;
		  str++;
		  i++;
		  i2 = 0;
		  for(; i < str_len && i2 < VARBUF - 1; i++, i2++, str++)
		  {
			  var2[i2] = *str;
			  if(*str == '\n') 
			  {
				  var2[i2] = 0;
				  break;
			  }
		  }
	  }	  
 
	  if(flag == 3 && *str == ' ')
	  {                              
		  flag = 4;
		  str++;
		  i++;
		  i2 = 0;
		  for(; i < str_len && i2 < VARBUF - 1; i++, i2++, str++)
		  {
			  var3[i2] = *str;
			  if(*str == ' ') 
			  {
				  var3[i2] = 0;
				  break;
			  }
		  }
	  }		  
	  
	  if(flag == 4 && *str == ' ')
	  {                              
		  flag = 0;
		  str++;
		  i++;
		  i2 = 0;
		  for(; i < str_len && i2 < VARBUF - 1; i++, i2++, str++)
		  {
			  var4[i2] = *str;
			  if(*str == '\n') 
			  {
				  var4[i2] = 0;
				  break;
			  }
		  }
	  }	
	  
	  str++;  
}

Можно ли назвать представленный выше код конечным автоматом?

 

stD
()

Помогите понять странную работу программы

Здравствуйте.

Есть программа на СИ (линукс).

Вот часть функционала в функции маин...

...
  for(;;)
  {
    rat_rub = fopen("/tmp/file.txt", "r"); 
    if(rat_rub == NULL) error_log("rat_rub!");
    while(fgets(buff, 255, rat_rub) != NULL)
    {
      time_creat = strtoul(buff, NULL, 0);
      printf("buff: %lu %s\n", time_creat, buff);

      if(time_creat > time_res)
      {
        printf("SEND: %s\n", buff);
        SendMessage(namechatid, buff, 1);
        //sleep(2); 
      }
    }

    if(fclose(rat_rub) == -1) error_log("close rat_rub_func.");
    time_res = time_creat;
  }
...

Функция SendMessage(namechatid, buff, 1); вызавет функцию, в которой происходит форк, выполняется действие и выход из этой функции - exit(0);

По условиям, функция должна вызваться три раза (из файла читается построчно три строки и каждая строка поочерёдно отправляется в SendMessage).

Вопрос вот в чём: если sleep(2) закомментировано (как в примере), то всё работает нормально. А вот если sleep(2) раскомментировать, то функция SendMessage начинает вызывать большее количество раз, в частности 10 раз.

Как такое может происходить? Как sleep(2) на это влияет?

 

stD
()

Снова про указатель

Здравствуйте.

Помогите понять. Я хочу объявить массив указателей и потом присвоить этим указателям ареса других массивов...


uint8_t *globalptr[2]; // глобальный

int main()  
{ 
    uint8_t array_1[16];
    uint8_t array_2[16];
    
    globalptr[0] = array_1;
    globalptr[1] = array_2;
    ...

Всё это работает.

globalptr - хранит адреса массивов. Но ведь он объявлен как uint8_t, как туда влезают ареса.

Или всё это просто не правильно и у меня вылезает за границы? Однако valgrind ничего не говорит.

Помогите, а то запутался что-то.

 

stD
()

nginx - папка без https

Здравствуйте.

Собственно вопрос в названии топика. Мне нужно скачивать wget'ом кое-что из папки /блабла без ssl. То есть разрешить доступ к папке - /блабла без https.

Если не затруднит, покажите пример. Спасибо.

 

stD
()

Проверить наличие файла на удалённом компе

Здравствуйте.

Есть программа на СИ, работает на одном компьютере, нужно чтоб она проверяла наличие какого-либо файла на другом компе. Способ связи только SSH.

Как бы Вы это сделали?

 

stD
()

Nginx статика обновление

Здравствуйте.

Не знал как правильно озаглавить пост, поэтому прошу прощения.

Вопрос вот в чём: обновил внешний вид сайта (css и т.д.), как заставить браузеры пользователей очистить свою историю и кеш?

Можно ли это сделать средствами nginx?

 

stD
()

Что это в логе сервера?

Здравствуйте.

Обнаружил в логе самописного сервера (телеграмбот) следующие записи:

Sun Mar 25 21:50:48 2018
GET / HTTP/1.0

Sun Mar 25 21:50:49 2018
OPTIONS / HTTP/1.0

Sun Mar 25 21:50:49 2018
GET /nice%20ports%2C/Tri%6Eity.txt%2ebak HTTP/1.0

Sun Mar 25 21:50:50 2018
Ђћ

Sun Mar 25 21:50:50 2018
\#ST

Sun Mar 25 21:50:51 2018
OPTIONS / RTSP/1.0

Sun Mar 25 21:50:51 2018
Ђ

Sun Mar 25 21:50:52 2018
HELP

Sun Mar 25 21:50:53 2018
l

Sun Mar 25 21:50:53 2018
default

Sun Mar 25 21:50:53 2018
0„

Sun Mar 25 21:50:53 2018
0

Sun Mar 25 21:50:53 2018
OPTIONS sip:nm SIP/2.0
Via: SIP/2.0/TCP nm;branch=foo
From: <sip:nm@nm>;tag=root
To: <sip:nm2@nm2>
Call-ID: 50000
CSeq: 42 OPTIONS
Max-Forwards: 70
Content-Length: 0
Contact: <sip:nm@nm>
Accept: application/sdp

Sun Mar 25 21:50:54 2018
TNMP

Sun Mar 25 21:50:54 2018
DmdT

Sun Mar 25 21:50:54 2018
:

Sun Mar 25 21:50:55 2018
JRMI

Sun Mar 25 21:50:56 2018
GIOP

Это access-лог, то есть записи должны быть типа...

GET / HTTP/1.1
Host: 125.129.251.134
User-Agent: Firefox/59.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1

В файле /var/log/syslog нашлись вот такие строки:

Mar 25 21:50:49 debian kernel: [68103.603605] myserver[4171]: segfault at 1 ip b746a32b sp bfc136d0 error 4 in libc-2.19.so[b73ee000+1a7000]

Таких записей 16 штук с разницей в одну секунду, все одинаковые.

myserver - это мой сервер))).

Сервер работает следующим образом: принимает соединение (SSL_accept) и форкается, то есть read уже в форке, далее обрабатываются данные.

Я понимаю что это попытка залезть мне в душу взлома, но хотелось бы узнать подробнее, что это за вид атаки?

Видимо это как-то связано sip-телефонией (вычитал это в сети), но что это за слова - TNMP, DmdT, JRMI? Это что-то осмысленное, или обрывки чего-то? Там ещё присутствуют not a legal XML character (квадратики с шестнадцатеричным кодом).

Что означает ошибка 4?

Сталкиваюсь с подобным впервые, посему прошу отнестись снисходительно. Спасибо.

(линукс, сервер на си)

 

stD
()

Вопрос про recvfrom

Здравствуйте.

Скажите, как правильно обрабатывать ошибку recvfrom?

То есть, вот кусок udp-сервера, который в цикле принимает соединения...

while(1) 
     {  
        int n;
        if((n = recvfrom(sd, read_buffer, BREADSIZE - 1, 0, NULL, NULL)) < 0)
         {
           close(sd);
           exit(0);
         }

...если возникла ошибка, то нужно закрывать сокет и гасить прогу или можно сделать так...

while(1) 
     {  
        int n;
        if((n = recvfrom(sd, read_buffer, BREADSIZE - 1, 0, NULL, NULL)) < 0)
         {
           printf("error socket\n");
           continue;
         }

Сильно не пинайте ибо не понятно, какие последствия грядут?

То есть ясно, что ошибка EBADF (неверный дескриптор) погубит меня, но вот например ECONNREFUSED (сетевой компьютер с другой стороны отказался устанавливать сетевое соединение (обычно потому, что там не работает запрошенный сервис)), к чему приведёт?

Спасибо.

(язык си, линукс).

 

stD
()

Использование в своих программах других программ

Здравствуйте.

Скажите, если я в своей программе (СИ, линукс) вызываю другие программы (wget или df или curl или ifconfig и т.д.), это ведь стандартная практика. Или я ошибаюсь?

 ,

stD
()

RSS подписка на новые темы