@@ -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