Skip to content

Commit 31c3fb2

Browse files
committed
Fix raw key wrappers: len can't be discarded
1 parent 50bdc9a commit 31c3fb2

File tree

2 files changed

+31
-22
lines changed

2 files changed

+31
-22
lines changed

ed25519.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -145,12 +145,12 @@ func NewPrivateKeyEd25519FromSeed(seed []byte) (*PrivateKeyEd25519, error) {
145145
}
146146

147147
func extractPKEYPubEd25519(pkey C.GO_EVP_PKEY_PTR, pub []byte) error {
148-
pubSize := C.size_t(publicKeySizeEd25519)
149-
if C.go_openssl_EVP_PKEY_get_raw_public_key_wrapper(pkey, base(pub), pubSize) != 1 {
148+
r := C.go_openssl_EVP_PKEY_get_raw_public_key_wrapper(pkey, base(pub), C.size_t(publicKeySizeEd25519))
149+
if r.result != 1 {
150150
return newOpenSSLError("EVP_PKEY_get_raw_public_key")
151151
}
152-
if pubSize != publicKeySizeEd25519 {
153-
return errors.New("ed25519: bad public key length: " + strconv.Itoa(int(pubSize)))
152+
if r.len != publicKeySizeEd25519 {
153+
return errors.New("ed25519: bad public key length: " + strconv.Itoa(int(r.len)))
154154
}
155155
return nil
156156
}
@@ -159,12 +159,12 @@ func extractPKEYPrivEd25519(pkey C.GO_EVP_PKEY_PTR, priv []byte) error {
159159
if err := extractPKEYPubEd25519(pkey, priv[seedSizeEd25519:]); err != nil {
160160
return err
161161
}
162-
privSize := C.size_t(seedSizeEd25519)
163-
if C.go_openssl_EVP_PKEY_get_raw_private_key_wrapper(pkey, base(priv), privSize) != 1 {
162+
r := C.go_openssl_EVP_PKEY_get_raw_private_key_wrapper(pkey, base(priv), C.size_t(seedSizeEd25519))
163+
if r.result != 1 {
164164
return newOpenSSLError("EVP_PKEY_get_raw_private_key")
165165
}
166-
if privSize != seedSizeEd25519 {
167-
return errors.New("ed25519: bad private key length: " + strconv.Itoa(int(privSize)))
166+
if r.len != seedSizeEd25519 {
167+
return errors.New("ed25519: bad private key length: " + strconv.Itoa(int(r.len)))
168168
}
169169
return nil
170170
}

goopenssl.h

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,8 @@ go_hash_sum(GO_EVP_MD_CTX_PTR ctx, GO_EVP_MD_CTX_PTR ctx2, unsigned char *out)
8282
return go_openssl_EVP_DigestFinal(ctx2, out, NULL);
8383
}
8484

85-
// These wrappers allocate length variables on the C stack to avoid having to pass a pointer from Go, which would escape to the heap.
85+
// These wrappers allocate out_len on the C stack to avoid having to pass a pointer from Go, which would escape to the heap.
8686
// Use them only in situations where the output length can be safely discarded.
87-
8887
static inline int
8988
go_openssl_EVP_EncryptUpdate_wrapper(GO_EVP_CIPHER_CTX_PTR ctx, unsigned char *out, const unsigned char *in, int in_len)
9089
{
@@ -106,18 +105,6 @@ go_openssl_EVP_CipherUpdate_wrapper(GO_EVP_CIPHER_CTX_PTR ctx, unsigned char *ou
106105
return go_openssl_EVP_CipherUpdate(ctx, out, &len, in, in_len);
107106
}
108107

109-
static inline int
110-
go_openssl_EVP_PKEY_get_raw_public_key_wrapper(const GO_EVP_PKEY_PTR pkey, unsigned char *pub, size_t len)
111-
{
112-
return go_openssl_EVP_PKEY_get_raw_public_key(pkey, pub, &len);
113-
}
114-
115-
static inline int
116-
go_openssl_EVP_PKEY_get_raw_private_key_wrapper(const GO_EVP_PKEY_PTR pkey, unsigned char *priv, size_t len)
117-
{
118-
return go_openssl_EVP_PKEY_get_raw_private_key(pkey, priv, &len);
119-
}
120-
121108
// These wrappers also allocate length variables on the C stack to avoid escape to the heap, but do return the result.
122109
// A struct is returned that contains multiple return values instead of OpenSSL's approach of using pointers.
123110

@@ -135,6 +122,28 @@ go_openssl_EVP_PKEY_derive_wrapper(GO_EVP_PKEY_CTX_PTR ctx, unsigned char *key,
135122
return r;
136123
}
137124

125+
typedef struct
126+
{
127+
int result;
128+
size_t len;
129+
} go_openssl_EVP_PKEY_get_raw_key_out;
130+
131+
static inline go_openssl_EVP_PKEY_get_raw_key_out
132+
go_openssl_EVP_PKEY_get_raw_public_key_wrapper(const GO_EVP_PKEY_PTR pkey, unsigned char *pub, size_t len)
133+
{
134+
go_openssl_EVP_PKEY_get_raw_key_out r = {0, len};
135+
r.result = go_openssl_EVP_PKEY_get_raw_public_key(pkey, pub, &r.len);
136+
return r;
137+
}
138+
139+
static inline go_openssl_EVP_PKEY_get_raw_key_out
140+
go_openssl_EVP_PKEY_get_raw_private_key_wrapper(const GO_EVP_PKEY_PTR pkey, unsigned char *priv, size_t len)
141+
{
142+
go_openssl_EVP_PKEY_get_raw_key_out r = {0, len};
143+
r.result = go_openssl_EVP_PKEY_get_raw_private_key(pkey, priv, &r.len);
144+
return r;
145+
}
146+
138147
typedef struct
139148
{
140149
int result;

0 commit comments

Comments
 (0)