diff options
author | Dr. Stephen Henson <steve@openssl.org> | 2000-07-07 13:24:36 +0000 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2000-07-07 13:24:36 +0000 |
commit | a338e21bd1f1654b9fc90352a45e054be1f947eb (patch) | |
tree | 3b1b06a17133076ff9331dd6a03a9d49570de31a /crypto/asn1/a_bitstr.c | |
parent | 5789f8f780c21696c92e8138ad51afc53fa0d56d (diff) |
New ASN1 functions that just deal with
content octets, not tag+length.
Diffstat (limited to 'crypto/asn1/a_bitstr.c')
-rw-r--r-- | crypto/asn1/a_bitstr.c | 62 |
1 files changed, 45 insertions, 17 deletions
diff --git a/crypto/asn1/a_bitstr.c b/crypto/asn1/a_bitstr.c index f6cadc530a..35fe01d27e 100644 --- a/crypto/asn1/a_bitstr.c +++ b/crypto/asn1/a_bitstr.c @@ -70,13 +70,27 @@ int ASN1_BIT_STRING_set(ASN1_BIT_STRING *x, unsigned char *d, int len) { return M_ASN1_BIT_STRING_set(x, d, len); } int i2d_ASN1_BIT_STRING(ASN1_BIT_STRING *a, unsigned char **pp) +{ + int len, ret; + len = i2c_ASN1_BIT_STRING(a, NULL); + ret=ASN1_object_size(0,len,V_ASN1_BIT_STRING); + if(pp) { + ASN1_put_object(pp,0,ret,V_ASN1_BIT_STRING,V_ASN1_UNIVERSAL); + i2c_ASN1_BIT_STRING(a, pp); + } + return ret; +} + +int i2c_ASN1_BIT_STRING(ASN1_BIT_STRING *a, unsigned char **pp) { - int ret,j,r,bits,len; + int ret,j,bits,len; unsigned char *p,*d; if (a == NULL) return(0); len=a->length; + ret=1+len; + if (pp == NULL) return(ret); if (len > 0) { @@ -104,36 +118,27 @@ int i2d_ASN1_BIT_STRING(ASN1_BIT_STRING *a, unsigned char **pp) } else bits=0; - ret=1+len; - r=ASN1_object_size(0,ret,V_ASN1_BIT_STRING); - if (pp == NULL) return(r); p= *pp; - ASN1_put_object(&p,0,ret,V_ASN1_BIT_STRING,V_ASN1_UNIVERSAL); *(p++)=(unsigned char)bits; d=a->data; memcpy(p,d,len); p+=len; if (len > 0) p[-1]&=(0xff<<bits); *pp=p; - return(r); + return(ret); } + +/* Convert DER encoded ASN1 BIT_STRING to ASN1_BIT_STRING structure */ ASN1_BIT_STRING *d2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, unsigned char **pp, long length) - { - ASN1_BIT_STRING *ret=NULL; - unsigned char *p,*s; +{ + unsigned char *p; long len; - int inf,tag,xclass; int i; - - if ((a == NULL) || ((*a) == NULL)) - { - if ((ret=M_ASN1_BIT_STRING_new()) == NULL) return(NULL); - } - else - ret=(*a); + int inf,tag,xclass; + ASN1_BIT_STRING *ret; p= *pp; inf=ASN1_get_object(&p,&len,&tag,&xclass,length); @@ -149,7 +154,30 @@ ASN1_BIT_STRING *d2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, unsigned char **pp, goto err; } if (len < 1) { i=ASN1_R_STRING_TOO_SHORT; goto err; } + ret = c2i_ASN1_BIT_STRING(a, &p, len); + if(ret) *pp = p; + return ret; +err: + ASN1err(ASN1_F_D2I_ASN1_BIT_STRING,i); + return(NULL); + +} + +ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, unsigned char **pp, + long len) + { + ASN1_BIT_STRING *ret=NULL; + unsigned char *p,*s; + int i; + if ((a == NULL) || ((*a) == NULL)) + { + if ((ret=M_ASN1_BIT_STRING_new()) == NULL) return(NULL); + } + else + ret=(*a); + + p= *pp; i= *(p++); /* We do this to preserve the settings. If we modify * the settings, via the _set_bit function, we will recalculate |