Looking at the method globalKeyTransfer in python I find a problem that does not exist in the C++ and Java implementation.
The list_ parameter is supposed to be a list but then a getKey method is called. In order to do that, the list must be composed of Object with that getKey method.
If that's done, then GXDLMSSecureClient.encrypt(kek, it) will fail because it will be an object and then setOctetString will fail.
What I suppose will be a better implementation is something more like the C++ implementation and use a list of arrays or tuples.
If list_ is defined like this:
list_ = [ [0, GXByteBuffer.hexToBytes("AAAAAA...")] , [1, GXByteBuffer.hexToBytes("AAAAAA...")] ]
Then, the method can be called like this:
def globalKeyTransfer(self, client, kek, list_):
# pylint: disable=import-outside-toplevel
from ..secure.GXDLMSSecureClient import GXDLMSSecureClient
if not list_:
raise ValueError("Invalid list. It is empty.")
bb = GXByteBuffer()
bb.setUInt8(DataType.ARRAY)
bb.setUInt8(int(len(list_)))
for it in list_:
bb.setUInt8(DataType.STRUCTURE)
bb.setUInt8(2)
_GXCommon.setData(None, bb, DataType.ENUM, it[0])
tmp = GXDLMSSecureClient.encrypt(kek, it[1])
_GXCommon.setData(None, bb, DataType.OCTET_STRING, tmp)
return client.method(self, 2, bb.array(), DataType.ARRAY)
Hi,
Hi,
You are right. I'll add this to the worklist and the new version is released today.
BR,
Mikko
Hi,
Hi,
This is changed to the latest version.
BR,
Mikko
Thanks! That worked
Thanks! That worked flawlessly