Use inline functions to convert buffer data to scalars.

* include/host2net.h (buf16_to_ulong, buf16_to_uint): New.
(buf16_to_ushort, buf16_to_u16): New.
(buf32_to_size_t, buf32_to_ulong, buf32_to_uint, buf32_to_u32): New.
--

This fixes sign extension on shift problems.  Hanno Böck found a case
with an invalid read due to this problem.  To fix that almost all uses
of "<< 24" and "<< 8" are changed by this patch to use an inline
function from host2net.h.

(back ported from commit 2183683bd6)

Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2015-02-12 20:34:44 +01:00
parent b62395cf59
commit 3627123dc8
20 changed files with 310 additions and 275 deletions

View File

@ -42,6 +42,7 @@
#include "util.h" #include "util.h"
#include "sysutils.h" #include "sysutils.h"
#include "../include/host2net.h"
#include "iobuf.h" #include "iobuf.h"
/*-- Begin configurable part. --*/ /*-- Begin configurable part. --*/
@ -872,7 +873,7 @@ block_filter (void *opaque, int control, iobuf_t chain, byte * buffer,
} }
else if (c == 255) else if (c == 255)
{ {
a->size = iobuf_get (chain) << 24; a->size = (size_t)iobuf_get (chain) << 24;
a->size |= iobuf_get (chain) << 16; a->size |= iobuf_get (chain) << 16;
a->size |= iobuf_get (chain) << 8; a->size |= iobuf_get (chain) << 8;
if ((c = iobuf_get (chain)) == -1) if ((c = iobuf_get (chain)) == -1)

View File

@ -33,6 +33,7 @@
#include "cipher.h" #include "cipher.h"
#include "i18n.h" #include "i18n.h"
#include "options.h" #include "options.h"
#include "../include/host2net.h"
static int do_user_id( IOBUF out, int ctb, PKT_user_id *uid ); static int do_user_id( IOBUF out, int ctb, PKT_user_id *uid );
static int do_public_key( IOBUF out, int ctb, PKT_public_key *pk ); static int do_public_key( IOBUF out, int ctb, PKT_public_key *pk );
@ -632,8 +633,7 @@ delete_sig_subpkt (subpktarea_t *area, sigsubpkttype_t reqtype )
if( n == 255 ) { if( n == 255 ) {
if( buflen < 4 ) if( buflen < 4 )
break; break;
n = (buffer[0] << 24) | (buffer[1] << 16) n = buf32_to_size_t (buffer);
| (buffer[2] << 8) | buffer[3];
buffer += 4; buffer += 4;
buflen -= 4; buflen -= 4;
} }
@ -756,7 +756,7 @@ build_sig_subpkt (PKT_signature *sig, sigsubpkttype_t type,
/* This should never happen since we don't currently allow /* This should never happen since we don't currently allow
creating such a subpacket, but just in case... */ creating such a subpacket, but just in case... */
case SIGSUBPKT_SIG_EXPIRE: case SIGSUBPKT_SIG_EXPIRE:
if(buffer_to_u32(buffer)+sig->timestamp<=make_timestamp()) if (buf32_to_u32 (buffer) + sig->timestamp <= make_timestamp())
sig->flags.expired=1; sig->flags.expired=1;
else else
sig->flags.expired=0; sig->flags.expired=0;

View File

@ -35,6 +35,7 @@
#include "trustdb.h" #include "trustdb.h"
#include "i18n.h" #include "i18n.h"
#include "keyserver-internal.h" #include "keyserver-internal.h"
#include "../include/host2net.h"
#define MAX_PK_CACHE_ENTRIES PK_UID_CACHE_SIZE #define MAX_PK_CACHE_ENTRIES PK_UID_CACHE_SIZE
#define MAX_UID_CACHE_ENTRIES PK_UID_CACHE_SIZE #define MAX_UID_CACHE_ENTRIES PK_UID_CACHE_SIZE
@ -1486,14 +1487,14 @@ merge_keys_and_selfsig( KBNODE keyblock )
p = parse_sig_subpkt( sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL ); p = parse_sig_subpkt( sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL );
if( pk ) { if( pk ) {
ed = p? pk->timestamp + buffer_to_u32(p):0; ed = p? pk->timestamp + buf32_to_u32(p):0;
if( sig->timestamp > sigdate ) { if( sig->timestamp > sigdate ) {
pk->expiredate = ed; pk->expiredate = ed;
sigdate = sig->timestamp; sigdate = sig->timestamp;
} }
} }
else { else {
ed = p? sk->timestamp + buffer_to_u32(p):0; ed = p? sk->timestamp + buf32_to_u32(p):0;
if( sig->timestamp > sigdate ) { if( sig->timestamp > sigdate ) {
sk->expiredate = ed; sk->expiredate = ed;
sigdate = sig->timestamp; sigdate = sig->timestamp;
@ -1618,8 +1619,8 @@ fixup_uidnode ( KBNODE uidnode, KBNODE signode, u32 keycreated )
/* ditto for the key expiration */ /* ditto for the key expiration */
p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL); p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL);
if( p && buffer_to_u32(p) ) if( p && buf32_to_u32 (p) )
uid->help_key_expire = keycreated + buffer_to_u32(p); uid->help_key_expire = keycreated + buf32_to_u32(p);
else else
uid->help_key_expire = 0; uid->help_key_expire = 0;
@ -1833,9 +1834,9 @@ merge_selfsigs_main(KBNODE keyblock, int *r_revoked, struct revoke_info *rinfo)
key_usage=parse_key_usage(sig); key_usage=parse_key_usage(sig);
p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL); p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL);
if( p && buffer_to_u32(p) ) if( p && buf32_to_u32 (p) )
{ {
key_expire = keytimestamp + buffer_to_u32(p); key_expire = keytimestamp + buf32_to_u32 (p);
key_expire_seen = 1; key_expire_seen = 1;
} }
@ -2257,8 +2258,8 @@ merge_selfsigs_subkey( KBNODE keyblock, KBNODE subnode )
subpk->pubkey_usage = key_usage; subpk->pubkey_usage = key_usage;
p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL); p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL);
if ( p && buffer_to_u32(p) ) if ( p && buf32_to_u32 (p) )
key_expire = keytimestamp + buffer_to_u32(p); key_expire = keytimestamp + buf32_to_u32 (p);
else else
key_expire = 0; key_expire = 0;
subpk->has_expired = key_expire >= curtime? 0 : key_expire; subpk->has_expired = key_expire >= curtime? 0 : key_expire;

View File

@ -42,6 +42,7 @@
#include "i18n.h" #include "i18n.h"
#include "keyserver-internal.h" #include "keyserver-internal.h"
#include "call-agent.h" #include "call-agent.h"
#include "host2net.h"
/* The default algorithms. If you change them remember to change them /* The default algorithms. If you change them remember to change them
also in gpg.c:gpgconf_list. You should also check that the value also in gpg.c:gpgconf_list. You should also check that the value
@ -849,10 +850,7 @@ make_backsig (PKT_signature *sig,PKT_public_key *pk,
} }
else if(buf[1]==255) else if(buf[1]==255)
{ {
pktlen =buf[2] << 24; pktlen = buf32_to_size_t (buf+2);
pktlen|=buf[3] << 16;
pktlen|=buf[4] << 8;
pktlen|=buf[5];
buf+=6; buf+=6;
} }
else else
@ -869,14 +867,14 @@ make_backsig (PKT_signature *sig,PKT_public_key *pk,
break; break;
case 2: case 2:
pktlen =buf[mark++] << 24; pktlen = (size_t)buf[mark++] << 24;
pktlen|=buf[mark++] << 16; pktlen |= buf[mark++] << 16;
case 1: case 1:
pktlen|=buf[mark++] << 8; pktlen |= buf[mark++] << 8;
case 0: case 0:
pktlen|=buf[mark++]; pktlen |= buf[mark++];
} }
buf+=mark; buf+=mark;

View File

@ -34,6 +34,7 @@
#include "keydb.h" #include "keydb.h"
#include "i18n.h" #include "i18n.h"
#include "rmd160.h" #include "rmd160.h"
#include "host2net.h"
int int
pubkey_letter( int algo ) pubkey_letter( int algo )
@ -175,9 +176,9 @@ v3_keyid (gcry_mpi_t a, u32 *ki)
else else
{ {
p = buffer + nbytes - 8; p = buffer + nbytes - 8;
ki[0] = (p[0] << 24) | (p[1] <<16) | (p[2] << 8) | p[3]; ki[0] = buf32_to_u32 (p);
p += 4; p += 4;
ki[1] = (p[0] << 24) | (p[1] <<16) | (p[2] << 8) | p[3]; ki[1] = buf32_to_u32 (p);
} }
xfree (buffer); xfree (buffer);
return ki[1]; return ki[1];
@ -271,15 +272,8 @@ keystr_from_desc(KEYDB_SEARCH_DESC *desc)
{ {
u32 keyid[2]; u32 keyid[2];
keyid[0] = ((unsigned char)desc->u.fpr[12] << 24 keyid[0] = buf32_to_u32 (desc->u.fpr+12);
| (unsigned char)desc->u.fpr[13] << 16 keyid[1] = buf32_to_u32 (desc->u.fpr+16);
| (unsigned char)desc->u.fpr[14] << 8
| (unsigned char)desc->u.fpr[15]);
keyid[1] = ((unsigned char)desc->u.fpr[16] << 24
| (unsigned char)desc->u.fpr[17] << 16
| (unsigned char)desc->u.fpr[18] << 8
| (unsigned char)desc->u.fpr[19]);
return keystr(keyid); return keystr(keyid);
} }
@ -331,8 +325,8 @@ keyid_from_sk( PKT_secret_key *sk, u32 *keyid )
if(md) if(md)
{ {
dp = gcry_md_read (md, 0); dp = gcry_md_read (md, 0);
keyid[0] = dp[12] << 24 | dp[13] << 16 | dp[14] << 8 | dp[15] ; keyid[0] = buf32_to_u32 (dp+12);
keyid[1] = dp[16] << 24 | dp[17] << 16 | dp[18] << 8 | dp[19] ; keyid[1] = buf32_to_u32 (dp+16);
lowbits = keyid[1]; lowbits = keyid[1];
gcry_md_close (md); gcry_md_close (md);
sk->keyid[0] = keyid[0]; sk->keyid[0] = keyid[0];
@ -386,8 +380,8 @@ keyid_from_pk( PKT_public_key *pk, u32 *keyid )
if(md) if(md)
{ {
dp = gcry_md_read ( md, 0 ); dp = gcry_md_read ( md, 0 );
keyid[0] = dp[12] << 24 | dp[13] << 16 | dp[14] << 8 | dp[15] ; keyid[0] = buf32_to_u32 (dp+12);
keyid[1] = dp[16] << 24 | dp[17] << 16 | dp[18] << 8 | dp[19] ; keyid[1] = buf32_to_u32 (dp+16);
lowbits = keyid[1]; lowbits = keyid[1];
gcry_md_close (md); gcry_md_close (md);
pk->keyid[0] = keyid[0]; pk->keyid[0] = keyid[0];
@ -430,8 +424,8 @@ keyid_from_fingerprint( const byte *fprint, size_t fprint_len, u32 *keyid )
} }
else { else {
const byte *dp = fprint; const byte *dp = fprint;
keyid[0] = dp[12] << 24 | dp[13] << 16 | dp[14] << 8 | dp[15] ; keyid[0] = buf32_to_u32 (dp+12);
keyid[1] = dp[16] << 24 | dp[17] << 16 | dp[18] << 8 | dp[19] ; keyid[1] = buf32_to_u32 (dp+16);
} }
return keyid[1]; return keyid[1];
@ -721,8 +715,8 @@ fingerprint_from_pk( PKT_public_key *pk, byte *array, size_t *ret_len )
if (!array) if (!array)
array = xmalloc ( len ); array = xmalloc ( len );
memcpy (array, dp, len ); memcpy (array, dp, len );
pk->keyid[0] = dp[12] << 24 | dp[13] << 16 | dp[14] << 8 | dp[15] ; pk->keyid[0] = buf32_to_u32 (dp+12);
pk->keyid[1] = dp[16] << 24 | dp[17] << 16 | dp[18] << 8 | dp[19] ; pk->keyid[1] = buf32_to_u32 (dp+16);
gcry_md_close( md); gcry_md_close( md);
} }

View File

@ -77,7 +77,6 @@ int is_secured_filename (const char *fname);
u16 checksum_u16( unsigned n ); u16 checksum_u16( unsigned n );
u16 checksum( byte *p, unsigned n ); u16 checksum( byte *p, unsigned n );
u16 checksum_mpi( gcry_mpi_t a ); u16 checksum_mpi( gcry_mpi_t a );
u32 buffer_to_u32( const byte *buffer );
const byte *get_session_marker( size_t *rlen ); const byte *get_session_marker( size_t *rlen );
void print_pubkey_algo_note( int algo ); void print_pubkey_algo_note( int algo );
void print_cipher_algo_note( int algo ); void print_cipher_algo_note( int algo );

View File

@ -276,17 +276,6 @@ checksum_mpi (gcry_mpi_t a)
return csum; return csum;
} }
u32
buffer_to_u32( const byte *buffer )
{
unsigned long a;
a = *buffer << 24;
a |= buffer[1] << 16;
a |= buffer[2] << 8;
a |= buffer[3];
return a;
}
void void
print_pubkey_algo_note( int algo ) print_pubkey_algo_note( int algo )
{ {

View File

@ -34,6 +34,7 @@
#include "options.h" #include "options.h"
#include "main.h" #include "main.h"
#include "i18n.h" #include "i18n.h"
#include "host2net.h"
/* Maximum length of packets to avoid excessive memory allocation. */ /* Maximum length of packets to avoid excessive memory allocation. */
@ -90,7 +91,7 @@ static unsigned short
read_16(IOBUF inp) read_16(IOBUF inp)
{ {
unsigned short a; unsigned short a;
a = iobuf_get_noeof(inp) << 8; a = (unsigned short)iobuf_get_noeof(inp) << 8;
a |= iobuf_get_noeof(inp); a |= iobuf_get_noeof(inp);
return a; return a;
} }
@ -99,7 +100,7 @@ static unsigned long
read_32(IOBUF inp) read_32(IOBUF inp)
{ {
unsigned long a; unsigned long a;
a = iobuf_get_noeof(inp) << 24; a = (unsigned long)iobuf_get_noeof(inp) << 24;
a |= iobuf_get_noeof(inp) << 16; a |= iobuf_get_noeof(inp) << 16;
a |= iobuf_get_noeof(inp) << 8; a |= iobuf_get_noeof(inp) << 8;
a |= iobuf_get_noeof(inp); a |= iobuf_get_noeof(inp);
@ -457,7 +458,8 @@ parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos,
} }
else if( c == 255 ) else if( c == 255 )
{ {
pktlen = (hdr[hdrlen++] = iobuf_get_noeof(inp)) << 24; pktlen =
(unsigned long)(hdr[hdrlen++] = iobuf_get_noeof(inp)) << 24;
pktlen |= (hdr[hdrlen++] = iobuf_get_noeof(inp)) << 16; pktlen |= (hdr[hdrlen++] = iobuf_get_noeof(inp)) << 16;
pktlen |= (hdr[hdrlen++] = iobuf_get_noeof(inp)) << 8; pktlen |= (hdr[hdrlen++] = iobuf_get_noeof(inp)) << 8;
if( (c = iobuf_get(inp)) == -1 ) if( (c = iobuf_get(inp)) == -1 )
@ -954,14 +956,15 @@ dump_sig_subpkt( int hashed, int type, int critical,
switch( type ) { switch( type ) {
case SIGSUBPKT_SIG_CREATED: case SIGSUBPKT_SIG_CREATED:
if( length >= 4 ) if( length >= 4 )
fprintf (listfp, "sig created %s", strtimestamp( buffer_to_u32(buffer) ) ); fprintf (listfp, "sig created %s",
strtimestamp (buf32_to_u32(buffer)) );
break; break;
case SIGSUBPKT_SIG_EXPIRE: case SIGSUBPKT_SIG_EXPIRE:
if( length >= 4 ) if( length >= 4 )
{ {
if(buffer_to_u32(buffer)) if(buf32_to_u32(buffer))
fprintf (listfp, "sig expires after %s", fprintf (listfp, "sig expires after %s",
strtimevalue( buffer_to_u32(buffer) ) ); strtimevalue( buf32_to_u32(buffer) ) );
else else
fprintf (listfp, "sig does not expire"); fprintf (listfp, "sig does not expire");
} }
@ -993,9 +996,9 @@ dump_sig_subpkt( int hashed, int type, int critical,
case SIGSUBPKT_KEY_EXPIRE: case SIGSUBPKT_KEY_EXPIRE:
if( length >= 4 ) if( length >= 4 )
{ {
if(buffer_to_u32(buffer)) if(buf32_to_u32(buffer))
fprintf (listfp, "key expires after %s", fprintf (listfp, "key expires after %s",
strtimevalue( buffer_to_u32(buffer) ) ); strtimevalue( buf32_to_u32(buffer) ) );
else else
fprintf (listfp, "key does not expire"); fprintf (listfp, "key does not expire");
} }
@ -1018,8 +1021,8 @@ dump_sig_subpkt( int hashed, int type, int critical,
case SIGSUBPKT_ISSUER: case SIGSUBPKT_ISSUER:
if( length >= 8 ) if( length >= 8 )
fprintf (listfp, "issuer key ID %08lX%08lX", fprintf (listfp, "issuer key ID %08lX%08lX",
(ulong)buffer_to_u32(buffer), buf32_to_ulong (buffer),
(ulong)buffer_to_u32(buffer+4) ); buf32_to_ulong (buffer+4));
break; break;
case SIGSUBPKT_NOTATION: case SIGSUBPKT_NOTATION:
{ {
@ -1267,8 +1270,7 @@ enum_sig_subpkt( const subpktarea_t *pktbuf, sigsubpkttype_t reqtype,
if( n == 255 ) { /* 4 byte length header */ if( n == 255 ) { /* 4 byte length header */
if( buflen < 4 ) if( buflen < 4 )
goto too_short; goto too_short;
n = (buffer[0] << 24) | (buffer[1] << 16) n = buf32_to_size_t (buffer);
| (buffer[2] << 8) | buffer[3];
buffer += 4; buffer += 4;
buflen -= 4; buflen -= 4;
} }
@ -1491,7 +1493,7 @@ parse_signature( IOBUF inp, int pkttype, unsigned long pktlen,
p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_SIG_CREATED, NULL ); p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_SIG_CREATED, NULL );
if(p) if(p)
sig->timestamp = buffer_to_u32(p); sig->timestamp = buf32_to_u32 (p);
else if(!(sig->pubkey_algo>=100 && sig->pubkey_algo<=110) else if(!(sig->pubkey_algo>=100 && sig->pubkey_algo<=110)
&& opt.verbose) && opt.verbose)
log_info ("signature packet without timestamp\n"); log_info ("signature packet without timestamp\n");
@ -1499,16 +1501,16 @@ parse_signature( IOBUF inp, int pkttype, unsigned long pktlen,
p = parse_sig_subpkt2( sig, SIGSUBPKT_ISSUER, NULL ); p = parse_sig_subpkt2( sig, SIGSUBPKT_ISSUER, NULL );
if(p) if(p)
{ {
sig->keyid[0] = buffer_to_u32(p); sig->keyid[0] = buf32_to_u32 (p);
sig->keyid[1] = buffer_to_u32(p+4); sig->keyid[1] = buf32_to_u32 (p+4);
} }
else if(!(sig->pubkey_algo>=100 && sig->pubkey_algo<=110) else if(!(sig->pubkey_algo>=100 && sig->pubkey_algo<=110)
&& opt.verbose) && opt.verbose)
log_info ("signature packet without keyid\n"); log_info ("signature packet without keyid\n");
p=parse_sig_subpkt(sig->hashed,SIGSUBPKT_SIG_EXPIRE,NULL); p=parse_sig_subpkt(sig->hashed,SIGSUBPKT_SIG_EXPIRE,NULL);
if(p && buffer_to_u32(p)) if(p && buf32_to_u32 (p))
sig->expiredate=sig->timestamp+buffer_to_u32(p); sig->expiredate = sig->timestamp + buf32_to_u32 (p);
if(sig->expiredate && sig->expiredate<=make_timestamp()) if(sig->expiredate && sig->expiredate<=make_timestamp())
sig->flags.expired=1; sig->flags.expired=1;
@ -2109,9 +2111,8 @@ parse_attribute_subpkts(PKT_user_id *uid)
if( n == 255 ) { /* 4 byte length header */ if( n == 255 ) { /* 4 byte length header */
if( buflen < 4 ) if( buflen < 4 )
goto too_short; goto too_short;
n = (buffer[0] << 24) | (buffer[1] << 16) n = buf32_to_size_t (buffer);
| (buffer[2] << 8) | buffer[3]; buffer += 4;
buffer += 4;
buflen -= 4; buflen -= 4;
} }
else if( n >= 192 ) { /* 2 byte special encoded length header */ else if( n >= 192 ) { /* 2 byte special encoded length header */

View File

@ -1223,13 +1223,13 @@ tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected )
rec->r.ver.trust_model = *p++; rec->r.ver.trust_model = *p++;
rec->r.ver.min_cert_level = *p++; rec->r.ver.min_cert_level = *p++;
p += 2; p += 2;
rec->r.ver.created = buftoulong(p); p += 4; rec->r.ver.created = buf32_to_ulong (p); p += 4;
rec->r.ver.nextcheck = buftoulong(p); p += 4; rec->r.ver.nextcheck = buf32_to_ulong (p); p += 4;
p += 4; p += 4;
p += 4; p += 4;
rec->r.ver.firstfree =buftoulong(p); p += 4; rec->r.ver.firstfree =buf32_to_ulong (p); p += 4;
p += 4; p += 4;
rec->r.ver.trusthashtbl =buftoulong(p); p += 4; rec->r.ver.trusthashtbl =buf32_to_ulong (p); p += 4;
if( recnum ) { if( recnum ) {
log_error( _("%s: version record with recnum %lu\n"), db_name, log_error( _("%s: version record with recnum %lu\n"), db_name,
(ulong)recnum ); (ulong)recnum );
@ -1242,17 +1242,17 @@ tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected )
} }
break; break;
case RECTYPE_FREE: case RECTYPE_FREE:
rec->r.free.next = buftoulong(p); p += 4; rec->r.free.next = buf32_to_ulong (p); p += 4;
break; break;
case RECTYPE_HTBL: case RECTYPE_HTBL:
for(i=0; i < ITEMS_PER_HTBL_RECORD; i++ ) { for(i=0; i < ITEMS_PER_HTBL_RECORD; i++ ) {
rec->r.htbl.item[i] = buftoulong(p); p += 4; rec->r.htbl.item[i] = buf32_to_ulong (p); p += 4;
} }
break; break;
case RECTYPE_HLST: case RECTYPE_HLST:
rec->r.hlst.next = buftoulong(p); p += 4; rec->r.hlst.next = buf32_to_ulong (p); p += 4;
for(i=0; i < ITEMS_PER_HLST_RECORD; i++ ) { for(i=0; i < ITEMS_PER_HLST_RECORD; i++ ) {
rec->r.hlst.rnum[i] = buftoulong(p); p += 4; rec->r.hlst.rnum[i] = buf32_to_ulong (p); p += 4;
} }
break; break;
case RECTYPE_TRUST: case RECTYPE_TRUST:
@ -1261,12 +1261,12 @@ tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected )
rec->r.trust.depth = *p++; rec->r.trust.depth = *p++;
rec->r.trust.min_ownertrust = *p++; rec->r.trust.min_ownertrust = *p++;
p++; p++;
rec->r.trust.validlist = buftoulong(p); p += 4; rec->r.trust.validlist = buf32_to_ulong (p); p += 4;
break; break;
case RECTYPE_VALID: case RECTYPE_VALID:
memcpy( rec->r.valid.namehash, p, 20); p+=20; memcpy( rec->r.valid.namehash, p, 20); p+=20;
rec->r.valid.validity = *p++; rec->r.valid.validity = *p++;
rec->r.valid.next = buftoulong(p); p += 4; rec->r.valid.next = buf32_to_ulong (p); p += 4;
rec->r.valid.full_count = *p++; rec->r.valid.full_count = *p++;
rec->r.valid.marginal_count = *p++; rec->r.valid.marginal_count = *p++;
break; break;

View File

@ -1629,7 +1629,7 @@ mark_usable_uid_certs (KBNODE keyblock, KBNODE uidnode,
u32 expire; u32 expire;
p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_SIG_EXPIRE, NULL ); p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_SIG_EXPIRE, NULL );
expire = p? sig->timestamp + buffer_to_u32(p) : 0; expire = p? sig->timestamp + buf32_to_u32 (p) : 0;
if (expire==0 || expire > curtime ) if (expire==0 || expire > curtime )
{ {

View File

@ -1,14 +1,24 @@
/* host2net.h - Some macros /* host2net.h - Endian conversion macros
* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. * Copyright (C) 1998, 2014, 2015 Werner Koch
* *
* This file is part of GnuPG. * This file is part of GnuPG.
* *
* GnuPG is free software; you can redistribute it and/or modify * This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of either
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
* *
* GnuPG is distributed in the hope that it will be useful, * - the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* or
*
* - the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* or both in parallel, as here.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
@ -17,14 +27,11 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>. * along with this program; if not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef G10_HOST2NET_H #ifndef GNUPG_COMMON_HOST2NET_H
#define G10_HOST2NET_H #define GNUPG_COMMON_HOST2NET_H
#include "types.h" #include "types.h"
#define buftoulong( p ) ((*(byte*)(p) << 24) | (*((byte*)(p)+1)<< 16) | \
(*((byte*)(p)+2) << 8) | (*((byte*)(p)+3)))
#define buftoushort( p ) ((*((byte*)(p)) << 8) | (*((byte*)(p)+1)))
#define ulongtobuf( p, a ) do { \ #define ulongtobuf( p, a ) do { \
((byte*)p)[0] = a >> 24; \ ((byte*)p)[0] = a >> 24; \
((byte*)p)[1] = a >> 16; \ ((byte*)p)[1] = a >> 16; \
@ -35,8 +42,71 @@
((byte*)p)[0] = a >> 8; \ ((byte*)p)[0] = a >> 8; \
((byte*)p)[1] = a ; \ ((byte*)p)[1] = a ; \
} while(0) } while(0)
#define buftou32( p) buftoulong( (p) )
#define u32tobuf( p, a) ulongtobuf( (p), (a) )
#endif /*G10_HOST2NET_H*/ static inline unsigned long
buf16_to_ulong (const void *buffer)
{
const unsigned char *p = buffer;
return (((unsigned long)p[0] << 8) | p[1]);
}
static inline unsigned int
buf16_to_uint (const void *buffer)
{
const unsigned char *p = buffer;
return (((unsigned int)p[0] << 8) | p[1]);
}
static inline unsigned short
buf16_to_ushort (const void *buffer)
{
const unsigned char *p = buffer;
return (((unsigned short)p[0] << 8) | p[1]);
}
static inline u16
buf16_to_u16 (const void *buffer)
{
const unsigned char *p = buffer;
return (((u16)p[0] << 8) | p[1]);
}
static inline size_t
buf32_to_size_t (const void *buffer)
{
const unsigned char *p = buffer;
return (((size_t)p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]);
}
static inline unsigned long
buf32_to_ulong (const void *buffer)
{
const unsigned char *p = buffer;
return (((unsigned long)p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]);
}
static inline unsigned int
buf32_to_uint (const void *buffer)
{
const unsigned char *p = buffer;
return (((unsigned int)p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]);
}
static inline u32
buf32_to_u32 (const void *buffer)
{
const unsigned char *p = buffer;
return (((u32)p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]);
}
#endif /*GNUPG_COMMON_HOST2NET_H*/

View File

@ -25,6 +25,7 @@
#include "keybox-defs.h" #include "keybox-defs.h"
#include <gcrypt.h> #include <gcrypt.h>
#include "../include/host2net.h"
/* Argg, we can't include ../common/util.h */ /* Argg, we can't include ../common/util.h */
char *bin2hexcolon (const void *buffer, size_t length, char *stringbuf); char *bin2hexcolon (const void *buffer, size_t length, char *stringbuf);
@ -33,21 +34,13 @@ char *bin2hexcolon (const void *buffer, size_t length, char *stringbuf);
static ulong static ulong
get32 (const byte *buffer) get32 (const byte *buffer)
{ {
ulong a; return buf32_to_ulong (buffer);
a = *buffer << 24;
a |= buffer[1] << 16;
a |= buffer[2] << 8;
a |= buffer[3];
return a;
} }
static ulong static ulong
get16 (const byte *buffer) get16 (const byte *buffer)
{ {
ulong a; return buf16_to_ulong (buffer);
a = *buffer << 8;
a |= buffer[1];
return a;
} }
void void
@ -93,9 +86,9 @@ dump_header_blob (const byte *buffer, size_t length, FILE *fp)
if ( memcmp (buffer+8, "KBXf", 4)) if ( memcmp (buffer+8, "KBXf", 4))
fprintf (fp, "[Error: invalid magic number]\n"); fprintf (fp, "[Error: invalid magic number]\n");
n = get32 (buffer+16); n = get32 (buffer+16);
fprintf( fp, "created-at: %lu\n", n ); fprintf( fp, "created-at: %lu\n", n );
n = get32 (buffer+20); n = get32 (buffer+20);
fprintf( fp, "last-maint: %lu\n", n ); fprintf( fp, "last-maint: %lu\n", n );
return 0; return 0;
@ -117,7 +110,7 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
const byte *p; const byte *p;
buffer = _keybox_get_blob_image (blob, &length); buffer = _keybox_get_blob_image (blob, &length);
if (length < 32) if (length < 32)
{ {
fprintf (fp, "[blob too short]\n"); fprintf (fp, "[blob too short]\n");
@ -125,7 +118,7 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
} }
n = get32( buffer ); n = get32( buffer );
if (n > length) if (n > length)
fprintf (fp, "[blob larger than length - output truncated]\n"); fprintf (fp, "[blob larger than length - output truncated]\n");
else else
length = n; /* ignore the rest */ length = n; /* ignore the rest */
@ -159,7 +152,7 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
fprintf (fp, "[blob too short]\n"); fprintf (fp, "[blob too short]\n");
return -1; return -1;
} }
n = get16 (buffer + 6); n = get16 (buffer + 6);
fprintf( fp, "Blob-Flags: %04lX", n); fprintf( fp, "Blob-Flags: %04lX", n);
if (n) if (n)
@ -188,7 +181,7 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
fprintf( fp, "Data-Offset: %lu\n", rawdata_off ); fprintf( fp, "Data-Offset: %lu\n", rawdata_off );
fprintf( fp, "Data-Length: %lu\n", rawdata_len ); fprintf( fp, "Data-Length: %lu\n", rawdata_len );
if (rawdata_off > length || rawdata_len > length if (rawdata_off > length || rawdata_len > length
|| rawdata_off+rawdata_off > length) || rawdata_off+rawdata_off > length)
fprintf (fp, "[Error: raw data larger than blob]\n"); fprintf (fp, "[Error: raw data larger than blob]\n");
@ -207,7 +200,7 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
{ {
int i; int i;
ulong kidoff, kflags; ulong kidoff, kflags;
fprintf (fp, "Key-Fpr[%lu]: ", n ); fprintf (fp, "Key-Fpr[%lu]: ", n );
for (i=0; i < 20; i++ ) for (i=0; i < 20; i++ )
fprintf (fp, "%02X", p[i]); fprintf (fp, "%02X", p[i]);
@ -220,7 +213,7 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
kflags = get16 (p + 24 ); kflags = get16 (p + 24 );
fprintf( fp, "\nKey-Flags[%lu]: %04lX\n", n, kflags); fprintf( fp, "\nKey-Flags[%lu]: %04lX\n", n, kflags);
} }
/* serial number */ /* serial number */
fputs ("Serial-No: ", fp); fputs ("Serial-No: ", fp);
nserial = get16 (p); nserial = get16 (p);
@ -244,7 +237,7 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
for (n=0; n < nuids; n++, p += uidinfolen) for (n=0; n < nuids; n++, p += uidinfolen)
{ {
ulong uidoff, uidlen, uflags; ulong uidoff, uidlen, uflags;
uidoff = get32( p ); uidoff = get32( p );
uidlen = get32( p+4 ); uidlen = get32( p+4 );
if (type == BLOBTYPE_X509 && !n) if (type == BLOBTYPE_X509 && !n)
@ -284,7 +277,7 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
fprintf (fp, "Uid-Validity[%lu]: %d\n", n, p[10] ); fprintf (fp, "Uid-Validity[%lu]: %d\n", n, p[10] );
} }
} }
nsigs = get16 (p); nsigs = get16 (p);
fprintf (fp, "Sig-Count: %lu\n", nsigs ); fprintf (fp, "Sig-Count: %lu\n", nsigs );
siginfolen = get16 (p + 2); siginfolen = get16 (p + 2);
@ -294,7 +287,7 @@ _keybox_dump_blob (KEYBOXBLOB blob, FILE *fp)
for (n=0; n < nsigs; n++, p += siginfolen) for (n=0; n < nsigs; n++, p += siginfolen)
{ {
ulong sflags; ulong sflags;
sflags = get32 (p); sflags = get32 (p);
fprintf (fp, "Sig-Expire[%lu]: ", n ); fprintf (fp, "Sig-Expire[%lu]: ", n );
if (!sflags) if (!sflags)
@ -341,11 +334,11 @@ hash_blob_rawdata (KEYBOXBLOB blob, unsigned char *digest)
ulong rawdata_off, rawdata_len; ulong rawdata_off, rawdata_len;
buffer = _keybox_get_blob_image (blob, &length); buffer = _keybox_get_blob_image (blob, &length);
if (length < 32) if (length < 32)
return -1; return -1;
n = get32 (buffer); n = get32 (buffer);
if (n < length) if (n < length)
length = n; /* Blob larger than length in header - ignore the rest. */ length = n; /* Blob larger than length in header - ignore the rest. */
type = buffer[4]; type = buffer[4];
@ -364,11 +357,11 @@ hash_blob_rawdata (KEYBOXBLOB blob, unsigned char *digest)
if (length < 40) if (length < 40)
return -1; return -1;
rawdata_off = get32 (buffer + 8); rawdata_off = get32 (buffer + 8);
rawdata_len = get32 (buffer + 12); rawdata_len = get32 (buffer + 12);
if (rawdata_off > length || rawdata_len > length if (rawdata_off > length || rawdata_len > length
|| rawdata_off+rawdata_off > length) || rawdata_off+rawdata_off > length)
return -1; /* Out of bounds. */ return -1; /* Out of bounds. */
@ -408,7 +401,7 @@ update_stats (KEYBOXBLOB blob, struct file_stats_s *s)
} }
n = get32( buffer ); n = get32( buffer );
if (n > length) if (n > length)
s->too_large_blobs++; s->too_large_blobs++;
else else
length = n; /* ignore the rest */ length = n; /* ignore the rest */
@ -439,7 +432,7 @@ update_stats (KEYBOXBLOB blob, struct file_stats_s *s)
s->too_short_blobs++; s->too_short_blobs++;
return -1; return -1;
} }
n = get16 (buffer + 6); n = get16 (buffer + 6);
if (n) if (n)
{ {
@ -512,13 +505,13 @@ _keybox_dump_file (const char *filename, int stats_only, FILE *outfp)
rc = 0; rc = 0;
if (rc) if (rc)
fprintf (outfp, "error reading `%s': %s\n", filename, gpg_strerror (rc)); fprintf (outfp, "error reading `%s': %s\n", filename, gpg_strerror (rc));
if (fp != stdin) if (fp != stdin)
fclose (fp); fclose (fp);
if (stats_only) if (stats_only)
{ {
fprintf (outfp, fprintf (outfp,
"Total number of blobs: %8lu\n" "Total number of blobs: %8lu\n"
" header: %8lu\n" " header: %8lu\n"
" empty: %8lu\n" " empty: %8lu\n"
@ -551,9 +544,9 @@ _keybox_dump_file (const char *filename, int stats_only, FILE *outfp)
struct dupitem_s struct dupitem_s
{ {
unsigned long recno; unsigned long recno;
unsigned char digest[20]; unsigned char digest[20];
}; };
@ -563,7 +556,7 @@ cmp_dupitems (const void *arg_a, const void *arg_b)
{ {
struct dupitem_s *a = (struct dupitem_s *)arg_a; struct dupitem_s *a = (struct dupitem_s *)arg_a;
struct dupitem_s *b = (struct dupitem_s *)arg_b; struct dupitem_s *b = (struct dupitem_s *)arg_b;
return memcmp (a->digest, b->digest, 20); return memcmp (a->digest, b->digest, 20);
} }
@ -581,7 +574,7 @@ _keybox_dump_find_dups (const char *filename, int print_them, FILE *outfp)
char fprbuf[3*20+1]; char fprbuf[3*20+1];
(void)print_them; (void)print_them;
memset (zerodigest, 0, sizeof zerodigest); memset (zerodigest, 0, sizeof zerodigest);
if (!(fp = open_file (&filename, outfp))) if (!(fp = open_file (&filename, outfp)))
@ -601,7 +594,7 @@ _keybox_dump_find_dups (const char *filename, int print_them, FILE *outfp)
while ( !(rc = _keybox_read_blob (&blob, fp)) ) while ( !(rc = _keybox_read_blob (&blob, fp)) )
{ {
unsigned char digest[20]; unsigned char digest[20];
if (hash_blob_rawdata (blob, digest)) if (hash_blob_rawdata (blob, digest))
fprintf (outfp, "error in blob %ld of `%s'\n", recno, filename); fprintf (outfp, "error in blob %ld of `%s'\n", recno, filename);
else if (memcmp (digest, zerodigest, 20)) else if (memcmp (digest, zerodigest, 20))
@ -668,7 +661,7 @@ _keybox_dump_cut_records (const char *filename, unsigned long from,
KEYBOXBLOB blob; KEYBOXBLOB blob;
int rc; int rc;
unsigned long recno = 0; unsigned long recno = 0;
if (!(fp = open_file (&filename, stderr))) if (!(fp = open_file (&filename, stderr)))
return gpg_error_from_syserror (); return gpg_error_from_syserror ();

View File

@ -34,6 +34,7 @@
#include "keybox-defs.h" #include "keybox-defs.h"
#include <gcrypt.h> #include <gcrypt.h>
#include "../include/host2net.h"
enum packet_types enum packet_types
@ -119,10 +120,8 @@ next_packet (unsigned char const **bufptr, size_t *buflen,
{ {
if (len <4 ) if (len <4 )
return gpg_error (GPG_ERR_INV_PACKET); /* No length bytes. */ return gpg_error (GPG_ERR_INV_PACKET); /* No length bytes. */
pktlen = (*buf++) << 24; pktlen = buf32_to_ulong (buf);
pktlen |= (*buf++) << 16; buf += 4;
pktlen |= (*buf++) << 8;
pktlen |= (*buf++);
len -= 4; len -= 4;
} }
else /* Partial length encoding is not allowed for key packets. */ else /* Partial length encoding is not allowed for key packets. */

View File

@ -25,6 +25,7 @@
#include <errno.h> #include <errno.h>
#include "../jnlib/stringhelp.h" /* ascii_xxxx() */ #include "../jnlib/stringhelp.h" /* ascii_xxxx() */
#include "../include/host2net.h"
#include "keybox-defs.h" #include "keybox-defs.h"
#include <gcrypt.h> #include <gcrypt.h>
@ -45,21 +46,13 @@ struct sn_array_s {
static inline ulong static inline ulong
get32 (const byte *buffer) get32 (const byte *buffer)
{ {
ulong a; return buf32_to_ulong (buffer);
a = *buffer << 24;
a |= buffer[1] << 16;
a |= buffer[2] << 8;
a |= buffer[3];
return a;
} }
static inline ulong static inline ulong
get16 (const byte *buffer) get16 (const byte *buffer)
{ {
ulong a; return buf16_to_ulong (buffer);
a = *buffer << 8;
a |= buffer[1];
return a;
} }
@ -112,7 +105,7 @@ _keybox_get_flag_location (const unsigned char *buffer, size_t length,
*flag_off = 6; *flag_off = 6;
*flag_size = 2; *flag_size = 2;
break; break;
case KEYBOX_FLAG_OWNERTRUST: case KEYBOX_FLAG_OWNERTRUST:
case KEYBOX_FLAG_VALIDITY: case KEYBOX_FLAG_VALIDITY:
case KEYBOX_FLAG_CREATED_AT: case KEYBOX_FLAG_CREATED_AT:
@ -127,7 +120,7 @@ _keybox_get_flag_location (const unsigned char *buffer, size_t length,
if (pos+2 > length) if (pos+2 > length)
return GPG_ERR_INV_OBJ; /* Out of bounds. */ return GPG_ERR_INV_OBJ; /* Out of bounds. */
/* Serial number. */ /* Serial number. */
nserial = get16 (buffer+pos); nserial = get16 (buffer+pos);
pos += 2 + nserial; pos += 2 + nserial;
if (pos+4 > length) if (pos+4 > length)
return GPG_ERR_INV_OBJ; /* Out of bounds. */ return GPG_ERR_INV_OBJ; /* Out of bounds. */
@ -135,7 +128,7 @@ _keybox_get_flag_location (const unsigned char *buffer, size_t length,
nuids = get16 (buffer + pos); pos += 2; nuids = get16 (buffer + pos); pos += 2;
uidinfolen = get16 (buffer + pos); pos += 2; uidinfolen = get16 (buffer + pos); pos += 2;
if (uidinfolen < 12 ) if (uidinfolen < 12 )
return GPG_ERR_INV_OBJ; return GPG_ERR_INV_OBJ;
pos += uidinfolen*nuids; pos += uidinfolen*nuids;
if (pos+4 > length) if (pos+4 > length)
return GPG_ERR_INV_OBJ ; /* Out of bounds. */ return GPG_ERR_INV_OBJ ; /* Out of bounds. */
@ -143,7 +136,7 @@ _keybox_get_flag_location (const unsigned char *buffer, size_t length,
nsigs = get16 (buffer + pos); pos += 2; nsigs = get16 (buffer + pos); pos += 2;
siginfolen = get16 (buffer + pos); pos += 2; siginfolen = get16 (buffer + pos); pos += 2;
if (siginfolen < 4 ) if (siginfolen < 4 )
return GPG_ERR_INV_OBJ; return GPG_ERR_INV_OBJ;
pos += siginfolen*nsigs; pos += siginfolen*nsigs;
if (pos+1+1+2+4+4+4+4 > length) if (pos+1+1+2+4+4+4+4 > length)
return GPG_ERR_INV_OBJ ; /* Out of bounds. */ return GPG_ERR_INV_OBJ ; /* Out of bounds. */
@ -190,7 +183,7 @@ get_flag_from_image (const unsigned char *buffer, size_t length,
case 4: *value = get32 (buffer + pos); break; case 4: *value = get32 (buffer + pos); break;
default: ec = GPG_ERR_BUG; break; default: ec = GPG_ERR_BUG; break;
} }
return ec; return ec;
} }
@ -218,7 +211,7 @@ blob_cmp_sn (KEYBOXBLOB blob, const unsigned char *sn, int snlen)
return 0; /* out of bounds */ return 0; /* out of bounds */
/*serial*/ /*serial*/
nserial = get16 (buffer+pos); nserial = get16 (buffer+pos);
off = pos + 2; off = pos + 2;
if (off+nserial > length) if (off+nserial > length)
return 0; /* out of bounds */ return 0; /* out of bounds */
@ -316,7 +309,7 @@ blob_cmp_name (KEYBOXBLOB blob, int idx,
return 0; /* out of bounds */ return 0; /* out of bounds */
/*serial*/ /*serial*/
nserial = get16 (buffer+pos); nserial = get16 (buffer+pos);
pos += 2 + nserial; pos += 2 + nserial;
if (pos+4 > length) if (pos+4 > length)
return 0; /* out of bounds */ return 0; /* out of bounds */
@ -332,7 +325,7 @@ blob_cmp_name (KEYBOXBLOB blob, int idx,
if (idx < 0) if (idx < 0)
{ /* compare all names starting with that (negated) index */ { /* compare all names starting with that (negated) index */
idx = -idx; idx = -idx;
for ( ;idx < nuids; idx++) for ( ;idx < nuids; idx++)
{ {
size_t mypos = pos; size_t mypos = pos;
@ -409,7 +402,7 @@ blob_cmp_mail (KEYBOXBLOB blob, const char *name, size_t namelen, int substr)
return 0; /* out of bounds */ return 0; /* out of bounds */
/*serial*/ /*serial*/
nserial = get16 (buffer+pos); nserial = get16 (buffer+pos);
pos += 2 + nserial; pos += 2 + nserial;
if (pos+4 > length) if (pos+4 > length)
return 0; /* out of bounds */ return 0; /* out of bounds */
@ -428,7 +421,7 @@ blob_cmp_mail (KEYBOXBLOB blob, const char *name, size_t namelen, int substr)
for (idx=1 ;idx < nuids; idx++) for (idx=1 ;idx < nuids; idx++)
{ {
size_t mypos = pos; size_t mypos = pos;
mypos += idx*uidinfolen; mypos += idx*uidinfolen;
off = get32 (buffer+mypos); off = get32 (buffer+mypos);
len = get32 (buffer+mypos+4); len = get32 (buffer+mypos+4);
@ -439,7 +432,7 @@ blob_cmp_mail (KEYBOXBLOB blob, const char *name, size_t namelen, int substr)
len--; /* one back */ len--; /* one back */
if ( len < 3 || buffer[off+len] != '>') if ( len < 3 || buffer[off+len] != '>')
continue; /* not a proper email address */ continue; /* not a proper email address */
len--; len--;
if (substr) if (substr)
{ {
if (ascii_memcasemem (buffer+off+1, len, name, namelen)) if (ascii_memcasemem (buffer+off+1, len, name, namelen))
@ -474,7 +467,7 @@ blob_x509_has_grip (KEYBOXBLOB blob, const unsigned char *grip)
unsigned char array[20]; unsigned char array[20];
unsigned char *rcp; unsigned char *rcp;
size_t n; size_t n;
buffer = _keybox_get_blob_image (blob, &length); buffer = _keybox_get_blob_image (blob, &length);
if (length < 40) if (length < 40)
return 0; /* Too short. */ return 0; /* Too short. */
@ -527,7 +520,7 @@ blob_x509_has_grip (KEYBOXBLOB blob, const unsigned char *grip)
/* /*
The has_foo functions are used as helpers for search The has_foo functions are used as helpers for search
*/ */
static inline int static inline int
has_short_kid (KEYBOXBLOB blob, const unsigned char *kid) has_short_kid (KEYBOXBLOB blob, const unsigned char *kid)
@ -585,7 +578,7 @@ has_issuer_sn (KEYBOXBLOB blob, const char *name,
return 0; return 0;
namelen = strlen (name); namelen = strlen (name);
return (blob_cmp_sn (blob, sn, snlen) return (blob_cmp_sn (blob, sn, snlen)
&& blob_cmp_name (blob, 0 /* issuer */, name, namelen, 0)); && blob_cmp_name (blob, 0 /* issuer */, name, namelen, 0));
} }
@ -664,7 +657,7 @@ release_sn_array (struct sn_array_s *array, size_t size)
*/ */
int int
keybox_search_reset (KEYBOX_HANDLE hd) keybox_search_reset (KEYBOX_HANDLE hd)
{ {
if (!hd) if (!hd)
@ -683,13 +676,13 @@ keybox_search_reset (KEYBOX_HANDLE hd)
} }
hd->error = 0; hd->error = 0;
hd->eof = 0; hd->eof = 0;
return 0; return 0;
} }
/* Note: When in ephemeral mode the search function does visit all /* Note: When in ephemeral mode the search function does visit all
blobs but in standard mode, blobs flagged as ephemeral are ignored. */ blobs but in standard mode, blobs flagged as ephemeral are ignored. */
int int
keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc) keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc)
{ {
int rc; int rc;
@ -708,18 +701,18 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc)
hd->found.blob = NULL; hd->found.blob = NULL;
} }
if (hd->error) if (hd->error)
return hd->error; /* still in error state */ return hd->error; /* still in error state */
if (hd->eof) if (hd->eof)
return -1; /* still EOF */ return -1; /* still EOF */
/* figure out what information we need */ /* figure out what information we need */
need_words = any_skip = 0; need_words = any_skip = 0;
for (n=0; n < ndesc; n++) for (n=0; n < ndesc; n++)
{ {
switch (desc[n].mode) switch (desc[n].mode)
{ {
case KEYDB_SEARCH_MODE_WORDS: case KEYDB_SEARCH_MODE_WORDS:
need_words = 1; need_words = 1;
break; break;
case KEYDB_SEARCH_MODE_FIRST: case KEYDB_SEARCH_MODE_FIRST:
@ -729,7 +722,7 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc)
default: default:
break; break;
} }
if (desc[n].skipfnc) if (desc[n].skipfnc)
any_skip = 1; any_skip = 1;
if (desc[n].snlen == -1 && !sn_array) if (desc[n].snlen == -1 && !sn_array)
{ {
@ -762,7 +755,7 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc)
int i, odd; int i, odd;
size_t snlen; size_t snlen;
for (n=0; n < ndesc; n++) for (n=0; n < ndesc; n++)
{ {
if (!desc[n].sn) if (!desc[n].sn)
; ;
@ -830,14 +823,14 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc)
if (!hd->ephemeral && (blobflags & 2)) if (!hd->ephemeral && (blobflags & 2))
continue; /* Not in ephemeral mode but blob is flagged ephemeral. */ continue; /* Not in ephemeral mode but blob is flagged ephemeral. */
for (n=0; n < ndesc; n++) for (n=0; n < ndesc; n++)
{ {
switch (desc[n].mode) switch (desc[n].mode)
{ {
case KEYDB_SEARCH_MODE_NONE: case KEYDB_SEARCH_MODE_NONE:
never_reached (); never_reached ();
break; break;
case KEYDB_SEARCH_MODE_EXACT: case KEYDB_SEARCH_MODE_EXACT:
if (has_subject_or_alt (blob, desc[n].u.name, 0)) if (has_subject_or_alt (blob, desc[n].u.name, 0))
goto found; goto found;
break; break;
@ -854,7 +847,7 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc)
goto found; goto found;
break; break;
case KEYDB_SEARCH_MODE_MAILEND: case KEYDB_SEARCH_MODE_MAILEND:
case KEYDB_SEARCH_MODE_WORDS: case KEYDB_SEARCH_MODE_WORDS:
never_reached (); /* not yet implemented */ never_reached (); /* not yet implemented */
break; break;
case KEYDB_SEARCH_MODE_ISSUER: case KEYDB_SEARCH_MODE_ISSUER:
@ -876,7 +869,7 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc)
if (has_subject (blob, desc[n].u.name)) if (has_subject (blob, desc[n].u.name))
goto found; goto found;
break; break;
case KEYDB_SEARCH_MODE_SHORT_KID: case KEYDB_SEARCH_MODE_SHORT_KID:
if (has_short_kid (blob, desc[n].u.kid)) if (has_short_kid (blob, desc[n].u.kid))
goto found; goto found;
break; break;
@ -893,20 +886,20 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc)
if (has_keygrip (blob, desc[n].u.grip)) if (has_keygrip (blob, desc[n].u.grip))
goto found; goto found;
break; break;
case KEYDB_SEARCH_MODE_FIRST: case KEYDB_SEARCH_MODE_FIRST:
goto found; goto found;
break; break;
case KEYDB_SEARCH_MODE_NEXT: case KEYDB_SEARCH_MODE_NEXT:
goto found; goto found;
break; break;
default: default:
rc = gpg_error (GPG_ERR_INV_VALUE); rc = gpg_error (GPG_ERR_INV_VALUE);
goto found; goto found;
} }
} }
continue; continue;
found: found:
for (n=any_skip?0:ndesc; n < ndesc; n++) for (n=any_skip?0:ndesc; n < ndesc; n++)
{ {
/* if (desc[n].skipfnc */ /* if (desc[n].skipfnc */
/* && desc[n].skipfnc (desc[n].skipfncvalue, aki)) */ /* && desc[n].skipfnc (desc[n].skipfncvalue, aki)) */
@ -915,7 +908,7 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc)
if (n == ndesc) if (n == ndesc)
break; /* got it */ break; /* got it */
} }
if (!rc) if (!rc)
{ {
hd->found.blob = blob; hd->found.blob = blob;
@ -925,7 +918,7 @@ keybox_search (KEYBOX_HANDLE hd, KEYBOX_SEARCH_DESC *desc, size_t ndesc)
_keybox_release_blob (blob); _keybox_release_blob (blob);
hd->eof = 1; hd->eof = 1;
} }
else else
{ {
_keybox_release_blob (blob); _keybox_release_blob (blob);
hd->error = rc; hd->error = rc;

View File

@ -26,6 +26,7 @@
#include <unistd.h> #include <unistd.h>
#include "keybox-defs.h" #include "keybox-defs.h"
#include "../include/host2net.h"
#define EXTSEP_S "." #define EXTSEP_S "."
@ -65,12 +66,12 @@ fseeko (FILE * stream, off_t newpos, int whence)
static int static int
create_tmp_file (const char *template, create_tmp_file (const char *template,
char **r_bakfname, char **r_tmpfname, FILE **r_fp) char **r_bakfname, char **r_tmpfname, FILE **r_fp)
{ {
char *bakfname, *tmpfname; char *bakfname, *tmpfname;
*r_bakfname = NULL; *r_bakfname = NULL;
*r_tmpfname = NULL; *r_tmpfname = NULL;
# ifdef USE_ONLY_8DOT3 # ifdef USE_ONLY_8DOT3
/* Here is another Windoze bug?: /* Here is another Windoze bug?:
* you cant rename("pubring.kbx.tmp", "pubring.kbx"); * you cant rename("pubring.kbx.tmp", "pubring.kbx");
@ -87,7 +88,7 @@ create_tmp_file (const char *template,
return gpg_error_from_syserror (); return gpg_error_from_syserror ();
strcpy (bakfname, template); strcpy (bakfname, template);
strcpy (bakfname+strlen(template)-4, EXTSEP_S "kb_"); strcpy (bakfname+strlen(template)-4, EXTSEP_S "kb_");
tmpfname = xtrymalloc (strlen (template) + 1); tmpfname = xtrymalloc (strlen (template) + 1);
if (!tmpfname) if (!tmpfname)
{ {
@ -98,14 +99,14 @@ create_tmp_file (const char *template,
strcpy (tmpfname,template); strcpy (tmpfname,template);
strcpy (tmpfname + strlen (template)-4, EXTSEP_S "k__"); strcpy (tmpfname + strlen (template)-4, EXTSEP_S "k__");
} }
else else
{ /* File does not end with kbx, thus we hope we are working on a { /* File does not end with kbx, thus we hope we are working on a
modern file system and appending a suffix works. */ modern file system and appending a suffix works. */
bakfname = xtrymalloc ( strlen (template) + 5); bakfname = xtrymalloc ( strlen (template) + 5);
if (!bakfname) if (!bakfname)
return gpg_error_from_syserror (); return gpg_error_from_syserror ();
strcpy (stpcpy (bakfname, template), EXTSEP_S "kb_"); strcpy (stpcpy (bakfname, template), EXTSEP_S "kb_");
tmpfname = xtrymalloc ( strlen (template) + 5); tmpfname = xtrymalloc ( strlen (template) + 5);
if (!tmpfname) if (!tmpfname)
{ {
@ -120,7 +121,7 @@ create_tmp_file (const char *template,
if (!bakfname) if (!bakfname)
return gpg_error_from_syserror (); return gpg_error_from_syserror ();
strcpy (stpcpy (bakfname,template),"~"); strcpy (stpcpy (bakfname,template),"~");
tmpfname = xtrymalloc ( strlen (template) + 5); tmpfname = xtrymalloc ( strlen (template) + 5);
if (!tmpfname) if (!tmpfname)
{ {
@ -172,7 +173,7 @@ rename_tmp_file (const char *bakfname, const char *tmpfname,
/* First make a backup file except for secret keyboxes. */ /* First make a backup file except for secret keyboxes. */
if (!secret) if (!secret)
{ {
#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__) #if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
remove (bakfname); remove (bakfname);
#endif #endif
@ -181,7 +182,7 @@ rename_tmp_file (const char *bakfname, const char *tmpfname,
return gpg_error_from_syserror (); return gpg_error_from_syserror ();
} }
} }
/* Then rename the file. */ /* Then rename the file. */
#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__) #if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
remove (fname); remove (fname);
@ -199,7 +200,7 @@ rename_tmp_file (const char *bakfname, const char *tmpfname,
} }
return rc; return rc;
} }
return 0; return 0;
} }
@ -211,7 +212,7 @@ rename_tmp_file (const char *bakfname, const char *tmpfname,
3 = update 3 = update
*/ */
static int static int
blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob, blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
int secret, off_t start_offset) int secret, off_t start_offset)
{ {
FILE *fp, *newfp; FILE *fp, *newfp;
@ -221,14 +222,14 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
char buffer[4096]; char buffer[4096];
int nread, nbytes; int nread, nbytes;
/* Open the source file. Because we do a rename, we have to check the /* Open the source file. Because we do a rename, we have to check the
permissions of the file */ permissions of the file */
if (access (fname, W_OK)) if (access (fname, W_OK))
return gpg_error_from_syserror (); return gpg_error_from_syserror ();
fp = fopen (fname, "rb"); fp = fopen (fname, "rb");
if (mode == 1 && !fp && errno == ENOENT) if (mode == 1 && !fp && errno == ENOENT)
{ {
/* Insert mode but file does not exist: /* Insert mode but file does not exist:
Create a new keybox file. */ Create a new keybox file. */
newfp = fopen (fname, "wb"); newfp = fopen (fname, "wb");
@ -274,10 +275,10 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
fclose (newfp); fclose (newfp);
goto leave; goto leave;
} }
/* prepare for insert */ /* prepare for insert */
if (mode == 1) if (mode == 1)
{ {
/* Copy everything to the new file. */ /* Copy everything to the new file. */
while ( (nread = fread (buffer, 1, DIM(buffer), fp)) > 0 ) while ( (nread = fread (buffer, 1, DIM(buffer), fp)) > 0 )
{ {
@ -297,12 +298,12 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
goto leave; goto leave;
} }
} }
/* Prepare for delete or update. */ /* Prepare for delete or update. */
if ( mode == 2 || mode == 3 ) if ( mode == 2 || mode == 3 )
{ {
off_t current = 0; off_t current = 0;
/* Copy first part to the new file. */ /* Copy first part to the new file. */
while ( current < start_offset ) while ( current < start_offset )
{ {
@ -313,7 +314,7 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
if (!nread) if (!nread)
break; break;
current += nread; current += nread;
if (fwrite (buffer, nread, 1, newfp) != 1) if (fwrite (buffer, nread, 1, newfp) != 1)
{ {
rc = gpg_error_from_syserror (); rc = gpg_error_from_syserror ();
@ -329,7 +330,7 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
fclose (newfp); fclose (newfp);
goto leave; goto leave;
} }
/* Skip this blob. */ /* Skip this blob. */
rc = _keybox_read_blob (NULL, fp); rc = _keybox_read_blob (NULL, fp);
if (rc) if (rc)
@ -339,10 +340,10 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
return rc; return rc;
} }
} }
/* Do an insert or update. */ /* Do an insert or update. */
if ( mode == 1 || mode == 3 ) if ( mode == 1 || mode == 3 )
{ {
rc = _keybox_write_blob (blob, newfp); rc = _keybox_write_blob (blob, newfp);
if (rc) if (rc)
{ {
@ -351,10 +352,10 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
return rc; return rc;
} }
} }
/* Copy the rest of the packet for an delete or update. */ /* Copy the rest of the packet for an delete or update. */
if (mode == 2 || mode == 3) if (mode == 2 || mode == 3)
{ {
while ( (nread = fread (buffer, 1, DIM(buffer), fp)) > 0 ) while ( (nread = fread (buffer, 1, DIM(buffer), fp)) > 0 )
{ {
if (fwrite (buffer, nread, 1, newfp) != 1) if (fwrite (buffer, nread, 1, newfp) != 1)
@ -373,7 +374,7 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
goto leave; goto leave;
} }
} }
/* Close both files. */ /* Close both files. */
if (fclose(fp)) if (fclose(fp))
{ {
@ -397,7 +398,7 @@ blob_filecopy (int mode, const char *fname, KEYBOXBLOB blob,
#ifdef KEYBOX_WITH_X509 #ifdef KEYBOX_WITH_X509
int int
keybox_insert_cert (KEYBOX_HANDLE hd, ksba_cert_t cert, keybox_insert_cert (KEYBOX_HANDLE hd, ksba_cert_t cert,
unsigned char *sha1_digest) unsigned char *sha1_digest)
@ -407,12 +408,12 @@ keybox_insert_cert (KEYBOX_HANDLE hd, ksba_cert_t cert,
KEYBOXBLOB blob; KEYBOXBLOB blob;
if (!hd) if (!hd)
return gpg_error (GPG_ERR_INV_HANDLE); return gpg_error (GPG_ERR_INV_HANDLE);
if (!hd->kb) if (!hd->kb)
return gpg_error (GPG_ERR_INV_HANDLE); return gpg_error (GPG_ERR_INV_HANDLE);
fname = hd->kb->fname; fname = hd->kb->fname;
if (!fname) if (!fname)
return gpg_error (GPG_ERR_INV_HANDLE); return gpg_error (GPG_ERR_INV_HANDLE);
/* Close this one otherwise we will mess up the position for a next /* Close this one otherwise we will mess up the position for a next
search. Fixme: it would be better to adjust the position after search. Fixme: it would be better to adjust the position after
@ -466,12 +467,12 @@ keybox_set_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int value)
if (!hd->found.blob) if (!hd->found.blob)
return gpg_error (GPG_ERR_NOTHING_FOUND); return gpg_error (GPG_ERR_NOTHING_FOUND);
if (!hd->kb) if (!hd->kb)
return gpg_error (GPG_ERR_INV_HANDLE); return gpg_error (GPG_ERR_INV_HANDLE);
if (!hd->found.blob) if (!hd->found.blob)
return gpg_error (GPG_ERR_NOTHING_FOUND); return gpg_error (GPG_ERR_NOTHING_FOUND);
fname = hd->kb->fname; fname = hd->kb->fname;
if (!fname) if (!fname)
return gpg_error (GPG_ERR_INV_HANDLE); return gpg_error (GPG_ERR_INV_HANDLE);
off = _keybox_get_blob_fileoffset (hd->found.blob); off = _keybox_get_blob_fileoffset (hd->found.blob);
if (off == (off_t)-1) if (off == (off_t)-1)
@ -481,7 +482,7 @@ keybox_set_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int value)
ec = _keybox_get_flag_location (buffer, length, what, &flag_pos, &flag_size); ec = _keybox_get_flag_location (buffer, length, what, &flag_pos, &flag_size);
if (ec) if (ec)
return gpg_error (ec); return gpg_error (ec);
off += flag_pos; off += flag_pos;
_keybox_close_file (hd); _keybox_close_file (hd);
@ -503,7 +504,7 @@ keybox_set_flags (KEYBOX_HANDLE hd, int what, int idx, unsigned int value)
switch (flag_size) switch (flag_size)
{ {
case 1: case 1:
case 2: case 2:
case 4: case 4:
if (fwrite (tmp+4-flag_size, flag_size, 1, fp) != 1) if (fwrite (tmp+4-flag_size, flag_size, 1, fp) != 1)
@ -539,10 +540,10 @@ keybox_delete (KEYBOX_HANDLE hd)
if (!hd->found.blob) if (!hd->found.blob)
return gpg_error (GPG_ERR_NOTHING_FOUND); return gpg_error (GPG_ERR_NOTHING_FOUND);
if (!hd->kb) if (!hd->kb)
return gpg_error (GPG_ERR_INV_HANDLE); return gpg_error (GPG_ERR_INV_HANDLE);
fname = hd->kb->fname; fname = hd->kb->fname;
if (!fname) if (!fname)
return gpg_error (GPG_ERR_INV_HANDLE); return gpg_error (GPG_ERR_INV_HANDLE);
off = _keybox_get_blob_fileoffset (hd->found.blob); off = _keybox_get_blob_fileoffset (hd->found.blob);
if (off == (off_t)-1) if (off == (off_t)-1)
@ -588,18 +589,18 @@ keybox_compress (KEYBOX_HANDLE hd)
int skipped_deleted; int skipped_deleted;
if (!hd) if (!hd)
return gpg_error (GPG_ERR_INV_HANDLE); return gpg_error (GPG_ERR_INV_HANDLE);
if (!hd->kb) if (!hd->kb)
return gpg_error (GPG_ERR_INV_HANDLE); return gpg_error (GPG_ERR_INV_HANDLE);
if (hd->secret) if (hd->secret)
return gpg_error (GPG_ERR_NOT_IMPLEMENTED); return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
fname = hd->kb->fname; fname = hd->kb->fname;
if (!fname) if (!fname)
return gpg_error (GPG_ERR_INV_HANDLE); return gpg_error (GPG_ERR_INV_HANDLE);
_keybox_close_file (hd); _keybox_close_file (hd);
/* Open the source file. Because we do a rename, we have to check the /* Open the source file. Because we do a rename, we have to check the
permissions of the file */ permissions of the file */
if (access (fname, W_OK)) if (access (fname, W_OK))
return gpg_error_from_syserror (); return gpg_error_from_syserror ();
@ -623,9 +624,8 @@ keybox_compress (KEYBOX_HANDLE hd)
buffer = _keybox_get_blob_image (blob, &length); buffer = _keybox_get_blob_image (blob, &length);
if (length > 4 && buffer[4] == BLOBTYPE_HEADER) if (length > 4 && buffer[4] == BLOBTYPE_HEADER)
{ {
u32 last_maint = ((buffer[20] << 24) | (buffer[20+1] << 16) u32 last_maint = buf32_to_u32 (buffer+20);
| (buffer[20+2] << 8) | (buffer[20+3]));
if ( (last_maint + 3*3600) > time (NULL) ) if ( (last_maint + 3*3600) > time (NULL) )
{ {
fclose (fp); fclose (fp);
@ -645,7 +645,7 @@ keybox_compress (KEYBOX_HANDLE hd)
return rc;; return rc;;
} }
/* Processing loop. By reading using _keybox_read_blob we /* Processing loop. By reading using _keybox_read_blob we
automagically skip any blobs flagged as deleted. Thus what we automagically skip any blobs flagged as deleted. Thus what we
only have to do is to check all ephemeral flagged blocks whether only have to do is to check all ephemeral flagged blocks whether
@ -690,24 +690,23 @@ keybox_compress (KEYBOX_HANDLE hd)
continue; continue;
} }
if (_keybox_get_flag_location (buffer, length, if (_keybox_get_flag_location (buffer, length,
KEYBOX_FLAG_BLOB, &pos, &size) KEYBOX_FLAG_BLOB, &pos, &size)
|| size != 2) || size != 2)
{ {
rc = gpg_error (GPG_ERR_BUG); rc = gpg_error (GPG_ERR_BUG);
break; break;
} }
blobflags = ((buffer[pos] << 8) | (buffer[pos+1])); blobflags = buf16_to_uint (buffer+pos);
if ((blobflags & KEYBOX_FLAG_BLOB_EPHEMERAL)) if ((blobflags & KEYBOX_FLAG_BLOB_EPHEMERAL))
{ {
/* This is an ephemeral blob. */ /* This is an ephemeral blob. */
if (_keybox_get_flag_location (buffer, length, if (_keybox_get_flag_location (buffer, length,
KEYBOX_FLAG_CREATED_AT, &pos, &size) KEYBOX_FLAG_CREATED_AT, &pos, &size)
|| size != 4) || size != 4)
created_at = 0; /* oops. */ created_at = 0; /* oops. */
else else
created_at = ((buffer[pos] << 24) | (buffer[pos+1] << 16) created_at = buf32_to_u32 (buffer+pos);
| (buffer[pos+2] << 8) | (buffer[pos+3]));
if (created_at && created_at < cut_time) if (created_at && created_at < cut_time)
{ {

View File

@ -58,6 +58,7 @@
#include "scdaemon.h" #include "scdaemon.h"
#include "exechelp.h" #include "exechelp.h"
#endif /* GNUPG_MAJOR_VERSION != 1 */ #endif /* GNUPG_MAJOR_VERSION != 1 */
#include "../include/host2net.h"
#include "iso7816.h" #include "iso7816.h"
#include "apdu.h" #include "apdu.h"
@ -1013,15 +1014,14 @@ pcsc_get_status_wrapped (int slot, unsigned int *status)
i? strerror (errno) : "premature EOF"); i? strerror (errno) : "premature EOF");
goto command_failed; goto command_failed;
} }
len = (msgbuf[1] << 24) | (msgbuf[2] << 16) | (msgbuf[3] << 8 ) | msgbuf[4]; len = buf32_to_size_t (msgbuf+1);
if (msgbuf[0] != 0x81 || len < 4) if (msgbuf[0] != 0x81 || len < 4)
{ {
log_error ("invalid response header from PC/SC received\n"); log_error ("invalid response header from PC/SC received\n");
goto command_failed; goto command_failed;
} }
len -= 4; /* Already read the error code. */ len -= 4; /* Already read the error code. */
err = PCSC_ERR_MASK ((msgbuf[5] << 24) | (msgbuf[6] << 16) err = PCSC_ERR_MASK (buf32_to_ulong (msgbuf+5));
| (msgbuf[7] << 8 ) | msgbuf[8]);
if (err) if (err)
{ {
log_error ("pcsc_status failed: %s (0x%lx)\n", log_error ("pcsc_status failed: %s (0x%lx)\n",
@ -1181,15 +1181,14 @@ pcsc_send_apdu_wrapped (int slot, unsigned char *apdu, size_t apdulen,
i? strerror (errno) : "premature EOF"); i? strerror (errno) : "premature EOF");
goto command_failed; goto command_failed;
} }
len = (msgbuf[1] << 24) | (msgbuf[2] << 16) | (msgbuf[3] << 8 ) | msgbuf[4]; len = buf32_to_size_t (msgbuf+1);
if (msgbuf[0] != 0x81 || len < 4) if (msgbuf[0] != 0x81 || len < 4)
{ {
log_error ("invalid response header from PC/SC received\n"); log_error ("invalid response header from PC/SC received\n");
goto command_failed; goto command_failed;
} }
len -= 4; /* Already read the error code. */ len -= 4; /* Already read the error code. */
err = PCSC_ERR_MASK ((msgbuf[5] << 24) | (msgbuf[6] << 16) err = PCSC_ERR_MASK (buf32_to_ulong (msgbuf+5));
| (msgbuf[7] << 8 ) | msgbuf[8]);
if (err) if (err)
{ {
log_error ("pcsc_transmit failed: %s (0x%lx)\n", log_error ("pcsc_transmit failed: %s (0x%lx)\n",
@ -1321,15 +1320,14 @@ control_pcsc_wrapped (int slot, pcsc_dword_t ioctl_code,
i? strerror (errno) : "premature EOF"); i? strerror (errno) : "premature EOF");
goto command_failed; goto command_failed;
} }
len = (msgbuf[1] << 24) | (msgbuf[2] << 16) | (msgbuf[3] << 8 ) | msgbuf[4]; len = buf32_to_size_t (msgbuf+1);
if (msgbuf[0] != 0x81 || len < 4) if (msgbuf[0] != 0x81 || len < 4)
{ {
log_error ("invalid response header from PC/SC received\n"); log_error ("invalid response header from PC/SC received\n");
goto command_failed; goto command_failed;
} }
len -= 4; /* Already read the error code. */ len -= 4; /* Already read the error code. */
err = PCSC_ERR_MASK ((msgbuf[5] << 24) | (msgbuf[6] << 16) err = PCSC_ERR_MASK (buf32_to_ulong (msgbuf+5));
| (msgbuf[7] << 8 ) | msgbuf[8]);
if (err) if (err)
{ {
log_error ("pcsc_control failed: %s (0x%lx)\n", log_error ("pcsc_control failed: %s (0x%lx)\n",
@ -1458,15 +1456,14 @@ close_pcsc_reader_wrapped (int slot)
i? strerror (errno) : "premature EOF"); i? strerror (errno) : "premature EOF");
goto command_failed; goto command_failed;
} }
len = (msgbuf[1] << 24) | (msgbuf[2] << 16) | (msgbuf[3] << 8 ) | msgbuf[4]; len = buf32_to_size_t (msgbuf+1);
if (msgbuf[0] != 0x81 || len < 4) if (msgbuf[0] != 0x81 || len < 4)
{ {
log_error ("invalid response header from PC/SC received\n"); log_error ("invalid response header from PC/SC received\n");
goto command_failed; goto command_failed;
} }
len -= 4; /* Already read the error code. */ len -= 4; /* Already read the error code. */
err = PCSC_ERR_MASK ((msgbuf[5] << 24) | (msgbuf[6] << 16) err = PCSC_ERR_MASK (buf32_to_ulong (msgbuf+5));
| (msgbuf[7] << 8 ) | msgbuf[8]);
if (err) if (err)
log_error ("pcsc_close failed: %s (0x%lx)\n", log_error ("pcsc_close failed: %s (0x%lx)\n",
pcsc_error_string (err), err); pcsc_error_string (err), err);
@ -1647,7 +1644,7 @@ reset_pcsc_reader_wrapped (int slot)
i? strerror (errno) : "premature EOF"); i? strerror (errno) : "premature EOF");
goto command_failed; goto command_failed;
} }
len = (msgbuf[1] << 24) | (msgbuf[2] << 16) | (msgbuf[3] << 8 ) | msgbuf[4]; len = buf32_to_size_t (msgbuf+1);
if (msgbuf[0] != 0x81 || len < 4) if (msgbuf[0] != 0x81 || len < 4)
{ {
log_error ("invalid response header from PC/SC received\n"); log_error ("invalid response header from PC/SC received\n");
@ -1661,8 +1658,7 @@ reset_pcsc_reader_wrapped (int slot)
sw = SW_HOST_GENERAL_ERROR; sw = SW_HOST_GENERAL_ERROR;
goto command_failed; goto command_failed;
} }
err = PCSC_ERR_MASK ((msgbuf[5] << 24) | (msgbuf[6] << 16) err = PCSC_ERR_MASK (buf32_to_ulong (msgbuf+5));
| (msgbuf[7] << 8 ) | msgbuf[8]);
if (err) if (err)
{ {
log_error ("PC/SC RESET failed: %s (0x%lx)\n", log_error ("PC/SC RESET failed: %s (0x%lx)\n",
@ -1753,9 +1749,9 @@ pcsc_vendor_specific_init (int slot)
if (l == 1) if (l == 1)
v = p[0]; v = p[0];
else if (l == 2) else if (l == 2)
v = ((p[0] << 8) | p[1]); v = buf16_to_uint (p);
else if (l == 4) else if (l == 4)
v = ((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); v = buf32_to_uint (p);
if (code == FEATURE_VERIFY_PIN_DIRECT) if (code == FEATURE_VERIFY_PIN_DIRECT)
reader_table[slot].pcsc.verify_ioctl = v; reader_table[slot].pcsc.verify_ioctl = v;
@ -1814,9 +1810,9 @@ pcsc_vendor_specific_init (int slot)
if (l == 1) if (l == 1)
v = p[0]; v = p[0];
else if (l == 2) else if (l == 2)
v = ((p[1] << 8) | p[0]); v = (((unsigned int)p[1] << 8) | p[0]);
else if (l == 4) else if (l == 4)
v = ((p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]); v = (((unsigned int)p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]);
if (tag == PCSCv2_PART10_PROPERTY_bMinPINSize) if (tag == PCSCv2_PART10_PROPERTY_bMinPINSize)
reader_table[slot].pcsc.pinmin = v; reader_table[slot].pcsc.pinmin = v;
@ -2112,7 +2108,7 @@ open_pcsc_reader_wrapped (const char *portstr)
i? strerror (errno) : "premature EOF"); i? strerror (errno) : "premature EOF");
goto command_failed; goto command_failed;
} }
len = (msgbuf[1] << 24) | (msgbuf[2] << 16) | (msgbuf[3] << 8 ) | msgbuf[4]; len = buf32_to_size_t (msgbuf+1);
if (msgbuf[0] != 0x81 || len < 4) if (msgbuf[0] != 0x81 || len < 4)
{ {
log_error ("invalid response header from PC/SC received\n"); log_error ("invalid response header from PC/SC received\n");
@ -2125,8 +2121,7 @@ open_pcsc_reader_wrapped (const char *portstr)
(unsigned long)len); (unsigned long)len);
goto command_failed; goto command_failed;
} }
err = PCSC_ERR_MASK ((msgbuf[5] << 24) | (msgbuf[6] << 16) err = PCSC_ERR_MASK (buf32_to_ulong (msgbuf+5));
| (msgbuf[7] << 8 ) | msgbuf[8]);
if (err) if (err)
{ {

View File

@ -66,6 +66,7 @@
#include "iso7816.h" #include "iso7816.h"
#include "app-common.h" #include "app-common.h"
#include "tlv.h" #include "tlv.h"
#include "../include/host2net.h"
/* A table describing the DOs of the card. */ /* A table describing the DOs of the card. */
@ -805,7 +806,7 @@ send_fprtime_if_not_null (ctrl_t ctrl, const char *keyword,
char numbuf1[50], numbuf2[50]; char numbuf1[50], numbuf2[50];
unsigned long value; unsigned long value;
value = (stamp[0] << 24) | (stamp[1]<<16) | (stamp[2]<<8) | stamp[3]; value = buf32_to_ulong (stamp);
if (!value) if (!value)
return; return;
sprintf (numbuf1, "%d", number); sprintf (numbuf1, "%d", number);

View File

@ -94,6 +94,7 @@
#include "scdaemon.h" #include "scdaemon.h"
#include "iso7816.h" #include "iso7816.h"
#include "ccid-driver.h" #include "ccid-driver.h"
#include "../include/host2net.h"
#define DRVNAME "ccid-driver: " #define DRVNAME "ccid-driver: "
@ -317,7 +318,7 @@ static int send_escape_cmd (ccid_driver_t handle, const unsigned char *data,
static unsigned int static unsigned int
convert_le_u32 (const unsigned char *buf) convert_le_u32 (const unsigned char *buf)
{ {
return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24); return buf[0] | (buf[1] << 8) | (buf[2] << 16) | ((unsigned int)buf[3] << 24);
} }

View File

@ -273,7 +273,7 @@ read_32 (FILE *fp)
fprintf (stderr, PGM ": premature EOF while parsing request\n"); fprintf (stderr, PGM ": premature EOF while parsing request\n");
exit (1); exit (1);
} }
return (c1 << 24) | (c2 << 16) | (c3 << 8) | c4; return ((unsigned long)c1 << 24) | (c2 << 16) | (c3 << 8) | c4;
} }
@ -760,7 +760,8 @@ handle_control (unsigned char *argbuf, size_t arglen)
if (arglen < 4) if (arglen < 4)
bad_request ("CONTROL"); bad_request ("CONTROL");
ioctl_code = (argbuf[0] << 24) | (argbuf[1] << 16) | (argbuf[2] << 8) | argbuf[3]; ioctl_code = (((pcsc_dword_t)argbuf[0] << 24)
| (argbuf[1] << 16) | (argbuf[2] << 8) | argbuf[3]);
argbuf += 4; argbuf += 4;
arglen -= 4; arglen -= 4;

View File

@ -52,7 +52,7 @@ static int debug;
static int skip_escape; static int skip_escape;
static int usb_bus, usb_dev; static int usb_bus, usb_dev;
static int sniffusb; static int sniffusb;
/* Error counter. */ /* Error counter. */
static int any_error; static int any_error;
@ -142,19 +142,19 @@ err (const char *format, ...)
/* Convert a little endian stored 4 byte value into an unsigned /* Convert a little endian stored 4 byte value into an unsigned
integer. */ integer. */
static unsigned int static unsigned int
convert_le_u32 (const unsigned char *buf) convert_le_u32 (const unsigned char *buf)
{ {
return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24); return buf[0] | (buf[1] << 8) | (buf[2] << 16) | ((unsigned int)buf[3] << 24);
} }
/* Convert a little endian stored 2 byte value into an unsigned /* Convert a little endian stored 2 byte value into an unsigned
integer. */ integer. */
static unsigned int static unsigned int
convert_le_u16 (const unsigned char *buf) convert_le_u16 (const unsigned char *buf)
{ {
return buf[0] | (buf[1] << 8); return buf[0] | (buf[1] << 8);
} }
@ -182,7 +182,7 @@ print_pr_data (const unsigned char *data, size_t datalen, size_t off)
putchar ('\n'); putchar ('\n');
} }
static void static void
print_p2r_header (const char *name, const unsigned char *msg, size_t msglen) print_p2r_header (const char *name, const unsigned char *msg, size_t msglen)
{ {
@ -359,7 +359,7 @@ print_p2r_unknown (const unsigned char *msg, size_t msglen)
{ {
char buf[100]; char buf[100];
snprintf (buf, sizeof buf, "Unknown PC_to_RDR command 0x%02X", snprintf (buf, sizeof buf, "Unknown PC_to_RDR command 0x%02X",
msglen? msg[0]:0); msglen? msg[0]:0);
print_p2r_header (buf, msg, msglen); print_p2r_header (buf, msg, msglen);
if (msglen < 10) if (msglen < 10)
@ -466,7 +466,7 @@ print_r2p_slotstatus (const unsigned char *msg, size_t msglen)
msg[9] == 3? " (stopped)":""); msg[9] == 3? " (stopped)":"");
print_pr_data (msg, msglen, 10); print_pr_data (msg, msglen, 10);
} }
static void static void
print_r2p_parameters (const unsigned char *msg, size_t msglen) print_r2p_parameters (const unsigned char *msg, size_t msglen)
@ -527,7 +527,7 @@ print_r2p_unknown (const unsigned char *msg, size_t msglen)
{ {
char buf[100]; char buf[100];
snprintf (buf, sizeof buf, "Unknown RDR_to_PC command 0x%02X", snprintf (buf, sizeof buf, "Unknown RDR_to_PC command 0x%02X",
msglen? msg[0]:0); msglen? msg[0]:0);
print_r2p_header (buf, msg, msglen); print_r2p_header (buf, msg, msglen);
if (msglen < 10) if (msglen < 10)
@ -571,7 +571,7 @@ flush_data (void)
{ {
if (!databuffer.count) if (!databuffer.count)
return; return;
if (verbose) if (verbose)
printf ("Address: %s\n", databuffer.address); printf ("Address: %s\n", databuffer.address);
if (databuffer.is_bi) if (databuffer.is_bi)
@ -684,7 +684,7 @@ parse_line (char *line, unsigned int lineno)
p = strtok (NULL, " "); p = strtok (NULL, " ");
if (!p) if (!p)
return; /* No data length. */ return; /* No data length. */
datatag = strtok (NULL, " "); datatag = strtok (NULL, " ");
if (datatag && *datatag == '=') if (datatag && *datatag == '=')
{ {
@ -707,10 +707,10 @@ parse_line_sniffusb (char *line, unsigned int lineno)
return; return;
p = strtok (NULL, " \t"); p = strtok (NULL, " \t");
if (!p) if (!p)
return; return;
p = strtok (NULL, " \t"); p = strtok (NULL, " \t");
if (!p) if (!p)
return; return;
if (hexdigitp (p[0]) && hexdigitp (p[1]) if (hexdigitp (p[0]) && hexdigitp (p[1])
&& hexdigitp (p[2]) && hexdigitp (p[3]) && hexdigitp (p[2]) && hexdigitp (p[3])
@ -718,7 +718,7 @@ parse_line_sniffusb (char *line, unsigned int lineno)
{ {
size_t length; size_t length;
unsigned int value; unsigned int value;
length = databuffer.count; length = databuffer.count;
while ((p=strtok (NULL, " \t"))) while ((p=strtok (NULL, " \t")))
{ {
@ -791,7 +791,7 @@ parse_input (FILE *fp)
} }
int int
main (int argc, char **argv) main (int argc, char **argv)
{ {
int last_argc = -1; int last_argc = -1;
@ -845,7 +845,7 @@ main (int argc, char **argv)
sniffusb = 1; sniffusb = 1;
argc--; argv++; argc--; argv++;
} }
} }
if (argc && sniffusb) if (argc && sniffusb)
die ("no arguments expected when using --sniffusb\n"); die ("no arguments expected when using --sniffusb\n");
@ -855,14 +855,14 @@ main (int argc, char **argv)
if (argc == 1) if (argc == 1)
{ {
const char *s = strchr (argv[0], ':'); const char *s = strchr (argv[0], ':');
usb_bus = atoi (argv[0]); usb_bus = atoi (argv[0]);
if (s) if (s)
usb_dev = atoi (s+1); usb_dev = atoi (s+1);
if (usb_bus < 1 || usb_bus > 999 || usb_dev < 1 || usb_dev > 999) if (usb_bus < 1 || usb_bus > 999 || usb_dev < 1 || usb_dev > 999)
die ("invalid bus:dev specified"); die ("invalid bus:dev specified");
} }
signal (SIGPIPE, SIG_IGN); signal (SIGPIPE, SIG_IGN);