Files
mars-tinyldap/scan_asn1oid.c
leitner 41df4dbaeb add unit tests for scan_ldap*
add return 0 to unit tests for scan_asn1*
2023-09-16 09:19:19 +00:00

58 lines
1.9 KiB
C

#include "asn1.h"
/* This isn't actually used in LDAP.
* This is here for X.509 certificate parsing code. */
size_t scan_asn1oid(const char* src,const char* max,size_t* array,size_t* arraylen) {
size_t res,tlen;
unsigned long tag,tmp;
enum asn1_tagclass tc;
enum asn1_tagtype tt;
if (!arraylen)
return 0;
if (!(res=scan_asn1tag(src,max,&tc,&tt,&tag)) ||
(tc!=UNIVERSAL || tt!=PRIMITIVE || tag!=OBJECT_IDENTIFIER) ||
!(tmp=scan_asn1length(src+res,max,&tlen)) || tlen<1) {
*arraylen=0;
return 0;
}
res+=tmp;
if (max>src+res+tlen)
max=src+res+tlen; /* clamp max down */
src+=res;
tmp=scan_asn1rawoid(src,max,array,arraylen);
return tmp ? tmp+res : 0;
}
#ifdef UNITTEST
#include <string.h>
#include <assert.h>
#undef UNITTEST
#include "scan_asn1tag.c"
#include "scan_asn1tagint.c"
#include "scan_asn1length.c"
#include "scan_asn1rawoid.c"
int main() {
char buf[100];
size_t retval[10];
size_t retvals=10;
strcpy(buf,"\x06\x03\x55\x04\x03"); // \x06 = UNIVERSAL PRIMITIVE OBJECT_IDENTIFIER, 0x03 = length, \x55\x04\x03 = 2.5.4.3 (commonName)
assert(scan_asn1oid(buf,buf+5,retval,&retvals)==5 && retvals==4 && retval[0]==2 && retval[1]==5 && retval[2]==4 && retval[3]==3);
assert(scan_asn1oid(buf,buf+5,retval,NULL)==0); // trigger line 12
assert(scan_asn1oid(buf,buf,retval,&retvals)==0); // trigger line 13
buf[0]=0x05; // wrong tag (NULL instead of OBJECT_IDENTIFIER)
assert(scan_asn1oid(buf,buf+5,retval,&retvals)==0); // trigger line 14
buf[0]=0x06;
assert(scan_asn1oid(buf,buf+1,retval,&retvals)==0); // trigger line 15
buf[1]=0; // send length 0 (OIDs must have at least 1)
assert(scan_asn1oid(buf,buf+5,retval,&retvals)==0); // trigger line 15
buf[1]=3;
assert(scan_asn1oid(buf,buf+6,retval,&retvals)==0); // trigger line 21
// we only care for 100% coverage of this file, the others have their own unit tests */
return 0;
}
#endif