tls: Use SHA1 for sessionIdContext in FIPS mode
authorStefan Budeanu <stefan@budeanu.com>
Mon, 9 Nov 2015 23:19:11 +0000 (18:19 -0500)
committerJames M Snell <jasnell@gmail.com>
Wed, 23 Dec 2015 16:38:33 +0000 (08:38 -0800)
FIPS 140-2 disallows use of MD5, which is used to derive the
default sessionIdContext for tls.createServer().

PR-URL: https://github.com/nodejs/node/pull/3755
Reviewed-By: Fedor Indutny <fedor@indutny.com>
doc/api/tls.markdown
lib/_tls_wrap.js

index b46c3bb..fc2d095 100644 (file)
@@ -804,7 +804,8 @@ automatically set as a listener for the [secureConnection][] event.  The
 
   - `sessionIdContext`: A string containing an opaque identifier for session
     resumption. If `requestCert` is `true`, the default is MD5 hash value
-    generated from command-line. Otherwise, the default is not provided.
+    generated from command-line. (In FIPS mode a truncated SHA1 hash is
+    used instead.) Otherwise, the default is not provided.
 
   - `secureProtocol`: The SSL method to use, e.g. `SSLv3_method` to force
     SSL version 3. The possible values depend on your installation of
index 661f695..5b36906 100644 (file)
@@ -14,6 +14,21 @@ const Timer = process.binding('timer_wrap').Timer;
 const tls_wrap = process.binding('tls_wrap');
 const TCP = process.binding('tcp_wrap').TCP;
 const Pipe = process.binding('pipe_wrap').Pipe;
+const defaultSessionIdContext = getDefaultSessionIdContext();
+
+function getDefaultSessionIdContext() {
+  var defaultText = process.argv.join(' ');
+  /* SSL_MAX_SID_CTX_LENGTH is 128 bits */
+  if (process.config.variables.openssl_fips) {
+    return crypto.createHash('sha1')
+      .update(defaultText)
+      .digest('hex').slice(0, 32);
+  } else {
+    return crypto.createHash('md5')
+      .update(defaultText)
+      .digest('hex');
+  }
+}
 
 function onhandshakestart() {
   debug('onhandshakestart');
@@ -872,9 +887,7 @@ Server.prototype.setOptions = function(options) {
   if (options.sessionIdContext) {
     this.sessionIdContext = options.sessionIdContext;
   } else {
-    this.sessionIdContext = crypto.createHash('md5')
-                                  .update(process.argv.join(' '))
-                                  .digest('hex');
+    this.sessionIdContext = defaultSessionIdContext;
   }
 };