Marcono1234 created HIVE-24952: ---------------------------------- Summary: RcpServer.createSecret() creates malformed hex strings Key: HIVE-24952 URL: https://issues.apache.org/jira/browse/HIVE-24952 Project: Hive Issue Type: Bug Affects Versions: 2.4.0 Reporter: Marcono1234
The method {{org.apache.hive.spark.client.rpc.RcpServer.createSecret()}} creates malformed hex strings: {code} public String createSecret() { byte[] secret = new byte[config.getSecretBits() / 8]; RND.nextBytes(secret); StringBuilder sb = new StringBuilder(); for (byte b : secret) { if (b < 10) { sb.append("0"); } sb.append(Integer.toHexString(b)); } return sb.toString(); } {code} There are three flaws with this: - It uses the signed byte value, so for {{(byte) 0xFF}}, {{Integer.toHexString(...)}} will be {{ffffffff}}. - The {{b < 10}} check is incorrect; I assume it should cover the case the {{toHexString}} only has one hex char as result, however that happens for {{b < 16}}. - The check {{b < }} compares the signed value, so every value < 0 will also erroneously get a leading {{0}}. For example, if {{secret}} was randomly generated as {{\{10, -1\}}}, then the result would be: - Expected: 0aff - Actual: a0ffffffff The correct implementation would be: {code} public String createSecret() { byte[] secret = new byte[config.getSecretBits() / 8]; RND.nextBytes(secret); StringBuilder sb = new StringBuilder(); for (byte b : secret) { int unsignedB = b & 0xFF; if (unsignedB < 16) { sb.append('0'); } sb.append(Integer.toHexString(unsignedB)); } return sb.toString(); } {code} If this behavior is intended (e.g. because a different project relies on this broken hex string format), then it would at least be good to add a comment explaining this. -- This message was sent by Atlassian Jira (v8.3.4#803005)