Pack message body (as binary string) into one or more chunks. Size of each chunk will not exceed max_chunk_size. Returns a list of MessageChunks. SequenceNumber is not initialized here, it must be set by Secure Channel driver.
(security_policy, body, max_chunk_size, message_type=ua.MessageType.SecureMessage, channel_id=1, request_id=1, token_id=1)
| 82 | |
| 83 | @staticmethod |
| 84 | def message_to_chunks(security_policy, body, max_chunk_size, message_type=ua.MessageType.SecureMessage, channel_id=1, request_id=1, token_id=1): |
| 85 | """ |
| 86 | Pack message body (as binary string) into one or more chunks. |
| 87 | Size of each chunk will not exceed max_chunk_size. |
| 88 | Returns a list of MessageChunks. SequenceNumber is not initialized here, |
| 89 | it must be set by Secure Channel driver. |
| 90 | """ |
| 91 | if message_type == ua.MessageType.SecureOpen: |
| 92 | # SecureOpen message must be in a single chunk (specs, Part 6, 6.7.2) |
| 93 | chunk = MessageChunk(security_policy.asymmetric_cryptography, body, message_type, ua.ChunkType.Single) |
| 94 | chunk.SecurityHeader.SecurityPolicyURI = security_policy.URI |
| 95 | if security_policy.client_certificate: |
| 96 | chunk.SecurityHeader.SenderCertificate = security_policy.client_certificate |
| 97 | if security_policy.server_certificate: |
| 98 | chunk.SecurityHeader.ReceiverCertificateThumbPrint =\ |
| 99 | hashlib.sha1(security_policy.server_certificate).digest() |
| 100 | chunk.MessageHeader.ChannelId = channel_id |
| 101 | chunk.SequenceHeader.RequestId = request_id |
| 102 | return [chunk] |
| 103 | |
| 104 | crypto = security_policy.symmetric_cryptography |
| 105 | max_size = MessageChunk.max_body_size(crypto, max_chunk_size) |
| 106 | |
| 107 | chunks = [] |
| 108 | for i in range(0, len(body), max_size): |
| 109 | part = body[i:i + max_size] |
| 110 | if i + max_size >= len(body): |
| 111 | chunk_type = ua.ChunkType.Single |
| 112 | else: |
| 113 | chunk_type = ua.ChunkType.Intermediate |
| 114 | chunk = MessageChunk(crypto, part, message_type, chunk_type) |
| 115 | chunk.SecurityHeader.TokenId = token_id |
| 116 | chunk.MessageHeader.ChannelId = channel_id |
| 117 | chunk.SequenceHeader.RequestId = request_id |
| 118 | chunks.append(chunk) |
| 119 | return chunks |
| 120 | |
| 121 | def __str__(self): |
| 122 | return "{0}({1}, {2}, {3}, {4} bytes)".format(self.__class__.__name__, self.MessageHeader, self.SequenceHeader, self.SecurityHeader, len(self.Body)) |