#include "bee2/core/der.h"
#include "bee2/core/oid.h"
#include "bee2/core/str.h"
#include "bee2/core/u32.h"
#include "bee2/core/util.h"
bool_t oidIsValid(const char* oid)
{
u32 val = 0;
u32 d1 = 0;
size_t pos = 0;
size_t n = 0;
if (!strIsValid(oid))
return FALSE;
while (1)
{
if (oid[pos] == '.' || oid[pos] == '\0')
{
if (pos == 0 ||
n == 0 && val > 2 ||
n == 1 && d1 < 2 && val >= 40 ||
n == 1 && val > U32_MAX - 40 * d1)
{
n = 0;
break;
}
if (n == 0)
d1 = val;
n++;
if (oid[pos] == '\0')
break;
oid += ++pos, pos = 0, val = 0;
continue;
}
if (oid[pos] < '0' || oid[pos] > '9' ||
pos == 1 && oid[0] == '0' ||
val > U32_MAX / 10 ||
val == U32_MAX / 10 && (u32)(oid[pos] - '0') > U32_MAX % 10)
{
n = 0;
break;
}
val *= 10;
val += oid[pos] - '0';
++pos;
}
CLEAN3(val, d1, pos);
return n >= 2;
}
size_t oidToDER(octet der[], const char* oid)
{
return derOIDEnc(der, oid);
}
size_t oidFromDER(char* oid, const octet der[], size_t count)
{
size_t len, c;
c = derOIDDec(oid, &len, der, count);
if (len == SIZE_MAX || c != count)
return SIZE_MAX;
return len;
}