X-Git-Url: https://the.earth.li/gitweb/?p=onak.git;a=blobdiff_plain;f=keyid.c;h=6c789fdfd74c0344396d33e71af0a56e0760e3ff;hp=6a9b5580c34fa1c6a9df2100f565fd117ce382dc;hb=58ed9a0076feb9604154b99da6ed1907ca7df089;hpb=5cb3cfdb9d8caa6d7a4a1979c50c46896957b934 diff --git a/keyid.c b/keyid.c index 6a9b558..6c789fd 100644 --- a/keyid.c +++ b/keyid.c @@ -13,15 +13,14 @@ * more details. * * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 51 - * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * this program. If not, see . */ #include #include #include -#include "config.h" +#include "build-config.h" #include "keyid.h" #include "keystructs.h" #include "onak.h" @@ -38,6 +37,33 @@ #include "sha1.h" #endif +uint64_t fingerprint2keyid(struct openpgp_fingerprint *fingerprint) +{ + uint64_t keyid; + int i; + + switch (fingerprint->length) { + case 20: + /* v4, keyid is last 64 bits */ + for (keyid = 0, i = 12; i < 20; i++) { + keyid <<= 8; + keyid += fingerprint->fp[i]; + } + break; + case 32: + /* v5, keyid is first 64 bits */ + for (keyid = 0, i = 0; i < 8; i++) { + keyid <<= 8; + keyid += fingerprint->fp[i]; + } + break; + default: + keyid = (uint64_t) -1; + } + + return keyid; +} + /** * get_keyid - Given a public key returns the keyid. @@ -61,6 +87,9 @@ onak_status_t get_keyid(struct openpgp_publickey *publickey, uint64_t *keyid) onak_status_t get_fingerprint(struct openpgp_packet *packet, struct openpgp_fingerprint *fingerprint) { +#ifdef HAVE_NETTLE + struct sha256_ctx sha2_ctx; +#endif struct sha1_ctx sha_ctx; struct md5_ctx md5_context; unsigned char c; @@ -91,7 +120,6 @@ onak_status_t get_fingerprint(struct openpgp_packet *packet, md5_digest(&md5_context, fingerprint->length, fingerprint->fp); break; - case 4: sha1_init(&sha_ctx); /* @@ -110,6 +138,27 @@ onak_status_t get_fingerprint(struct openpgp_packet *packet, sha1_digest(&sha_ctx, fingerprint->length, fingerprint->fp); break; +#ifdef HAVE_NETTLE + case 5: + sha256_init(&sha2_ctx); + /* RFC4880bis 12.2 */ + c = 0x9A; + sha256_update(&sha2_ctx, sizeof(c), &c); + c = packet->length >> 24; + sha256_update(&sha2_ctx, sizeof(c), &c); + c = packet->length >> 16; + sha256_update(&sha2_ctx, sizeof(c), &c); + c = packet->length >> 8; + sha256_update(&sha2_ctx, sizeof(c), &c); + c = packet->length & 0xFF; + sha256_update(&sha2_ctx, sizeof(c), &c); + sha256_update(&sha2_ctx, packet->length, + packet->data); + fingerprint->length = 32; + sha256_digest(&sha2_ctx, fingerprint->length, fingerprint->fp); + + break; +#endif default: return ONAK_E_UNKNOWN_VER; } @@ -132,7 +181,7 @@ onak_status_t get_packetid(struct openpgp_packet *packet, uint64_t *keyid) uint8_t data; #endif - if (packet == NULL) + if (packet == NULL || packet->data == NULL) return ONAK_E_INVALID_PARAM; switch (packet->data[0]) { @@ -159,11 +208,9 @@ onak_status_t get_packetid(struct openpgp_packet *packet, uint64_t *keyid) ripemd160_digest(&ripemd160_context, RIPEMD160_DIGEST_SIZE, fingerprint.fp); + fingerprint.length = RIPEMD160_DIGEST_SIZE; - for (*keyid = 0, i = 12; i < 20; i++) { - *keyid <<= 8; - *keyid += fingerprint.fp[i]; - } + *keyid = fingerprint2keyid(&fingerprint); return ONAK_E_OK; } @@ -193,13 +240,9 @@ onak_status_t get_packetid(struct openpgp_packet *packet, uint64_t *keyid) } break; case 4: + case 5: get_fingerprint(packet, &fingerprint); - - for (*keyid = 0, i = 12; i < 20; i++) { - *keyid <<= 8; - *keyid += fingerprint.fp[i]; - } - + *keyid = fingerprint2keyid(&fingerprint); break; default: return ONAK_E_UNKNOWN_VER;