Annotation of embedaddon/strongswan/src/libstrongswan/credentials/keys/public_key.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2015-2017 Tobias Brunner
        !             3:  * Copyright (C) 2014-2016 Andreas Steffen
        !             4:  * Copyright (C) 2007 Martin Willi
        !             5:  * HSR Hochschule fuer Technik Rapperswil
        !             6:  *
        !             7:  * This program is free software; you can redistribute it and/or modify it
        !             8:  * under the terms of the GNU General Public License as published by the
        !             9:  * Free Software Foundation; either version 2 of the License, or (at your
        !            10:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
        !            11:  *
        !            12:  * This program is distributed in the hope that it will be useful, but
        !            13:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            14:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
        !            15:  * for more details.
        !            16:  */
        !            17: 
        !            18: #include <asn1/oid.h>
        !            19: 
        !            20: #include "public_key.h"
        !            21: #include "signature_params.h"
        !            22: 
        !            23: ENUM(key_type_names, KEY_ANY, KEY_BLISS,
        !            24:        "ANY",
        !            25:        "RSA",
        !            26:        "ECDSA",
        !            27:        "DSA",
        !            28:        "ED25519",
        !            29:        "ED448",
        !            30:        "BLISS"
        !            31: );
        !            32: 
        !            33: ENUM(signature_scheme_names, SIGN_UNKNOWN, SIGN_BLISS_WITH_SHA3_512,
        !            34:        "UNKNOWN",
        !            35:        "RSA_EMSA_PKCS1_NULL",
        !            36:        "RSA_EMSA_PKCS1_MD5",
        !            37:        "RSA_EMSA_PKCS1_SHA1",
        !            38:        "RSA_EMSA_PKCS1_SHA2_224",
        !            39:        "RSA_EMSA_PKCS1_SHA2_256",
        !            40:        "RSA_EMSA_PKCS1_SHA2_384",
        !            41:        "RSA_EMSA_PKCS1_SHA2_512",
        !            42:        "RSA_EMSA_PKCS1_SHA3_224",
        !            43:        "RSA_EMSA_PKCS1_SHA3_256",
        !            44:        "RSA_EMSA_PKCS1_SHA3_384",
        !            45:        "RSA_EMSA_PKCS1_SHA3_512",
        !            46:        "RSA_EMSA_PSS",
        !            47:        "ECDSA_WITH_SHA1_DER",
        !            48:        "ECDSA_WITH_SHA256_DER",
        !            49:        "ECDSA_WITH_SHA384_DER",
        !            50:        "ECDSA_WITH_SHA512_DER",
        !            51:        "ECDSA_WITH_NULL",
        !            52:        "ECDSA-256",
        !            53:        "ECDSA-384",
        !            54:        "ECDSA-521",
        !            55:        "ED25519",
        !            56:        "ED448",
        !            57:        "BLISS_WITH_SHA2_256",
        !            58:        "BLISS_WITH_SHA2_384",
        !            59:        "BLISS_WITH_SHA2_512",
        !            60:        "BLISS_WITH_SHA3_256",
        !            61:        "BLISS_WITH_SHA3_384",
        !            62:        "BLISS_WITH_SHA3_512",
        !            63: );
        !            64: 
        !            65: ENUM(encryption_scheme_names, ENCRYPT_UNKNOWN, ENCRYPT_RSA_OAEP_SHA512,
        !            66:        "ENCRYPT_UNKNOWN",
        !            67:        "ENCRYPT_RSA_PKCS1",
        !            68:        "ENCRYPT_RSA_OAEP_SHA1",
        !            69:        "ENCRYPT_RSA_OAEP_SHA224",
        !            70:        "ENCRYPT_RSA_OAEP_SHA256",
        !            71:        "ENCRYPT_RSA_OAEP_SHA384",
        !            72:        "ENCRYPT_RSA_OAEP_SHA512",
        !            73: );
        !            74: 
        !            75: /**
        !            76:  * See header.
        !            77:  */
        !            78: bool public_key_equals(public_key_t *this, public_key_t *other)
        !            79: {
        !            80:        cred_encoding_type_t type;
        !            81:        chunk_t a, b;
        !            82: 
        !            83:        if (this == other)
        !            84:        {
        !            85:                return TRUE;
        !            86:        }
        !            87: 
        !            88:        for (type = 0; type < CRED_ENCODING_MAX; type++)
        !            89:        {
        !            90:                if (this->get_fingerprint(this, type, &a) &&
        !            91:                        other->get_fingerprint(other, type, &b))
        !            92:                {
        !            93:                        return chunk_equals(a, b);
        !            94:                }
        !            95:        }
        !            96:        return FALSE;
        !            97: }
        !            98: 
        !            99: /**
        !           100:  * See header.
        !           101:  */
        !           102: bool public_key_has_fingerprint(public_key_t *public, chunk_t fingerprint)
        !           103: {
        !           104:        cred_encoding_type_t type;
        !           105:        chunk_t current;
        !           106: 
        !           107:        for (type = 0; type < KEYID_MAX; type++)
        !           108:        {
        !           109:                if (public->get_fingerprint(public, type, &current) &&
        !           110:                        chunk_equals(current, fingerprint))
        !           111:                {
        !           112:                        return TRUE;
        !           113:                }
        !           114:        }
        !           115:        return FALSE;
        !           116: }
        !           117: 
        !           118: /*
        !           119:  * Defined in header.
        !           120:  */
        !           121: signature_scheme_t signature_scheme_from_oid(int oid)
        !           122: {
        !           123:        switch (oid)
        !           124:        {
        !           125:                case OID_MD5_WITH_RSA:
        !           126:                case OID_MD5:
        !           127:                        return SIGN_RSA_EMSA_PKCS1_MD5;
        !           128:                case OID_SHA1_WITH_RSA:
        !           129:                case OID_SHA1:
        !           130:                        return SIGN_RSA_EMSA_PKCS1_SHA1;
        !           131:                case OID_SHA224_WITH_RSA:
        !           132:                case OID_SHA224:
        !           133:                        return SIGN_RSA_EMSA_PKCS1_SHA2_224;
        !           134:                case OID_SHA256_WITH_RSA:
        !           135:                case OID_SHA256:
        !           136:                        return SIGN_RSA_EMSA_PKCS1_SHA2_256;
        !           137:                case OID_SHA384_WITH_RSA:
        !           138:                case OID_SHA384:
        !           139:                        return SIGN_RSA_EMSA_PKCS1_SHA2_384;
        !           140:                case OID_SHA512_WITH_RSA:
        !           141:                case OID_SHA512:
        !           142:                        return SIGN_RSA_EMSA_PKCS1_SHA2_512;
        !           143:                case OID_RSASSA_PKCS1V15_WITH_SHA3_224:
        !           144:                        return SIGN_RSA_EMSA_PKCS1_SHA3_224;
        !           145:                case OID_RSASSA_PKCS1V15_WITH_SHA3_256:
        !           146:                        return SIGN_RSA_EMSA_PKCS1_SHA3_256;
        !           147:                case OID_RSASSA_PKCS1V15_WITH_SHA3_384:
        !           148:                        return SIGN_RSA_EMSA_PKCS1_SHA3_384;
        !           149:                case OID_RSASSA_PKCS1V15_WITH_SHA3_512:
        !           150:                        return SIGN_RSA_EMSA_PKCS1_SHA3_512;
        !           151:                case OID_RSASSA_PSS:
        !           152:                        return SIGN_RSA_EMSA_PSS;
        !           153:                case OID_ECDSA_WITH_SHA1:
        !           154:                case OID_EC_PUBLICKEY:
        !           155:                        return SIGN_ECDSA_WITH_SHA1_DER;
        !           156:                case OID_ECDSA_WITH_SHA256:
        !           157:                        return SIGN_ECDSA_WITH_SHA256_DER;
        !           158:                case OID_ECDSA_WITH_SHA384:
        !           159:                        return SIGN_ECDSA_WITH_SHA384_DER;
        !           160:                case OID_ECDSA_WITH_SHA512:
        !           161:                        return SIGN_ECDSA_WITH_SHA512_DER;
        !           162:                case OID_ED25519:
        !           163:                        return SIGN_ED25519;
        !           164:                case OID_ED448:
        !           165:                        return SIGN_ED448;
        !           166:                case OID_BLISS_PUBLICKEY:
        !           167:                case OID_BLISS_WITH_SHA2_512:
        !           168:                        return SIGN_BLISS_WITH_SHA2_512;
        !           169:                case OID_BLISS_WITH_SHA2_384:
        !           170:                        return SIGN_BLISS_WITH_SHA2_384;
        !           171:                case OID_BLISS_WITH_SHA2_256:
        !           172:                        return SIGN_BLISS_WITH_SHA2_256;
        !           173:                case OID_BLISS_WITH_SHA3_512:
        !           174:                        return SIGN_BLISS_WITH_SHA3_512;
        !           175:                case OID_BLISS_WITH_SHA3_384:
        !           176:                        return SIGN_BLISS_WITH_SHA3_384;
        !           177:                case OID_BLISS_WITH_SHA3_256:
        !           178:                        return SIGN_BLISS_WITH_SHA3_256;
        !           179:        }
        !           180:        return SIGN_UNKNOWN;
        !           181: }
        !           182: 
        !           183: /*
        !           184:  * Defined in header.
        !           185:  */
        !           186: int signature_scheme_to_oid(signature_scheme_t scheme)
        !           187: {
        !           188:        switch (scheme)
        !           189:        {
        !           190:                case SIGN_UNKNOWN:
        !           191:                case SIGN_RSA_EMSA_PKCS1_NULL:
        !           192:                case SIGN_ECDSA_WITH_NULL:
        !           193:                case SIGN_ECDSA_256:
        !           194:                case SIGN_ECDSA_384:
        !           195:                case SIGN_ECDSA_521:
        !           196:                        break;
        !           197:                case SIGN_RSA_EMSA_PKCS1_MD5:
        !           198:                        return OID_MD5_WITH_RSA;
        !           199:                case SIGN_RSA_EMSA_PKCS1_SHA1:
        !           200:                        return OID_SHA1_WITH_RSA;
        !           201:                case SIGN_RSA_EMSA_PKCS1_SHA2_224:
        !           202:                        return OID_SHA224_WITH_RSA;
        !           203:                case SIGN_RSA_EMSA_PKCS1_SHA2_256:
        !           204:                        return OID_SHA256_WITH_RSA;
        !           205:                case SIGN_RSA_EMSA_PKCS1_SHA2_384:
        !           206:                        return OID_SHA384_WITH_RSA;
        !           207:                case SIGN_RSA_EMSA_PKCS1_SHA2_512:
        !           208:                        return OID_SHA512_WITH_RSA;
        !           209:                case SIGN_RSA_EMSA_PKCS1_SHA3_224:
        !           210:                        return OID_RSASSA_PKCS1V15_WITH_SHA3_224;
        !           211:                case SIGN_RSA_EMSA_PKCS1_SHA3_256:
        !           212:                        return OID_RSASSA_PKCS1V15_WITH_SHA3_256;
        !           213:                case SIGN_RSA_EMSA_PKCS1_SHA3_384:
        !           214:                        return OID_RSASSA_PKCS1V15_WITH_SHA3_384;
        !           215:                case SIGN_RSA_EMSA_PKCS1_SHA3_512:
        !           216:                        return OID_RSASSA_PKCS1V15_WITH_SHA3_384;
        !           217:                case SIGN_RSA_EMSA_PSS:
        !           218:                        return OID_RSASSA_PSS;
        !           219:                case SIGN_ECDSA_WITH_SHA1_DER:
        !           220:                        return OID_ECDSA_WITH_SHA1;
        !           221:                case SIGN_ECDSA_WITH_SHA256_DER:
        !           222:                        return OID_ECDSA_WITH_SHA256;
        !           223:                case SIGN_ECDSA_WITH_SHA384_DER:
        !           224:                        return OID_ECDSA_WITH_SHA384;
        !           225:                case SIGN_ECDSA_WITH_SHA512_DER:
        !           226:                        return OID_ECDSA_WITH_SHA512;
        !           227:                case SIGN_ED25519:
        !           228:                        return OID_ED25519;
        !           229:                case SIGN_ED448:
        !           230:                        return OID_ED448;
        !           231:                case SIGN_BLISS_WITH_SHA2_256:
        !           232:                        return OID_BLISS_WITH_SHA2_256;
        !           233:                case SIGN_BLISS_WITH_SHA2_384:
        !           234:                        return OID_BLISS_WITH_SHA2_384;
        !           235:                case SIGN_BLISS_WITH_SHA2_512:
        !           236:                        return OID_BLISS_WITH_SHA2_512;
        !           237:                case SIGN_BLISS_WITH_SHA3_256:
        !           238:                        return OID_BLISS_WITH_SHA3_256;
        !           239:                case SIGN_BLISS_WITH_SHA3_384:
        !           240:                        return OID_BLISS_WITH_SHA3_384;
        !           241:                case SIGN_BLISS_WITH_SHA3_512:
        !           242:                        return OID_BLISS_WITH_SHA3_512;
        !           243:        }
        !           244:        return OID_UNKNOWN;
        !           245: }
        !           246: 
        !           247: /**
        !           248:  * Parameters for RSA/PSS signature schemes
        !           249:  */
        !           250: #define PSS_PARAMS(bits) static rsa_pss_params_t pss_params_sha##bits = { \
        !           251:        .hash = HASH_SHA##bits, \
        !           252:        .mgf1_hash = HASH_SHA##bits, \
        !           253:        .salt_len = HASH_SIZE_SHA##bits, \
        !           254: }
        !           255: 
        !           256: PSS_PARAMS(256);
        !           257: PSS_PARAMS(384);
        !           258: PSS_PARAMS(512);
        !           259: 
        !           260: /**
        !           261:  * Map for signature schemes to the key type and maximum key size allowed.
        !           262:  * We only cover schemes with hash algorithms supported by IKEv2 signature
        !           263:  * authentication.
        !           264:  */
        !           265: static struct {
        !           266:        key_type_t type;
        !           267:        int max_keysize;
        !           268:        signature_params_t params;
        !           269: } scheme_map[] = {
        !           270:        { KEY_RSA,  3072, { .scheme = SIGN_RSA_EMSA_PSS, .params = &pss_params_sha256, }},
        !           271:        { KEY_RSA,  7680, { .scheme = SIGN_RSA_EMSA_PSS, .params = &pss_params_sha384, }},
        !           272:        { KEY_RSA,     0, { .scheme = SIGN_RSA_EMSA_PSS, .params = &pss_params_sha512, }},
        !           273:        { KEY_RSA,  3072, { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_256 }},
        !           274:        { KEY_RSA,  7680, { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_384 }},
        !           275:        { KEY_RSA,     0, { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_512 }},
        !           276:        { KEY_ECDSA, 256, { .scheme = SIGN_ECDSA_WITH_SHA256_DER }},
        !           277:        { KEY_ECDSA, 384, { .scheme = SIGN_ECDSA_WITH_SHA384_DER }},
        !           278:        { KEY_ECDSA,   0, { .scheme = SIGN_ECDSA_WITH_SHA512_DER }},
        !           279:        { KEY_ED25519, 0, { .scheme = SIGN_ED25519 }},
        !           280:        { KEY_ED448,   0, { .scheme = SIGN_ED448 }},
        !           281:        { KEY_BLISS, 128, { .scheme = SIGN_BLISS_WITH_SHA2_256 }},
        !           282:        { KEY_BLISS, 192, { .scheme = SIGN_BLISS_WITH_SHA2_384 }},
        !           283:        { KEY_BLISS,   0, { .scheme = SIGN_BLISS_WITH_SHA2_512 }},
        !           284: };
        !           285: 
        !           286: /**
        !           287:  * Private data for signature scheme enumerator
        !           288:  */
        !           289: typedef struct  {
        !           290:        enumerator_t public;
        !           291:        int index;
        !           292:        key_type_t type;
        !           293:        int size;
        !           294: } private_enumerator_t;
        !           295: 
        !           296: METHOD(enumerator_t, signature_schemes_enumerate, bool,
        !           297:        private_enumerator_t *this, va_list args)
        !           298: {
        !           299:        signature_params_t **params;
        !           300: 
        !           301:        VA_ARGS_VGET(args, params);
        !           302: 
        !           303:        while (++this->index < countof(scheme_map))
        !           304:        {
        !           305:                if (this->type == scheme_map[this->index].type &&
        !           306:                   (this->size <= scheme_map[this->index].max_keysize ||
        !           307:                        !scheme_map[this->index].max_keysize))
        !           308:                {
        !           309:                        *params = &scheme_map[this->index].params;
        !           310:                        return TRUE;
        !           311:                }
        !           312:        }
        !           313:        return FALSE;
        !           314: }
        !           315: 
        !           316: /*
        !           317:  * Defined in header.
        !           318:  */
        !           319: enumerator_t *signature_schemes_for_key(key_type_t type, int size)
        !           320: {
        !           321:        private_enumerator_t *this;
        !           322: 
        !           323:        INIT(this,
        !           324:                .public = {
        !           325:                        .enumerate = enumerator_enumerate_default,
        !           326:                        .venumerate = _signature_schemes_enumerate,
        !           327:                        .destroy = (void*)free,
        !           328:                },
        !           329:                .index = -1,
        !           330:                .type = type,
        !           331:                .size = size,
        !           332:        );
        !           333: 
        !           334:        return &this->public;
        !           335: }
        !           336: 
        !           337: /*
        !           338:  * Defined in header.
        !           339:  */
        !           340: key_type_t key_type_from_signature_scheme(signature_scheme_t scheme)
        !           341: {
        !           342:        switch (scheme)
        !           343:        {
        !           344:                case SIGN_UNKNOWN:
        !           345:                        break;
        !           346:                case SIGN_RSA_EMSA_PKCS1_NULL:
        !           347:                case SIGN_RSA_EMSA_PKCS1_MD5:
        !           348:                case SIGN_RSA_EMSA_PKCS1_SHA1:
        !           349:                case SIGN_RSA_EMSA_PKCS1_SHA2_224:
        !           350:                case SIGN_RSA_EMSA_PKCS1_SHA2_256:
        !           351:                case SIGN_RSA_EMSA_PKCS1_SHA2_384:
        !           352:                case SIGN_RSA_EMSA_PKCS1_SHA2_512:
        !           353:                case SIGN_RSA_EMSA_PKCS1_SHA3_224:
        !           354:                case SIGN_RSA_EMSA_PKCS1_SHA3_256:
        !           355:                case SIGN_RSA_EMSA_PKCS1_SHA3_384:
        !           356:                case SIGN_RSA_EMSA_PKCS1_SHA3_512:
        !           357:                case SIGN_RSA_EMSA_PSS:
        !           358:                        return KEY_RSA;
        !           359:                case SIGN_ECDSA_WITH_SHA1_DER:
        !           360:                case SIGN_ECDSA_WITH_SHA256_DER:
        !           361:                case SIGN_ECDSA_WITH_SHA384_DER:
        !           362:                case SIGN_ECDSA_WITH_SHA512_DER:
        !           363:                case SIGN_ECDSA_WITH_NULL:
        !           364:                case SIGN_ECDSA_256:
        !           365:                case SIGN_ECDSA_384:
        !           366:                case SIGN_ECDSA_521:
        !           367:                        return KEY_ECDSA;
        !           368:                case SIGN_ED25519:
        !           369:                        return KEY_ED25519;
        !           370:                case SIGN_ED448:
        !           371:                        return KEY_ED448;
        !           372:                case SIGN_BLISS_WITH_SHA2_256:
        !           373:                case SIGN_BLISS_WITH_SHA2_384:
        !           374:                case SIGN_BLISS_WITH_SHA2_512:
        !           375:                case SIGN_BLISS_WITH_SHA3_256:
        !           376:                case SIGN_BLISS_WITH_SHA3_384:
        !           377:                case SIGN_BLISS_WITH_SHA3_512:
        !           378:                        return KEY_BLISS;
        !           379:        }
        !           380:        return KEY_ANY;
        !           381: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>