1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-06-01 22:28:02 +02:00

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

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;
} }

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 "."
@ -623,8 +624,7 @@ 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) )
{ {
@ -697,7 +697,7 @@ keybox_compress (KEYBOX_HANDLE hd)
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. */
@ -706,8 +706,7 @@ keybox_compress (KEYBOX_HANDLE hd)
|| 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

@ -145,7 +145,7 @@ err (const char *format, ...)
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);
} }