You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 6 Next »

Функция GrdTRU_GenerateQuestionTime генерирует зашифрованное число-вопрос для удаленного программирования, использующего технологию Trusted Remote Update. Является аналогом функции GrdTRU_GenerateQuestion для ключа Guardant Time. Эта функция не подходит для ключей Guardant Code Time, при работе с которыми нужно использовать функцию GrdTRU_GenerateQuestionTimeEx.

    int GRD_API GrdTRU_GenerateQuestionTime( 
    		HANDLE	hGrd,				
    		void	*pQuestion,			
    		DWORD	*pdwID,			 
    		DWORD	*pdwPublic,			
    		QWORD   *pqwDongleTime,	
    		DWORD	dwDeadTimesSize,	 
    		QWORD	*pqwDeadTimes,		
    		DWORD	*pdwDeadTimesNumbers,
    		void	*pHash,			
    		void	*pReserved		
    	);	

    hGrd

    хэндл, через который будет выполнена данная операция

    pQuestion

    буфер, куда будет помещен сгенерированный вопрос. Размер буфера 8 байт

    pdwID

    буфер, куда будет помещено значение ID ключа, для которого сгенерирован вопрос. Длина буфера 4 байта

    pdwPublic

    буфер, куда будет помещено численное значение Public code ключа, для которого сгенерирован вопрос. Длина буфера 4 байта

    pqwDongleTime

    зашифрованное время из микросхемы таймера. Длина буфера 8 байт

    pdwPublic

    буфер, куда будет помещено численное значение Public code ключа, для которого сгенерирован вопрос. Длина буфера 4 байта

    dwDeadTimesSize

    размер входного буфера pqwDeadTimes в байтах

    pqwDeadTimes

    зашифрованные значения времен жизни алгоритмов. По 8 байт

    pdwDeadTimesNumbers

    количество элементов, возвращаемых в pqwDeadTimes

    pHash

    буфер, куда будет помещено значение MAC ( Message Authentication Code - кода аутентификации сообщения) для верификации вопроса. Длина буфера 8 байт

    pReserved

    зарезервировано. Должно быть равно NULL

    Возможные ошибки

    GrdE_SystemDataCorrupted

    Системные данные TRU повреждены. (Секретный ключ удаленного программирования отсутствует)

    GrdE_NoQuestion

    Число-вопрос не было сгенерировано или было перегенерировано до записи числа ответа

    GrdE_InvalidData

    Неверный формат данных для удаленного программирования

    GrdE_QuestionOK

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

    GrdE_UpdateNotComplete

    Ошибка при записи данных удаленного программирования. Операция не была завершена

    GrdE_InvalidHash

    Неверное значение MAC (Message Authentication Code)

     

    Стандартный набор ошибок

    public static GrdE GrdTRU_GenerateQuestionTime(Handle grdHandle, out byte[] question, out uint id, out uint publicCode,
    	out ulong dongleTime, ulong[] deadTimes, out int deadTimesNumbers, out byte[] hash)
    
    

     

     

     

     

     

     

    Функция GrdTRU_GenerateQuestionTime генерирует зашифрованное число-вопрос и инициализирует процесс для удаленного программирования, использующего технологию Trusted Remote Update. Функция является аналогом GrdTRU_GenerateQuestion для ключа Guardant Time и используется в случаях, когда необходимо продлевать время работы защищенного приложения.

    Функция GrdTRU_GenerateQuestionTime вызывается на компьютере удаленного пользователя и генерирует число-вопрос pQuestion, защищенное от подделки кодом аутентификации сообщения (MAC) pHash. MAC вырабатывается аппаратным алгоритмом на секретном ключе, который должен быть предварительно записан при помощи функции GrdTRU_SetKey. MAC используется для того, чтобы нельзя было подделать число-вопрос, ID или Public Code электронного ключа.

    После того, как число-вопрос сгенерировано, конечный пользователь должен передать разработчику все сгенерированные функцией GrdTRU_GenerateQuestionTime данные: собственно число-вопрос pQuestion, ID ключа pdwID, Public code pdwPublic и MAC pHash. С момента генерации числа-вопроса ключ переходит в состояние ожидания числа-ответа.

    Рекомендуемый размер буфера pqwDeadTimes для зашифрованных значения времени жизни алгоритмов должен быть равен (количеству алгоритмов + количество защищенных ячеек )*8. Если буфер содержит меньше элементов, то возвращается только то, что поместилось, иначе дополняется нулями до dwDeadTimesSize/8 элементов, но не более 499 элементов.

    Два старших байта параметра pqwDongleTime - нули. 2 старших байта элементов массива pqwDeadTimes - числовое имя алгоритма. Остальные 6 байт - время жизни соответствующего алгоритма.

    Время жизни (8 байт) имеет следующий формат:

    1, 2 байтычисловое имя алгоритма (либо нули, если время из микросхемы таймера); 
    3 байтгод от 2000 (08 для 2008 года); 
    4 байт месяц года (01 - январь, 02 - февраль, ...);
    5 байтдень месяца (1 - 31); 
    6 байтчасы (0 - 23); 
    7 байтминуты (0 - 59);
    8 байтсекунды (0 - 59) 

    На клиентской стороне всегда можно узнать, сколько алгоритмов и ячеек есть в ключе для вычисления количества элементов массива DeadTime. Количество алгоритмов и защищенных ячеек в ключе можно узнать, считав поле kmAlgoNum в режиме адресации SAM.

    На стороне разработчика тоже можно вычислить количество алгоритмов по маске, хранящейся в базе. Поэтому в функциях TRU для Time важен только размер массива. Более того, количество элементов можно передать в "посылке" удаленного программирования вместе счислом-вопросом.

     

    • No labels