diff options
| author | Ed Maste <emaste@FreeBSD.org> | 2024-07-01 14:01:36 +0000 |
|---|---|---|
| committer | Ed Maste <emaste@FreeBSD.org> | 2024-07-01 14:01:36 +0000 |
| commit | d565364dadebdaabef4ecead36ae102774e81174 (patch) | |
| tree | dc22dc885255344e9a27e99a9d4ab2f9b3ec211f /ssh-pkcs11.c | |
| parent | 9200ce3210fdc00706904d2eb2d8a481ed84eef3 (diff) | |
Vendor import of OpenSSH 9.8p1vendor/openssh/9.8p1
Diffstat (limited to 'ssh-pkcs11.c')
| -rw-r--r-- | ssh-pkcs11.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/ssh-pkcs11.c b/ssh-pkcs11.c index 35e98be72301..1e76e8b2bb3a 100644 --- a/ssh-pkcs11.c +++ b/ssh-pkcs11.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-pkcs11.c,v 1.59 2023/07/27 22:26:49 djm Exp $ */ +/* $OpenBSD: ssh-pkcs11.c,v 1.62 2024/04/02 12:22:38 deraadt Exp $ */ /* * Copyright (c) 2010 Markus Friedl. All rights reserved. * Copyright (c) 2014 Pedro Martelletto. All rights reserved. @@ -1386,10 +1386,22 @@ pkcs11_rsa_generate_private_key(struct pkcs11_provider *p, CK_ULONG slotidx, } static int +h2i(char c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + else if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + return c - 'A' + 10; + else + return -1; +} + +static int pkcs11_decode_hex(const char *hex, unsigned char **dest, size_t *rlen) { size_t i, len; - char ptr[3]; if (dest) *dest = NULL; @@ -1402,13 +1414,14 @@ pkcs11_decode_hex(const char *hex, unsigned char **dest, size_t *rlen) *dest = xmalloc(len); - ptr[2] = '\0'; for (i = 0; i < len; i++) { - ptr[0] = hex[2 * i]; - ptr[1] = hex[(2 * i) + 1]; - if (!isxdigit(ptr[0]) || !isxdigit(ptr[1])) + int hi, low; + + hi = h2i(hex[2 * i]); + lo = h2i(hex[(2 * i) + 1]); + if (hi == -1 || lo == -1) return -1; - (*dest)[i] = (unsigned char)strtoul(ptr, NULL, 16); + (*dest)[i] = (hi << 4) | lo; } if (rlen) |
