Skip to content

Commit d590a68

Browse files
authored
Merge pull request #18 from patricklaf/patricklaf-fix-oid
Fix OID
2 parents 658afd0 + 0867ed3 commit d590a68

1 file changed

Lines changed: 28 additions & 6 deletions

File tree

src/BER.h

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -906,7 +906,16 @@ class BER: public Base {
906906
uint8_t* encodeNumeric(T value, uint8_t *buffer) {
907907
uint8_t *pointer = BER::encode(buffer);
908908
for (uint8_t index = 0; index < _length; ++index) {
909+
#if ARDUINO_ARCH_ESP32
910+
uint8_t shift = _length - index - 1;
911+
if (shift == sizeof(T)) {
912+
*pointer++ = 0;
913+
} else {
914+
*pointer++ = value >> (shift << 3);
915+
}
916+
#else
909917
*pointer++ = value >> ((_length - index - 1) << 3);
918+
#endif
910919
}
911920
return pointer;
912921
}
@@ -1482,6 +1491,7 @@ class NullBER: public BER {
14821491
*
14831492
* | Object Identifier | Encoding |
14841493
* |:-----------------------------|:---------------------------------------------|
1494+
* | 1 | 06 01 01 |
14851495
* | 1.3.6.1.2.1.2.2.1.8.4096 | 06 0B 2B 06 01 02 01 02 02 01 08 A0 00 |
14861496
* | 1.3.6.1.4.1.54858.81.1.1.1.0 | 06 0D 2B 06 01 04 01 83 AC 4A 51 01 01 01 00 |
14871497
*/
@@ -1517,12 +1527,18 @@ class ObjectIdentifierBER: public BER {
15171527
BER::encode(stream);
15181528
char *token = const_cast<char*>(_value.c_str());
15191529
while (token != NULL) {
1530+
char *next = strchr(token + 1, '.');
15201531
switch (index) {
15211532
case 0:
15221533
subidentifier = atoi(token);
1523-
break;
1534+
if (next) {
1535+
break;
1536+
}
1537+
// No break
15241538
case 1:
1525-
subidentifier = subidentifier * 40 + atoi(++token);
1539+
if (index) {
1540+
subidentifier = subidentifier * 40 + atoi(++token);
1541+
}
15261542
stream.write(subidentifier);
15271543
_size++;
15281544
break;
@@ -1540,7 +1556,7 @@ class ObjectIdentifierBER: public BER {
15401556
}
15411557
break;
15421558
}
1543-
token = strchr(token, '.');
1559+
token = next;
15441560
index++;
15451561
}
15461562
}
@@ -1594,12 +1610,18 @@ class ObjectIdentifierBER: public BER {
15941610
uint8_t *pointer = BER::encode(buffer);
15951611
char *token = const_cast<char*>(_value.c_str());
15961612
while (token != NULL) {
1613+
char *next = strchr(token + 1, '.');
15971614
switch (index) {
15981615
case 0:
15991616
subidentifier = atoi(token);
1600-
break;
1617+
if (next) {
1618+
break;
1619+
}
1620+
// No break
16011621
case 1:
1622+
if (index) {
16021623
subidentifier = subidentifier * 40 + atoi(++token);
1624+
}
16031625
*pointer = subidentifier;
16041626
break;
16051627
;
@@ -1616,7 +1638,7 @@ class ObjectIdentifierBER: public BER {
16161638
}
16171639
break;
16181640
}
1619-
token = strchr(token, '.');
1641+
token = next;
16201642
index++;
16211643
}
16221644
return ++pointer;
@@ -1679,10 +1701,10 @@ class ObjectIdentifierBER: public BER {
16791701
switch (index) {
16801702
case 0:
16811703
subidentifier = atoi(token);
1704+
_length++;
16821705
break;
16831706
case 1:
16841707
subidentifier = subidentifier * 40 + atoi(++token);
1685-
_length++;
16861708
break;
16871709
default: {
16881710
subidentifier = atol(++token);

0 commit comments

Comments
 (0)