1
0
mirror of https://github.com/libp2p/go-openssl.git synced 2025-04-23 17:40:31 +08:00

PA-267: Added regular sign

This commit is contained in:
marko-fazz 2022-11-22 22:11:49 +08:00
parent 5190fe670a
commit 6253032ea7
3 changed files with 41 additions and 0 deletions

31
key.go
View File

@ -19,6 +19,7 @@ import "C"
import (
"errors"
"fmt"
"io"
"runtime"
"unsafe"
@ -100,6 +101,9 @@ type PrivateKey interface {
// Signs the data using PKCS1.15
SignPKCS1v15(Method, []byte) ([]byte, error)
// Signs the data
Sign(method Method, data []byte) ([]byte, error)
// MarshalPKCS1PrivateKeyPEM converts the private key to PEM-encoded PKCS1
// format
MarshalPKCS1PrivateKeyPEM() (pem_block []byte, err error)
@ -179,6 +183,33 @@ func (key *pKey) SignPKCS1v15(method Method, data []byte) ([]byte, error) {
}
}
func (key *pKey) Sign(method Method, data []byte) ([]byte, error) {
// std::vector<uint8_t> sign(const uint8_t *data, size_t size) const
ctx := C.X_EVP_MD_CTX_new()
defer C.X_EVP_MD_CTX_free(ctx)
if C.X_EVP_DigestSignInit(ctx, nil, method, nil, key.key) != 1 {
return nil, fmt.Errorf("EVP_DigestSignInit")
}
if C.X_EVP_DigestSignUpdate(ctx, unsafe.Pointer(&data[0]), C.size_t(len(data))) <= 0 {
return nil, fmt.Errorf("EVP_DigestSignUpdate")
}
var msgLenEnc C.size_t
if (C.X_EVP_DigestSignFinal(ctx, nil, &msgLenEnc)) <= 0 {
return nil, fmt.Errorf("EVP_DigestSignFinal get length")
}
sig := make([]byte, msgLenEnc)
if (C.X_EVP_DigestSignFinal(ctx, (*C.uchar)(unsafe.Pointer(&sig[0])), &msgLenEnc)) <= 0 {
return nil, fmt.Errorf("EVP_DigestSignFinal")
}
return sig, nil
}
func (key *pKey) VerifyPKCS1v15(method Method, data, sig []byte) error {
ctx := C.X_EVP_MD_CTX_new()
defer C.X_EVP_MD_CTX_free(ctx)

8
shim.c
View File

@ -58,6 +58,14 @@ int X_EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sigret,
return EVP_DigestSign(ctx, sigret, siglen, tbs, tbslen);
}
int X_EVP_DigestSignUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt){
return EVP_DigestSignUpdate(ctx, d, cnt);
}
int X_EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sigret,
size_t *siglen) {
return EVP_DigestSignFinal(ctx, sigret, siglen);
}
int X_EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey){

2
shim.h
View File

@ -132,6 +132,8 @@ extern int X_EVP_SignInit(EVP_MD_CTX *ctx, const EVP_MD *type);
extern int X_EVP_SignUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt);
extern int X_EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx, const EVP_MD *type, ENGINE *e, EVP_PKEY *pkey);
extern int X_EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen, const unsigned char *tbs, size_t tbslen);
extern int X_EVP_DigestSignUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt);
extern int X_EVP_DigestSignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen);
extern EVP_PKEY *X_EVP_PKEY_new(void);
extern void X_EVP_PKEY_free(EVP_PKEY *pkey);
extern int X_EVP_PKEY_size(EVP_PKEY *pkey);