snmpUSMRemoteConfigure.java
上传用户:aonuowh
上传日期:2021-05-23
资源大小:35390k
文件大小:36k
源码类别:

SNMP编程

开发平台:

C/C++

  1. /* $Id: snmpUSMRemoteConfigure.src,v 1.4.2.6 2009/01/28 13:25:08 tmanoj Exp $ */
  2. /*
  3.  * @(#)snmpUSMRemoteConfigure.java
  4.  * Copyright (c) 1996-2009 AdventNet, Inc. All Rights Reserved.
  5.  * Please read the associated COPYRIGHTS file for more details.
  6.  */
  7. /**
  8.  * This is an example program to explain how remotely configure users
  9.  * on the agent. The procedure followed is a five step procedure.
  10.  * Step 1. GET(usmUserSpinLock.0) Value 
  11.  * Step 2. SET(usmUserSpinLock.0=spinlockValue
  12.  *              usmUserCloneFrom=templateUser,
  13.  *              usmUserStatus=createAndWait)
  14.  * Strp 3. GET(usmUserSpinLock.0) value
  15.  *              SET(usmUserSpinLock.0=spinLockValue,
  16.  *              usmUserKeyChange=keyChangeValue
  17.  *              usmUserPublic=randomValue)
  18.  * Strp 4. GET(usmUserPulic) and check it has randomValue
  19.  * Step 5. Activate the new user by setting the usmUserStatus=active
  20.  *
  21.  * The application sends request with version v3. 
  22.  * The user could run this application by giving any of the following usage.
  23.  *  
  24.  * java snmpUSMRemoteConfigure [options] userName newUserName hostname 
  25.  *
  26.  * iava snmpUSMRemoteConfigure [-d] [-p port] [-r retries] [-t timeout] [-a auth_protocol] [-w auth_password] [-s priv_password] [-pp priv_protocol] [-n contextName] [-i contextID] [-y new_auth_password] [-z new_priv_password] userName newUserName host
  27.  *
  28.  * e.g.
  29.  * java snmpUSMRemoteConfigure -a MD5 -w initial2Pass -y initial2NewPass initial2 newInitial 10.3.2.120
  30.  * Where, initial2 user already configured on the agent whose authProtocol is
  31.  * MD5 and authPassword is initial2Pass. newInitial is the name of the new
  32.  * user who will be configured with authProtocol=MD5 and 
  33.  * authPassword=initial2NewPass.
  34.  * Here the clone-from user is initial2, the user on whose behalf all the
  35.  * requests will be sent.
  36.  * 
  37.  * Options:
  38.  * [-d]                   - Debug output. By default off.
  39.  * [-p] <port>            - remote port no. By default 161.
  40.  * [-t] <Timeout>         - Timeout. By default 5000ms.
  41.  * [-r] <Retries>         - Retries. By default 0.      
  42.  * [-a] <autProtocol>     - The authProtocol(MD5/SHA) of the template user. Mandatory if authPassword is specified
  43.  * [-w] <authPassword>    - The authentication password of the template user.
  44.  * [-s] <privPassword>    - The privacy protocol password of the template user. Must be accompanied with auth password and authProtocol fields.
  45.  * [-n] <contextName>     - The contextName to be used for the v3 pdu.
  46.  * [-i] <contextID>       - The contextID to be used for the v3 pdu.
  47.  * [-w] <newAuthPassword> - The authentication password for the new user.
  48.  * [-s] <newPrivPassword> - The privacy protocol password of the new user. Must be accompanied with auth password and authProtocol fields.
  49.  * username Mandatory     - The user who is already configured on the agent.
  50.  *                          (template user)
  51.  * newusername Mandatory  - The user name of the new user who will be 
  52.                             Remotely configured on the agent.
  53.  * host Mandatory         - The RemoteHost (agent).Format (string without double qoutes/IpAddress).
  54.  */
  55. import java.lang.*;
  56. import java.util.*;
  57. import java.net.*;
  58. import com.adventnet.snmp.snmp2.*;
  59. import com.adventnet.snmp.snmp2.usm.*;
  60. import com.adventnet.utils.*;
  61. public class snmpUSMRemoteConfigure {
  62.     private static final int USM_SECURITY_MODEL = 3;
  63.     private static final String ENC = "ISO8859_1";
  64.     private static final int DEBUG = 0;
  65.     private static final int PORT = 1;
  66.     private static final int RETRIES = 2;
  67.     private static final int TIMEOUT = 3;
  68.     private static final int AUTH_PROTOCOL = 4;
  69.     private static final int AUTH_PASSWORD = 5;
  70.     private static final int PRIV_PASSWORD = 6;
  71.     private static final int CONTEXT_NAME = 7;
  72.     private static final int CONTEXT_ID = 8;
  73.     private static final int NEW_AUTH_PASSWORD = 9;
  74.     private static final int NEW_PRIV_PASSWORD = 10;
  75.     private static final int PRIV_PROTOCOL = 11;
  76.     private static final String SPIN_LOCK_OID = ".1.3.6.1.6.3.15.1.2.1.0";
  77.     private static final String USM_TABLE = ".1.3.6.1.6.3.15.1.2.2";
  78.     private static final String USM_ENTRY = ".1.3.6.1.6.3.15.1.2.2.1";
  79.     private static final String CLONE_COL = "4";
  80.     private static final String KEY_CHANGE_COL = "6";
  81.     private static final String PRIV_KEY_CHANGE_COL = "9";
  82.     private static final String USM_PUBLIC_COL = "11";
  83.     private static final String ROW_STATUS_COL = "13";
  84.     private static final int AUTH_MD5_LEN = 16;
  85.     private static final int AUTH_SHA_LEN = 20;
  86.     boolean debug = false;
  87.     public static void main(String args[]) {
  88.         
  89.         snmpUSMRemoteConfigure surg = new snmpUSMRemoteConfigure();
  90.         
  91.         // Take care of getting options
  92.         String usage =
  93.         "snmpUSMRemoteConfigure [-d] [-p port] [-r retries] n" +
  94.         "[-t timeout] [-a auth_protocol] [-w auth_password] n" +
  95.         "[-s priv_password][-pp priv_protocol(DES/AES-128/AES-192/AES-256/3DES)] [-n contextName] [-i contextID] n" +
  96.         "[-y new_auth_password] [-z new_priv_password] n" +
  97.         "userName newUserName host ";
  98.         String options[] =
  99.         {
  100.             "-d", "-p", "-r", "-t", "-a",
  101.             "-w", "-s", "-n", "-i", "-y",
  102.             "-z","-pp"
  103.         };
  104.         String values[] =
  105.         {
  106.             "None", null, null, null, null,
  107.             null, null, null, null, null,
  108.             null,null
  109.         };
  110.         String userName = new String("");
  111.         int authProtocol = USMUserEntry.NO_AUTH;
  112.         int privProtocol = USMUserEntry.NO_PRIV;
  113.         String authPassword = new String ("");
  114.         String privPassword = new String ("");
  115.         String contextName = new String ("");
  116.         String contextID = new String ("");
  117.         String newUser = new String("");
  118.         //int newAuthProtocol = USMUserEntry.NO_AUTH;
  119.         String newAuthPassword = new String ("");
  120.         String newPrivPassword = new String ("");
  121.          ParseOptions opt = new ParseOptions(args,options,values, usage);
  122.         if (opt.remArgs.length<3) opt.usage_error();
  123.         // Start SNMP API
  124.         SnmpAPI api;
  125.         api = new SnmpAPI();
  126.         if (values[DEBUG].equals("Set")){
  127.             api.setDebug( true );
  128.             surg.debug = true;
  129.         }
  130.     
  131.         userName = opt.remArgs[0];
  132.         newUser = opt.remArgs[1];
  133.         // Open session
  134.         SnmpSession session = new SnmpSession(api);        
  135.         
  136.         // set remote Host 
  137.         UDPProtocolOptions ses_opt = new UDPProtocolOptions(opt.remArgs[2]);
  138.         // Set the values accepted from the command line
  139.         //boolean usage_error = false;
  140.     
  141.         //set remote Port, timeout,retries if needed.
  142.         try {
  143.             if (values[PORT] != null)
  144.                 ses_opt.setRemotePort( Integer.parseInt(values[PORT]) );
  145.             if (values[RETRIES] != null)
  146.                 session.setRetries( Integer.parseInt(values[RETRIES]) );
  147.             if (values[TIMEOUT] != null)
  148.                 session.setTimeout( Integer.parseInt(values[TIMEOUT]) );
  149.         }
  150.         catch (NumberFormatException ex) {
  151.             System.err.println("Invalid Integer Arg");
  152.         }
  153.         session.setProtocolOptions(ses_opt);
  154.         session.setVersion( SnmpAPI.SNMP_VERSION_3 );
  155.         if ((values[AUTH_PROTOCOL] != null) 
  156.                 && (values[AUTH_PASSWORD] != null) 
  157.                 && (values[NEW_AUTH_PASSWORD] != null)) {
  158.             if(values[AUTH_PROTOCOL].equals("SHA"))
  159.                 authProtocol = USMUserEntry.SHA_AUTH;
  160.             else 
  161.                 authProtocol = USMUserEntry.MD5_AUTH;                   
  162.             if(authProtocol==USMUserEntry.NO_AUTH){
  163.                 System.err.println("Enter authentication protocol");
  164.                 opt.usage_error();
  165.             }
  166.             authPassword = values[AUTH_PASSWORD];
  167.             newAuthPassword = values[NEW_AUTH_PASSWORD];
  168.              
  169.              privProtocol= USMUserEntry.CBC_DES;
  170.              if( values[PRIV_PROTOCOL] != null)
  171.     {
  172.     if(values[PRIV_PROTOCOL].equals("DES"))
  173.     {
  174.     privProtocol= USMUserEntry.CBC_DES;
  175.     }
  176.     else if(values[PRIV_PROTOCOL].equals("AES-128"))
  177.     {
  178.     privProtocol= USMUserEntry.CFB_AES_128;
  179.     }
  180.     else if(values[PRIV_PROTOCOL].equals("AES-192"))
  181.     {
  182.     privProtocol= USMUserEntry.CFB_AES_192;
  183.     }
  184.      else if(values[PRIV_PROTOCOL].equals("AES-256"))
  185.     {
  186.     privProtocol= USMUserEntry.CFB_AES_256;
  187.     }
  188.     else if(values[PRIV_PROTOCOL].equals("3DES"))
  189.     {
  190.     privProtocol= USMUserEntry.CBC_3DES;
  191.     }
  192.     else
  193.     {
  194.     System.out.println("Invalid privProtocol is given ");
  195.     System.exit(1);
  196.     }
  197.     }
  198.             if (values[PRIV_PASSWORD] != null) {
  199.                 if (values[NEW_PRIV_PASSWORD] != null) { 
  200.                     privPassword = values[PRIV_PASSWORD];
  201.                     newPrivPassword = values[NEW_PRIV_PASSWORD];
  202.                 }
  203.                 else
  204.                     opt.usage_error();
  205.             }
  206.         }
  207.         else if ((values[AUTH_PROTOCOL] != null) 
  208.                 || (values[AUTH_PASSWORD] != null) 
  209.                 || (values[PRIV_PASSWORD] != null)) {
  210.             opt.usage_error();
  211.         }
  212.         if (values[CONTEXT_NAME] != null)
  213.             contextName = values[CONTEXT_NAME];
  214.         if (values[CONTEXT_ID] != null)
  215.             contextID = values[CONTEXT_ID];
  216.         // Build Get request PDU
  217.         SnmpPDU pdu = new SnmpPDU();
  218.         try {
  219.             //Open session
  220.             session.open();
  221.         } catch (SnmpException e) {
  222.             System.err.println("Error opening session:"+e.getMessage());
  223.             System.exit(1);
  224.         }
  225.         // inititialize the manager by adding the user. All requests will
  226.         // sent with this username 
  227.         pdu.setUserName(userName.getBytes());
  228.         try
  229.         {
  230.             USMUtils.init_v3_parameters(
  231.                userName,
  232. null,
  233.                 authProtocol,
  234.                 authPassword, 
  235.                 privPassword,
  236.                 ses_opt, 
  237.                 session,
  238. false,
  239. privProtocol); 
  240.         }
  241.         catch(Exception exp)
  242.         {
  243.             System.out.println(exp.getMessage());
  244.             System.exit(1);
  245.         }
  246.         pdu.setContextName(contextName.getBytes());
  247.         pdu.setContextID(contextID.getBytes());
  248.         // A valid user is now configured.on the manager. 
  249.         System.out.println("A new user " + userName + " is now " +
  250.                              "configured on the manager"); 
  251.     // Let's start the remote configuration.
  252.     // Step 1. Retrive the USMUserSpinLock
  253.         int spinLock = surg.sendSpinLockRequest(pdu,session);
  254.         if(spinLock < 0){
  255.             System.out.println("Error in retriving SnmpLock");
  256.             System.exit(1);
  257.         }
  258.         System.out.println("Spin lock value retrived successfullyn");
  259.         // Since we are reusing the PDU, we will remove the varbinds
  260.         // and set the reqid to 0.
  261.         surg.removeAllVarBinds(pdu);
  262.         //pdu.setReqid(0);
  263.     // Step 2. Send a multiVarBind SET request with the retrived
  264.     // spinlock value, USMUserCloneFrom=templateuser and 
  265.     // usmUserStatus=createAndWait.
  266.     // Here the templateuser will be user on whose behalf the requests
  267.     // are made.
  268.         // Create the ConeFrom OID for the creating new instance.
  269.         // i.e for newUserName and engineID
  270.         byte[] engineID = ((Snmp3Message)pdu.getMsg()).
  271.                                         getSecurity().getEngineID();
  272.         String engID;
  273.         try{
  274.         engID = new String(engineID, ENC);
  275.         }
  276.         catch(Exception e){
  277.         engID = new String(engineID);
  278.         }
  279.         int[] firstindex = surg.stringToIntegerArray(engID);
  280.         int[] secondIndex = surg.stringToIntegerArray(newUser);
  281.         String engIDOID = surg.intArrayToString(firstindex);
  282.         String newUserOID = surg.intArrayToString(secondIndex);
  283.         String cloneFromOID = USM_ENTRY + "." + CLONE_COL + "." 
  284.                             + firstindex.length + engIDOID + "." 
  285.                             + secondIndex.length + newUserOID;
  286.         
  287.         if(surg.debug)
  288.             System.out.println("cloneFrom OID = " + cloneFromOID);
  289.         // Create the CloneFrom OID value. This will point
  290.         // to the existing template entry.i.e userName and engineID
  291.         int[] cloneFromIndex = surg.stringToIntegerArray(userName);
  292.         String userNameOID = surg.intArrayToString(cloneFromIndex);
  293.         String cloneFromOIDValue = USM_ENTRY + "." + CLONE_COL + "." 
  294.                     + firstindex.length + engIDOID + "."
  295.                     + cloneFromIndex.length + userNameOID;
  296.         if(surg.debug)
  297.             System.out.println("cloneFrom OID value = " + cloneFromOIDValue);
  298.         String rowStatusOID = USM_ENTRY + "." + ROW_STATUS_COL + "." +
  299.                     + firstindex.length + engIDOID + "." + 
  300.                     secondIndex.length + newUserOID;
  301.         
  302.         if(surg.debug)
  303.             System.out.println("Row status  OID = " + rowStatusOID);
  304.         // Create the multivarbind. 
  305.         SnmpOID setOID1 = new SnmpOID(SPIN_LOCK_OID);
  306.         surg.addvarbind(pdu, setOID1,"INTEGER",
  307.                             new Integer(spinLock).toString());
  308.         SnmpOID setOID2 = new SnmpOID(cloneFromOID); 
  309.         surg.addvarbind(pdu, setOID2,"OID",cloneFromOIDValue);
  310.         SnmpOID setOID3 = new SnmpOID(rowStatusOID);
  311.         surg.addvarbind(pdu, setOID3,"INTEGER","5");
  312.         System.out.println("nSending a multivarbind cloneFrom requestn");
  313.         pdu.setCommand(SnmpAPI.SET_REQ_MSG);
  314.         try {
  315.             // Send PDU and receive response PDU
  316.             pdu = session.syncSend(pdu);
  317.         } catch (SnmpException e) {
  318.             System.err.println("Sending PDU"+e.getMessage());
  319.             System.exit(1);
  320.         }    
  321.         if (pdu == null) {
  322.             // timeout
  323.             System.out.println("Request timed out to: " + opt.remArgs[0] );
  324.             System.exit(1);
  325.         }
  326.         System.out.println("Response PDU for clonefrom  received from " +
  327.                             pdu.getProtocolOptions().getSessionId());
  328.         if (pdu.getErrstat() != 0){
  329.             System.out.println("Clonefrom request returned error "
  330.                                     + "User NOT Successfully cloned");
  331.             System.err.println(pdu.getError());
  332.             System.exit(1);
  333.         }
  334.         else 
  335.             // print the response pdu varbinds
  336.             System.out.println(pdu.printVarBinds());
  337.         // Since we are reusing the PDU, we will remove the varbinds
  338.         // and set the reqid to 0.
  339.         surg.removeAllVarBinds(pdu);
  340.         //pdu.setReqid(0);
  341.         if(authPassword.length() > 0 && newAuthPassword.length() > 0)   {       
  342.         // Get the SpinLock to use in the next SET request.
  343.         spinLock = surg.sendSpinLockRequest(pdu,session);
  344.         if(spinLock < 0){
  345.             System.out.println("Error in retriving SnmpLock");
  346.             System.exit(1);
  347.         }
  348.         // Since we are reusing the PDU, we will remove the varbinds
  349.         // and set the reqid to 0.
  350.         surg.removeAllVarBinds(pdu);
  351.         //pdu.setReqid(0);
  352.     // Step 3. Send a multiVarBind SET request with the retrived
  353.     // spinlock value, USMUserKeyChange=keyChangeValue and 
  354.     // usmUserPublic=randomValue.
  355.         // Initialize the random value based on the protocol used.
  356.         byte[] random;
  357.         if(authProtocol == USMUserEntry.MD5_AUTH)
  358.             random = new byte[AUTH_MD5_LEN];
  359.         else
  360.             random = new byte[AUTH_SHA_LEN];
  361.         USMUserTable userTable = (USMUserTable)api.getSecurityProvider().
  362.                                     getTable(USM_SECURITY_MODEL);
  363.         USMUserEntry entry = null;
  364.         try{
  365.              entry = userTable.getEntry(userName.getBytes(),
  366.                                                 engID.getBytes(ENC));
  367.         }catch(Exception e){
  368.              entry = userTable.getEntry(userName.getBytes(),
  369.                                                 engID.getBytes());
  370.             }
  371.         byte[] oldKey = entry.getAuthKey();
  372.         // Generate the keyChange value based on the secret
  373.         // authKey of the clone-from user and the secret key
  374.         // to be used for the new user. Let us call this akcValue.
  375.         String akcValue = surg.getKeyChangeValue(newUser,engID,authProtocol,
  376.                                 newAuthPassword,oldKey,random,false, privProtocol);
  377.         // This is just ot verify the keyChange. This will give
  378.         // the original key taking the keyChange. (This is what is 
  379.         // done on the agent side.
  380.         if(authProtocol == USMUserEntry.MD5_AUTH){
  381.             try{
  382.             random = akcValue.substring(0,AUTH_MD5_LEN).getBytes(ENC);
  383.             }catch(Exception e){
  384.             random = akcValue.substring(0,AUTH_MD5_LEN).getBytes();
  385.             }
  386.         }
  387.         else{
  388.             try{
  389.             random = akcValue.substring(0,AUTH_SHA_LEN).getBytes(ENC);
  390.             }catch(Exception e){
  391.             random = akcValue.substring(0,AUTH_SHA_LEN).getBytes();
  392.             }
  393.         }
  394.         String keyChangeOID = USM_ENTRY + "." + KEY_CHANGE_COL + "." 
  395.                 + firstindex.length + engIDOID + "." 
  396.                 + secondIndex.length + newUserOID;
  397.         String randomOID = USM_ENTRY + "." + USM_PUBLIC_COL + "." +
  398.                 + firstindex.length + engIDOID + "." + 
  399.                 secondIndex.length + newUserOID;
  400.                 
  401.         setOID1 = new SnmpOID(SPIN_LOCK_OID);
  402.         surg.addvarbind(pdu, setOID1,"INTEGER",
  403.                             new Integer(spinLock).toString());
  404.         
  405.         setOID2 = new SnmpOID(keyChangeOID); //check this up
  406.         surg.addvarbind(pdu, setOID2,"STRING",akcValue);
  407.         setOID3 = new SnmpOID(randomOID);
  408.         String randomString;
  409.         try{
  410.             randomString = new String(random,ENC);
  411.         }catch(Exception e){
  412.             randomString = new String(random);
  413.         }
  414.         surg.addvarbind(pdu, setOID3,"STRING", randomString);
  415.         System.out.println("Sending a request to set the authKeyChangen");
  416.         pdu.setCommand( SnmpAPI.SET_REQ_MSG );
  417.         try {
  418.             // Send PDU and receive response PDU
  419.             pdu = session.syncSend(pdu);
  420.         } catch (SnmpException e) {
  421.             System.err.println("Sending PDU"+e.getMessage());
  422.             System.exit(1);
  423.         }    
  424.         if (pdu == null) {
  425.             // timeout
  426.             System.out.println("Request timed out to: " + opt.remArgs[0] );
  427.             System.exit(1);
  428.         }
  429.         System.out.println("Response PDU for keyChange  received from " +
  430.                             pdu.getProtocolOptions().getSessionId());
  431.         if (pdu.getErrstat() != 0){
  432.             System.out.println("KeyChange SET request returned error "
  433.                                     + "User NOT Successfully cloned");
  434.             System.err.println(pdu.getError());
  435.             System.exit(1);
  436.         }
  437.         else 
  438.             // print the response pdu varbinds
  439.             System.out.println(pdu.printVarBinds());
  440.         // Since we are reusing the PDU, we will remove the varbinds
  441.         // and set the reqid to 0.
  442.         surg.removeAllVarBinds(pdu);
  443.         //pdu.setReqid(0);
  444.     // Step 4. GET usmUserPulic and check it has randomValue
  445.         // Get the usmUserPublic value
  446.         pdu.setCommand( SnmpAPI.GET_REQ_MSG );
  447.         
  448.         SnmpOID oid = new SnmpOID(randomOID);
  449.         if (oid.toValue() == null) 
  450.             System.err.println("Invalid OID argument: " + randomOID);
  451.         else pdu.addNull(oid);
  452.          
  453.         try {
  454.             // Send PDU and receive response PDU
  455.             pdu = session.syncSend(pdu);
  456.         } catch (SnmpException e) {
  457.             System.err.println("Sending PDU "+e.getMessage());
  458.             System.exit(1);
  459.         }    
  460.         if (pdu == null) {
  461.             // timeout
  462.             System.out.println("Request timed out to: " + opt.remArgs[0] );
  463.             System.exit(1);
  464.         }
  465.         // print and exit
  466.         System.out.println("Response PDU for usmUserPublic  received from " +
  467.                             pdu.getProtocolOptions().getSessionId());
  468.             
  469.         // Check for error in response
  470.         if (pdu.getErrstat() != 0){
  471.             System.out.println("usmUserPublic GET request returned error "
  472.                                     + "User NOT Successfully cloned");
  473.             System.err.println(pdu.getError());
  474.             System.exit(1);
  475.         }
  476.         else 
  477.             // print the response pdu varbinds
  478.             System.out.println(pdu.printVarBinds());
  479.         String userPublic = (pdu.getVariable(0)).toString();
  480.         String tempRandom;
  481.         try{
  482.             tempRandom = new String(random,ENC);
  483.         }catch(Exception e){
  484.             tempRandom = new String(random);
  485.         }
  486.         if(userPublic.equals(tempRandom))
  487.             System.out.println("usmUserPulic value is set appropriatelyn");
  488.         else{
  489.             System.out.println("usmUserPulic value is NOT set appropriately");
  490.             System.out.println("User NOT Successfully cloned");
  491.             System.exit(1);
  492.         }
  493.         // Since we are reusing the PDU, we will remove the varbinds
  494.         // and set the reqid to 0.
  495.         surg.removeAllVarBinds(pdu);
  496.         //pdu.setReqid(0);
  497.         // Start the privKeyChange
  498.         if(privPassword.length()>0 && newPrivPassword.length()>0)
  499.             {
  500.             newPrivPassword = values[NEW_PRIV_PASSWORD];
  501.             SnmpPDU pdu1 = new SnmpPDU();
  502.             pdu1.setUserName(userName.getBytes());
  503.             pdu1.setContextName(contextName.getBytes());
  504.             pdu1.setContextID(contextID.getBytes());
  505.             // Step 1. Retrive the USMUserSpinLock
  506.             spinLock = surg.sendSpinLockRequest(pdu1,session);
  507.             if(spinLock < 0){
  508.                 System.out.println("Error in retriving SnmpLock");
  509.                 System.exit(1);
  510.             }
  511.             System.out.println("Spin lock value retrived successfullyn");
  512.             // Since we are reusing the PDU, we will remove the varbinds
  513.             // and set the reqid to 0.
  514.             surg.removeAllVarBinds(pdu1);
  515.             // Step 3. Send a multiVarBind SET request with the retrived
  516.             // spinlock value, USMUserKeyChange=keyChangeValue and 
  517.             // usmUserPublic=randomValue.
  518.             // Initialize the random value based on the protocol used.
  519.             // byte[] priv_random = new byte[16]; // always 16 for Priv
  520.             byte[] priv_random = null; 
  521.             //Added by R.Ravikumar - to support privProtocols such as DES/AES128/AES192/AES256. 
  522.             if( values[PRIV_PROTOCOL] != null)
  523.     {
  524.     if(values[PRIV_PROTOCOL].equals("DES") ||values[PRIV_PROTOCOL].equals("AES-128") )
  525.     {
  526.       priv_random = new byte[16];
  527.     }
  528.     else if(values[PRIV_PROTOCOL].equals("AES-192"))
  529.     {
  530.    priv_random = new byte[24];
  531.     }
  532.     else if(values[PRIV_PROTOCOL].equals("AES-256"))
  533.     {
  534.     priv_random = new byte[32];
  535.     }
  536.       else if(values[PRIV_PROTOCOL].equals("3DES"))
  537.     {
  538.     priv_random = new byte[32];
  539.     }
  540.   
  541.     }
  542.     else
  543.     {
  544.           priv_random = new byte[16];     
  545.     }
  546.       
  547.             byte[] oldPrivKey = entry.getPrivKey();
  548.         
  549.             // Generate the keyChange value based on the secret
  550.             // privKey of the clone-from user and the secret key
  551.             // to be used for the new user. Let us call this pkcValue.
  552.              String pkcValue = surg.getKeyChangeValue(newUser,engID, authProtocol ,newPrivPassword,oldPrivKey,priv_random,true, privProtocol);
  553.         // This is just to verify the keyChange. This will give
  554.         // the original key taking the keyChange. (This is what is 
  555.         // done on the agent side.
  556.             try{
  557.             priv_random = pkcValue.substring(0,priv_random.length).getBytes(ENC);
  558.             }catch(Exception e){
  559.             priv_random = pkcValue.substring(0,priv_random.length).getBytes();
  560.             }
  561.             keyChangeOID = USM_ENTRY + "." + PRIV_KEY_CHANGE_COL + "." 
  562.                 + firstindex.length + engIDOID + "." 
  563.                 + secondIndex.length + newUserOID;
  564.             randomOID = USM_ENTRY + "." + USM_PUBLIC_COL + "." +
  565.                 + firstindex.length + engIDOID + "." + 
  566.                 secondIndex.length + newUserOID;
  567.                 
  568.             setOID1 = new SnmpOID(SPIN_LOCK_OID);
  569.             surg.addvarbind(pdu1, setOID1,"INTEGER",
  570.                             new Integer(spinLock).toString());
  571.         
  572.             setOID2 = new SnmpOID(keyChangeOID); //check this up
  573.             surg.addvarbind(pdu1, setOID2,"STRING",pkcValue);
  574.             setOID3 = new SnmpOID(randomOID);
  575.             try{
  576.                 randomString = new String(priv_random,ENC);
  577.             }catch(Exception e){
  578.             randomString = new String(priv_random);
  579.             }
  580.             surg.addvarbind(pdu1, setOID3,"STRING", randomString);
  581.             System.out.println("Sending a request to set the privKeyChangen");
  582.             pdu1.setCommand( SnmpAPI.SET_REQ_MSG );
  583.             try {
  584.                 // Send PDU and receive response PDU
  585.                 pdu1 = session.syncSend(pdu1);
  586.             } catch (SnmpException e) {
  587.                 System.err.println("Sending PDU"+e.getMessage());
  588.                 System.exit(1);
  589.             }    
  590.             if (pdu1 == null) {
  591.             // timeout
  592.                 System.out.println("Request timed out to: " + opt.remArgs[0] );
  593.                 System.exit(1);
  594.             }
  595.             System.out.println("Response PDU for keyChange  received from " +
  596.                             pdu.getProtocolOptions().getSessionId());
  597.             if (pdu1.getErrstat() != 0){
  598.                 System.out.println("KeyChange SET request returned error "
  599.                                     + "User NOT Successfully cloned");
  600.                 System.err.println(pdu1.getError());
  601.                 System.exit(1);
  602.             }
  603.         else 
  604.             // print the response pdu varbinds
  605.             System.out.println(pdu1.printVarBinds());
  606.         // Since we are reusing the PDU, we will remove the varbinds
  607.         // and set the reqid to 0.
  608.             surg.removeAllVarBinds(pdu1);
  609.         //pdu.setReqid(0);
  610.         // Step 4. GET usmUserPulic and check it has randomValue
  611.         // Get the usmUserPublic value
  612.             pdu1.setCommand( SnmpAPI.GET_REQ_MSG );
  613.         
  614.             oid = new SnmpOID(randomOID);
  615.             if (oid.toValue() == null) 
  616.                 System.err.println("Invalid OID argument: " + randomOID);
  617.             else pdu1.addNull(oid);
  618.          
  619.             try {
  620.             // Send PDU and receive response PDU
  621.                 pdu1 = session.syncSend(pdu1);
  622.             } catch (SnmpException e) {
  623.                 System.err.println("Sending PDU "+e.getMessage());
  624.                 System.exit(1);
  625.             }    
  626.             if (pdu1 == null) {
  627.             // timeout
  628.                 System.out.println("Request timed out to: " + opt.remArgs[0] );
  629.                 System.exit(1);
  630.             }
  631.         // print and exit
  632.             System.out.println("Response PDU for usmUserPublic  received from " +
  633.                         pdu.getProtocolOptions().getSessionId());
  634.             
  635.         // Check for error in response
  636.         if (pdu1.getErrstat() != 0){
  637.             System.out.println("usmUserPublic GET request returned error "
  638.                                     + "User NOT Successfully cloned");
  639.             System.err.println(pdu1.getError());
  640.             System.exit(1);
  641.         }
  642.         else 
  643.             // print the response pdu varbinds
  644.             System.out.println(pdu1.printVarBinds());
  645.         userPublic = (pdu1.getVariable(0)).toString();
  646.         try{
  647.             tempRandom = new String(priv_random,ENC);
  648.         }catch(Exception e){
  649.             tempRandom = new String(priv_random);
  650.         }
  651.         if(userPublic.equals(tempRandom))
  652.             System.out.println("usmUserPulic value is set appropriatelyn");
  653.         else{
  654.             System.out.println("usmUserPulic value is NOT set appropriately");
  655.             System.out.println("User NOT Successfully cloned");
  656.             System.exit(1);
  657.         }
  658.         }
  659.     }  // end of if(authPassword.length() > 0 .....)        
  660.     // Step 5. Activate the new user by setting the usmUserStatus=active 
  661.         setOID3 = new SnmpOID(rowStatusOID);
  662.         surg.addvarbind(pdu, setOID3,"INTEGER","1");
  663.         System.out.println("Sending a request to set  rowStatus value to activen");
  664.         pdu.setCommand( SnmpAPI.SET_REQ_MSG );
  665.         try {
  666.             // Send PDU and receive response PDU
  667.             pdu = session.syncSend(pdu);
  668.         } catch (SnmpException e) {
  669.             System.err.println("Sending PDU"+e.getMessage());
  670.             System.exit(1);
  671.         }    
  672.         if (pdu == null) {
  673.             // timeout
  674.             System.out.println("Request timed out to: " + opt.remArgs[2] );
  675.             System.exit(1);
  676.         }
  677.         System.out.println("Response PDU for set row status active " +
  678.                 " received from " + pdu.getProtocolOptions().getSessionId());
  679.         if (pdu.getErrstat() != 0){
  680.             System.out.println("Row Status SET request returned error "
  681.                                     + "User NOT Successfully cloned");
  682.             System.err.println(pdu.getError());
  683.             System.exit(1);
  684.         }
  685.         else{ 
  686.             // print the response pdu varbinds
  687.             System.out.println(pdu.printVarBinds());
  688.             System.out.println("User  S u c c e s s f u l l y  cloned !!!");
  689.         }
  690.         // close session
  691.         session.close();
  692.         // stop api thread
  693.         api.close();
  694.     
  695.         System.exit(0);
  696.     }
  697.     int sendSpinLockRequest(SnmpPDU pdu,SnmpSession session)
  698.     {
  699.         // Get the usmUserSpinLock value. 
  700.         System.out.println("nSending a request for retriving the " +
  701.                                             " usmUserSpinLock valuen");
  702.         pdu.setCommand( SnmpAPI.GET_REQ_MSG );
  703.         SnmpOID oid = new SnmpOID(SPIN_LOCK_OID);
  704.         if (oid.toValue() == null) 
  705.             System.err.println("Invalid OID argument: " + SPIN_LOCK_OID);
  706.         else 
  707.             pdu.addNull(oid);
  708.          
  709.         try {
  710.             // Send PDU and receive response PDU
  711.             pdu = session.syncSend(pdu);
  712.         } catch (SnmpException e) {
  713.             System.err.println("Sending PDU "+e.getMessage());
  714.             // System.exit(1);
  715.             return -1;
  716.         }    
  717.         if (pdu == null) {
  718.             // timeout
  719.             System.out.println("Request timed out to: remote host ");
  720.             // System.exit(1);
  721.             return -1;
  722.         }
  723.         // print and exit
  724.         System.out.println("Response PDU for usmUserSpinLock received from " +
  725.                             pdu.getProtocolOptions().getSessionId());
  726.             
  727.         // Check for error in response
  728.         if (pdu.getErrstat() != 0){
  729.             System.err.println(pdu.getError());
  730.             //System.exit(1);
  731.             return -1;
  732.         }
  733.         else 
  734.             // print the response pdu varbinds
  735.             System.out.println(pdu.printVarBinds());
  736.         SnmpVarBind vb = pdu.getVariableBinding(0);
  737.         SnmpVar var = vb.getVariable();
  738.         int spinLock = Integer.parseInt(var.toString()); 
  739.         return spinLock;
  740.     }
  741.     String getKeyChangeValue(String user,String engID,
  742.                             int protocol,String password,
  743.                             byte[] keyOld,byte[] random,boolean isPriv, int privProtocol)
  744.     {
  745.         byte[] engineID = null;
  746.         try {
  747.             engineID = engID.getBytes(ENC);
  748.         }catch(Exception ex)    {
  749.             engineID = engID.getBytes();
  750.         }
  751.        
  752.             byte[] localizedKey = null;
  753.     int keyLength = AUTH_MD5_LEN;
  754.     int hashLength = AUTH_MD5_LEN;
  755.     if(isPriv)
  756.     {
  757.     localizedKey = USMUtils.password_to_key(
  758.     protocol,
  759.     password.getBytes(),
  760.     password.getBytes().length, 
  761.     engineID,privProtocol);
  762.     if(privProtocol != USMUserEntry.NO_PRIV )
  763.     {
  764.     if(privProtocol == USMUserEntry.CFB_AES_192 )
  765.     {
  766.     keyLength = 24 ;
  767.     hashLength =24; 
  768.     }
  769.     else if(privProtocol == USMUserEntry.CFB_AES_256)
  770.     {
  771.     keyLength  = 32 ;
  772.     hashLength = 32; 
  773.     }
  774.     else if(privProtocol == USMUserEntry.CBC_3DES)
  775.     {
  776.     keyLength  = 32 ;
  777.     hashLength = 32; 
  778.     }
  779.     }
  780.     }
  781.     else
  782.     {
  783.     localizedKey = USMUtils.password_to_key(
  784.     protocol,
  785.     password.getBytes(),
  786.     password.getBytes().length, 
  787.     engineID);
  788.     if(protocol == USMUserEntry.SHA_AUTH && !isPriv)
  789.     {
  790.     keyLength = AUTH_SHA_LEN;
  791.     hashLength = AUTH_SHA_LEN;
  792.     }
  793.     }
  794.     
  795.         if(debug){
  796.             System.out.println("The old localized key is " + 
  797.                     USMUtils.printOctets(keyOld, keyOld.length) + "n");
  798.             System.out.println("The new localized key is " + 
  799.                     USMUtils.printOctets(localizedKey, localizedKey.length) 
  800.                                                                 + "n"); 
  801.         }
  802.         byte[] keyChange = USMUtils.getKeyChange(protocol,true,keyLength,
  803.                                         hashLength,localizedKey,keyOld,random);
  804.         if(debug){
  805.             System.out.println("The keyChange is " + 
  806.                 USMUtils.printOctets(keyChange, keyChange.length) + "n");
  807.             System.out.println("The random is " + 
  808.                     USMUtils.printOctets(random, random.length) + "n");
  809.         }
  810.         String kChange;
  811.         try{
  812.         kChange =  new String(keyChange,ENC);
  813.         }
  814.         catch(Exception e){
  815.         kChange =  new String(keyChange);
  816.         }
  817.         return kChange;
  818.     }
  819.     void removeAllVarBinds(SnmpPDU pdu)
  820.     {
  821.         int size = pdu.getVariableBindings().size();
  822.         for(int i = 0; i < size; i++)
  823.         {
  824.             pdu.removeVariableBinding(0);
  825.         }
  826.     }
  827.     static public int[] stringToIntegerArray(String str){
  828.         int[] instanceOID = new int[str.length()];
  829.         byte[] temp = null;
  830.         try
  831.         {
  832.             temp = str.getBytes(ENC);
  833.         }
  834.         catch(Exception exp)
  835.         {
  836.             temp = str.getBytes();
  837.         }
  838.         for (int i=0;i<temp.length;i++)
  839.             instanceOID[i] = (int)(temp[i] & 0xff);
  840.         return instanceOID;
  841.     }
  842.     static String intArrayToString(int[] intArray) {
  843.         StringBuffer s = new StringBuffer();
  844.         for (int i=0;i<intArray.length;i++) 
  845.             s.append("."+Integer.toString(intArray[i]));
  846.                 return s.toString();
  847.     }
  848.  /** <img SRC="images/v3only.jpg" ALT="v3 only"> adds the varbind with specified oid, type and value to the pdu */
  849.     static void addvarbind(SnmpPDU pdu, SnmpOID oid, String type, String value)
  850.     {        
  851.         byte dataType ;
  852.         if (type.equals("INTEGER")) {
  853.             dataType = SnmpAPI.INTEGER;
  854.         } else if (type.equals("STRING")) {
  855.             dataType = SnmpAPI.STRING;
  856.         } else if (type.equals("GAUGE")) {
  857.             dataType = SnmpAPI.GAUGE;
  858.         } else if (type.equals("TIMETICKS")) {
  859.             dataType = SnmpAPI.TIMETICKS;
  860.         } else if (type.equals("OPAQUE")) {
  861.             dataType = SnmpAPI.OPAQUE;
  862.         } else if (type.equals("IPADDRESS")) {
  863.             dataType = SnmpAPI.IPADDRESS;
  864.         } else if (type.equals("COUNTER")) {
  865.             dataType = SnmpAPI.COUNTER;
  866.         } else if (type.equals("OID")) { 
  867.             dataType = SnmpAPI.OBJID;
  868.         } else if (type.equals("BITS")) { 
  869.             dataType = SnmpAPI.STRING;
  870.         } else { 
  871.             System.err.println("Invalid variable type: " + type);
  872.             return;
  873.         }
  874.         SnmpVar var = null;
  875.         try {
  876.             // create SnmpVar instance for the value and the type
  877.             var = SnmpVar.createVariable( value, dataType );
  878.         }
  879.         catch(SnmpException e){
  880.             System.err.println("Cannot create variable: " + 
  881.                                     oid + " with value: " + value);
  882.             return;
  883.         }
  884.         //create varbind
  885.         SnmpVarBind varbind = new SnmpVarBind(oid, var);
  886.         // add variable binding
  887.         pdu.addVariableBinding(varbind);
  888.     }
  889. }