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

SNMP编程

开发平台:

C/C++

  1. /* $Id: snmpUSMKeyChange.src,v 1.4 2002/09/09 05:54:49 parasuraman Exp $ */
  2. /*
  3.  * @(#)snmpUSMKeyChange.java
  4.  * Copyright (c) 1996-2003 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.  * Strp 2. generate the keyChange value based on the secret
  12.  *         privKey of the clone-from user and the secret key
  13.  *         to be used for the new user. Let us call this keyChangeValue.
  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.  * The application sends request with version v3. 
  20.  * The user could run this application by giving any of the following usage.
  21.  *  
  22.  * java snmpUSMKeyChange [options] userName hostname 
  23.  *
  24.  * iava snmpUSMKeyChange [-d] [-p port] [-r retries] [-t timeout] [-a auth_protocol] [-w auth_password] [-s priv_password] [-n contextName] [-i contextID] [-y new_auth_password] [-z new_priv_password] userName host
  25.  *
  26.  * e.g.
  27.  * java snmpUSMKeyChange -a MD5 -w initial2Pass -y initial2NewPass initial2 10.3.2.120
  28.  * Where, initial2 user already configured on the agent whose authProtocol is
  29.  * MD5 and authPassword is initial2Pass. newInitial is the name of the new
  30.  * user who will be configured with authProtocol=MD5 and 
  31.  * authPassword=initial2NewPass.
  32.  * Here the clone-from user is initial2, the user on whose behalf all the
  33.  * requests will be sent.
  34.  * 
  35.  * Options:
  36.  * [-d]                   - Debug output. By default off.
  37.  * [-p] <port>            - remote port no. By default 161.
  38.  * [-t] <Timeout>         - Timeout. By default 5000ms.
  39.  * [-r] <Retries>         - Retries. By default 0.      
  40.  * [-a] <autProtocol>     - The authProtocol(MD5/SHA) of the template user. Mandatory if authPassword is specified
  41.  * [-w] <authPassword>    - The authentication password of the template user.
  42.  * [-s] <privPassword>    - The privacy protocol password of the template user. Must be accompanied with auth password and authProtocol fields.
  43.  * [-n] <contextName>     - The contextName to be used for the v3 pdu.
  44.  * [-i] <contextID>       - The contextID to be used for the v3 pdu.
  45.  * [-w] <newAuthPassword> - The authentication password for the new user.
  46.  * [-s] <newPrivPassword> - The privacy protocol password of the new user. Must be accompanied with auth password and authProtocol fields.
  47.  * username Mandatory     - The user who is already configured on the agent.
  48.  *                          (template user)
  49.  * newusername Mandatory  - The user name of the new user who will be 
  50.                             Remotely configured on the agent.
  51.  * host Mandatory         - The RemoteHost (agent).Format (string without double qoutes/IpAddress).
  52.  */
  53. import java.lang.*;
  54. import java.util.*;
  55. import java.net.*;
  56. import com.adventnet.snmp.snmp2.*;
  57. import com.adventnet.snmp.snmp2.usm.*;
  58. import com.adventnet.utils.*;
  59. public class snmpUSMKeyChange {
  60. private static final int USM_SECURITY_MODEL = 3;
  61. private static final String ENC = "8859_1";
  62. private static final int DEBUG = 0;
  63. private static final int PORT = 1;
  64. private static final int RETRIES = 2;
  65. private static final int TIMEOUT = 3;
  66. private static final int AUTH_PROTOCOL = 4;
  67. private static final int AUTH_PASSWORD = 5;
  68. private static final int PRIV_PASSWORD = 6;
  69. private static final int CONTEXT_NAME = 7;
  70. private static final int CONTEXT_ID = 8;
  71. private static final int NEW_AUTH_PASSWORD = 9;
  72. private static final int NEW_PRIV_PASSWORD = 10;
  73. private static final int OLD_USERNAME = 11;
  74. private static final int OLD_AUTH_PASSWORD = 12;
  75. private static final int OLD_PRIV_PASSWORD = 13;
  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 AUTH_OWN_KEY_CHANGE_COL = "7";
  80. private static final String AUTH_KEY_CHANGE_COL = "6";
  81. private static final String PRIV_OWN_KEY_CHANGE_COL = "10";
  82. private static final String PRIV_KEY_CHANGE_COL = "9";
  83. private static final String USM_PUBLIC_COL = "11";
  84. private static final String ROW_STATUS_COL = "13";
  85. private static final int AUTH_MD5_LEN = 16;
  86. private static final int AUTH_SHA_LEN = 20;
  87. boolean debug = false;
  88.     public static void main(String args[]) {
  89.         
  90. snmpUSMKeyChange surg = new snmpUSMKeyChange();
  91.         // Take care of getting options
  92.         String usage = "snmpUSMKeyChange [-d] [-p port] [-r retries] [-t timeout] [-a auth_protocol] [-w auth_password] [-s priv_password] [-n contextName] [-i contextID] [-y new_auth_password] [-z new_priv_password] [ -ou user_name] [ -ow old_auth_password] [ -oz old_priv_password] userName  host ";
  93.         String options[] = { "-d", "-p", "-r", "-t", "-a", "-w", "-s", "-n", "-i", "-y", "-z", "-ou", "-ow", "-oz"};
  94.         String values[] = { "None", null, null, null, null, null, null, null, null, null, null, null, null,null };       
  95. String userName = new String("");
  96. int authProtocol = USMUserEntry.NO_AUTH;
  97. String authPassword = null;
  98. String privPassword = null;
  99. String contextName = null;
  100. String contextID = null;
  101. //int newAuthProtocol = USMUserEntry.NO_AUTH;
  102. String newAuthPassword = null;
  103. String newPrivPassword = null;
  104. // Old sec Parameters for the user
  105. byte oldAuthProtocol = USMUserEntry.MD5_AUTH;
  106. String oldAuthPassword = null;
  107. String oldPrivPassword = null;
  108. String oldUserName = null;
  109. boolean ownKeyChange=false;
  110.          ParseOptions opt = new ParseOptions(args,options,values, usage);
  111.         if (opt.remArgs.length<2) opt.usage_error();
  112.         // Start SNMP API
  113.         SnmpAPI api;
  114.         api = new SnmpAPI();
  115.         if (values[DEBUG].equals("Set")){
  116. api.setDebug( true );
  117. surg.debug = true;
  118. }
  119.     
  120. userName = opt.remArgs[0];
  121.         // Open session
  122.         SnmpSession session = new SnmpSession(api);        
  123.         // set remote Host 
  124.         session.setPeername( opt.remArgs[1] );
  125. // Set the values accepted from the command line
  126. //boolean usage_error = false;
  127.         //set remote Port, timeout,retries if needed.
  128.     try {
  129.         if (values[PORT] != null)
  130.                 session.setRemotePort( Integer.parseInt(values[PORT]) );
  131.         if (values[RETRIES] != null)
  132.                 session.setRetries( Integer.parseInt(values[RETRIES]) );
  133.         if (values[TIMEOUT] != null)
  134.                 session.setTimeout( Integer.parseInt(values[TIMEOUT]) );
  135.     }
  136.     catch (NumberFormatException ex) {
  137.         System.err.println("Invalid Integer Arg");
  138.     }
  139. session.setVersion( SnmpAPI.SNMP_VERSION_3 );
  140. if ((values[AUTH_PROTOCOL] != null)) {
  141. if(values[AUTH_PROTOCOL].equals("SHA"))
  142. authProtocol = USMUserEntry.SHA_AUTH;
  143. else 
  144. authProtocol = USMUserEntry.MD5_AUTH;
  145. }
  146. if(values[AUTH_PASSWORD]!=null){
  147. authPassword=values[AUTH_PASSWORD];
  148. }
  149. if(values[PRIV_PASSWORD]!=null){
  150. privPassword=values[PRIV_PASSWORD];
  151. }
  152. /// for old user
  153. if(values[OLD_USERNAME]==null){
  154. ownKeyChange=true;
  155. }
  156. else{
  157. oldUserName=values[OLD_USERNAME];
  158. }
  159. if(!ownKeyChange){
  160. if(!(values[OLD_AUTH_PASSWORD]!=null && values[AUTH_PASSWORD]!=null
  161. && values[NEW_AUTH_PASSWORD]!=null)){
  162. System.out.println("GOT Here 187");
  163. opt.usage_error();
  164. }
  165. else{
  166. oldAuthPassword = values[OLD_AUTH_PASSWORD];
  167. newAuthPassword = values[NEW_AUTH_PASSWORD];
  168. authPassword = values[AUTH_PASSWORD];
  169. }
  170. if(values[OLD_PRIV_PASSWORD]!=null){
  171. if(values[PRIV_PASSWORD]==null){
  172. System.out.println("GOT Here 187");
  173. opt.usage_error();
  174. }
  175. else{
  176. if(values[NEW_PRIV_PASSWORD]==null){
  177. opt.usage_error();
  178. }
  179. else{
  180. oldPrivPassword = values[OLD_AUTH_PASSWORD];
  181. newPrivPassword = values[NEW_AUTH_PASSWORD];
  182. privPassword = values[AUTH_PASSWORD];
  183. }
  184. }
  185. }
  186. else{
  187. privPassword=null;
  188. }
  189. }
  190. else{
  191. if(values[AUTH_PASSWORD]==null){
  192. opt.usage_error();
  193. }
  194. else{
  195. authPassword=values[AUTH_PASSWORD];
  196. if(values[NEW_AUTH_PASSWORD]!=null){
  197. newAuthPassword=values[NEW_AUTH_PASSWORD];
  198. }
  199. else{
  200. opt.usage_error();
  201. }
  202. }
  203. if(values[PRIV_PASSWORD]!=null){
  204. privPassword=values[PRIV_PASSWORD];
  205. if(values[NEW_PRIV_PASSWORD]!=null){
  206. newPrivPassword=values[NEW_PRIV_PASSWORD];
  207. }
  208. }
  209. }
  210. if (values[CONTEXT_NAME] != null)
  211. contextName = values[CONTEXT_NAME];
  212. if (values[CONTEXT_ID] != null)
  213. contextID = values[CONTEXT_ID];
  214.         // Build Get request PDU
  215.         SnmpPDU pdu = new SnmpPDU();
  216.         try {
  217.             //Open session
  218.             session.open();
  219.         } catch (SnmpException e) {
  220.             System.err.println("Error opening session:"+e.getMessage());
  221.             System.exit(1);
  222.         }
  223. // inititialize the manager by adding the user. All requests will
  224. // sent with this username 
  225. pdu.setUserName(userName.getBytes());
  226.         USMUtils.init_v3_params(userName, authProtocol, authPassword, 
  227. privPassword, session.getPeername(),
  228. session.getRemotePort(),session);
  229.         if(contextName!=null){
  230. pdu.setContextName(contextName.getBytes());
  231. }
  232.         if(contextID!=null){
  233. pdu.setContextID(contextID.getBytes());
  234. }
  235. // A valid user is now configured.on the manager. 
  236. System.out.println("A new user " + userName + " is now " +
  237.  "configured on the manager"); 
  238. // Get the SpinLock to use in the next SET request.
  239. int spinLock = surg.sendSpinLockRequest(pdu,session);
  240. if(spinLock < 0){
  241. System.out.println("Error in retriving SnmpLock");
  242. System.exit(1);
  243. }
  244. // Since we are reusing the PDU, we will remove the varbinds
  245. // and set the reqid to 0.
  246. surg.removeAllVarBinds(pdu);
  247. //pdu.setReqid(0);
  248. byte[] engineID = ((Snmp3Message)pdu.getMsg()).
  249. getSecurity().getEngineID();
  250. String engID;
  251. try{
  252. engID = new String(engineID, ENC);
  253. }
  254. catch(Exception e){
  255. engID = new String(engineID);
  256. }
  257. int[] firstindex = surg.stringToIntegerArray(engID);
  258. String engIDOID = surg.intArrayToString(firstindex);
  259. int[] userIndex=null;
  260. if(ownKeyChange){
  261. userIndex = surg.stringToIntegerArray(userName);
  262. }
  263. else{
  264. userIndex = surg.stringToIntegerArray(oldUserName);
  265. }
  266. String userNameOID = surg.intArrayToString(userIndex);
  267. // Initialize the random value based on the protocol used.
  268. byte[] random;
  269. if(authProtocol == USMUserEntry.MD5_AUTH)
  270. random = new byte[AUTH_MD5_LEN];
  271. else
  272. random = new byte[AUTH_SHA_LEN];
  273. byte[] engID2 = null;
  274. try {
  275. engID2 = engID.getBytes(ENC);
  276. }catch(Exception ex) {
  277. engID2 = engID.getBytes();
  278. }
  279. USMUserTable userTable = (USMUserTable)api.getSecurityProvider().
  280. getTable(USM_SECURITY_MODEL);
  281. USMUserEntry entry = userTable.getEntry(userName.getBytes(),
  282. engID2);
  283. byte[] oldKey=null;
  284. if(ownKeyChange){
  285. oldKey = entry.getAuthKey();
  286. }
  287. else{
  288. oldKey = 
  289. USMUtils.password_to_key(oldAuthProtocol,oldAuthPassword.getBytes(),
  290. oldAuthPassword.getBytes().length,engineID);
  291. }
  292. // Generate the keyChange value based on the secret
  293. // authKey of the  user and the new secret key
  294. // to be used for the user. Let us call this akcValue.
  295. String akcValue=surg.getKeyChangeValue(engID,authProtocol,
  296. newAuthPassword,oldKey,random,false);
  297. if(authProtocol == USMUserEntry.MD5_AUTH){
  298. try{
  299. random = akcValue.substring(0,AUTH_MD5_LEN).getBytes(ENC);
  300. }catch(Exception e){
  301. random = akcValue.substring(0,AUTH_MD5_LEN).getBytes();
  302. }
  303. }
  304. else{
  305. try{
  306. random = akcValue.substring(0,AUTH_SHA_LEN).getBytes(ENC);
  307. }catch(Exception e){
  308. random = akcValue.substring(0,AUTH_SHA_LEN).getBytes();
  309. }
  310. }
  311. String keyChangeOID=null;
  312. if(ownKeyChange){
  313. keyChangeOID = USM_ENTRY + "." + AUTH_OWN_KEY_CHANGE_COL + "." 
  314. + firstindex.length + engIDOID + "." 
  315. + userIndex.length + userNameOID;
  316. }
  317. else{
  318. keyChangeOID = USM_ENTRY + "." + AUTH_KEY_CHANGE_COL + "." 
  319. + firstindex.length + engIDOID + "." 
  320. + userIndex.length + userNameOID;
  321. }
  322. String randomOID = USM_ENTRY + "." + USM_PUBLIC_COL + "." +
  323. + firstindex.length + engIDOID + "." + 
  324. userIndex.length + userNameOID;
  325. SnmpOID setOID1 = new SnmpOID(SPIN_LOCK_OID);
  326. surg.addvarbind(pdu, setOID1,"INTEGER",
  327. new Integer(spinLock).toString());
  328. SnmpOID setOID2 = new SnmpOID(keyChangeOID); //check this up
  329. surg.addvarbind(pdu, setOID2,"STRING",akcValue);
  330. SnmpOID setOID3 = new SnmpOID(randomOID);
  331. String randomString;
  332. try{
  333. randomString = new String(random,ENC);
  334. }catch(Exception e){
  335. randomString = new String(random);
  336. }
  337. surg.addvarbind(pdu, setOID3,"STRING", randomString);
  338. System.out.println("Sending a request to set the authKeyChangen");
  339.         pdu.setCommand( SnmpAPI.SET_REQ_MSG );
  340.         try {
  341.             // Send PDU and receive response PDU
  342. System.out.println("Sending Request for KeyChange");
  343.             pdu = session.syncSend(pdu);
  344.         } catch (SnmpException e) {
  345.             System.err.println("Sending PDU"+e.getMessage());
  346.             System.exit(1);
  347.         }    
  348.         if (pdu == null) {
  349.             // timeout
  350.             System.out.println("Request timed out to: " + opt.remArgs[0] );
  351.             System.exit(1);
  352.         }
  353.         System.out.println("Response PDU for keyChange  received from " +
  354. (pdu.getAddress()).getHostAddress());
  355.         if (pdu.getErrstat() != 0){
  356.          System.out.println("KeyChange SET request returned error "
  357. + "User NOT Successfully cloned");
  358.             System.err.println(pdu.getError());
  359. System.exit(1);
  360. }
  361.         else 
  362.             // print the response pdu varbinds
  363.             System.out.println(pdu.printVarBinds());
  364. // Since we are reusing the PDU, we will remove the varbinds
  365. // and set the reqid to 0.
  366. surg.removeAllVarBinds(pdu);
  367. //pdu.setReqid(0);
  368. // This is to set the new AuthKey on our side for receiving 
  369. //the usmUserPublic
  370. // value after it has been set.
  371. if(ownKeyChange){
  372. entry.setAuthPassword(newAuthPassword.getBytes());
  373. byte[] engID1 = null;
  374. try {
  375. engID1 = engID.getBytes(ENC);
  376. }catch(Exception ex) {
  377. engID1 = engID.getBytes();
  378. }
  379. byte[] newKey = USMUtils.password_to_key(authProtocol,
  380. newAuthPassword.getBytes(),
  381. newAuthPassword.getBytes().length,
  382. engID1);
  383. entry.setAuthKey(newKey);
  384. }
  385. // Get the usmUserPublic value
  386.         pdu.setCommand( SnmpAPI.GET_REQ_MSG );
  387.         SnmpOID oid = new SnmpOID(randomOID);
  388.         if (oid.toValue() == null) 
  389.             System.err.println("Invalid OID argument: " + randomOID);
  390.         else pdu.addNull(oid);
  391.  
  392.         try {
  393.             // Send PDU and receive response PDU
  394.             pdu = session.syncSend(pdu);
  395.         } catch (SnmpException e) {
  396.             System.err.println("Sending PDU "+e.getMessage());
  397.             System.exit(1);
  398.         }    
  399.         if (pdu == null) {
  400.             // timeout
  401.             System.out.println("Request timed out to: " + opt.remArgs[0] );
  402.             System.exit(1);
  403.         }
  404.         // print and exit
  405.         System.out.println("Response PDU for usmUserPublic  received from " +
  406. (pdu.getAddress()).getHostAddress());
  407.             
  408.         // Check for error in response
  409.         if (pdu.getErrstat() != 0){
  410.          System.out.println("usmUserPublic GET request returned error "
  411. + "User NOT Successfully cloned");
  412.             System.err.println(pdu.getError());
  413. System.exit(1);
  414. }
  415.         else 
  416.             // print the response pdu varbinds
  417.             System.out.println(pdu.printVarBinds());
  418. String userPublic = (pdu.getVariable(0)).toString();
  419. String tempRandom;
  420. try{
  421. tempRandom = new String(random,ENC);
  422. }catch(Exception e){
  423. tempRandom = new String(random);
  424. }
  425. if(userPublic.equals(tempRandom))
  426. System.out.println("usmUserPulic value is set appropriatelyn");
  427. else{
  428. System.out.println("usmUserPulic value is NOT set appropriately");
  429. System.out.println("User NOT Successfully cloned");
  430. System.exit(1);
  431. }
  432. // Since we are reusing the PDU, we will remove the varbinds
  433. // and set the reqid to 0.
  434. surg.removeAllVarBinds(pdu);
  435. //pdu.setReqid(0);
  436. // Start the privKeyChange
  437. if(privPassword!=null && privPassword.length()>0 && newPrivPassword!=null && newPrivPassword.length()>0)
  438. {
  439. newPrivPassword = values[NEW_PRIV_PASSWORD];
  440. SnmpPDU pdu1 = new SnmpPDU();
  441. pdu1.setUserName(userName.getBytes());
  442.          if(contextName!=null){
  443. pdu1.setContextName(contextName.getBytes());
  444. }
  445. if(contextID!=null){
  446.          pdu1.setContextID(contextID.getBytes());
  447. }
  448. // Step 1. Retrive the USMUserSpinLock
  449. spinLock = surg.sendSpinLockRequest(pdu1,session);
  450. if(spinLock < 0){
  451. System.out.println("Error in retriving SnmpLock");
  452. System.exit(1);
  453. }
  454. System.out.println("Spin lock value retrived successfullyn");
  455. // Since we are reusing the PDU, we will remove the varbinds
  456. // and set the reqid to 0.
  457. surg.removeAllVarBinds(pdu1);
  458. // Initialize the random value based on the protocol used.
  459. byte[] priv_random = new byte[16]; // always 16 for Priv
  460. byte[] oldPrivKey=null;
  461. if(ownKeyChange){
  462. oldPrivKey = entry.getPrivKey();
  463. }
  464. else{
  465. System.out.println("Got here 518");
  466. oldPrivKey=USMUtils.password_to_key(oldAuthProtocol,oldPrivPassword.getBytes(),oldPrivPassword.getBytes().length,engineID);
  467. }
  468. String pkcValue=null;
  469. // Generate the keyChange value based on the secret
  470. // privKey of the user and the new secret key
  471. // to be used for the user. Let us call this pkcValue.
  472. pkcValue = surg.getKeyChangeValue(engID,USMUserEntry.MD5_AUTH,newPrivPassword,oldPrivKey,random,true);
  473. try{
  474. priv_random = pkcValue.substring(0,16).getBytes(ENC);
  475. }catch(Exception e){
  476. priv_random = pkcValue.substring(0,16).getBytes();
  477. }
  478. if(ownKeyChange){
  479. keyChangeOID = USM_ENTRY + "." + PRIV_OWN_KEY_CHANGE_COL + "." 
  480. + firstindex.length + engIDOID + "." 
  481. + userIndex.length + userNameOID;
  482. }
  483. else{
  484. System.out.println("GOT Here 540 "); 
  485. keyChangeOID = USM_ENTRY + "." + PRIV_KEY_CHANGE_COL + "." 
  486. + firstindex.length + engIDOID + "." 
  487. + userIndex.length + userNameOID;
  488. }
  489. randomOID = USM_ENTRY + "." + USM_PUBLIC_COL + "." +
  490. + firstindex.length + engIDOID + "." + 
  491. userIndex.length + userNameOID;
  492. setOID1 = new SnmpOID(SPIN_LOCK_OID);
  493. surg.addvarbind(pdu1, setOID1,"INTEGER",
  494. new Integer(spinLock).toString());
  495. setOID2 = new SnmpOID(keyChangeOID); //check this up
  496. surg.addvarbind(pdu1, setOID2,"STRING",pkcValue);
  497. setOID3 = new SnmpOID(randomOID);
  498. try{
  499. randomString = new String(priv_random,ENC);
  500. }catch(Exception e){
  501. randomString = new String(priv_random);
  502. }
  503. surg.addvarbind(pdu1, setOID3,"STRING", randomString);
  504. System.out.println("Sending a request to set the privKeyChangen");
  505.          pdu1.setCommand( SnmpAPI.SET_REQ_MSG );
  506.          try {
  507.              // Send PDU and receive response PDU
  508.              pdu1 = session.syncSend(pdu1);
  509.          } catch (SnmpException e) {
  510.              System.err.println("Sending PDU"+e.getMessage());
  511.              System.exit(1);
  512.          }    
  513.          if (pdu1 == null) {
  514.             // timeout
  515.              System.out.println("Request timed out to: " + opt.remArgs[0] );
  516.              System.exit(1);
  517.          }
  518.          System.out.println("Response PDU for keyChange  received from " +
  519. (pdu1.getAddress()).getHostAddress());
  520.          if (pdu1.getErrstat() != 0){
  521.          System.out.println("KeyChange SET request returned error "
  522. + "User NOT Successfully cloned");
  523.              System.err.println(pdu1.getError());
  524. System.exit(1);
  525. }
  526.         else 
  527.             // print the response pdu varbinds
  528.             System.out.println(pdu1.printVarBinds());
  529. // Since we are reusing the PDU, we will remove the varbinds
  530. // and set the reqid to 0.
  531. surg.removeAllVarBinds(pdu1);
  532. //pdu.setReqid(0);
  533. if(ownKeyChange){
  534. entry.setPrivPassword(newPrivPassword.getBytes());
  535. byte[] engID1 = null;
  536. try {
  537. engID1 = engID.getBytes(ENC);
  538. }catch(Exception ex) {
  539. engID1 = engID.getBytes();
  540. }
  541. // This is to set the new PrivKey on our side for receiving 
  542. //the usmUserPublic
  543. // value after it has been set on the Agent.
  544. byte[] tempKey = USMUtils.password_to_key(authProtocol,
  545. newPrivPassword.getBytes(),
  546. newPrivPassword.getBytes().length,
  547. engID1);
  548. byte[] newPrivKey = new byte[16];
  549. System.arraycopy(tempKey,0,newPrivKey,0,16);
  550. entry.setPrivKey(newPrivKey);
  551. }
  552. // Get the usmUserPublic value
  553.          pdu1.setCommand( SnmpAPI.GET_REQ_MSG );
  554.          oid = new SnmpOID(randomOID);
  555.          if (oid.toValue() == null) 
  556.              System.err.println("Invalid OID argument: " + randomOID);
  557.          else pdu1.addNull(oid);
  558.  
  559.          try {
  560.             // Send PDU and receive response PDU
  561.              pdu1 = session.syncSend(pdu1);
  562.          } catch (SnmpException e) {
  563.              System.err.println("Sending PDU "+e.getMessage());
  564.              System.exit(1);
  565.          }    
  566.          if (pdu1 == null) {
  567.             // timeout
  568.              System.out.println("Request timed out to: " + opt.remArgs[0] );
  569.              System.exit(1);
  570.          }
  571.         // print and exit
  572.          System.out.println("Response PDU for usmUserPublic  received from "  +
  573. (pdu1.getAddress()).getHostAddress());
  574.             
  575.         // Check for error in response
  576.         if (pdu1.getErrstat() != 0){
  577.          System.out.println("usmUserPublic GET request returned error "
  578. + "User NOT Successfully cloned");
  579.             System.err.println(pdu1.getError());
  580. System.exit(1);
  581. }
  582.         else 
  583.             // print the response pdu varbinds
  584.             System.out.println(pdu1.printVarBinds());
  585. userPublic = (pdu1.getVariable(0)).toString();
  586. try{
  587. tempRandom = new String(priv_random,ENC);
  588. }catch(Exception e){
  589. tempRandom = new String(priv_random);
  590. }
  591. if(userPublic.equals(tempRandom))
  592. System.out.println("usmUserPulic value is set appropriatelyn");
  593. else{
  594. System.out.println("usmUserPulic value is NOT set appropriately");
  595. System.out.println("User NOT Successfully cloned");
  596. System.exit(1);
  597. }
  598. }
  599. System.out.println("Key Change SUCCESSFULL!!!");
  600.         // close session
  601.         session.close();
  602.         // stop api thread
  603.         api.close();
  604.     
  605.         System.exit(0);
  606.     }
  607. int sendSpinLockRequest(SnmpPDU pdu,SnmpSession session)
  608. {
  609. // Get the usmUserSpinLock value. 
  610. System.out.println("nSending a request for retriving the " +
  611. " usmUserSpinLock valuen");
  612.         pdu.setCommand( SnmpAPI.GET_REQ_MSG );
  613.         SnmpOID oid = new SnmpOID(SPIN_LOCK_OID);
  614.         if (oid.toValue() == null) 
  615.             System.err.println("Invalid OID argument: " + SPIN_LOCK_OID);
  616.         else 
  617. pdu.addNull(oid);
  618.  
  619.         try {
  620.             // Send PDU and receive response PDU
  621.             pdu = session.syncSend(pdu);
  622.         } catch (SnmpException e) {
  623.             System.err.println("Sending PDU "+e.getMessage());
  624.             // System.exit(1);
  625. return -1;
  626.         }    
  627.         if (pdu == null) {
  628.             // timeout
  629.             System.out.println("Request timed out to: remote host ");
  630.             // System.exit(1);
  631. return -1;
  632.         }
  633.         // print and exit
  634.         System.out.println("Response PDU for usmUserSpinLock received from " +
  635. (pdu.getAddress()).getHostAddress());
  636.             
  637.         // Check for error in response
  638.         if (pdu.getErrstat() != 0){
  639.             System.err.println(pdu.getError());
  640. //System.exit(1);
  641. return -1;
  642. }
  643.         else 
  644.             // print the response pdu varbinds
  645.             System.out.println(pdu.printVarBinds());
  646. SnmpVarBind vb = pdu.getVariableBinding(0);
  647. SnmpVar var = vb.getVariable();
  648. int spinLock = Integer.parseInt(var.toString()); 
  649. return spinLock;
  650. }
  651. String getKeyChangeValue(String engID,
  652. int protocol,String password,
  653. byte[] keyOld,byte[] random,boolean isPriv)
  654. {
  655. byte[] engID1 = null;
  656. try {
  657. engID1 = engID.getBytes(ENC);
  658. }catch(Exception exp) {
  659. engID1 = engID.getBytes();
  660. }
  661. byte[] localizedKey = USMUtils.password_to_key(protocol,
  662. password.getBytes(),
  663. password.getBytes().length, 
  664. engID1);
  665. int keyLength = AUTH_MD5_LEN;
  666. int hashLength = AUTH_MD5_LEN;
  667. if(protocol == USMUserEntry.SHA_AUTH && !isPriv)
  668. {
  669. keyLength = AUTH_SHA_LEN;
  670. hashLength = AUTH_SHA_LEN;
  671. }
  672. if(debug){
  673. System.out.println("The old localized key is " + 
  674. USMUtils.printOctets(keyOld, keyOld.length) + "n");
  675. System.out.println("The new localized key is " + 
  676. USMUtils.printOctets(localizedKey, localizedKey.length) 
  677. + "n"); 
  678. }
  679. byte[] keyChange = USMUtils.getKeyChange(protocol,true,keyLength,
  680. hashLength,localizedKey,keyOld,random);
  681. if(debug){
  682. System.out.println("The keyChange is " + 
  683. USMUtils.printOctets(keyChange, keyChange.length) + "n");
  684. System.out.println("The random is " + 
  685. USMUtils.printOctets(random, random.length) + "n");
  686. }
  687. String kChange;
  688. try{
  689. kChange =  new String(keyChange,ENC);
  690. }
  691. catch(Exception e){
  692. kChange =  new String(keyChange);
  693. }
  694. return kChange;
  695. }
  696. void removeAllVarBinds(SnmpPDU pdu)
  697. {
  698. int size = pdu.getVariableBindings().size();
  699. for(int i = 0; i < size; i++)
  700. {
  701. pdu.removeVariableBinding(0);
  702. }
  703. }
  704. static public int[] stringToIntegerArray(String str){
  705. int[] instanceOID = new int[str.length()];
  706. byte[] temp = null;
  707. try {
  708. temp = str.getBytes(ENC);
  709. }catch(Exception ex) {
  710. temp = str.getBytes();
  711. }
  712. for (int i=0;i<temp.length;i++)
  713. instanceOID[i] = (int)(temp[i]) & 0xff;
  714. return instanceOID;
  715. }
  716. static String intArrayToString(int[] intArray) {
  717. StringBuffer s = new StringBuffer();
  718. for (int i=0;i<intArray.length;i++) 
  719. s.append("."+Integer.toString(intArray[i]));
  720.     return s.toString();
  721. }
  722.  /** <img SRC="images/v3only.jpg" ALT="v3 only"> adds the varbind with specified oid, type and value to the pdu */
  723.     static void addvarbind(SnmpPDU pdu, SnmpOID oid, String type, String value)
  724.     {        
  725.         byte dataType ;
  726.         if (type.equals("INTEGER")) {
  727.             dataType = SnmpAPI.INTEGER;
  728.         } else if (type.equals("STRING")) {
  729.             dataType = SnmpAPI.STRING;
  730.         } else if (type.equals("GAUGE")) {
  731.             dataType = SnmpAPI.GAUGE;
  732.         } else if (type.equals("TIMETICKS")) {
  733.             dataType = SnmpAPI.TIMETICKS;
  734.         } else if (type.equals("OPAQUE")) {
  735.             dataType = SnmpAPI.OPAQUE;
  736.         } else if (type.equals("IPADDRESS")) {
  737.             dataType = SnmpAPI.IPADDRESS;
  738.         } else if (type.equals("COUNTER")) {
  739.             dataType = SnmpAPI.COUNTER;
  740.         } else if (type.equals("OID")) { 
  741.             dataType = SnmpAPI.OBJID;
  742.         } else if (type.equals("BITS")) { 
  743.             dataType = SnmpAPI.BITSTRING;
  744.         } else { 
  745.             System.err.println("Invalid variable type: " + type);
  746.             return;
  747.         }
  748.         SnmpVar var = null;
  749.         try {
  750.             // create SnmpVar instance for the value and the type
  751.             var = SnmpVar.createVariable( value, dataType );
  752.         }
  753.         catch(SnmpException e){
  754.             System.err.println("Cannot create variable: " + 
  755. oid + " with value: " + value);
  756.             return;
  757.         }
  758.         //create varbind
  759.         SnmpVarBind varbind = new SnmpVarBind(oid, var);
  760.         // add variable binding
  761.         pdu.addVariableBinding(varbind);
  762.     }
  763. }