Blame crypto/poly1305/poly1305_ameth.c

Packit Service 084de1
/*
Packit Service 084de1
 * Copyright 2007-2018 The OpenSSL Project Authors. All Rights Reserved.
Packit Service 084de1
 *
Packit Service 084de1
 * Licensed under the OpenSSL license (the "License").  You may not use
Packit Service 084de1
 * this file except in compliance with the License.  You can obtain a copy
Packit Service 084de1
 * in the file LICENSE in the source distribution or at
Packit Service 084de1
 * https://www.openssl.org/source/license.html
Packit Service 084de1
 */
Packit Service 084de1
Packit Service 084de1
#include <stdio.h>
Packit Service 084de1
#include "internal/cryptlib.h"
Packit Service 084de1
#include <openssl/evp.h>
Packit Service 084de1
#include "crypto/asn1.h"
Packit Service 084de1
#include "crypto/poly1305.h"
Packit Service 084de1
#include "poly1305_local.h"
Packit Service 084de1
#include "crypto/evp.h"
Packit Service 084de1
Packit Service 084de1
/*
Packit Service 084de1
 * POLY1305 "ASN1" method. This is just here to indicate the maximum
Packit Service 084de1
 * POLY1305 output length and to free up a POLY1305 key.
Packit Service 084de1
 */
Packit Service 084de1
Packit Service 084de1
static int poly1305_size(const EVP_PKEY *pkey)
Packit Service 084de1
{
Packit Service 084de1
    return POLY1305_DIGEST_SIZE;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static void poly1305_key_free(EVP_PKEY *pkey)
Packit Service 084de1
{
Packit Service 084de1
    ASN1_OCTET_STRING *os = EVP_PKEY_get0(pkey);
Packit Service 084de1
    if (os != NULL) {
Packit Service 084de1
        if (os->data != NULL)
Packit Service 084de1
            OPENSSL_cleanse(os->data, os->length);
Packit Service 084de1
        ASN1_OCTET_STRING_free(os);
Packit Service 084de1
    }
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int poly1305_pkey_ctrl(EVP_PKEY *pkey, int op, long arg1, void *arg2)
Packit Service 084de1
{
Packit Service 084de1
    /* nothing, (including ASN1_PKEY_CTRL_DEFAULT_MD_NID), is supported */
Packit Service 084de1
    return -2;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int poly1305_pkey_public_cmp(const EVP_PKEY *a, const EVP_PKEY *b)
Packit Service 084de1
{
Packit Service 084de1
    return ASN1_OCTET_STRING_cmp(EVP_PKEY_get0(a), EVP_PKEY_get0(b));
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int poly1305_set_priv_key(EVP_PKEY *pkey, const unsigned char *priv,
Packit Service 084de1
                                 size_t len)
Packit Service 084de1
{
Packit Service 084de1
    ASN1_OCTET_STRING *os;
Packit Service 084de1
Packit Service 084de1
    if (pkey->pkey.ptr != NULL || len != POLY1305_KEY_SIZE)
Packit Service 084de1
        return 0;
Packit Service 084de1
Packit Service 084de1
    os = ASN1_OCTET_STRING_new();
Packit Service 084de1
    if (os == NULL)
Packit Service 084de1
        return 0;
Packit Service 084de1
Packit Service 084de1
    if (!ASN1_OCTET_STRING_set(os, priv, len)) {
Packit Service 084de1
        ASN1_OCTET_STRING_free(os);
Packit Service 084de1
        return 0;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    pkey->pkey.ptr = os;
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int poly1305_get_priv_key(const EVP_PKEY *pkey, unsigned char *priv,
Packit Service 084de1
                                 size_t *len)
Packit Service 084de1
{
Packit Service 084de1
    ASN1_OCTET_STRING *os = (ASN1_OCTET_STRING *)pkey->pkey.ptr;
Packit Service 084de1
Packit Service 084de1
    if (priv == NULL) {
Packit Service 084de1
        *len = POLY1305_KEY_SIZE;
Packit Service 084de1
        return 1;
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    if (os == NULL || *len < POLY1305_KEY_SIZE)
Packit Service 084de1
        return 0;
Packit Service 084de1
Packit Service 084de1
    memcpy(priv, ASN1_STRING_get0_data(os), ASN1_STRING_length(os));
Packit Service 084de1
    *len = POLY1305_KEY_SIZE;
Packit Service 084de1
Packit Service 084de1
    return 1;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
const EVP_PKEY_ASN1_METHOD poly1305_asn1_meth = {
Packit Service 084de1
    EVP_PKEY_POLY1305,
Packit Service 084de1
    EVP_PKEY_POLY1305,
Packit Service 084de1
    0,
Packit Service 084de1
Packit Service 084de1
    "POLY1305",
Packit Service 084de1
    "OpenSSL POLY1305 method",
Packit Service 084de1
Packit Service 084de1
    0, 0, poly1305_pkey_public_cmp, 0,
Packit Service 084de1
Packit Service 084de1
    0, 0, 0,
Packit Service 084de1
Packit Service 084de1
    poly1305_size,
Packit Service 084de1
    0, 0,
Packit Service 084de1
    0, 0, 0, 0, 0, 0, 0,
Packit Service 084de1
Packit Service 084de1
    poly1305_key_free,
Packit Service 084de1
    poly1305_pkey_ctrl,
Packit Service 084de1
    NULL,
Packit Service 084de1
    NULL,
Packit Service 084de1
Packit Service 084de1
    NULL,
Packit Service 084de1
    NULL,
Packit Service 084de1
    NULL,
Packit Service 084de1
Packit Service 084de1
    NULL,
Packit Service 084de1
    NULL,
Packit Service 084de1
    NULL,
Packit Service 084de1
Packit Service 084de1
    poly1305_set_priv_key,
Packit Service 084de1
    NULL,
Packit Service 084de1
    poly1305_get_priv_key,
Packit Service 084de1
    NULL,
Packit Service 084de1
};