/// <summary> /// GEt legacy response payload. /// </summary> /// <param name="pdu"></param> /// <param name="requestId"></param> /// <returns></returns> private PduPayload GetLegacyResponsePayload(LegacyPdu pdu, ulong?requestId) { PduPayload payload = pdu.Payload; if (payload == null && pdu.ErrorPayload == null) { throw new KsiServiceException("Invalid response payload: null."); } if (payload != null && payload.Type != GetPayloadTagType(true)) { throw new KsiServiceException("Unexpected response payload tag type. Type: " + payload.Type + "; Expected type: " + GetPayloadTagType(true)); } if (pdu.ErrorPayload != null) { if (payload != null) { // If error payload exists then Payload should be null. Log it. LogUnexpectedPayloads(pdu); } throw new KsiServiceException(FormatServerErrorStatus(pdu.ErrorPayload.Status, pdu.ErrorPayload.ErrorMessage)); } CheckMacAlgorithm(pdu.Mac, _macAlgorithm); if (!LegacyPdu.ValidateMac(pdu.Encode(), pdu.Mac, _macKey)) { throw new KsiServiceException("Invalid MAC in response PDU."); } if (requestId.HasValue) { RequestResponsePayload requestResponsePayload = payload as RequestResponsePayload; if (requestResponsePayload == null) { throw new KsiServiceException("Cannot get request ID from payload. Payload type: " + payload?.GetType()); } if (requestResponsePayload.RequestId != requestId) { throw new KsiServiceException("Unknown request ID: " + requestResponsePayload.RequestId); } } ResponsePayload responsePayload = payload as ResponsePayload; if (responsePayload == null) { throw new KsiServiceException("Cannot get status from payload. Payload type: " + payload?.GetType()); } if (responsePayload.Status != 0) { throw new KsiServiceException(FormatServerErrorStatus(responsePayload.Status, responsePayload.ErrorMessage)); } return(payload); }
private IAsyncResult BeginLegacySign(DataHash hash, uint level, AsyncCallback callback, object asyncState) { PduHeader header = new PduHeader(_signingServiceCredentials.LoginId); ulong requestId = GenerateRequestId(); LegacyAggregationRequestPayload payload = level == 0 ? new LegacyAggregationRequestPayload(requestId, hash) : new LegacyAggregationRequestPayload(requestId, hash, level); LegacyAggregationPdu pdu = new LegacyAggregationPdu(header, payload, LegacyPdu.GetMacTag(_signingMacAlgorithm, _signingServiceCredentials.LoginKey, header, payload)); Logger.Debug("Begin legacy sign (request id: {0}){1}{2}", payload.RequestId, Environment.NewLine, pdu); return(BeginSignRequest(pdu.Encode(), requestId, hash, level, callback, asyncState)); }
private IAsyncResult BeginLegacyExtend(LegacyExtendRequestPayload payload, AsyncCallback callback, object asyncState) { if (_extendingServiceProtocol == null) { throw new KsiServiceException("Extending service protocol is missing from service."); } if (_extendingServiceCredentials == null) { throw new KsiServiceException("Extending service credentials are missing."); } PduHeader header = new PduHeader(_extendingServiceCredentials.LoginId); LegacyExtendPdu pdu = new LegacyExtendPdu(header, payload, LegacyPdu.GetMacTag(_extendingMacAlgorithm, _extendingServiceCredentials.LoginKey, header, payload)); Logger.Debug("Begin legacy extend. (request id: {0}){1}{2}", payload.RequestId, Environment.NewLine, pdu); return(_extendingServiceProtocol.BeginExtend(pdu.Encode(), payload.RequestId, callback, asyncState)); }
/// <summary> /// Parse KSI service response. /// </summary> /// <param name="data">Response byte array</param> /// <param name="requestId">Request ID</param> /// <returns></returns> public PduPayload Parse(byte[] data, ulong?requestId = null) { if (data == null) { throw new ArgumentNullException(nameof(data)); } RawTag rawTag = null; Pdu pdu = null; LegacyPdu legacyPdu = null; try { using (TlvReader reader = new TlvReader(new MemoryStream(data))) { rawTag = new RawTag(reader.ReadTag()); } if (rawTag.Type == GetPduTagType(false)) { if (_pduVersion == PduVersion.v1) { throw new KsiServiceUnexpectedResponseFormatException("Received PDU v2 response to PDU v1 request. Configure the SDK to use PDU v2 format."); } pdu = GetPdu(rawTag); } else if (rawTag.Type == GetPduTagType(true)) { if (_pduVersion == PduVersion.v2) { if (!IsLegacyRequestSupported()) { throw new KsiServiceUnexpectedResponseFormatException("Received PDU v1 response to PDU v2 request."); } throw new KsiServiceUnexpectedResponseFormatException("Received PDU v1 response to PDU v2 request. Configure the SDK to use PDU v1 format."); } legacyPdu = GetLegacyPdu(rawTag); } else { throw new KsiServiceException("Unknown response PDU tag type: " + rawTag.Type.ToString("X")); } if (legacyPdu != null) { return(GetLegacyResponsePayload(legacyPdu, requestId)); } else { CheckAggregatorConfigChange(pdu); CheckExtenderConfigChange(pdu); return(GetResponsePayload(data, pdu, requestId)); } } catch (TlvException e) { KsiException ksiException = new KsiServiceException("Could not parse response message: " + Base16.Encode(data), e); if (requestId.HasValue) { Logger.Warn("Request failed (request id: {0}): {1}", requestId, ksiException); } else { Logger.Warn("Request failed: {0}", ksiException); } throw ksiException; } catch (KsiException e) { if (requestId.HasValue) { Logger.Warn("Request failed (request id: {0}){1}{2}{1}PDU:{1}{3}", requestId, Environment.NewLine, e, legacyPdu ?? pdu ?? (ITlvTag)rawTag); } else { Logger.Warn("Request failed.{0}{1}{0}PDU:{0}{2}", Environment.NewLine, e, legacyPdu ?? pdu ?? (ITlvTag)rawTag); } throw; } }