<p>Vadim Yanitskiy <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10098">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved
  Vadim Yanitskiy: Looks good to me, but someone else must approve

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Move from libc random() to osmo_get_rand_id (2nd attempt)<br><br>When starting multiple mobile in the same second, the libc random number<br>generator will be seeded to exactly the same value.<br><br>The random bits inside the RACH request(s) will be exactly the same<br>across multiple mobile and when the channel fails they all pick the same<br>randomized back-off timing.<br><br>Use stronger random numbers and replace all calls to random(2) with<br>osmo_get_rand_id. Add a fallback to try random().<br><br>[v2: Add helper to make sure the result is int and between 0 and<br>RAND_MAX]<br><br>Change-Id: Icdd4be88c62bba1e9d954568e48f0c12a67ac182<br>---<br>M src/host/layer23/include/osmocom/bb/common/Makefile.am<br>A src/host/layer23/include/osmocom/bb/common/utils.h<br>M src/host/layer23/src/common/Makefile.am<br>A src/host/layer23/src/common/utils.c<br>M src/host/layer23/src/mobile/gsm322.c<br>M src/host/layer23/src/mobile/gsm48_mm.c<br>M src/host/layer23/src/mobile/gsm48_rr.c<br>M src/host/layer23/src/mobile/settings.c<br>8 files changed, 61 insertions(+), 8 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/host/layer23/include/osmocom/bb/common/Makefile.am b/src/host/layer23/include/osmocom/bb/common/Makefile.am</span><br><span>index 945c73d..cd3437e 100644</span><br><span>--- a/src/host/layer23/include/osmocom/bb/common/Makefile.am</span><br><span>+++ b/src/host/layer23/include/osmocom/bb/common/Makefile.am</span><br><span>@@ -1,2 +1,2 @@</span><br><span> noinst_HEADERS = l1ctl.h l1l2_interface.h l23_app.h logging.h \</span><br><span style="color: hsl(0, 100%, 40%);">-             networks.h gps.h sysinfo.h osmocom_data.h</span><br><span style="color: hsl(120, 100%, 40%);">+             networks.h gps.h sysinfo.h osmocom_data.h utils.h</span><br><span>diff --git a/src/host/layer23/include/osmocom/bb/common/utils.h b/src/host/layer23/include/osmocom/bb/common/utils.h</span><br><span>new file mode 100644</span><br><span>index 0000000..8ca61f8</span><br><span>--- /dev/null</span><br><span>+++ b/src/host/layer23/include/osmocom/bb/common/utils.h</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int layer23_random(void);</span><br><span>diff --git a/src/host/layer23/src/common/Makefile.am b/src/host/layer23/src/common/Makefile.am</span><br><span>index 71081c0..b76094c 100644</span><br><span>--- a/src/host/layer23/src/common/Makefile.am</span><br><span>+++ b/src/host/layer23/src/common/Makefile.am</span><br><span>@@ -3,4 +3,4 @@</span><br><span> </span><br><span> noinst_LIBRARIES = liblayer23.a</span><br><span> liblayer23_a_SOURCES = l1ctl.c l1l2_interface.c sap_interface.c \</span><br><span style="color: hsl(0, 100%, 40%);">-        logging.c networks.c sim.c sysinfo.c gps.c l1ctl_lapdm_glue.c</span><br><span style="color: hsl(120, 100%, 40%);">+ logging.c networks.c sim.c sysinfo.c gps.c l1ctl_lapdm_glue.c utils.c</span><br><span>diff --git a/src/host/layer23/src/common/utils.c b/src/host/layer23/src/common/utils.c</span><br><span>new file mode 100644</span><br><span>index 0000000..4ecb134</span><br><span>--- /dev/null</span><br><span>+++ b/src/host/layer23/src/common/utils.c</span><br><span>@@ -0,0 +1,47 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* Utilities used by mobile */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2018 by Holger Hans Peter Freyther</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bb/common/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * A secure replacement for random(3).</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \return a secure random number using osmo_get_rand_id between</span><br><span style="color: hsl(120, 100%, 40%);">+ * 0 and RAND_MAX.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int layer23_random(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned int r;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (osmo_get_rand_id((uint8_t *) &r, sizeof(r)) != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+             return random();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    r &= ~(1U << 31);</span><br><span style="color: hsl(120, 100%, 40%);">+   r %= RAND_MAX;</span><br><span style="color: hsl(120, 100%, 40%);">+        return (int) r;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/host/layer23/src/mobile/gsm322.c b/src/host/layer23/src/mobile/gsm322.c</span><br><span>index c3485b6..3bc8b5c 100644</span><br><span>--- a/src/host/layer23/src/mobile/gsm322.c</span><br><span>+++ b/src/host/layer23/src/mobile/gsm322.c</span><br><span>@@ -31,7 +31,6 @@</span><br><span> #include <osmocom/core/talloc.h></span><br><span> #include <osmocom/core/utils.h></span><br><span> #include <osmocom/gsm/gsm48.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm_utils.h></span><br><span> #include <osmocom/core/signal.h></span><br><span> </span><br><span> #include <osmocom/bb/common/logging.h></span><br><span>@@ -40,6 +39,7 @@</span><br><span> #include <osmocom/bb/common/networks.h></span><br><span> #include <osmocom/bb/mobile/vty.h></span><br><span> #include <osmocom/bb/mobile/app_mobile.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bb/common/utils.h></span><br><span> </span><br><span> #include <l1ctl_proto.h></span><br><span> </span><br><span>@@ -959,7 +959,7 @@</span><br><span>                         entries++;</span><br><span>   }</span><br><span>    while(entries) {</span><br><span style="color: hsl(0, 100%, 40%);">-                move = random() % entries;</span><br><span style="color: hsl(120, 100%, 40%);">+            move = layer23_random() % entries;</span><br><span>           i = 0;</span><br><span>               llist_for_each_entry(temp, &temp_list, entry) {</span><br><span>                  if (rxlev2dbm(temp->rxlev) > -85) {</span><br><span>diff --git a/src/host/layer23/src/mobile/gsm48_mm.c b/src/host/layer23/src/mobile/gsm48_mm.c</span><br><span>index a7af1f5..02d861e 100644</span><br><span>--- a/src/host/layer23/src/mobile/gsm48_mm.c</span><br><span>+++ b/src/host/layer23/src/mobile/gsm48_mm.c</span><br><span>@@ -41,6 +41,7 @@</span><br><span> #include <osmocom/bb/mobile/app_mobile.h></span><br><span> #include <osmocom/bb/mobile/primitives.h></span><br><span> #include <osmocom/bb/mobile/vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bb/common/utils.h></span><br><span> </span><br><span> extern void *l23_ctx;</span><br><span> </span><br><span>@@ -2099,7 +2100,7 @@</span><br><span>                    mm->t3212.timeout.tv_sec = current_time.tv_sec</span><br><span>                            + (t % s->t3212);</span><br><span>                 } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        uint32_t rand = random();</span><br><span style="color: hsl(120, 100%, 40%);">+                     uint32_t rand = layer23_random();</span><br><span> </span><br><span>                        LOGP(DMM, LOGL_INFO, "New T3212 while timer is not "</span><br><span>                               "running (value %d)\n", s->t3212);</span><br><span>diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c</span><br><span>index dd3fe93..c074323 100644</span><br><span>--- a/src/host/layer23/src/mobile/gsm48_rr.c</span><br><span>+++ b/src/host/layer23/src/mobile/gsm48_rr.c</span><br><span>@@ -79,6 +79,7 @@</span><br><span> #include <osmocom/bb/common/networks.h></span><br><span> #include <osmocom/bb/common/l1ctl.h></span><br><span> #include <osmocom/bb/mobile/vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bb/common/utils.h></span><br><span> </span><br><span> #include <l1ctl_proto.h></span><br><span> </span><br><span>@@ -1628,7 +1629,7 @@</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   chan_req = random();</span><br><span style="color: hsl(120, 100%, 40%);">+  chan_req = layer23_random();</span><br><span>         chan_req &= rr->chan_req_mask;</span><br><span>        chan_req |= rr->chan_req_val;</span><br><span> </span><br><span>diff --git a/src/host/layer23/src/mobile/settings.c b/src/host/layer23/src/mobile/settings.c</span><br><span>index 7370b0a..6a7cd81 100644</span><br><span>--- a/src/host/layer23/src/mobile/settings.c</span><br><span>+++ b/src/host/layer23/src/mobile/settings.c</span><br><span>@@ -25,6 +25,7 @@</span><br><span> #include <osmocom/core/talloc.h></span><br><span> </span><br><span> #include <osmocom/bb/mobile/app_mobile.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bb/common/utils.h></span><br><span> #include <osmocom/bb/common/logging.h></span><br><span> #include <osmocom/bb/common/osmocom_data.h></span><br><span> #include <osmocom/bb/common/networks.h></span><br><span>@@ -184,8 +185,8 @@</span><br><span>       if (digits > 15)</span><br><span>          digits = 15;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        sprintf(rand, "%08ld", random() % 100000000);</span><br><span style="color: hsl(0, 100%, 40%);">- sprintf(rand + 8, "%07ld", random() % 10000000);</span><br><span style="color: hsl(120, 100%, 40%);">+    sprintf(rand, "%08d", layer23_random() % 100000000);</span><br><span style="color: hsl(120, 100%, 40%);">+        sprintf(rand + 8, "%07d", layer23_random() % 10000000);</span><br><span> </span><br><span>        strcpy(set->imei + 15 - digits, rand + 15 - digits);</span><br><span>      strncpy(set->imeisv, set->imei, 15);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10098">change 10098</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/10098"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Icdd4be88c62bba1e9d954568e48f0c12a67ac182 </div>
<div style="display:none"> Gerrit-Change-Number: 10098 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: Holger Freyther <holger@freyther.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Holger Freyther <holger@freyther.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>