com.ibm.as400.access.DDMTerm Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jt400 Show documentation
Show all versions of jt400 Show documentation
The Open Source version of the IBM Toolbox for Java
The newest version!
///////////////////////////////////////////////////////////////////////////////
//
// JTOpen (IBM Toolbox for Java - OSS version)
//
// Filename: DDMTerm.java
//
// The source code contained herein is licensed under the IBM Public License
// Version 1.0, which has been approved by the Open Source Initiative.
// Copyright (C) 1997-2003 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
package com.ibm.as400.access;
import java.math.BigInteger;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.KeyAgreement;
import javax.crypto.spec.DHParameterSpec;
import javax.crypto.spec.DHPublicKeySpec;
/**
*DDM terms. This class consists of defined constants for the DDM term code points.
**/
class DDMTerm
{
//@B1D static final int ACCORD = 0x1162; // Access order for ULDRECF
static final int ACCSEC = 0x106D; // Access method for exchange attributes - added by DDM server
static final int ACCRDBRM = 0x2201; // Access to RDB completed
static final int ACCSECRD = 0x14AC; // Access method reply from ACCSEC
static final int AGENT = 0x1403; // Agent resource manager
static final int AGNPRMRM = 0x1232; // Permanent agent error
static final int ALTINDF = 0x1423; // Alternate index file
static final int BYTDR = 0x0043; // Byte character
static final int BYTSTRDR = 0x0044; // Byte string
static final int CHRSTRDR = 0x0009; // Character string
static final int CMBACCAM = 0x1405; // Combined access access method
static final int CMBKEYAM = 0x1406; // Combined keyed access method
static final int CMBRNBAM = 0x1407; // Combined record number access method
static final int CMDATHRM = 0x121C; // Not authorized to command
static final int CMDCHKRM = 0x1254; // Command check
static final int CMDCMPRM = 0x124B; // Command processing complete reply
static final int CMDNSPRM = 0x1250; // Command not supported
static final int CMMCTLTYP = 0x11BA; // Commitment control type
static final int CMMUOW = 0x105A; // Commit
static final int CMNAPPC = 0x1444; // APPC communications manager - Used for pre-V4R2 connections
static final int CMNTCPIP = 0x1474; // TCP/IP communications manager - added by DDM server
static final int CODPNTDR = 0x0064; // Code point data - byte[2]
static final int DCLFIL = 0x102C; // Declare the file name
static final int DCLNAM = 0x1136; // Declared file name
static final int DCLNAMRM = 0x1256; // Invalid declared name
static final int DICTIONARY = 0x1458; // Dictionary manager
static final int DIRECTORY = 0x1457; // Directory file
static final int DIRFIL = 0x140C; // Direct file
static final int DRCAM = 0x1419; // Directory access method
static final int DRCNAM = 0x1165; // Library name
static final int DUPDCLRM = 0x1255; // Duplicate declared file name reply
static final int ENDUOWRM = 0x220C; // End unit of work reply message
static final int FILISOLVL = 0x1472; // Commitment control lock level
static final int FILNAM = 0x110E; // File name
static final int EXCSAT = 0x1041; // Exchange server attributes
static final int EXCSATRD = 0x1443; // Exchange server attributes reply
static final int EXTNAM = 0x115E; // External name
static final int KEYFIL = 0x141E; // Keyed file
static final int KEYORD = 0x145D; // Key order
static final int LCKMGR = 0x1422; // Lock manager
static final int LUWHLDCSR = 0x11B5; // Hold cursor parameter
static final int MGRDEPRM = 0x1218; // Manager dependency error
static final int MGRLVLLS = 0x1404; // Manager level list
static final int NAMDR = 0x0066; // Name string
static final int NAMSYMDR = 0x0061; // Name string with only A-Z, 0-9 and '_'
static final int PASSWORD = 0x11A1; // Password for connecting
static final int PRCCNVRM = 0x1245; // Conversational protocol error
static final int PRMNSPRM = 0x1251; // Parameter not supported
static final int RDB = 0x240F; // Relational database
static final int SXXFACTOR = 0xD142; // Additional authentication factor
static final int SXXVERID = 0xD143; // MFA - Verification ID
static final int SXXCLTIP = 0xD144; // MFA - Client IP address
static final int RDBACCRM = 0x2207; // RDB currently accessed
static final int RDBAFLRM = 0x221A; // RDB access failed reply message
static final int RDBATHRM = 0x2203; // Not authorized to RDB
static final int RDBNAM = 0x2110; // Relational database name
static final int RDBNFNRM = 0x2211; // RDB not found
//@B1D static final int RECCNT = 0x111A; // Record count returned from ULDRECF
static final int RECAL = 0x1430; // Record attribute list
//@B1D static final int RECORD = 0x144A; // Record object returned from ULDRECF
static final int RELKEYAM = 0x1432; // Relative by key access method
static final int RELRNBAM = 0x1433; // Relative by record number access method
static final int RLLBCKUOW = 0x105B; // Rollback
static final int RLSFILLK = 0x1143; // Release file lock
static final int RNBORD = 0x145E; // Record number order
static final int RNDKEYAM = 0x1434; // Random by key access method
static final int RNDRNBAM = 0x1435; // Random by record number access method
static final int RQSFILLK = 0x1145; // Request file lock
static final int RSCLMTRM = 0x1233; // Resource limits reached
static final int RSCRCVM = 0x14A0; // @E0M
static final int RTNINA = 0x1155; // Return inactive records
static final int SECCHK = 0x106E; // Security check - added by DDM server
static final int SECCHKCD = 0x11A4; // Security check code - added by DDM server @B0A
static final int SECCHKRD = 0x1219; // Security check reply- added by DDM server
static final int SECMEC = 0x11A2; // Security mechanism - added by DDM server
static final int SECMGR = 0x1440; // Security manager
static final int SECTKN = 0x11DC; // Security token @B0A
static final int SEQFIL = 0x143B; // Sequential file
static final int SQLAM = 0x2407; // SQL Application manager
static final int SRVCLSNM = 0x1147; // Server class name
static final int SRVDGN = 0x1153; // Server diagnostic information
static final int STRAM = 0x1463; // Stream access method
static final int STRFIL = 0x1465; // Stream file
static final int STRCMMCTL = 0x105C; // Start commitment control
static final int SUPERVISOR = 0x143C; // Supervisor
static final int SVRCOD = 0x1149; // Severity code
static final int SYNTAXRM = 0x124C; // Data stream syntax error
static final int SYSCMDMGR = 0x147F; // System command manager
static final int S38ALCOB = 0xD002; // Allocate object (lock object)
static final int S38BUF = 0xD405; // Input/Output buffer
static final int S38CLOSE = 0xD004; // Close file
static final int S38CLOST = 0xD121; // Close type
static final int S38CMD = 0xD006; // Submit remote command
static final int S38CMDST = 0xD103; // Command string
static final int S38CTLL = 0xD105; // Control list
static final int S38DEL = 0xD007; // Delete record
static final int S38DLCOB = 0xD008; // Deallocate object (release explicit locks)
static final int S38FEOD = 0xD00B; // Force end of data
static final int S38GET = 0xD00C; // Get record
static final int S38GETD = 0xD00D; // Get record at file position
static final int S38GETK = 0xD00E; // Get record by key
static final int S38GETM = 0xD00F; // Get multiple records
static final int S38IOFB = 0xD402; // Input/output feedback
static final int S38LCNRD = 0xD406; // Number of files unlocked count reply object
static final int S38LRLS = 0xD115; // Lock release structure
static final int S38LRQS = 0xD10B; // Lock request structure
static final int S38LWAIT = 0xD10C; // Lock wait time
static final int S38MDATA = 0xD10E; // Message replacement data
static final int S38MFILE = 0xD111; // Message file
static final int S38MID = 0xD112; // Message id
static final int S38MTEXT = 0xD116; // Message text
static final int S38MTYPE = 0xD117; // Message type
static final int S38MSGRM = 0xD201; // AS400 error message reply
static final int S38OPEN = 0xD011; // Open file
static final int S38OPNFB = 0xD404; // File open feed back area
static final int S38OPTL = 0xD119; // Option list
static final int S38PUT = 0xD012; // Put record
static final int S38PUTM = 0xD013; // Put multiple record
static final int S38UFCB = 0xD11F; // User file control block structure
static final int S38UPDAT = 0xD019; // Update record
static final int SXXASPRQ = 0xD02A; // Set ASP group
static final int SXXPUTDR = 0xD01C; // Insert record at file position
static final int TRGNSPRM = 0x125F; // Target not supported
//@B1D static final int ULDRECF = 0x1040; // Unload records from file
static final int UOWDSP = 0x2115; // Unit of work disposition
static final int USRID = 0x11A0; // Userid for connecting
static final int VALNSPRM = 0x1252; // Parameter value not supported
static final int ENCALC = 0x1909; // Encryption algorithm
static final int AES = 2; // AES encryption
// Security mechanisms
static final int EUSRIDPWD = 9; // Encode userid and password
static final int USRSBSPWD = 6; // User ID with Substitute Password
static final int KERBEROS = 11; // kerberos
static final int EUSRIDONL = 16; // encoded user ID only (profile token)
// Error codes from SECCHK
static final int SECMECHVALUE_NOT_SUPPORTED = 1;
static final int DCEINFORMATIONAL_STATUS_ISSUED = 0x02;
static final int DCERETRYABLE_ERROR = 0x03;
static final int DCENON_RETRYABLE_ERROR = 0x04;
static final int GSSAPI_INFORMATIONAL_STATUS_ISSUED = 0x05;
static final int GSSAPI_RETRYABLE_ERROR = 0x06;
static final int GSSAPI_NON_RETRYABLE_ERROR = 0x07;
static final int LOCALSECURITY_SERVICE_INFORMATIONAL_STATUS_ISSUED = 0x08;
static final int LOCALSECURITY_SERVICE_RETRYABLE_ERROR= 0x09;
static final int LOCALSECURITY_SERVICE_NON_RETRYABLE_ERROR = 0x0A;
static final int SECTKN_MISSING_WHEN_IT_IS_REQUIRED_OR_IT_IS_INVALID = 0x0B;
static final int PASSWORD_EXPIRED = 0x0E;
static final int PASSWORD_INVALID = 0x0F;
static final int PASSWORD_MISSING = 0x10;
static final int USERID_MISSING = 0x12;
static final int USERID_INVALID = 0x13;
static final int USERID_REVOKED = 0x14;
static final int NEWPASSWORD_INVALID = 0x15;
static final int AUTHENTICATION_FAILED_BECAUSE_OF_CONNECTIVITY_RESTRICTIONS_ENFORCED_BY_THE_SECURITY_PLUG_IN = 0x16;
static final int INVALID_GSS_API_SERVER_CREDENTIAL = 0x17;
static final int GSS_API_SERVER_CREDENTIAL_EXPIRED_ON_THE_DATABASE_SERVER = 0x18;
static final int CONTINUE__REQUIRE_MORE_SECURITY_CONTEXT_INFORMATION_FOR_AUTHENTICATION = 0x19;
static final int SWITCHUSER_IS_INVALID = 0x1a;
static final int THEENCALG_VALUE_IS_NOT_SUPPORTED_BY_THE_SERVER = 0x1b;
// prime for DES's Diffie-Hellman
// Note, the first 0x00 is need so when this is used with the
// BigInteger constructor, it does not appear as a negative number
static final byte DESprime[] = {
(byte) 0x00,
(byte) 0xc6, (byte) 0x21, (byte) 0x12, (byte) 0xd7,
(byte) 0x3e, (byte) 0xe6, (byte) 0x13, (byte) 0xf0,
(byte) 0x94, (byte) 0x7a, (byte) 0xb3, (byte) 0x1f,
(byte) 0x0f, (byte) 0x68, (byte) 0x46, (byte) 0xa1,
(byte) 0xbf, (byte) 0xf5, (byte) 0xb3, (byte) 0xa4,
(byte) 0xca, (byte) 0x0d, (byte) 0x60, (byte) 0xbc,
(byte) 0x1e, (byte) 0x4c, (byte) 0x7a, (byte) 0x0d,
(byte) 0x8c, (byte) 0x16, (byte) 0xb3, (byte) 0xe3
};
static final byte DESgenerator[] = {
(byte) 0x46, (byte) 0x90, (byte) 0xfa, (byte) 0x1f,
(byte) 0x7b, (byte) 0x9e, (byte) 0x1d, (byte) 0x44,
(byte) 0x42, (byte) 0xc8, (byte) 0x6c, (byte) 0x91,
(byte) 0x14, (byte) 0x60, (byte) 0x3f, (byte) 0xde,
(byte) 0xcf, (byte) 0x07, (byte) 0x1e, (byte) 0xdc,
(byte) 0xec, (byte) 0x5f, (byte) 0x62, (byte) 0x6e,
(byte) 0x21, (byte) 0xe2, (byte) 0x56, (byte) 0xae,
(byte) 0xd9, (byte) 0xea, (byte) 0x34, (byte) 0xe4
};
// Prime for AES's Diffie-Hellman
// Note: Both begin with 0x00 to allow it to be used
// with the BigInteger constructor
static final byte AESprime[] = {
0x00,
(byte)0xF2, (byte)0x4F, (byte)0x63, (byte)0x15, (byte)0x0E, (byte)0xAA, (byte)0x97, (byte)0xCC,
(byte)0xE7, (byte)0x8F, (byte)0x57, (byte)0x10, (byte)0xC4, (byte)0x5F, (byte)0xAF, (byte)0xBE,
(byte)0xB7, (byte)0x1C, (byte)0xF6, (byte)0xA8, (byte)0x72, (byte)0x4F, (byte)0x63, (byte)0x14,
(byte)0x0E, (byte)0xAA, (byte)0x97, (byte)0xCC, (byte)0xE7, (byte)0x8F, (byte)0x57, (byte)0x10,
(byte)0xC4, (byte)0x5F, (byte)0xAF, (byte)0xBE, (byte)0xB7, (byte)0x1C, (byte)0xF6, (byte)0xA8,
(byte)0x72, (byte)0x4F, (byte)0x63, (byte)0x13, (byte)0x08, (byte)0xE3, (byte)0x2B, (byte)0x26,
(byte)0xEA, (byte)0x15, (byte)0x94, (byte)0x88, (byte)0x9C, (byte)0xBB, (byte)0xFC, (byte)0x91,
(byte)0xF6, (byte)0xDF, (byte)0x75, (byte)0x24, (byte)0x35, (byte)0x2E, (byte)0xF9, (byte)0x79
};
static final byte AESgenerator[] = {
0x00,
(byte)0xE8, (byte)0xCE, (byte)0x9E, (byte)0x08, (byte)0x44, (byte)0xC6, (byte)0x7A, (byte)0x00,
(byte)0x9F, (byte)0xB7, (byte)0x84, (byte)0x3C, (byte)0xD9, (byte)0x45, (byte)0xA0, (byte)0x58,
(byte)0x93, (byte)0x5D, (byte)0xA5, (byte)0x1B, (byte)0x02, (byte)0x8A, (byte)0x49, (byte)0xE5,
(byte)0xA9, (byte)0x1F, (byte)0x83, (byte)0x1B, (byte)0x78, (byte)0x36, (byte)0x44, (byte)0x91,
(byte)0xCD, (byte)0x0E, (byte)0x0A, (byte)0x8F, (byte)0x72, (byte)0x34, (byte)0x5D, (byte)0xF8,
(byte)0x07, (byte)0x69, (byte)0x54, (byte)0x99, (byte)0x26, (byte)0xFD, (byte)0x16, (byte)0xEC,
(byte)0xD6, (byte)0xF6, (byte)0x85, (byte)0x94, (byte)0x81, (byte)0x64, (byte)0x7C, (byte)0xA9,
(byte)0xEF, (byte)0xB2, (byte)0xBA, (byte)0xAC, (byte)0x7B, (byte)0xC0, (byte)0x9A, (byte)0x92
};
static KeyPairGenerator desKeyPairGenerator = null;
// get the DESKeyPair from the shared prime and generator @U4A
static KeyPair getDESKeyPair() throws NoSuchAlgorithmException, InvalidAlgorithmParameterException
{
if (desKeyPairGenerator == null)
{
try {
desKeyPairGenerator = KeyPairGenerator.getInstance("DiffieHellman");
}
catch (NoSuchAlgorithmException e) {
throw e;
}
BigInteger p = new BigInteger(DDMTerm.DESprime);
BigInteger g = new BigInteger(DDMTerm.DESgenerator);
DHParameterSpec dhParameterSpec = new DHParameterSpec(p, g, 256);
try {
desKeyPairGenerator.initialize(dhParameterSpec);
}
catch (InvalidAlgorithmParameterException e) {
desKeyPairGenerator = null;
throw e;
}
}
return desKeyPairGenerator.genKeyPair();
}
/* Return the shared key. If the public key is 32 bytes long then the algorithm is DES */
/* @U4A*/
static byte[] getSharedKey(KeyPair keyPair, byte[] publicKey) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException
{
Trace.log(Trace.DIAGNOSTIC, "getSharedKey: serverPublicKey:", publicKey);
boolean isDes = (publicKey.length == 32);
KeyAgreement keyAgreement = null;
keyAgreement = KeyAgreement.getInstance("DiffieHellman");
keyAgreement.init(keyPair.getPrivate());
KeyFactory keyFactory = null;
keyFactory = KeyFactory.getInstance("DiffieHellman");
BigInteger publicKeyBigInt;
// If the number is negative, we must make it positive
if ((publicKey[0] & 0x80) == 0x80 )
{
byte[] newPublicKey = new byte[publicKey.length+1];
newPublicKey[0] = 0;
System.arraycopy(publicKey, 0, newPublicKey, 1, publicKey.length);
publicKey = newPublicKey;
}
publicKeyBigInt = new BigInteger(1, publicKey);
BigInteger p;
BigInteger g;
if (isDes)
{
p = new BigInteger(DDMTerm.DESprime);
g = new BigInteger(DDMTerm.DESgenerator);
}
else
{
p = new BigInteger(DDMTerm.AESprime);
g = new BigInteger(DDMTerm.AESgenerator);
}
/*
DHPrivateKey privateKey = (DHPrivateKey) keyPair.getPrivate();
Trace.log(Trace.DIAGNOSTIC, "getSharedKey: clientPrivateKeyBigInt:", privateKey.getX().toString());
Trace.log(Trace.DIAGNOSTIC, "getSharedKey: serverPublicKeyBigInt: ", publicKeyBigInt.toString());
Trace.log(Trace.DIAGNOSTIC, "getSharedKey: p: ", p.toString());
Trace.log(Trace.DIAGNOSTIC, "getSharedKey: g: ", g.toString());
Trace.log(Trace.DIAGNOSTIC, "getSharedKey: clientPrivateKeyBigInt:", privateKey.getX().toByteArray());
Trace.log(Trace.DIAGNOSTIC, "getSharedKey: serverPublicKeyBigInt: ", publicKeyBigInt.toByteArray());
Trace.log(Trace.DIAGNOSTIC, "getSharedKey: p: ", p.toByteArray());
Trace.log(Trace.DIAGNOSTIC, "getSharedKey: g: ", g.toByteArray());
*/
PublicKey publicKeyObject = null ;
publicKeyObject = keyFactory.generatePublic(new DHPublicKeySpec(publicKeyBigInt, p, g));
keyAgreement.doPhase(publicKeyObject, true);
byte[] sharedKey = keyAgreement.generateSecret();
Trace.log(Trace.DIAGNOSTIC, "getSharedKey: sharedKey:", sharedKey);
return sharedKey;
}
static KeyPairGenerator aesKeyPairGenerator = null;
/* Get the AES key pair for the DDM prime and generator @U4A */
static KeyPair getAESKeyPair() throws InvalidAlgorithmParameterException, NoSuchAlgorithmException
{
if (aesKeyPairGenerator == null)
{
aesKeyPairGenerator = KeyPairGenerator.getInstance("DiffieHellman");
BigInteger p = new BigInteger(DDMTerm.AESprime);
BigInteger g = new BigInteger(DDMTerm.AESgenerator);
DHParameterSpec dhParameterSpec = new DHParameterSpec(p, g, 512);
try {
aesKeyPairGenerator.initialize(dhParameterSpec);
}
catch (InvalidAlgorithmParameterException e) {
aesKeyPairGenerator = null;
throw e;
}
}
return aesKeyPairGenerator.genKeyPair();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy