Код: Выделить всё
import base64
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
from cryptography.hazmat.primitives.serialization import load_pem_private_key
def logon_raw_data(private_key: Ed25519PrivateKey,
sender_comp_id: str,
target_comp_id: str,
msg_seq_num: str,
sending_time: str):
"""
Computes the value of RawData (96) field in Logon message.
"""
payload = chr(1).join([
'A',
sender_comp_id,
target_comp_id,
msg_seq_num,
sending_time,
])
signature = private_key.sign(payload.encode('ASCII'))
return base64.b64encode(signature).decode('ASCII')
with open('private_key.pem', 'rb') as f:
private_key = load_pem_private_key(data=f.read(),
password=None)
raw_data = logon_raw_data(private_key,
sender_comp_id='5JQmUOsm',
target_comp_id='SPOT',
msg_seq_num='1',
sending_time='20240612-08:52:21.613')
< /code>
Я не знаю, как реализовать этот алгоритм в C ++ на данный момент, и вручную копировал строку RawData (сгенерированную с помощью сценария Python) и использовал SetField (), чтобы добавить ее в сообщение вход в систему, как показано ниже. Это приводит к тому, что «подпись для этого запроса не является действительным». Отправка сообщения FIX слишком долго после того, как сгенерированная метка времени дала бы следующую ошибку: TimeStamp для этого запроса находится за пределами RecvWindow.void Application::toAdmin(FIX::Message &message, const FIX::SessionID &sessionID)
EXCEPT(FIX::DoNotSend) {
if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType)) {
std::string rawData = "CkY08Cf3xrN4MwAdl/Kblj2aHrGxT2sS1URZ/VM0mksR1tQd6hHQ5bda0oNSIeD/JI9cwPBJ4y2R2ZcVgy7oDQ==";
message.setField(FIX::RawDataLength(88));
message.setField(FIX::RawData(rawData));
message.setField(FIX::Username("myapikey"));
message.setField(FIX::StringField(25035, "1"));
}
}
Сообщение отправлено: (8 = исправление.4.4 | 9 = 248 | 35 = A | 34 = 1 | 49 = SenderCompid | 52 = 20250102-15: 38: 55,546 | 56 = Spot | 95 = 88 | 96 = CKY08CF3XRN4MWADL/KBLJ2AHRGX T2SS1URZ/VM0MKSR1TQD6HHQ5BDA0ONSID/JI9CWPBJ4Y2R2ZCVGY7ODQ == | 98 = 0 | 108 = 30 | 141 = Y | 553 = APIKEY | 25035 = 1 | 10 = 149 |)
Ответ: (8 = FIX.4.4 | 9 = 0000131 | 35 = 3 | 49 = Spot | 56 = Ryantest | 34 = 1 | 52 = 20250102-15: 38: 55,774913 | 45 = 1 | 372 = A | 373 = 8 | 25016 = -1022 | 58 =.>
Подробнее здесь: https://stackoverflow.com/questions/793 ... ignature-w
Мобильная версия