1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.db.protocol.opengauss.packet.authentication;
19
20 import org.apache.shardingsphere.db.protocol.opengauss.constant.OpenGaussProtocolVersion;
21 import org.apache.shardingsphere.db.protocol.postgresql.packet.identifier.PostgreSQLIdentifierPacket;
22 import org.apache.shardingsphere.db.protocol.postgresql.packet.identifier.PostgreSQLIdentifierTag;
23 import org.apache.shardingsphere.db.protocol.postgresql.packet.identifier.PostgreSQLMessagePacketType;
24 import org.apache.shardingsphere.db.protocol.postgresql.payload.PostgreSQLPacketPayload;
25
26
27
28
29 public final class OpenGaussAuthenticationSCRAMSha256Packet extends PostgreSQLIdentifierPacket {
30
31 private static final int AUTH_REQ_SHA256 = 10;
32
33 private static final int PASSWORD_STORED_METHOD_SHA256 = 2;
34
35 private final int version;
36
37 private final int serverIteration;
38
39 private final OpenGaussAuthenticationHexData authHexData;
40
41 private final String serverSignature;
42
43 public OpenGaussAuthenticationSCRAMSha256Packet(final int version, final int serverIteration, final OpenGaussAuthenticationHexData authHexData, final String password) {
44 this.version = version;
45 this.serverIteration = serverIteration;
46 this.authHexData = authHexData;
47 serverSignature = version >= OpenGaussProtocolVersion.PROTOCOL_350.getVersion() ? "" : OpenGaussMacCalculator.requestServerMac(password, authHexData, serverIteration);
48 }
49
50 @Override
51 protected void write(final PostgreSQLPacketPayload payload) {
52 payload.writeInt4(AUTH_REQ_SHA256);
53 payload.writeInt4(PASSWORD_STORED_METHOD_SHA256);
54 payload.writeBytes(authHexData.getSalt().getBytes());
55 payload.writeBytes(authHexData.getNonce().getBytes());
56 if (version < OpenGaussProtocolVersion.PROTOCOL_350.getVersion()) {
57 payload.writeBytes(serverSignature.getBytes());
58 }
59 if (OpenGaussProtocolVersion.PROTOCOL_351.getVersion() == version) {
60 payload.writeInt4(serverIteration);
61 }
62 }
63
64 @Override
65 public PostgreSQLIdentifierTag getIdentifier() {
66 return PostgreSQLMessagePacketType.AUTHENTICATION_REQUEST;
67 }
68 }