Skip to content

Commit 471296d

Browse files
committed
Do not use analogRead or ECCX08 to generate random NTP port
1 parent b3f2282 commit 471296d

File tree

2 files changed

+64
-6
lines changed

2 files changed

+64
-6
lines changed

Diff for: src/utility/time/NTPUtils.cpp

+61-6
Original file line numberDiff line numberDiff line change
@@ -90,17 +90,72 @@ void NTPUtils::sendNTPpacket(UDP & udp)
9090
udp.endPacket();
9191
}
9292

93+
#ifdef NTP_USE_RANDOM_PORT
9394
int NTPUtils::getRandomPort(int const min_port, int const max_port)
9495
{
95-
#if defined (BOARD_HAS_ECCX08)
96-
return ECCX08.random(min_port, max_port);
97-
#elif defined (ARDUINO_ARCH_ESP8266) || (ARDUINO_ARCH_ESP32)
96+
#if defined (ARDUINO_ARCH_ESP8266) || (ARDUINO_ARCH_ESP32) || \
97+
(ARDUINO_ARCH_RENESAS) || (ARDUINO_ARCH_MBED)
9898
/* Uses HW Random Number Generator */
99-
return random(min_port, max_port);
99+
#elif defined (ARDUINO_ARCH_SAMD)
100+
/* Use ADC to generate a seed */
101+
randomSeed(adcSeed());
100102
#else
101103
randomSeed(analogRead(0));
102-
return random(min_port, max_port);
103104
#endif
105+
return random(min_port, max_port);
104106
}
105107

106-
#endif /* #ifndef HAS_LORA */
108+
#if defined (ARDUINO_ARCH_SAMD)
109+
unsigned long NTPUtils::adcSeed()
110+
{
111+
uint32_t seed = 0;
112+
uint32_t bitCount = 0;
113+
uint16_t sampctlr = ADC->SAMPCTRL.reg;
114+
115+
// Use lowest sampling time
116+
ADC->SAMPCTRL.reg = 0;
117+
// Enable ADC
118+
ADC->CTRLA.bit.ENABLE = 1;
119+
while (ADC->STATUS.bit.SYNCBUSY == 1);
120+
do {
121+
uint16_t adcReading;
122+
// Start ADC conversion
123+
ADC->SWTRIG.bit.START = 1;
124+
// Wait until ADC conversion is done
125+
while (!(ADC->INTFLAG.bit.RESRDY));
126+
while (ADC->STATUS.bit.SYNCBUSY == 1);
127+
// Get result
128+
adcReading = ADC->RESULT.reg;
129+
// Clear result ready flag
130+
ADC->INTFLAG.reg = ADC_INTFLAG_RESRDY;
131+
while (ADC->STATUS.bit.SYNCBUSY == 1);
132+
// Take least significant bit
133+
uint8_t b0 = adcReading & 0x0001;
134+
ADC->SWTRIG.bit.START = 1;
135+
// Wait until ADC conversion is done
136+
while (!(ADC->INTFLAG.bit.RESRDY));
137+
while (ADC->STATUS.bit.SYNCBUSY == 1);
138+
// Get result
139+
adcReading = ADC->RESULT.reg;
140+
// Clear result ready flag
141+
ADC->INTFLAG.reg = ADC_INTFLAG_RESRDY;
142+
while (ADC->STATUS.bit.SYNCBUSY == 1);
143+
// Take least significant nibble
144+
uint8_t b1 = adcReading & 0x0001;
145+
if (b0 == b1) {
146+
continue;
147+
}
148+
seed |= b0 << bitCount;
149+
bitCount++;
150+
} while(bitCount < 32);
151+
// Disable ADC
152+
ADC->CTRLA.bit.ENABLE = 0;
153+
// restore original sampling time
154+
ADC->SAMPCTRL.reg = sampctlr;
155+
return seed;
156+
}
157+
#endif /* ARDUINO_ARCH_SAMD */
158+
159+
#endif /* NTP_USE_RANDOM_PORT */
160+
161+
#endif /* !HAS_LORA */

Diff for: src/utility/time/NTPUtils.h

+3
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ class NTPUtils
4242
public:
4343

4444
static unsigned long getTime(UDP & udp);
45+
#if NTP_USE_RANDOM_PORT
4546
static int getRandomPort(int const min_port, int const max_port);
47+
#endif
4648

4749
private:
4850

@@ -57,6 +59,7 @@ class NTPUtils
5759
static constexpr const char * NTP_TIME_SERVER = "time.arduino.cc";
5860

5961
static void sendNTPpacket(UDP & udp);
62+
static unsigned long adcSeed();
6063
};
6164

6265
#endif /* #ifndef HAS_LORA */

0 commit comments

Comments
 (0)