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:
parent
5190fe670a
commit
6253032ea7
31
key.go
31
key.go
@ -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
8
shim.c
@ -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
2
shim.h
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user