2012-09-21 23:25:04 +01:00
/* Signature verification with an asymmetric key
*
2018-05-08 15:14:57 -03:00
* See Documentation / crypto / asymmetric - keys . txt
2012-09-21 23:25:04 +01:00
*
* Copyright ( C ) 2012 Red Hat , Inc . All Rights Reserved .
* Written by David Howells ( dhowells @ redhat . com )
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public Licence
* as published by the Free Software Foundation ; either version
* 2 of the Licence , or ( at your option ) any later version .
*/
2014-09-02 13:52:15 +01:00
# define pr_fmt(fmt) "SIG: "fmt
2012-09-21 23:25:04 +01:00
# include <keys/asymmetric-subtype.h>
2015-12-09 15:05:28 -05:00
# include <linux/export.h>
2012-09-21 23:25:04 +01:00
# include <linux/err.h>
2016-04-06 16:13:33 +01:00
# include <linux/slab.h>
2012-09-21 23:25:04 +01:00
# include <crypto/public_key.h>
# include "asymmetric_keys.h"
2016-04-06 16:13:33 +01:00
/*
* Destroy a public key signature .
*/
void public_key_signature_free ( struct public_key_signature * sig )
{
2016-04-06 16:13:33 +01:00
int i ;
2016-04-06 16:13:33 +01:00
if ( sig ) {
2016-04-06 16:13:33 +01:00
for ( i = 0 ; i < ARRAY_SIZE ( sig - > auth_ids ) ; i + + )
kfree ( sig - > auth_ids [ i ] ) ;
2016-04-06 16:13:33 +01:00
kfree ( sig - > s ) ;
kfree ( sig - > digest ) ;
kfree ( sig ) ;
}
}
EXPORT_SYMBOL_GPL ( public_key_signature_free ) ;
2012-09-21 23:25:04 +01:00
/**
* verify_signature - Initiate the use of an asymmetric key to verify a signature
* @ key : The asymmetric key to verify against
* @ sig : The signature to check
*
* Returns 0 if successful or else an error .
*/
int verify_signature ( const struct key * key ,
const struct public_key_signature * sig )
{
const struct asymmetric_key_subtype * subtype ;
int ret ;
pr_devel ( " ==>%s() \n " , __func__ ) ;
if ( key - > type ! = & key_type_asymmetric )
return - EINVAL ;
subtype = asymmetric_key_subtype ( key ) ;
if ( ! subtype | |
2015-10-21 14:04:48 +01:00
! key - > payload . data [ 0 ] )
2012-09-21 23:25:04 +01:00
return - EINVAL ;
if ( ! subtype - > verify_signature )
return - ENOTSUPP ;
ret = subtype - > verify_signature ( key , sig ) ;
pr_devel ( " <==%s() = %d \n " , __func__ , ret ) ;
return ret ;
}
EXPORT_SYMBOL_GPL ( verify_signature ) ;