diff --git a/development/src/main/java/gurux/dlms/GXAPDU.java b/development/src/main/java/gurux/dlms/GXAPDU.java index de396a15..fad5fcab 100644 --- a/development/src/main/java/gurux/dlms/GXAPDU.java +++ b/development/src/main/java/gurux/dlms/GXAPDU.java @@ -188,9 +188,10 @@ private static void generateApplicationContextName(final int name, final GXDLMSS } } // Add system title. - if (!settings.isServer() && (ciphered || settings.getAuthentication() == Authentication.HIGH_GMAC) + if (!settings.isServer() && (ciphered || + (settings.getAuthentication() == Authentication.HIGH_GMAC || settings.getAuthentication() == Authentication.HIGH_SHA256 - || settings.getAuthentication() == Authentication.HIGH_ECDSA) { + || settings.getAuthentication() == Authentication.HIGH_ECDSA))) { if (cipher.getSystemTitle() == null || cipher.getSystemTitle().length == 0) { throw new IllegalArgumentException("SystemTitle"); } diff --git a/development/src/main/java/gurux/dlms/GXDLMS.java b/development/src/main/java/gurux/dlms/GXDLMS.java index e989fe8f..1d665335 100644 --- a/development/src/main/java/gurux/dlms/GXDLMS.java +++ b/development/src/main/java/gurux/dlms/GXDLMS.java @@ -231,179 +231,6 @@ private static long getLongInvokeIDPriority(final GXDLMSSettings settings) { return value; } - static GXDLMSObject createObject(final GXDLMSSettings settings, final ObjectType type, final int classID, - final int version) { - // If IC is manufacturer specific or unknown. - if (type == null || type == ObjectType.NONE) { - GXDLMSObject obj = null; - if (settings != null && settings.getCustomObjectNotifier() != null) { - obj = settings.getCustomObjectNotifier().onObjectCreate(classID, version); - } - if (obj == null) { - obj = new GXDLMSObject(); - } - return obj; - } - switch (type) { - case ACTION_SCHEDULE: - return new GXDLMSActionSchedule(); - case ACTIVITY_CALENDAR: - return new GXDLMSActivityCalendar(); - case ASSOCIATION_LOGICAL_NAME: - return new GXDLMSAssociationLogicalName(); - case ASSOCIATION_SHORT_NAME: - return new GXDLMSAssociationShortName(); - case AUTO_ANSWER: - return new GXDLMSAutoAnswer(); - case AUTO_CONNECT: - return new GXDLMSAutoConnect(); - case CLOCK: - return new GXDLMSClock(); - case DATA: - return new GXDLMSData(); - case DEMAND_REGISTER: - return new GXDLMSDemandRegister(); - case MAC_ADDRESS_SETUP: - return new GXDLMSMacAddressSetup(); - case EXTENDED_REGISTER: - return new GXDLMSExtendedRegister(); - case GPRS_SETUP: - return new GXDLMSGprsSetup(); - case IEC_HDLC_SETUP: - return new GXDLMSHdlcSetup(); - case IEC_LOCAL_PORT_SETUP: - return new GXDLMSIECLocalPortSetup(); - case IEC_TWISTED_PAIR_SETUP: - return new GXDLMSIecTwistedPairSetup(); - case IP4_SETUP: - return new GXDLMSIp4Setup(); - case IP6_SETUP: - return new GXDLMSIp6Setup(); - case MBUS_SLAVE_PORT_SETUP: - return new GXDLMSMBusSlavePortSetup(); - case IMAGE_TRANSFER: - return new GXDLMSImageTransfer(); - case SECURITY_SETUP: - return new GXDLMSSecuritySetup(); - case DISCONNECT_CONTROL: - return new GXDLMSDisconnectControl(); - case LIMITER: - return new GXDLMSLimiter(); - case MBUS_CLIENT: - return new GXDLMSMBusClient(); - case MODEM_CONFIGURATION: - return new GXDLMSModemConfiguration(); - case PPP_SETUP: - return new GXDLMSPppSetup(); - case PROFILE_GENERIC: - return new GXDLMSProfileGeneric(); - case REGISTER: - return new GXDLMSRegister(); - case REGISTER_ACTIVATION: - return new GXDLMSRegisterActivation(); - case REGISTER_MONITOR: - return new GXDLMSRegisterMonitor(); - case REGISTER_TABLE: - return new GXDLMSObject(); - case ZIG_BEE_SAS_STARTUP: - return new GXDLMSObject(); - case ZIG_BEE_SAS_JOIN: - return new GXDLMSObject(); - case SAP_ASSIGNMENT: - return new GXDLMSSapAssignment(); - case SCHEDULE: - return new GXDLMSSchedule(); - case SCRIPT_TABLE: - return new GXDLMSScriptTable(); - case SPECIAL_DAYS_TABLE: - return new GXDLMSSpecialDaysTable(); - case STATUS_MAPPING: - return new GXDLMSObject(); - case TCP_UDP_SETUP: - return new GXDLMSTcpUdpSetup(); - case ZIG_BEE_SAS_APS_FRAGMENTATION: - return new GXDLMSObject(); - case UTILITY_TABLES: - return new GXDLMSUtilityTables(); - case PUSH_SETUP: - return new GXDLMSPushSetup(); - case MBUS_MASTER_PORT_SETUP: - return new GXDLMSMBusMasterPortSetup(); - case GSM_DIAGNOSTIC: - return new GXDLMSGSMDiagnostic(); - case ACCOUNT: - return new GXDLMSAccount(); - case CREDIT: - return new GXDLMSCredit(); - case CHARGE: - return new GXDLMSCharge(); - case TOKEN_GATEWAY: - return new GXDLMSTokenGateway(); - case PARAMETER_MONITOR: - return new GXDLMSParameterMonitor(); - case COMPACT_DATA: - return new GXDLMSCompactData(); - case LLC_SSCS_SETUP: - return new GXDLMSLlcSscsSetup(); - case PRIME_NB_OFDM_PLC_PHYSICAL_LAYER_COUNTERS: - return new GXDLMSPrimeNbOfdmPlcPhysicalLayerCounters(); - case PRIME_NB_OFDM_PLC_MAC_SETUP: - return new GXDLMSPrimeNbOfdmPlcMacSetup(); - case PRIME_NB_OFDM_PLC_MAC_FUNCTIONAL_PARAMETERS: - return new GXDLMSPrimeNbOfdmPlcMacFunctionalParameters(); - case PRIME_NB_OFDM_PLC_MAC_COUNTERS: - return new GXDLMSPrimeNbOfdmPlcMacCounters(); - case PRIME_NB_OFDM_PLC_MAC_NETWORK_ADMINISTRATION_DATA: - return new GXDLMSPrimeNbOfdmPlcMacNetworkAdministrationData(); - case PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION: - return new GXDLMSPrimeNbOfdmPlcApplicationsIdentification(); - case IEC_8802_LLC_TYPE1_SETUP: - return new GXDLMSIec8802LlcType1Setup(); - case IEC_8802_LLC_TYPE2_SETUP: - return new GXDLMSIec8802LlcType2Setup(); - case IEC_8802_LLC_TYPE3_SETUP: - return new GXDLMSIec8802LlcType3Setup(); - case SFSK_REPORTING_SYSTEM_LIST: - return new GXDLMSSFSKReportingSystemList(); - case ARBITRATOR: - return new GXDLMSArbitrator(); - case SFSK_MAC_COUNTERS: - return new GXDLMSSFSKMacCounters(); - case SFSK_MAC_SYNCHRONIZATION_TIMEOUTS: - return new GXDLMSSFSKMacSynchronizationTimeouts(); - case SFSK_ACTIVE_INITIATOR: - return new GXDLMSSFSKActiveInitiator(); - case SFSK_PHY_MAC_SETUP: - return new GXDLMSSFSKPhyMacSetUp(); - case NTP_SETUP: - return new GXDLMSNtpSetup(); - case COMMUNICATION_PORT_PROTECTION: - return new GXDLMSCommunicationPortProtection(); - case G3_PLC_MAC_LAYER_COUNTERS: - return new GXDLMSG3PlcMacLayerCounters(); - case G3_PLC6_LO_WPAN: - return new GXDLMSG3Plc6LoWPan(); - case G3_PLC_MAC_SETUP: - return new GXDLMSG3PlcMacSetup(); - case ARRAY_MANAGER: - return new GXDLMSArrayManager(); - case LTE_MONITORING: - return new GXDLMSLteMonitoring(); - case FUNCTION_CONTROL: - return new GXDLMSFunctionControl(); - case COAP_SETUP: - return new GXDLMSCoAPSetup(); - case COAP_DIAGNOSTIC: - return new GXDLMSCoAPDiagnostic(); - case MBUS_PORT_SETUP: - return new GXDLMSMBusPortSetup(); - case MBUS_DIAGNOSTIC: - return new GXDLMSMBusDiagnostic(); - default: - return new GXDLMSObject(); - } - } - /** * Generates an acknowledgment message, with which the server is informed to * send next packets. diff --git a/development/src/main/java/gurux/dlms/GXDLMSClient.java b/development/src/main/java/gurux/dlms/GXDLMSClient.java index 41a50b2a..f395418d 100644 --- a/development/src/main/java/gurux/dlms/GXDLMSClient.java +++ b/development/src/main/java/gurux/dlms/GXDLMSClient.java @@ -83,12 +83,7 @@ import gurux.dlms.internal.GXCommon; import gurux.dlms.internal.GXDataInfo; import gurux.dlms.manufacturersettings.GXObisCodeCollection; -import gurux.dlms.objects.GXDLMSCaptureObject; -import gurux.dlms.objects.GXDLMSData; -import gurux.dlms.objects.GXDLMSObject; -import gurux.dlms.objects.GXDLMSObjectCollection; -import gurux.dlms.objects.GXDLMSProfileGeneric; -import gurux.dlms.objects.IGXDLMSBase; +import gurux.dlms.objects.*; import gurux.dlms.objects.enums.CertificateType; import gurux.dlms.objects.enums.SecuritySuite; import gurux.dlms.secure.GXSecure; @@ -240,7 +235,7 @@ protected final void setCipher(final GXICipher value) { /** * @return Get settings. */ - protected final GXDLMSSettings getSettings() { + public final GXDLMSSettings getSettings() { return settings; } @@ -1323,7 +1318,7 @@ public final byte[] disconnectRequest(final boolean force) static GXDLMSObject createDLMSObject(final GXDLMSSettings settings, final int classID, final Object version, final int baseName, final Object ln, final Object accessRights, final int lnVersion) { ObjectType type = ObjectType.forValue(classID); - GXDLMSObject obj = GXDLMS.createObject(settings, type, classID, ((Number) version).intValue()); + GXDLMSObject obj = GXCreateObject.createObject(settings, type, classID, ((Number) version).intValue()); updateObjectData(obj, type, version, baseName, (byte[]) ln, accessRights, lnVersion); return obj; } @@ -3021,7 +3016,7 @@ else if ("0.0.1.2.0.255".equals(sort.getLogicalName())) { * @return Created object. */ public static GXDLMSObject createObject(final ObjectType type) { - return GXDLMS.createObject(null, type, 0, 0); + return GXCreateObject.createObject(null, type, 0, 0); } /** @@ -3032,7 +3027,7 @@ public static GXDLMSObject createObject(final ObjectType type) { * @return Created object. */ public static GXDLMSObject createCustomObject(final GXDLMSSettings settings, final int type) { - return GXDLMS.createObject(settings, null, type, 0); + return GXCreateObject.createObject(settings, null, type, 0); } /** diff --git a/development/src/main/java/gurux/dlms/GXDLMSSettings.java b/development/src/main/java/gurux/dlms/GXDLMSSettings.java index efb1c896..e9821195 100644 --- a/development/src/main/java/gurux/dlms/GXDLMSSettings.java +++ b/development/src/main/java/gurux/dlms/GXDLMSSettings.java @@ -1625,6 +1625,10 @@ public GXDLMSData getInvocationCounter() { return invocationCounter; } + public void setInvocationCounter(GXDLMSData invocationCounter) { + this.invocationCounter = invocationCounter; + } + /** * @return Crypto notifier. */ diff --git a/development/src/main/java/gurux/dlms/objects/GXCreateObject.java b/development/src/main/java/gurux/dlms/objects/GXCreateObject.java new file mode 100644 index 00000000..30936461 --- /dev/null +++ b/development/src/main/java/gurux/dlms/objects/GXCreateObject.java @@ -0,0 +1,184 @@ +package gurux.dlms.objects; + +import gurux.dlms.GXDLMSSettings; +import gurux.dlms.enums.ObjectType; + +/** + * Class for better object creation, in case of using custom objects. + */ +public class GXCreateObject { + + public static GXDLMSObject createObject(final GXDLMSSettings settings, final ObjectType type, final int classID, + final int version) { + // If IC is manufacturer specific or unknown. + if (type == null || type == ObjectType.NONE) { + GXDLMSObject obj = null; + if (settings != null && settings.getCustomObjectNotifier() != null) { + obj = settings.getCustomObjectNotifier().onObjectCreate(classID, version); + } + if (obj == null) { + obj = new GXDLMSObject(); + } + return obj; + } + switch (type) { + case ACTION_SCHEDULE: + return new GXDLMSActionSchedule(); + case ACTIVITY_CALENDAR: + return new GXDLMSActivityCalendar(); + case ASSOCIATION_LOGICAL_NAME: + return new GXDLMSAssociationLogicalName(); + case ASSOCIATION_SHORT_NAME: + return new GXDLMSAssociationShortName(); + case AUTO_ANSWER: + return new GXDLMSAutoAnswer(); + case AUTO_CONNECT: + return new GXDLMSAutoConnect(); + case CLOCK: + return new GXDLMSClock(); + case DATA: + return new GXDLMSData(); + case DEMAND_REGISTER: + return new GXDLMSDemandRegister(); + case MAC_ADDRESS_SETUP: + return new GXDLMSMacAddressSetup(); + case EXTENDED_REGISTER: + return new GXDLMSExtendedRegister(); + case GPRS_SETUP: + return new GXDLMSGprsSetup(); + case IEC_HDLC_SETUP: + return new GXDLMSHdlcSetup(); + case IEC_LOCAL_PORT_SETUP: + return new GXDLMSIECLocalPortSetup(); + case IEC_TWISTED_PAIR_SETUP: + return new GXDLMSIecTwistedPairSetup(); + case IP4_SETUP: + return new GXDLMSIp4Setup(); + case IP6_SETUP: + return new GXDLMSIp6Setup(); + case MBUS_SLAVE_PORT_SETUP: + return new GXDLMSMBusSlavePortSetup(); + case IMAGE_TRANSFER: + return new GXDLMSImageTransfer(); + case SECURITY_SETUP: + return new GXDLMSSecuritySetup(); + case DISCONNECT_CONTROL: + return new GXDLMSDisconnectControl(); + case LIMITER: + return new GXDLMSLimiter(); + case MBUS_CLIENT: + return new GXDLMSMBusClient(); + case MODEM_CONFIGURATION: + return new GXDLMSModemConfiguration(); + case PPP_SETUP: + return new GXDLMSPppSetup(); + case PROFILE_GENERIC: + return new GXDLMSProfileGeneric(); + case REGISTER: + return new GXDLMSRegister(); + case REGISTER_ACTIVATION: + return new GXDLMSRegisterActivation(); + case REGISTER_MONITOR: + return new GXDLMSRegisterMonitor(); + case REGISTER_TABLE: + return new GXDLMSObject(); + case ZIG_BEE_SAS_STARTUP: + return new GXDLMSObject(); + case ZIG_BEE_SAS_JOIN: + return new GXDLMSObject(); + case SAP_ASSIGNMENT: + return new GXDLMSSapAssignment(); + case SCHEDULE: + return new GXDLMSSchedule(); + case SCRIPT_TABLE: + return new GXDLMSScriptTable(); + case SPECIAL_DAYS_TABLE: + return new GXDLMSSpecialDaysTable(); + case STATUS_MAPPING: + return new GXDLMSObject(); + case TCP_UDP_SETUP: + return new GXDLMSTcpUdpSetup(); + case ZIG_BEE_SAS_APS_FRAGMENTATION: + return new GXDLMSObject(); + case UTILITY_TABLES: + return new GXDLMSUtilityTables(); + case PUSH_SETUP: + return new GXDLMSPushSetup(); + case MBUS_MASTER_PORT_SETUP: + return new GXDLMSMBusMasterPortSetup(); + case GSM_DIAGNOSTIC: + return new GXDLMSGSMDiagnostic(); + case ACCOUNT: + return new GXDLMSAccount(); + case CREDIT: + return new GXDLMSCredit(); + case CHARGE: + return new GXDLMSCharge(); + case TOKEN_GATEWAY: + return new GXDLMSTokenGateway(); + case PARAMETER_MONITOR: + return new GXDLMSParameterMonitor(); + case COMPACT_DATA: + return new GXDLMSCompactData(); + case LLC_SSCS_SETUP: + return new GXDLMSLlcSscsSetup(); + case PRIME_NB_OFDM_PLC_PHYSICAL_LAYER_COUNTERS: + return new GXDLMSPrimeNbOfdmPlcPhysicalLayerCounters(); + case PRIME_NB_OFDM_PLC_MAC_SETUP: + return new GXDLMSPrimeNbOfdmPlcMacSetup(); + case PRIME_NB_OFDM_PLC_MAC_FUNCTIONAL_PARAMETERS: + return new GXDLMSPrimeNbOfdmPlcMacFunctionalParameters(); + case PRIME_NB_OFDM_PLC_MAC_COUNTERS: + return new GXDLMSPrimeNbOfdmPlcMacCounters(); + case PRIME_NB_OFDM_PLC_MAC_NETWORK_ADMINISTRATION_DATA: + return new GXDLMSPrimeNbOfdmPlcMacNetworkAdministrationData(); + case PRIME_NB_OFDM_PLC_APPLICATIONS_IDENTIFICATION: + return new GXDLMSPrimeNbOfdmPlcApplicationsIdentification(); + case IEC_8802_LLC_TYPE1_SETUP: + return new GXDLMSIec8802LlcType1Setup(); + case IEC_8802_LLC_TYPE2_SETUP: + return new GXDLMSIec8802LlcType2Setup(); + case IEC_8802_LLC_TYPE3_SETUP: + return new GXDLMSIec8802LlcType3Setup(); + case SFSK_REPORTING_SYSTEM_LIST: + return new GXDLMSSFSKReportingSystemList(); + case ARBITRATOR: + return new GXDLMSArbitrator(); + case SFSK_MAC_COUNTERS: + return new GXDLMSSFSKMacCounters(); + case SFSK_MAC_SYNCHRONIZATION_TIMEOUTS: + return new GXDLMSSFSKMacSynchronizationTimeouts(); + case SFSK_ACTIVE_INITIATOR: + return new GXDLMSSFSKActiveInitiator(); + case SFSK_PHY_MAC_SETUP: + return new GXDLMSSFSKPhyMacSetUp(); + case NTP_SETUP: + return new GXDLMSNtpSetup(); + case COMMUNICATION_PORT_PROTECTION: + return new GXDLMSCommunicationPortProtection(); + case G3_PLC_MAC_LAYER_COUNTERS: + return new GXDLMSG3PlcMacLayerCounters(); + case G3_PLC6_LO_WPAN: + return new GXDLMSG3Plc6LoWPan(); + case G3_PLC_MAC_SETUP: + return new GXDLMSG3PlcMacSetup(); + case ARRAY_MANAGER: + return new GXDLMSArrayManager(); + case LTE_MONITORING: + return new GXDLMSLteMonitoring(); + case FUNCTION_CONTROL: + return new GXDLMSFunctionControl(); + case COAP_SETUP: + return new GXDLMSCoAPSetup(); + case COAP_DIAGNOSTIC: + return new GXDLMSCoAPDiagnostic(); + case MBUS_PORT_SETUP: + return new GXDLMSMBusPortSetup(); + case MBUS_DIAGNOSTIC: + return new GXDLMSMBusDiagnostic(); + default: + return new GXDLMSObject(); + } + } + +} diff --git a/development/src/main/java/gurux/dlms/objects/GXDLMSGSMDiagnostic.java b/development/src/main/java/gurux/dlms/objects/GXDLMSGSMDiagnostic.java index f8ae5f89..c7a24c30 100644 --- a/development/src/main/java/gurux/dlms/objects/GXDLMSGSMDiagnostic.java +++ b/development/src/main/java/gurux/dlms/objects/GXDLMSGSMDiagnostic.java @@ -384,9 +384,9 @@ public final void setValue(final GXDLMSSettings settings, final ValueEventArgs e case 2: if (e.getValue() instanceof byte[]) { operator = new String((byte[]) e.getValue()); - } else if (operator instanceof String) { + } else if (e.getValue() instanceof String) { operator = (String) e.getValue(); - } else if (operator == null) { + } else if (e.getValue() == null) { operator = null; } else { e.setError(ErrorCode.READ_WRITE_DENIED); diff --git a/development/src/main/java/gurux/dlms/objects/enums/GsmPacketSwitchStatus.java b/development/src/main/java/gurux/dlms/objects/enums/GsmPacketSwitchStatus.java index 8b68aeb9..81b6db07 100644 --- a/development/src/main/java/gurux/dlms/objects/enums/GsmPacketSwitchStatus.java +++ b/development/src/main/java/gurux/dlms/objects/enums/GsmPacketSwitchStatus.java @@ -38,32 +38,14 @@ * Packet switched status of the modem. */ public enum GsmPacketSwitchStatus { - /** - * Inactive - */ INACTIVE, - /** - * GPRS - */ GPRS, - /** - * EDGE - */ EDGE, - /** - * UMTS - */ UMTS, - /** - * HSDPA - */ HSDPA, - /** - * LTE - */ LTE, - /** - * CDMA - */ - CDMA + CDMA, + LTE_CAT_M1, + LTE_CAT_NB1, + LTE_CAT_NB2 } diff --git a/development/src/main/java/gurux/dlms/secure/GXSecure.java b/development/src/main/java/gurux/dlms/secure/GXSecure.java index a666df6c..ec092fa2 100644 --- a/development/src/main/java/gurux/dlms/secure/GXSecure.java +++ b/development/src/main/java/gurux/dlms/secure/GXSecure.java @@ -815,67 +815,69 @@ static byte[] decryptAesGcm(final GXICipher c, final AesGcmParameter p, final GX if (cmd == Command.GENERAL_CIPHERING) { // KeyInfo OPTIONAL // len = - data.getUInt8(); - // AgreedKey CHOICE tag. - data.getUInt8(); - // key-parameters - // len = - data.getUInt8(); - value = data.getUInt8(); - p.setKeyParameters(value); - if (value == KeyAgreementScheme.ONE_PASS_DIFFIE_HELLMAN.ordinal()) { - p.getSettings().getCipher().setSigning(Signing.ONE_PASS_DIFFIE_HELLMAN); - // key-ciphered-data - len = GXCommon.getObjectCount(data); - GXByteBuffer bb = new GXByteBuffer(); - bb.set(data, len); - if (p.getXml() != null) { - p.setKeyCipheredData(bb.array()); - } - kp = p.getSettings().getCipher().getKeyAgreementKeyPair(); - if (kp == null || kp.getPublic() == null) { - pub = (PublicKey) p.getSettings().getKey(CertificateType.KEY_AGREEMENT, p.getSystemTitle(), - false); - if (pub != null) { - p.getSettings().getCipher().setKeyAgreementKeyPair(new KeyPair(pub, - p.getSettings().getCipher().getKeyAgreementKeyPair().getPrivate())); + short KeyInfoLen = data.getUInt8(); + if (KeyInfoLen != 0) { + // AgreedKey CHOICE tag. + data.getUInt8(); + // key-parameters + // len = + data.getUInt8(); + value = data.getUInt8(); + p.setKeyParameters(value); + if (value == KeyAgreementScheme.ONE_PASS_DIFFIE_HELLMAN.ordinal()) { + p.getSettings().getCipher().setSigning(Signing.ONE_PASS_DIFFIE_HELLMAN); + // key-ciphered-data + len = GXCommon.getObjectCount(data); + GXByteBuffer bb = new GXByteBuffer(); + bb.set(data, len); + if (p.getXml() != null) { + p.setKeyCipheredData(bb.array()); } - } - if (kp.getPrivate() == null) { - key = (PrivateKey) p.getSettings().getKey(CertificateType.KEY_AGREEMENT, p.getSystemTitle(), - true); - if (key != null) { - p.getSettings().getCipher().setKeyAgreementKeyPair(new KeyPair( - p.getSettings().getCipher().getKeyAgreementKeyPair().getPublic(), key)); + kp = p.getSettings().getCipher().getKeyAgreementKeyPair(); + if (kp == null || kp.getPublic() == null) { + pub = (PublicKey) p.getSettings().getKey(CertificateType.KEY_AGREEMENT, p.getSystemTitle(), + false); + if (pub != null) { + p.getSettings().getCipher().setKeyAgreementKeyPair(new KeyPair(pub, + p.getSettings().getCipher().getKeyAgreementKeyPair().getPrivate())); + } + } + if (kp.getPrivate() == null) { + key = (PrivateKey) p.getSettings().getKey(CertificateType.KEY_AGREEMENT, p.getSystemTitle(), + true); + if (key != null) { + p.getSettings().getCipher().setKeyAgreementKeyPair(new KeyPair( + p.getSettings().getCipher().getKeyAgreementKeyPair().getPublic(), key)); + } + } + if (kp.getPublic() != null) { + // Get Ephemeral public key. + int keySize = len / 2; + pub = GXAsn1Converter.getPublicKey(bb.subArray(0, keySize)); + } + } else if (value == KeyAgreementScheme.STATIC_UNIFIED_MODEL.ordinal()) { + p.getSettings().getCipher().setSigning(Signing.STATIC_UNIFIED_MODEL); + len = GXCommon.getObjectCount(data); + if (len != 0) { + throw new IllegalArgumentException("Invalid key parameters"); + } + kp = p.getSettings().getCipher().getKeyAgreementKeyPair(); + if (kp == null || kp.getPublic() == null) { + pub = (PublicKey) p.getSettings().getKey(CertificateType.KEY_AGREEMENT, p.getSystemTitle(), + false); + } else { + pub = p.getSettings().getCipher().getKeyAgreementKeyPair().getPublic(); + } + if (kp.getPrivate() == null) { + key = (PrivateKey) p.getSettings().getKey(CertificateType.KEY_AGREEMENT, + p.getRecipientSystemTitle(), true); + } else { + key = p.getSettings().getCipher().getKeyAgreementKeyPair().getPrivate(); + } + if (kp.getPublic() == null || kp.getPrivate() == null) { + kp = new KeyPair(pub, key); + p.getSettings().getCipher().setKeyAgreementKeyPair(kp); } - } - if (kp.getPublic() != null) { - // Get Ephemeral public key. - int keySize = len / 2; - pub = GXAsn1Converter.getPublicKey(bb.subArray(0, keySize)); - } - } else if (value == KeyAgreementScheme.STATIC_UNIFIED_MODEL.ordinal()) { - p.getSettings().getCipher().setSigning(Signing.STATIC_UNIFIED_MODEL); - len = GXCommon.getObjectCount(data); - if (len != 0) { - throw new IllegalArgumentException("Invalid key parameters"); - } - kp = p.getSettings().getCipher().getKeyAgreementKeyPair(); - if (kp == null || kp.getPublic() == null) { - pub = (PublicKey) p.getSettings().getKey(CertificateType.KEY_AGREEMENT, p.getSystemTitle(), - false); - } else { - pub = p.getSettings().getCipher().getKeyAgreementKeyPair().getPublic(); - } - if (kp.getPrivate() == null) { - key = (PrivateKey) p.getSettings().getKey(CertificateType.KEY_AGREEMENT, - p.getRecipientSystemTitle(), true); - } else { - key = p.getSettings().getCipher().getKeyAgreementKeyPair().getPrivate(); - } - if (kp.getPublic() == null || kp.getPrivate() == null) { - kp = new KeyPair(pub, key); - p.getSettings().getCipher().setKeyAgreementKeyPair(kp); } } } else {