19
19
#include " AndroidOperationalCredentialsIssuer.h"
20
20
#include < algorithm>
21
21
#include < credentials/CHIPCert.h>
22
+ #include < credentials/DeviceAttestationConstructor.h>
22
23
#include < lib/core/CASEAuthTag.h>
23
24
#include < lib/core/CHIPTLV.h>
24
25
#include < lib/support/CHIPMem.h>
30
31
31
32
#include < lib/support/CHIPJNIError.h>
32
33
#include < lib/support/JniReferences.h>
34
+ #include < lib/support/JniTypeWrappers.h>
33
35
34
36
namespace chip {
35
37
namespace Controller {
@@ -40,6 +42,13 @@ using namespace Credentials;
40
42
using namespace Crypto ;
41
43
using namespace TLV ;
42
44
45
+ static CHIP_ERROR N2J_CSRInfo (JNIEnv * env, jbyteArray nonce, jbyteArray elements, jbyteArray elementsSignature, jbyteArray csr,
46
+ jobject & outCSRInfo);
47
+
48
+ static CHIP_ERROR N2J_AttestationInfo (JNIEnv * env, jbyteArray challenge, jbyteArray nonce, jbyteArray elements,
49
+ jbyteArray elementsSignature, jbyteArray dac, jbyteArray pai, jbyteArray cd,
50
+ jbyteArray firmwareInfo, jobject & outAttestationInfo);
51
+
43
52
CHIP_ERROR AndroidOperationalCredentialsIssuer::Initialize (PersistentStorageDelegate & storage, AutoCommissioner * autoCommissioner,
44
53
jobject javaObjectRef)
45
54
{
@@ -149,8 +158,9 @@ CHIP_ERROR AndroidOperationalCredentialsIssuer::CallbackGenerateNOCChain(const B
149
158
{
150
159
jmethodID method;
151
160
CHIP_ERROR err = CHIP_NO_ERROR;
152
- err = JniReferences::GetInstance ().FindMethod (JniReferences::GetInstance ().GetEnvForCurrentThread (), mJavaObjectRef ,
153
- " onNOCChainGenerationNeeded" , " ([B[B[B[B[B[B[B[B[B)V" , &method);
161
+ JNIEnv * env = JniReferences::GetInstance ().GetEnvForCurrentThread ();
162
+ err = JniReferences::GetInstance ().FindMethod (env, mJavaObjectRef , " onNOCChainGenerationNeeded" , " ([B[B[B[B[B[B[B[B[B)V" ,
163
+ &method);
154
164
if (err != CHIP_NO_ERROR)
155
165
{
156
166
ChipLogError (Controller, " Error invoking onNOCChainGenerationNeeded: %" CHIP_ERROR_FORMAT, err.Format ());
@@ -159,52 +169,103 @@ CHIP_ERROR AndroidOperationalCredentialsIssuer::CallbackGenerateNOCChain(const B
159
169
160
170
mOnNOCCompletionCallback = onCompletion;
161
171
162
- JniReferences::GetInstance (). GetEnvForCurrentThread () ->ExceptionClear ();
172
+ env ->ExceptionClear ();
163
173
164
- jbyteArray javaCsr;
165
- JniReferences::GetInstance ().N2J_ByteArray (JniReferences::GetInstance ().GetEnvForCurrentThread (), csrElements.data (),
166
- csrElements.size (), javaCsr);
174
+ jbyteArray javaCsrElements;
175
+ JniReferences::GetInstance ().N2J_ByteArray (env, csrElements.data (), csrElements.size (), javaCsrElements);
167
176
168
177
jbyteArray javaCsrNonce;
169
- JniReferences::GetInstance ().N2J_ByteArray (JniReferences::GetInstance ().GetEnvForCurrentThread (), csrNonce.data (),
170
- csrNonce.size (), javaCsrNonce);
178
+ JniReferences::GetInstance ().N2J_ByteArray (env, csrNonce.data (), csrNonce.size (), javaCsrNonce);
171
179
172
180
jbyteArray javaCsrSignature;
173
- JniReferences::GetInstance ().N2J_ByteArray (JniReferences::GetInstance ().GetEnvForCurrentThread (), csrSignature.data (),
174
- csrSignature.size (), javaCsrSignature);
181
+ JniReferences::GetInstance ().N2J_ByteArray (env, csrSignature.data (), csrSignature.size (), javaCsrSignature);
182
+
183
+ ChipLogProgress (Controller, " Parsing Certificate Signing Request" );
184
+ TLVReader reader;
185
+ reader.Init (csrElements);
186
+
187
+ if (reader.GetType () == kTLVType_NotSpecified )
188
+ {
189
+ ReturnErrorOnFailure (reader.Next ());
190
+ }
191
+
192
+ VerifyOrReturnError (reader.GetType () == kTLVType_Structure , CHIP_ERROR_WRONG_TLV_TYPE);
193
+ VerifyOrReturnError (reader.GetTag () == AnonymousTag (), CHIP_ERROR_UNEXPECTED_TLV_ELEMENT);
194
+
195
+ TLVType containerType;
196
+ ReturnErrorOnFailure (reader.EnterContainer (containerType));
197
+ ReturnErrorOnFailure (reader.Next (kTLVType_ByteString , TLV::ContextTag (1 )));
198
+
199
+ ByteSpan csr (reader.GetReadPoint (), reader.GetLength ());
200
+ reader.ExitContainer (containerType);
201
+
202
+ jbyteArray javaCsr;
203
+ JniReferences::GetInstance ().N2J_ByteArray (env, csr.data (), csr.size (), javaCsr);
204
+
205
+ jobject csrInfo;
206
+ err = N2J_CSRInfo (env, javaCsrNonce, javaCsrElements, javaCsrSignature, javaCsr, csrInfo);
207
+ if (err != CHIP_NO_ERROR)
208
+ {
209
+ ChipLogError (Controller, " Failed to create CSRInfo" );
210
+ return err;
211
+ }
175
212
176
213
jbyteArray javaAttestationChallenge;
177
- JniReferences::GetInstance ().N2J_ByteArray (JniReferences::GetInstance (). GetEnvForCurrentThread (), attestationChallenge.data (),
178
- attestationChallenge. size (), javaAttestationChallenge);
214
+ JniReferences::GetInstance ().N2J_ByteArray (env, attestationChallenge. data (), attestationChallenge.size (),
215
+ javaAttestationChallenge);
179
216
180
217
const ByteSpan & attestationElements = mAutoCommissioner ->GetCommissioningParameters ().GetAttestationElements ().Value ();
181
218
jbyteArray javaAttestationElements;
182
- JniReferences::GetInstance ().N2J_ByteArray (JniReferences::GetInstance (). GetEnvForCurrentThread (), attestationElements.data (),
183
- attestationElements. size (), javaAttestationElements);
219
+ JniReferences::GetInstance ().N2J_ByteArray (env, attestationElements. data (), attestationElements.size (),
220
+ javaAttestationElements);
184
221
185
222
const ByteSpan & attestationNonce = mAutoCommissioner ->GetCommissioningParameters ().GetAttestationNonce ().Value ();
186
223
jbyteArray javaAttestationNonce;
187
- JniReferences::GetInstance ().N2J_ByteArray (JniReferences::GetInstance ().GetEnvForCurrentThread (), attestationNonce.data (),
188
- attestationNonce.size (), javaAttestationNonce);
224
+ JniReferences::GetInstance ().N2J_ByteArray (env, attestationNonce.data (), attestationNonce.size (), javaAttestationNonce);
189
225
190
226
const ByteSpan & attestationElementsSignature =
191
227
mAutoCommissioner ->GetCommissioningParameters ().GetAttestationSignature ().Value ();
192
228
jbyteArray javaAttestationElementsSignature;
193
- JniReferences::GetInstance ().N2J_ByteArray (JniReferences::GetInstance ().GetEnvForCurrentThread (),
194
- attestationElementsSignature.data (), attestationElementsSignature.size (),
229
+ JniReferences::GetInstance ().N2J_ByteArray (env, attestationElementsSignature.data (), attestationElementsSignature.size (),
195
230
javaAttestationElementsSignature);
196
231
197
232
jbyteArray javaDAC;
198
- JniReferences::GetInstance ().N2J_ByteArray (JniReferences::GetInstance ().GetEnvForCurrentThread (), DAC.data (), DAC.size (),
199
- javaDAC);
233
+ JniReferences::GetInstance ().N2J_ByteArray (env, DAC.data (), DAC.size (), javaDAC);
200
234
201
235
jbyteArray javaPAI;
202
- JniReferences::GetInstance ().N2J_ByteArray (JniReferences::GetInstance ().GetEnvForCurrentThread (), PAI.data (), PAI.size (),
203
- javaPAI);
236
+ JniReferences::GetInstance ().N2J_ByteArray (env, PAI.data (), PAI.size (), javaPAI);
237
+
238
+ ByteSpan certificationDeclarationSpan;
239
+ ByteSpan attestationNonceSpan;
240
+ uint32_t timestampDeconstructed;
241
+ ByteSpan firmwareInfoSpan;
242
+ DeviceAttestationVendorReservedDeconstructor vendorReserved;
243
+
244
+ err = DeconstructAttestationElements (attestationElements, certificationDeclarationSpan, attestationNonceSpan,
245
+ timestampDeconstructed, firmwareInfoSpan, vendorReserved);
246
+ if (err != CHIP_NO_ERROR)
247
+ {
248
+ ChipLogError (Controller, " Failed to create parse attestation elements" );
249
+ return err;
250
+ }
251
+
252
+ jbyteArray javaCD;
253
+ JniReferences::GetInstance ().N2J_ByteArray (env, certificationDeclarationSpan.data (), certificationDeclarationSpan.size (),
254
+ javaCD);
204
255
205
- JniReferences::GetInstance ().GetEnvForCurrentThread ()->CallVoidMethod (
206
- mJavaObjectRef , method, javaCsr, javaCsrNonce, javaCsrSignature, javaAttestationChallenge, javaAttestationElements,
207
- javaAttestationNonce, javaAttestationElementsSignature, javaDAC, javaPAI);
256
+ jbyteArray javaFirmwareInfo;
257
+ JniReferences::GetInstance ().N2J_ByteArray (env, firmwareInfoSpan.data (), firmwareInfoSpan.size (), javaFirmwareInfo);
258
+
259
+ jobject attestationInfo;
260
+ err = N2J_AttestationInfo (env, javaAttestationChallenge, javaAttestationNonce, javaAttestationElements,
261
+ javaAttestationElementsSignature, javaDAC, javaPAI, javaCD, javaFirmwareInfo, attestationInfo);
262
+ if (err != CHIP_NO_ERROR)
263
+ {
264
+ ChipLogError (Controller, " Failed to create AttestationInfo" );
265
+ return err;
266
+ }
267
+
268
+ env->CallVoidMethod (mJavaObjectRef , method, csrInfo, attestationInfo);
208
269
return CHIP_NO_ERROR;
209
270
}
210
271
@@ -312,5 +373,51 @@ CHIP_ERROR AndroidOperationalCredentialsIssuer::LocalGenerateNOCChain(const Byte
312
373
return CHIP_NO_ERROR;
313
374
}
314
375
376
+ CHIP_ERROR N2J_CSRInfo (JNIEnv * env, jbyteArray nonce, jbyteArray elements, jbyteArray elementsSignature, jbyteArray csr,
377
+ jobject & outCSRInfo)
378
+ {
379
+ CHIP_ERROR err = CHIP_NO_ERROR;
380
+ jmethodID constructor;
381
+ jclass infoClass;
382
+
383
+ err = JniReferences::GetInstance ().GetClassRef (env, " chip/devicecontroller/CSRInfo" , infoClass);
384
+ JniClass attestationInfoClass (infoClass);
385
+ SuccessOrExit (err);
386
+
387
+ env->ExceptionClear ();
388
+ constructor = env->GetMethodID (infoClass, " <init>" , " ([B[B[B[B)V" );
389
+ VerifyOrExit (constructor != nullptr , err = CHIP_JNI_ERROR_METHOD_NOT_FOUND);
390
+
391
+ outCSRInfo = (jobject) env->NewObject (infoClass, constructor, nonce, elements, elementsSignature, csr);
392
+
393
+ VerifyOrExit (!env->ExceptionCheck (), err = CHIP_JNI_ERROR_EXCEPTION_THROWN);
394
+ exit :
395
+ return err;
396
+ }
397
+
398
+ CHIP_ERROR N2J_AttestationInfo (JNIEnv * env, jbyteArray challenge, jbyteArray nonce, jbyteArray elements,
399
+ jbyteArray elementsSignature, jbyteArray dac, jbyteArray pai, jbyteArray cd, jbyteArray firmwareInfo,
400
+ jobject & outAttestationInfo)
401
+ {
402
+ CHIP_ERROR err = CHIP_NO_ERROR;
403
+ jmethodID constructor;
404
+ jclass infoClass;
405
+
406
+ err = JniReferences::GetInstance ().GetClassRef (env, " chip/devicecontroller/AttestationInfo" , infoClass);
407
+ JniClass attestationInfoClass (infoClass);
408
+ SuccessOrExit (err);
409
+
410
+ env->ExceptionClear ();
411
+ constructor = env->GetMethodID (infoClass, " <init>" , " ([B[B[B[B[B[B[B[B)V" );
412
+ VerifyOrExit (constructor != nullptr , err = CHIP_JNI_ERROR_METHOD_NOT_FOUND);
413
+
414
+ outAttestationInfo =
415
+ (jobject) env->NewObject (infoClass, constructor, challenge, nonce, elements, elementsSignature, dac, pai, cd, firmwareInfo);
416
+
417
+ VerifyOrExit (!env->ExceptionCheck (), err = CHIP_JNI_ERROR_EXCEPTION_THROWN);
418
+ exit :
419
+ return err;
420
+ }
421
+
315
422
} // namespace Controller
316
423
} // namespace chip
0 commit comments