summaryrefslogtreecommitdiffstats
path: root/scan_asn1rawoid.c
blob: d23e93a2b3e8e7b3132a76fcd855de71415c2b50 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "asn1.h"

size_t scan_asn1rawoid(const char* src,const char* max,size_t* array,size_t* arraylen) {
  const char* orig=src;
  size_t cur=0,al;
  if (!arraylen) return 0;
  al=*arraylen; *arraylen=0;
  if (max-src<1) return 0;	/* there has to be at least one octet */

  {
    int a,b;
    a=(unsigned char)*src;
    b=a%40;
    a/=40;
    /* a can be 0, 1 or 2.  And b is <=39 if a is 0 or 1.
     * So, if a is bigger than 2, it is really 2 */
    if (a>2) {
      b+=(a-2)*40;
      a=2;
    }
    if (array && cur+1<al) { array[cur]=a; array[cur+1]=b; }
    cur+=2;
  }

  for (++src; src<max; ) {
    size_t i;
    unsigned long tmp;
    if (!(i=scan_asn1tagint(src,max,&tmp)))
      return 0;
    src+=i;
    if (array && cur<al) array[cur]=tmp;
    ++cur;
  }

  /* if we got this far, then we have an OID, but it might not have fit */
  *arraylen=cur;
  if (cur>al)		/* did not fit */
    return 0;
  return src-orig;
}