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);
0 commit comments