Skip to content
This repository was archived by the owner on Dec 20, 2023. It is now read-only.

Commit d7939b3

Browse files
authored
Merge pull request #555 from openweave/bug/emargolis/fix-der-to-weave-implementation
Fixed Function Implementation that Converts DER to Weave Signature.
2 parents a781b34 + d665d98 commit d7939b3

File tree

2 files changed

+30
-7
lines changed

2 files changed

+30
-7
lines changed

src/lib/profiles/security/WeaveSig.cpp

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/*
22
*
3+
* Copyright (c) 2020 Google LLC.
34
* Copyright (c) 2013-2017 Nest Labs, Inc.
45
* All rights reserved.
56
*
@@ -501,9 +502,9 @@ WEAVE_ERROR EncodeWeaveECDSASignature(TLVWriter& writer, EncodedECDSASignature&
501502
return err;
502503
}
503504

504-
// Takes an ECDSA signature in DER form and converts it to Weave form.
505+
// Takes an ECDSA signature in DER form and converts and copies values it to Weave form.
505506
// ECDSA-Sig-Value ::= SEQUENCE { r INTEGER, s INTEGER }
506-
WEAVE_ERROR ConvertECDSASignature_DERToWeave(const uint8_t * sigBuf, uint8_t sigLen, EncodedECDSASignature& sig)
507+
WEAVE_ERROR DecodeCopyECDSASignature_DER(const uint8_t * sigBuf, uint8_t sigLen, EncodedECDSASignature& sig)
507508
{
508509
WEAVE_ERROR err;
509510
ASN1Reader reader;
@@ -514,11 +515,20 @@ WEAVE_ERROR ConvertECDSASignature_DERToWeave(const uint8_t * sigBuf, uint8_t sig
514515
ASN1_PARSE_ENTER_SEQUENCE {
515516
// r INTEGER
516517
ASN1_PARSE_ELEMENT(kASN1TagClass_Universal, kASN1UniversalTag_Integer);
517-
sig.R = const_cast<uint8_t *>(reader.Value);
518+
519+
VerifyOrExit(sig.R != NULL, err = WEAVE_ERROR_INVALID_ARGUMENT);
520+
VerifyOrExit(sig.RLen >= reader.ValueLen, err = WEAVE_ERROR_BUFFER_TOO_SMALL);
521+
522+
memcpy(sig.R, const_cast<uint8_t *>(reader.Value), reader.ValueLen);
518523
sig.RLen = reader.ValueLen;
524+
519525
// s INTEGER
520526
ASN1_PARSE_ELEMENT(kASN1TagClass_Universal, kASN1UniversalTag_Integer);
521-
sig.S = const_cast<uint8_t *>(reader.Value);
527+
528+
VerifyOrExit(sig.S != NULL, err = WEAVE_ERROR_INVALID_ARGUMENT);
529+
VerifyOrExit(sig.SLen >= reader.ValueLen, err = WEAVE_ERROR_BUFFER_TOO_SMALL);
530+
531+
memcpy(sig.S, const_cast<uint8_t *>(reader.Value), reader.ValueLen);
522532
sig.SLen = reader.ValueLen;
523533
} ASN1_EXIT_SEQUENCE;
524534

@@ -532,9 +542,21 @@ WEAVE_ERROR ConvertECDSASignature_DERToWeave(const uint8_t * sigBuf, uint8_t sig
532542
{
533543
WEAVE_ERROR err;
534544
EncodedECDSASignature sig;
545+
ASN1Reader reader;
535546

536-
err = ConvertECDSASignature_DERToWeave(sigBuf, sigLen, sig);
537-
SuccessOrExit(err);
547+
reader.Init(sigBuf, sigLen);
548+
549+
// ECDSA-Sig-Value ::= SEQUENCE
550+
ASN1_PARSE_ENTER_SEQUENCE {
551+
// r INTEGER
552+
ASN1_PARSE_ELEMENT(kASN1TagClass_Universal, kASN1UniversalTag_Integer);
553+
sig.R = const_cast<uint8_t *>(reader.Value);
554+
sig.RLen = reader.ValueLen;
555+
// s INTEGER
556+
ASN1_PARSE_ELEMENT(kASN1TagClass_Universal, kASN1UniversalTag_Integer);
557+
sig.S = const_cast<uint8_t *>(reader.Value);
558+
sig.SLen = reader.ValueLen;
559+
} ASN1_EXIT_SEQUENCE;
538560

539561
err = EncodeWeaveECDSASignature(writer, sig, tag);
540562
SuccessOrExit(err);

src/lib/profiles/security/WeaveSig.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/*
22
*
3+
* Copyright (c) 2020 Google LLC.
34
* Copyright (c) 2013-2017 Nest Labs, Inc.
45
* All rights reserved.
56
*
@@ -132,7 +133,7 @@ extern WEAVE_ERROR GenerateAndEncodeWeaveECDSASignature(TLVWriter& writer, uint6
132133

133134
extern WEAVE_ERROR EncodeWeaveECDSASignature(TLVWriter& writer, EncodedECDSASignature& sig, uint64_t tag);
134135
extern WEAVE_ERROR DecodeWeaveECDSASignature(TLVReader& reader, EncodedECDSASignature& sig);
135-
extern WEAVE_ERROR ConvertECDSASignature_DERToWeave(const uint8_t * sigBuf, uint8_t sigLen, EncodedECDSASignature& sig);
136+
extern WEAVE_ERROR DecodeCopyECDSASignature_DER(const uint8_t * sigBuf, uint8_t sigLen, EncodedECDSASignature& sig);
136137
extern WEAVE_ERROR ConvertECDSASignature_DERToWeave(const uint8_t * sigBuf, uint8_t sigLen, TLVWriter& writer, uint64_t tag);
137138
extern WEAVE_ERROR InsertRelatedCertificatesIntoWeaveSignature(
138139
uint8_t *sigBuf, uint16_t sigLen, uint16_t sigBufLen,

0 commit comments

Comments
 (0)