Ramaniganth, I worked on enhancing net-snmp to work with OpenSSL in FIPS mode a few months ago. After seeming to get it to work, the project was shelved, so the code never got published. But, I can tell you the approach I took. First, I would echo the advice from David Schwartz to carefully read and understand the OpenSSL FIPS security policy and user's guide - this is a very important first step if you are going to attempt this. There are two things that net-snmp needs to do in order to work in FIPS mode. At startup, it needs to call FIPS_mode_set(1) to put the OpenSSL library in FIPS mode, and then it needs to avoid calling non-FIPS algorithms - in particular MD5 and DES. Actually, I'm a little confused about whether DES has to be avoided or not, but we made the decision that when in FIPS mode we would only allow AES to be used for encryption. To call FIPS_mode_set, I added a function in snmplib/scapi.c named "sc_fips()". This function uses a static variable to tell whether or not it has been previously called, and simply returns immediately on all calls after the first one, with a value indicating whether or not FIPS mode is enabled. On the first call, it checks an environment variable, "NETSNMP_FIPS" to see whether or not FIPS mode is being requested; if not, it just returns, indicating that FIPS mode is not enabled. This is similar to the way the openssl utility works (using an environment variable to request that it operate in FIPS mode). If the environment variable is set, then FIPS_mode_set() is called, and if successful, a return is made indicating that FIPS mode is now enabled. If FIPS_mode_set() returns an error, the program aborts with an error. I then inserted calls to this function prior to each place in the code where calls to OpenSSL functions were made. This insures that if FIPS mode is requested, then FIPS_mode_set() will be called prior to calling any other OpenSSL function, but it will only be called once. Of course, when there are a series of calls to OpenSSL functions within a single function, it is sufficient to call sc_fips() just once in that function before any of the OpenSSL calls are made. The places where OpenSSL function calls are made can be found pretty easily by scanning for the "USE_OPENSSL" compile flag. There seem to be just two modules: snmplib/keytools.c and snmplib/scapi.c. By doing the initialization this way, it works for all application code that links with the library - not just snmpd, but also snmpget, snmpwalk, etc. The next problem is to make sure that non-FIPS algorithms are avoided when in FIPS mode. There are already compile-time flags that can be set to disable calling MD5 and DES - "DISABLE_MD5" and "DISABLE_DES". So, one way to create a FIPS net-snmp would be to build it with those flags set. That is, run configure with --disable-md5 and --disable-des options. We wanted to be able to select FIPS mode at run time, though, through the environment variable described above, so I couldn't compile MD5 and DES support out, but rather needed to add logic to make sure these calls were avoided whenever - but only when - running in FIPS mode. To do that conveniently, I added these macro definitions to /include/net-snmp/library/scapi.h: #define NOT_FIPS_AND !sc_fips() && #define FIPS_OR sc_fips() || #define FIPS_ENABLE sc_fips()
Then, searching through the source for all instances of DISABLE_MD5 or DISABLE_DES, I added logic to make the same disable decision at run time using one of those macros. For example, in snmplib/scapi.c, you'll find this function: int sc_get_properlength(const oid * hashtype, u_int hashtype_len) { DEBUGTRACE; /* * Determine transform type hash length. */ #ifndef DISABLE_MD5 if (ISTRANSFORM(hashtype, HMACMD5Auth)) { return BYTESIZE(SNMP_TRANS_AUTHLEN_HMACMD5); } else #endif if (ISTRANSFORM(hashtype, HMACSHA1Auth)) { return BYTESIZE(SNMP_TRANS_AUTHLEN_HMACSHA1); } return SNMPERR_GENERR; } This was changed to: int sc_get_properlength(const oid * hashtype, u_int hashtype_len) { DEBUGTRACE; /* * Determine transform type hash length. */ #ifndef DISABLE_MD5 if (NOT_FIPS_AND ISTRANSFORM(hashtype, HMACMD5Auth)) { return BYTESIZE(SNMP_TRANS_AUTHLEN_HMACMD5); } else #endif if (ISTRANSFORM(hashtype, HMACSHA1Auth)) { return BYTESIZE(SNMP_TRANS_AUTHLEN_HMACSHA1); } return SNMPERR_GENERR; } As a result, the MD5 HMAC function is only used if FIPS mode is not selected. If FIPS mode is selected, it acts the same as if the code was built with the DISABLE_MD5 flag set. Similar changes were made everywhere the DISABLE_MD5 or DISABLE_DES compile flags were found. Finally, note that each reference to "NOT_FIPS_AND", "FIPS_OR", or "FIPS_ENABLE" results in a call to sc_fips(). Thus, these tests can double as the required calls to enable fips mode in the first place. Hope this helps with your project. As noted at the top, we didn't actually get to final release on this, so it never went through formal testing or customer acceptance. But, it did seem to work in preliminary testing. Good Luck! David McKinley _____ From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of [EMAIL PROTECTED] Sent: Saturday, July 21, 2007 7:02 AM To: openssl-users@openssl.org Subject: OpenSSL FIPS Query Hi, NetSNMP is the open source SNMP management Kit which uses OpenSSL Libcrypto. I would like to know what changes I have to make in the NetSnmp to access the FIPS compatible OpenSSL Libraries. Thanks Ramaniganth V.S. Nortel : 6-877-8976 Wipro : +91-80-28520408 Xtn: 81109 Mobile: +91-9972227096 Loc.: T8-1F-A-079, EC-3, Wipro Tech., #72, Keonics Electronics City, Hosur Main Rd, Bangalore - 560 100. The information contained in this electronic message and any attachments to this message are intended for the exclusive use of the addressee(s) and may contain proprietary, confidential or privileged information. If you are not the intended recipient, you should not disseminate, distribute or copy this e-mail. Please notify the sender immediately and destroy all copies of this message and any attachments. WARNING: Computer viruses can be transmitted via email. The recipient should check this email and any attachments for the presence of viruses. The company accepts no liability for any damage caused by any virus transmitted by this email. www.wipro.com
smime.p7s
Description: S/MIME cryptographic signature