diff --git a/sdk/src/main/java/io/opentdf/platform/sdk/nanotdf/ResourceLocator.java b/sdk/src/main/java/io/opentdf/platform/sdk/nanotdf/ResourceLocator.java index cf50e1fc..ac189859 100644 --- a/sdk/src/main/java/io/opentdf/platform/sdk/nanotdf/ResourceLocator.java +++ b/sdk/src/main/java/io/opentdf/platform/sdk/nanotdf/ResourceLocator.java @@ -79,7 +79,7 @@ public ResourceLocator(ByteBuffer buffer) { // Get the first byte and mask it with 0xF to keep only the first four bits final byte protocolWithIdentifier = buffer.get(); int protocolNibble = protocolWithIdentifier & 0x0F; - int identifierNibble = (protocolWithIdentifier & 0xF0) >> 4; + int identifierNibble = ((protocolWithIdentifier & 0xFF) & 0xF0) >> 4; this.protocol = NanoTDFType.Protocol.values()[protocolNibble]; // body this.bodyLength = buffer.get(); @@ -183,13 +183,21 @@ public int writeIntoBuffer(ByteBuffer buffer) { int totalBytesWritten = 0; // Write the protocol type. - if (identifierType == NanoTDFType.IdentifierType.NONE) { - buffer.put((byte) protocol.ordinal()); - totalBytesWritten += 1; // size of byte - } else { - buffer.put((byte) (identifierType.ordinal() << 4 | protocol.ordinal())); - totalBytesWritten += 1; + switch (identifierType) { + case NONE: + buffer.put((byte) protocol.ordinal()); + break; + case TWO_BYTES: + buffer.put((byte) ((0b0001 << 4) | protocol.ordinal())); + break; + case EIGHT_BYTES: + buffer.put((byte) ((0b0010 << 4) | protocol.ordinal())); + break; + case THIRTY_TWO_BYTES: + buffer.put((byte) ((0b0011 << 4) | protocol.ordinal())); + break; } + totalBytesWritten += 1; // size of byte // Write the url body length buffer.put((byte)bodyLength); @@ -220,6 +228,7 @@ public String getIdentifierString() { actualLength = i + 1; } } - return new String(this.identifier, 0, actualLength); + String identifierPadded = new String(this.identifier, 0, actualLength); + return identifierPadded.trim(); } } \ No newline at end of file diff --git a/sdk/src/test/java/io/opentdf/platform/sdk/nanotdf/ResourceLocatorTest.java b/sdk/src/test/java/io/opentdf/platform/sdk/nanotdf/ResourceLocatorTest.java index ec6a17c8..562a3475 100644 --- a/sdk/src/test/java/io/opentdf/platform/sdk/nanotdf/ResourceLocatorTest.java +++ b/sdk/src/test/java/io/opentdf/platform/sdk/nanotdf/ResourceLocatorTest.java @@ -60,20 +60,22 @@ void writingResourceLocatorIntoBufferWithInsufficientSize() { @ParameterizedTest @MethodSource("provideUrlsAndIdentifiers") - void creatingResourceLocatorWithDifferentIdentifiers(String url, String identifier, int expectedLength) { + void creatingResourceLocatorWithDifferentIdentifiers(String url, String identifier, int expectedLength, byte[] goldenIdentifier) { locator = new ResourceLocator(url, identifier); assertEquals(url, locator.getResourceUrl()); assertEquals(identifier, locator.getIdentifierString()); + assertArrayEquals(goldenIdentifier, locator.getIdentifier()); assertEquals(expectedLength, locator.getIdentifier().length); } private static Stream provideUrlsAndIdentifiers() { return Stream.of( - Arguments.of("http://test.com", "F", 2), - Arguments.of("http://test.com", "e0", 2), - Arguments.of("http://test.com", "e0e0e0e0", 8), - Arguments.of("http://test.com", "e0e0e0e0e0e0e0e0", 32), - Arguments.of("https://test.com", "e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0",32 ) + Arguments.of("http://test.com", "F", 2, new byte[]{70, 0}), + Arguments.of("http://test.com", "e0", 2, new byte[]{101,48}), + Arguments.of("http://test.com", "12345", 8, new byte[]{49,50,51,52,53,0,0,0}), + Arguments.of("http://test.com", "e0e0e0e0", 8, new byte[]{101, 48, 101, 48, 101, 48, 101, 48}), + Arguments.of("http://test.com", "e0e0e0e0e0e0e0e0", 32, new byte[]{101,48,101,48,101,48,101,48,101,48,101,48,101,48,101,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}), + Arguments.of("https://test.com", "e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0",32, new byte[]{101, 48, 101, 48, 101, 48, 101, 48, 101, 48, 101, 48, 101, 48, 101, 48, 101, 48, 101, 48, 101, 48, 101, 48, 101, 48, 101, 48, 101, 48, 101, 48}) ); }