<p>Holger Freyther has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10098">View Change</a></p><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/mobile/Makefile.am<br>A src/host/layer23/include/osmocom/bb/mobile/utils.h<br>M src/host/layer23/src/mobile/Makefile.am<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>A src/host/layer23/src/mobile/utils.c<br>8 files changed, 64 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/98/10098/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/host/layer23/include/osmocom/bb/mobile/Makefile.am b/src/host/layer23/include/osmocom/bb/mobile/Makefile.am</span><br><span>index 12cf24b..d2b4f2a 100644</span><br><span>--- a/src/host/layer23/include/osmocom/bb/mobile/Makefile.am</span><br><span>+++ b/src/host/layer23/include/osmocom/bb/mobile/Makefile.am</span><br><span>@@ -1,3 +1,3 @@</span><br><span> noinst_HEADERS = gsm322.h gsm480_ss.h gsm411_sms.h gsm48_cc.h gsm48_mm.h \</span><br><span>                gsm48_rr.h mncc.h settings.h subscriber.h support.h \</span><br><span style="color: hsl(0, 100%, 40%);">-           transaction.h vty.h mncc_sock.h primitives.h</span><br><span style="color: hsl(120, 100%, 40%);">+          transaction.h vty.h mncc_sock.h primitives.h utils.h</span><br><span>diff --git a/src/host/layer23/include/osmocom/bb/mobile/utils.h b/src/host/layer23/include/osmocom/bb/mobile/utils.h</span><br><span>new file mode 100644</span><br><span>index 0000000..30f09ff</span><br><span>--- /dev/null</span><br><span>+++ b/src/host/layer23/include/osmocom/bb/mobile/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 mobile_random(void);</span><br><span>diff --git a/src/host/layer23/src/mobile/Makefile.am b/src/host/layer23/src/mobile/Makefile.am</span><br><span>index 4e80e4e..f541565 100644</span><br><span>--- a/src/host/layer23/src/mobile/Makefile.am</span><br><span>+++ b/src/host/layer23/src/mobile/Makefile.am</span><br><span>@@ -5,7 +5,7 @@</span><br><span> noinst_LIBRARIES = libmobile.a</span><br><span> libmobile_a_SOURCES = gsm322.c gsm480_ss.c gsm411_sms.c gsm48_cc.c gsm48_mm.c \</span><br><span>  gsm48_rr.c mnccms.c settings.c subscriber.c support.c \</span><br><span style="color: hsl(0, 100%, 40%);">- transaction.c vty_interface.c voice.c mncc_sock.c primitives.c</span><br><span style="color: hsl(120, 100%, 40%);">+        transaction.c vty_interface.c voice.c mncc_sock.c primitives.c utils.c</span><br><span> </span><br><span> bin_PROGRAMS = mobile</span><br><span> </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..f49b97d 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>@@ -40,6 +40,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/mobile/utils.h></span><br><span> </span><br><span> #include <l1ctl_proto.h></span><br><span> </span><br><span>@@ -959,7 +960,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 = mobile_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..c7cea65 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>@@ -30,6 +30,7 @@</span><br><span> #include <osmocom/core/utils.h></span><br><span> #include <osmocom/gsm/gsm48.h></span><br><span> #include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm_utils.h></span><br><span> </span><br><span> #include <osmocom/bb/common/logging.h></span><br><span> #include <osmocom/bb/common/osmocom_data.h></span><br><span>@@ -41,6 +42,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/mobile/utils.h></span><br><span> </span><br><span> extern void *l23_ctx;</span><br><span> </span><br><span>@@ -2099,7 +2101,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 = mobile_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..5921c76 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>@@ -71,6 +71,7 @@</span><br><span> #include <osmocom/gsm/rsl.h></span><br><span> #include <osmocom/gsm/gsm48.h></span><br><span> #include <osmocom/core/bitvec.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm_utils.h></span><br><span> </span><br><span> #include <osmocom/bb/common/osmocom_data.h></span><br><span> #include <osmocom/bb/common/l1l2_interface.h></span><br><span>@@ -79,6 +80,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/mobile/utils.h></span><br><span> </span><br><span> #include <l1ctl_proto.h></span><br><span> </span><br><span>@@ -1628,7 +1630,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 = mobile_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..908b4b4 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>@@ -23,8 +23,10 @@</span><br><span> #include <errno.h></span><br><span> #include <string.h></span><br><span> #include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm_utils.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/mobile/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 +186,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", mobile_random() % 100000000);</span><br><span style="color: hsl(120, 100%, 40%);">+ sprintf(rand + 8, "%07d", mobile_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>diff --git a/src/host/layer23/src/mobile/utils.c b/src/host/layer23/src/mobile/utils.c</span><br><span>new file mode 100644</span><br><span>index 0000000..50a7f54</span><br><span>--- /dev/null</span><br><span>+++ b/src/host/layer23/src/mobile/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/mobile/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 mobile_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></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: newchange </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: 1 </div>
<div style="display:none"> Gerrit-Owner: Holger Freyther <holger@freyther.de> </div>