Статус: Участник
Группы: Участники
Зарегистрирован: 08.11.2018(UTC) Сообщений: 18
|
С другими серверами ошибка аналогичная. Код улучшения подписей: Код:static byte[] Enhance(byte[] signature, string tspUri, CadesType cadesType)
{
var tspConnectionParamsSize = Marshal.SizeOf<CADES_SERVICE_CONNECTION_PARA>();
var tspConnectionParams = new CADES_SERVICE_CONNECTION_PARA
{
dwSize = (uint)tspConnectionParamsSize,
wszUri = tspUri
};
var tspConnectionParamsPtr = Marshal.AllocHGlobal(tspConnectionParamsSize);
try
{
Marshal.StructureToPtr(tspConnectionParams, tspConnectionParamsPtr, false);
var signParamsSize = Marshal.SizeOf<CADES_SIGN_PARA>();
var signParams = new CADES_SIGN_PARA
{
dwSize = (uint)signParamsSize,
dwCadesType = cadesType,
pTspConnectionPara = tspConnectionParamsPtr
};
var signParamsPtr = Marshal.AllocHGlobal(signParamsSize);
try
{
Marshal.StructureToPtr(signParams, signParamsPtr, false);
var enchanceParams = new CADES_ENHANCE_MESSAGE_PARA
{
dwSize = (uint)Marshal.SizeOf<CADES_ENHANCE_MESSAGE_PARA>(),
dwMsgEncodingType = AsnEncoding.X509_PKCS_7,
pCadesSignPara = signParamsPtr
};
if (!CadesNativeMethods.CadesEnhanceMessageAll(ref enchanceParams, signature, (uint)signature.Length, out var ppEnhancedBlob))
{
throw new InvalidOperationException(string.Format("Не удалось усовершенствовать подпись до {0}. Код ошибки: {1}.", cadesType, CadesNativeMethods.GetLastError()));
}
try
{
var enhancedSignatureBlob = Marshal.PtrToStructure<_CRYPTOAPI_BLOB>(ppEnhancedBlob);
var enhancedSignature = new byte[enhancedSignatureBlob.cbData];
Marshal.Copy(enhancedSignatureBlob.pbData, enhancedSignature, 0, enhancedSignature.Length);
return enhancedSignature;
}
finally
{
CadesNativeMethods.CadesFreeBlob(ppEnhancedBlob);
}
}
finally
{
Marshal.FreeHGlobal(signParamsPtr);
}
}
finally
{
Marshal.FreeHGlobal(tspConnectionParamsPtr);
}
}
CadesNativeMethods: Код:internal sealed class CadesNativeMethods
{
[DllImport("libcades", SetLastError = true)]
public static extern bool CadesEnhanceMessageAll(
[In] ref CADES_ENHANCE_MESSAGE_PARA pEnhancePara,
[In] byte[] pbSignedBlob,
[In] uint cbSignedBlob,
[Out] out IntPtr ppEnhancedBlob);
[DllImport("libcades", SetLastError = true)]
public static extern bool CadesFreeBlob([In] IntPtr pBlob);
[DllImport("libcades", SetLastError = false)]
public static extern int GetLastError();
}
CadesType: Код:public enum CadesType : uint
{
CADES_DEFAULT = 0x00000000,
CADES_BES = 0x00000001,
CADES_T = 0x00000005,
CADES_X_LONG_TYPE_1 = 0x0000005D,
PKCS7_TYPE = 0x0000ffff
}
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 08.11.2018(UTC) Сообщений: 18
|
Добрый день!
Нужны ли еще какие-нибудь данные? Есть ли идеи по поводу того, что пошло не так?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.04.2020(UTC) Сообщений: 10
|
Автор: byre_vestnik Добрый день!
Нужны ли еще какие-нибудь данные? Есть ли идеи по поводу того, что пошло не так? Коллеги, добрый день. Дополню. Дошли до установки Wireshark, чтобы посмотреть, а что же там происходит. А ничего не происходит. :) Несмотря на наличие в логе "<tsp>MakeRequest", Wireshark не ловит никакого HTTP-трафика (хотя, если из браузера дернуть тот же URI, все прекрасно в логе WSH видно). Более того, картинка не меняется, если подсунуть невалидный адрес TSP-сервера (потормозить вызов должен при попытке отресолвить имя хоста в адрес) - моментально возвращается тот же код ошибки. Как понять, _куда именно_ идет запрос (и идет ли на самом деле, т.к. есть подозрение, что никакого запроса никуда не уходит)? Касательно прокси: Отредактировано пользователем 11 ноября 2021 г. 12:08:54(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.04.2020(UTC) Сообщений: 10
|
Коллеги, добрый день? Все вымерли? Вопрос более чем актуален.
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,164 Сказал(а) «Спасибо»: 93 раз Поблагодарили: 262 раз в 245 постах
|
Добрый день! для отладки включите логирование sudo /opt/cprocsp/sbin/amd64/cpconfig -loglevel сades -mask 0xF sudo /opt/cprocsp/sbin/amd64/cpconfig -loglevel tsp -mask 0xF sudo /opt/cprocsp/sbin/amd64/cpconfig -loglevel ocsp -mask 0xF воспроизведите ошибку. сообщения будут видны в sudo journalctl -f вернуть логирование обратно на прежний уровень mask 0x1 приложите лог. либо создайте обращение на портале техподдержки и приложите там |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.04.2020(UTC) Сообщений: 10
|
Добрый день. Создал обращение 43166 на портале ТП. Лог приложил, но в нем ничего нового - тот же набор записей, что и в первых сообщениях темы. Тот же HTTP STATUS: 456.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.04.2020(UTC) Сообщений: 10
|
Санчир, спасибо. Проблема решена. Суть в том, что Marshal.StringToHGlobalUni внутри вызывает вот это: Код:
[System.Security.SecurityCritical] // auto-generated
internal static unsafe void wstrcpy(char *dmem, char *smem, int charCount)
{
Buffer.Memcpy((byte*)dmem, (byte*)smem, charCount * 2); // 2 used everywhere instead of sizeof(char)
}
Т.е. ни автоматический маршаллниг с параметрами по умолчанию, если структура объявлена так: Код:
[StructLayout(LayoutKind.Sequential)]
internal struct CADES_SERVICE_CONNECTION_PARA
{
public uint dwSize;
public string wszUri;
public IntPtr pAuthPara;
}
ни явный вызов Marshal.StringToHGlobalUni, если структура объявлена вот так: Код:
[StructLayout(LayoutKind.Sequential)]
internal struct CADES_SERVICE_CONNECTION_PARA
{
public uint dwSize;
public IntPtr wszUri;
public IntPtr pAuthPara;
}
под Linux не отработает, т.к. имеем захардкоженный UTF-16 вместо требуемого под Linux UTF-32. В итоге добавили вот такое явное использование UTF-32: Код:
public static IntPtr ToHGlobalUni(this string source)
{
if (string.IsNullOrEmpty(source))
{
return IntPtr.Zero;
}
var sourceBytes = Encoding.UTF32.GetBytes(source);
Array.Resize(ref sourceBytes, sourceBytes.Length + 4);
var sourceBytesPtr = Marshal.AllocHGlobal(sourceBytes.Length);
Marshal.Copy(sourceBytes, 0, sourceBytesPtr, sourceBytes.Length);
return sourceBytesPtr;
}
Использовать вместе со вторым вариантом объявления структуры, в котором wszUri объявлен как IntPtr.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close