@@ -5,7 +5,7 @@ use crate::common::JsonWrapper;
5
5
use crate :: crypto;
6
6
use crate :: serialization:: serialize_maybe_base64;
7
7
use crate :: { tpm, Error as KeylimeError , QuoteData } ;
8
- use actix_web:: { web, HttpRequest , HttpResponse , Responder } ;
8
+ use actix_web:: { http , web, HttpRequest , HttpResponse , Responder } ;
9
9
use base64:: { engine:: general_purpose, Engine as _} ;
10
10
use log:: * ;
11
11
use serde:: { Deserialize , Serialize } ;
@@ -47,7 +47,7 @@ pub(crate) struct KeylimeQuote {
47
47
// This is a Quote request from the tenant, which does not check
48
48
// integrity measurement. It should return this data:
49
49
// { QuoteAIK(nonce, 16:H(NK_pub)), NK_pub }
50
- pub async fn identity (
50
+ async fn identity (
51
51
req : HttpRequest ,
52
52
param : web:: Query < Ident > ,
53
53
data : web:: Data < QuoteData > ,
@@ -136,7 +136,7 @@ pub async fn identity(
136
136
// by the mask. It should return this data:
137
137
// { QuoteAIK(nonce, 16:H(NK_pub), xi:yi), NK_pub}
138
138
// where xi:yi are additional PCRs to be included in the quote.
139
- pub async fn integrity (
139
+ async fn integrity (
140
140
req : HttpRequest ,
141
141
param : web:: Query < Integ > ,
142
142
data : web:: Data < QuoteData > ,
@@ -336,13 +336,54 @@ pub async fn integrity(
336
336
HttpResponse :: Ok ( ) . json ( response)
337
337
}
338
338
339
+ /// Handles the default case for the /quotes scope
340
+ async fn quotes_default ( req : HttpRequest ) -> impl Responder {
341
+ let error;
342
+ let response;
343
+ let message;
344
+
345
+ match req. head ( ) . method {
346
+ http:: Method :: GET => {
347
+ error = 400 ;
348
+ message = "URI not supported, only /identity and /integrity are supported for GET in /quotes/ interface" ;
349
+ response = HttpResponse :: BadRequest ( )
350
+ . json ( JsonWrapper :: error ( error, message) ) ;
351
+ }
352
+ _ => {
353
+ error = 405 ;
354
+ message = "Method is not supported in /quotes/ interface" ;
355
+ response = HttpResponse :: MethodNotAllowed ( )
356
+ . insert_header ( http:: header:: Allow ( vec ! [ http:: Method :: GET ] ) )
357
+ . json ( JsonWrapper :: error ( error, message) ) ;
358
+ }
359
+ } ;
360
+
361
+ warn ! (
362
+ "{} returning {} response. {}" ,
363
+ req. head( ) . method,
364
+ error,
365
+ message
366
+ ) ;
367
+
368
+ response
369
+ }
370
+
371
+ /// Configure the endpoints for the /quotes scope
372
+ pub ( crate ) fn configure_quotes_endpoints ( cfg : & mut web:: ServiceConfig ) {
373
+ _ = cfg
374
+ . service ( web:: resource ( "/identity" ) . route ( web:: get ( ) . to ( identity) ) )
375
+ . service ( web:: resource ( "/integrity" ) . route ( web:: get ( ) . to ( integrity) ) )
376
+ . default_service ( web:: to ( quotes_default) ) ;
377
+ }
378
+
339
379
#[ cfg( feature = "testing" ) ]
340
380
#[ cfg( test) ]
341
381
mod tests {
342
382
use super :: * ;
343
383
use crate :: common:: API_VERSION ;
344
384
use actix_web:: { test, web, App } ;
345
385
use keylime:: { crypto:: testing:: pkey_pub_from_pem, tpm} ;
386
+ use serde_json:: { json, Value } ;
346
387
347
388
#[ actix_rt:: test]
348
389
async fn test_identity ( ) {
@@ -523,4 +564,37 @@ mod tests {
523
564
assert ! ( result. results. ima_measurement_list. is_none( ) ) ;
524
565
assert ! ( result. results. ima_measurement_list_entry. is_none( ) ) ;
525
566
}
567
+
568
+ #[ actix_rt:: test]
569
+ async fn test_keys_default ( ) {
570
+ let mut app = test:: init_service (
571
+ App :: new ( ) . service ( web:: resource ( "/" ) . to ( quotes_default) ) ,
572
+ )
573
+ . await ;
574
+
575
+ let req = test:: TestRequest :: get ( ) . uri ( "/" ) . to_request ( ) ;
576
+
577
+ let resp = test:: call_service ( & app, req) . await ;
578
+ assert ! ( resp. status( ) . is_client_error( ) ) ;
579
+
580
+ let result: JsonWrapper < Value > = test:: read_body_json ( resp) . await ;
581
+
582
+ assert_eq ! ( result. results, json!( { } ) ) ;
583
+ assert_eq ! ( result. code, 400 ) ;
584
+
585
+ let req = test:: TestRequest :: delete ( ) . uri ( "/" ) . to_request ( ) ;
586
+
587
+ let resp = test:: call_service ( & app, req) . await ;
588
+ assert ! ( resp. status( ) . is_client_error( ) ) ;
589
+
590
+ let headers = resp. headers ( ) ;
591
+
592
+ assert ! ( headers. contains_key( "allow" ) ) ;
593
+ assert_eq ! ( headers. get( "allow" ) . unwrap( ) . to_str( ) . unwrap( ) , "GET" ) ; //#[allow_ci]
594
+
595
+ let result: JsonWrapper < Value > = test:: read_body_json ( resp) . await ;
596
+
597
+ assert_eq ! ( result. results, json!( { } ) ) ;
598
+ assert_eq ! ( result. code, 405 ) ;
599
+ }
526
600
}
0 commit comments