ã¯ããã«
ããã«ã¡ã¯ã製åéçºé¨ã®æ³ã§ãã
ç§ã¯ãå½ç¤¾ã®ä¸»è¦ã»ãã¥ãªãã£ãããã¯ãã§ãã FFRI yarai ãéä¸ç®¡çãã FFRI AMC(以ä¸ãAMC)ã¨ãã Web ã¢ããªã±ã¼ã·ã§ã³ã®éçºã»ä¿å®æ¥åãè¡ã£ã¦ãã¾ãã
ç¾å¨ AMC ã«ã¯ãã¯ã³ã¿ã¤ã ãã¹ã¯ã¼ããç¨ããå¤è¦ç´ èªè¨¼æ©è½ãæè¼ããã¦ãã¾ãã
ã¯ã³ã¿ã¤ã ãã¹ã¯ã¼ããç¨ããå¤è¦ç´ èªè¨¼ã¯ã徿¥ã®ãã¹ã¯ã¼ãèªè¨¼ã®å¼±ç¹ã§ãã£ããªã¹ãåæ»æãä¸éè æ»æãªã©ã¸ã®èæ§ããã䏿¹ãæ¹å¼ã«ãã£ã¦ã¯ãã£ãã·ã³ã°æ»æãªã©ã¸ã®èæ§ãå¼±ãã¨ããåé¡ãææããã¦ãã¾ãã
ãã®ãããªä¸ãæ¨ä»ããã»ãã¥ãªãã£å¼·åº¦ã®é«ãããã¹ãã¼ãã«ããèªè¨¼ã注ç®ããã¦ãã¾ãã ãã¹ãã¼ã¯ãFIDO ã¢ã©ã¤ã¢ã³ã¹ã¨ W3C ãå ±åã§çå®ããå ¬é鵿å·ããã¼ã¹ã¨ããèªè¨¼ææ®µã§ãã ç¾å¨ã§ã¯ããã¾ãã¾ãª OS ã Web ãã©ã¦ã¶ã¼ããµãã¼ããã¦ããã主è¦ãªãµã¼ãã¹ã§ã¯å©ç¨ãæ¨å¥¨ããã¦ãã¾ãã AMC ã«å¯¾ãã¦ãè¿ã æè¼è¦æãæ¥ãã¨æ³å®ããããããããã«åãã¦å®éã« AMC ã¸ç°¡æçã«å®è£ ãã¦ã¿ã¾ããã®ã§ããã®å 容ããç´¹ä»ãã¾ãã
ãªããæ¬è¨äºã§ã¯ãã¹ãã¼èªè¨¼ã®ä»çµã¿ã«ã¤ãã¦ã¯è§£èª¬ãã¾ããã 以ä¸ã®ãã¼ã¸ãªã©ãåããããã解説ããã¦ããè¨äºãã¤ã³ã¿ã¼ãããä¸ã«ããã¾ãã®ã§ãããããã確èªãã ããã
AMC ã¸ã®å®è£
çæäºé
- ãµã¼ãã¼å´ã®ã½ã¼ã¹ã³ã¼ãã¯ã»ãã¥ãªãã£ä¸ã®é½åã«ããå ¬éãã¦ãã¾ããããªã¯ã¨ã¹ããã©ã¡ã¼ã¿ã¼ã¨ã¬ã¹ãã³ã¹ã®ã¿è¨è¼ãã¦ãã¾ãã
- ç»é¢ã¯ããã¾ã§ä»åã®ç°¡æå®è£ ã®ããã«ä½æãããã®ã§ãä»å¾è£½åã«å®è£ ããç»é¢ããã®éãã«ãªãã¨ã¯éãã¾ããã
å®è£ ã®å¤§ç
ã¾ããå®è£ å ¨ä½ã®å¤§çã«ã¤ãã¦èª¬æãã¦ããã¾ãã ãã¹ãã¼ã®ç»é²ããã³èªè¨¼å¦çã¯ãWeb Authentication API ãä¸å¿ã«è¡ããã¾ãã ãªã³ã¯å ã®ãã¼ã¸ã«ãWeb Authentication API ã®èª¬æã¨ç»é²ãèªè¨¼å¦çã®æµãã示ããã¦ãã¾ãã®ã§ãã¾ãã¯ãã¡ãã®å 容ãã確èªãã ããã
ä¸è¨ã®ãã¼ã¸ã«è¨è¼ããã¦ãã¾ãããWeb ã¢ããªã±ã¼ã·ã§ã³å´ã§å®è£ ãå¿ è¦ãªã®ã¯ãç»é²ã¨èªè¨¼å¦çããããã®â ã¨â¤ã«é¢ããé¨åã§ãã å ·ä½çã«ã¯æ¬¡ã®å 容ãå®è£ ãã¦ããã¾ãã
Web Authentication API ã®å¼ã³åºããã©ã¡ã¼ã¿ã¼ã®çæã¨æ»ãå¤ããµã¼ãã¼ã¸éä¿¡ããããã®ãµã¼ãã¼å´ API ã 4 æ¬ä½æããã
- ç»é²ãã©ã¡ã¼ã¿ã¼åå¾ API(ä¸è¨ãã¼ã¸ã®ç»é²å¦çã®å³â ã§ä½¿ç¨)
- ç»é²å¦ç API(ä¸è¨ãã¼ã¸ã®ç»é²å¦çã®å³â¤ã§ä½¿ç¨)
- èªè¨¼ãã©ã¡ã¼ã¿ã¼åå¾ API(ä¸è¨ãã¼ã¸ã®èªè¨¼å¦çã®å³â ã§ä½¿ç¨)
- èªè¨¼å¦ç API(ä¸è¨ãã¼ã¸ã®èªè¨¼å¦çã®å³â¤ã§ä½¿ç¨)
WebUI ã®å¤æ´
- ãã¹ãã¼ç»é²ç¨ç»é¢ã®ä½æããå API ã使ç¨ãã¦ç»é²å¦çãè¡ããããã«ãã
- ãã°ã¤ã³ç»é¢ã夿´ããå API ã使ç¨ãã¦èªè¨¼å¦çãè¡ããããã«ãã
ç»é²ãã©ã¡ã¼ã¿ã¼åå¾ API ã®ä½æ
ãã® API 㯠navigator.credentials.create() ã®å¼ã³åºããã©ã¡ã¼ã¿ã¼ã«ãªãæ å ±ãåå¾ããããã«ã¯ã©ã¤ã¢ã³ãããå¼ã³åºããã¾ãã ã¬ã¹ãã³ã¹ã¨ãã¦æ¬¡ã®ãã㪠JSON ãè¿ãã¾ãã
{ "rp": { "name": "passkey.example.com", "id": "passkey.example.com" }, "user": { "name": "admin", "id": "NDg1ZGVmMzQtYjZkMC00ZDQ3LWJlNzQtOGY1NTQ1ZjI5YmQ2", "displayName": "admin" }, "challenge": "zQdt2R39RXI4W0AkBdlSxA", "pubKeyCredParams": [ { "type": "public-key", "alg": -7 }, { "type": "public-key", "alg": -257 } ], "authenticatorSelection": { "requireResidentKey": true, "residentKey": "required" }, "attestation": "none" }
| ãã¼å | è¨å®å¤ |
|---|---|
| rp | ãµã¼ãã¼ã®æ å ± |
| user | ãã¹ãã¼ãç»é²ããã¦ã¼ã¶ã¼ã®æ å ± |
| challenge | ãµã¼ãã¼ãçæãããã£ã¬ã³ã¸ |
| pubKeyCredParams | ãµã¼ãã¼ã対å¿å¯è½ãªç½²åã¢ã«ã´ãªãºã ãåªå
度é ã«è¨å® alg ã«ã¯ IANAã®COSE Algorithms ã¬ã¸ã¹ã㪠ã«ç»é²ããã¦ããå¤ãæå® ä¾ãã° -7 ã¯ã ES256(ECDSA w/ SHA-256) ã表ã |
| residentKey | èªè¨¼å¨ã«ç§å¯éµãå«ãèªè¨¼æ å ±ãä¿åãããã©ããã®è¨å® |
| attestation | èªè¨¼å¨ã®çæ£æ§ç¢ºèª(èªè¨¼å¨ãæ£å½ãªãã®ã§ããã確èªãããã¨)ã«ã¤ãã¦ã®è¨å® none ãæå®ããã¨ãµã¼ãã¼ã¯çæ£æ§ã確èªãããèªè¨¼å¨ãããã«é¢ããæ å ±ãéä¿¡ããªã |
表ä¸ã® challenge(ãã£ã¬ã³ã¸) ã¯ããµã¼ãã¼ãçºè¡ããã©ã³ãã ãªæååã§ãããã©ã®ãããªç¨éã§ä½¿ç¨ããããç°¡åã«èª¬æãã¦ããã¾ãã
å䏿§ã®æ¤è¨¼
- ãã® API ã§çæãããå¤ããç»é²å¦ç API ã§éä¿¡ãããå¤ã¨åä¸ããæ¤è¨¼ããç°ãªã£ã¦ããã°ä¸æ£ãªãªã¯ã¨ã¹ãã¨ãã¦å¦çã䏿¢ãã¾ãã
èªè¨¼å¨ã®çæ£æ§ç¢ºèªãç®çã«çæãããç½²åã®ä¸é¨
- çæ£æ§ç¢ºèªã®ããã«ãèªè¨¼å¨ããã£ã¬ã³ã¸ããã®ä»æ å ±ãçµåãããã®ã«å¯¾ãã¦ç½²åãçæããéã«ä½¿ç¨ããã¾ã(ä»åã¯å®è£ ãã¦ããªããã詳細ã¯å²æãã¾ã)ã
ç»é²å¦ç API ã®ä½æ
ãã® API 㯠Web ãã©ã¦ã¶ã¼ããéä¿¡ãããæ å ±ãæ¤è¨¼ããåé¡ãªããã°å ¬ééµããã¼ã¿ãã¼ã¹ã«ç»é²ãã¾ãã ãªã¯ã¨ã¹ããã©ã¡ã¼ã¿ã¼ã¨ãã¦ã次ã®ãã㪠JSON ãéä¿¡ãã¾ãã
{ "id": "JkxADqBLdF1M5Rt3y0EGfMXGXx0", "type": "public-key", "rawId": "JkxADqBLdF1M5Rt3y0EGfMXGXx0", "response": { "clientDataJSON": "d2Vi44OW44Op44Km4 ..çç¥.. 4K244O855Sf5oiQ44", "attestationObject": "KOODieODoeOCpO ..çç¥.. ODs+OBlOOBqOOBrin" } }
| ãã¼å | è¨å®å¤ |
|---|---|
| id | ãã®èªè¨¼æ å ±ã®èå¥å |
| type | public-key åºå® |
| rawId | idã¨åã |
| clientDataJSON | web ãã©ã¦ã¶ã¼ãçæããæ å ±ã§ããã®ä¸ã«ãµã¼ãã¼ãçæãããã£ã¬ã³ã¸ããªãªã¸ã³(ãã¡ã¤ã³)ãå«ã¾ãã |
| attestationObject | èªè¨¼å¨ãçæããå
¬ééµãå
¬ééµããã£ã¬ã³ã¸ã«å¯¾ããç½²åãã¢ãã¹ãã¼ã·ã§ã³è¨¼ææ¸ãªã©ã®æ
å ± ç»é²ãã©ã¡ã¼ã¿ã¼åå¾ API ã "attestation": "none" ã§å¿çãã¦ããå ´åãèªè¨¼å¨ã®çæ£æ§ç¢ºèªã§ä½¿ç¨ãããç½²åãè¨¼ææ¸æ å ±ã¯è¨å®ãããªã |
ç»é²å¦çã® WebUI ã®å®è£
次ã«ãWebUI å´ã®å®è£ ã§ãã
ããã AMC ã® WebUI ã§ãä»åã¯ã¦ã¼ã¶ã¼å人ã®è¨å®ãè¡ãæ©è½ã«ãã¹ãã¼ç»é²ã®ããã®ç»é¢ã使ãã¾ããã
ãã®ç»é¢ã®è¨å®ãã¿ã³ãã¯ãªãã¯ããã¨ã以ä¸ã®ã¹ã¯ãªãããå®è¡ããããã¹ãã¼ç»é²ãå§ã¾ãã¾ãã
register_request : async () => { // (1) ç»é²ãã©ã¡ã¼ã¿ã¼åå¾ API ã®å¼ã³åºã response = await $.ajax ({ type:'post', url:'/func/personal/mfa/passkey/api/creation_options/', dataType: 'json', cache: false, data:JSON.stringify({}) }); // (2) ç»é²ãã©ã¡ã¼ã¿ã¼åå¾APIã®ã¬ã¹ãã³ã¹ãç·¨é // èªè¨¼å¨ã«ã¯ãã¤ããªãã¼ã¿ã渡ãå¿ è¦ããããããbase64url2ab()ã«ã¦Base64urlã¨ã³ã³ã¼ãããããã®ã // Uint8Arrayã¸å¤æãã¦ãã response.user.id = base64url2ab(response.user.id); response.challenge = base64url2ab(response.challenge); let options = { publicKey: response } // (3) create() ã®å¼ã³åºã pwdCred = await navigator.credentials.create(options); // (4) create()ã®æ»ãå¤ãç·¨é // ab2base64url()ã§ã¯ããã¤ããªãã¼ã¿ãBase64urlã¨ã³ã³ã¼ããã¦ãã let = credentials = { id : pwdCred.id, type : pwdCred.type, rawId : ab2base64url(pwdCred.rawId), response : { clientDataJSON : ab2base64url(pwdCred.response.clientDataJSON), attestationObject : ab2base64url(pwdCred.response.attestationObject) } }; // (5) ç»é²å¦ç API ã®å¼ã³åºã let param = { 'credentials' : JSON.stringify(credentials) }; result = await $.ajax ({ type:'post', url:'/func/personal/mfa/passkey/api/attestation_response/', dataType: 'json', cache: false, data:JSON.stringify(param) }); alert("å ¬é鵿 å ±ããµã¼ãã¼ã«ç»é²ããã¾ãã"); }
å¦çå
容ã¯ã·ã³ãã«ã§ãã¾ãç»é²ãã©ã¡ã¼ã¿ã¼åå¾ API ãå¼ã³åºã㦠navigator.credentials.create() ã®ãã©ã¡ã¼ã¿ã¼ãçæãã¦ãã¾ã(1)ã
ãã®éãbase64url2ab() ã§ãBase64url ã¨ã³ã³ã¼ãã£ã³ã°ãããæ
å ±ããã¤ããªãã¼ã¿(ArrayBuffer å) ã«å¤æãã¦ãã¾ã(2)ã
次㫠navigator.credentials.create() ãå¼ã³åºãã¦(3)ãæ»ãå¤ãå ç¨ã¨å対㫠ab2base64url() ã§ãã¤ããªãã Base64url ã¨ã³ã³ã¼ãã£ã³ã°ãã¦ãã¾ã(4)ã
ãã®å¾ãç»é²å¦ç API ãå¼ã³åºãã¦å ¬ééµãªã©ã®æ å ±ãç»é²ãã¾ã(5)ã
ä¸è¨ã¹ã¯ãªããã®å®è¡çµæ
ã§ã¯ãä¸è¨ã®ã¹ã¯ãªãããå®è¡ããçµæãè¦ã¦ã¿ã¾ãããã ãªããä»åã¯èªè¨¼å¨ã« YubiKey 5 NFC ã使ç¨ãã¦ãã¾ãã
ä¸ã®ãã¤ã¢ãã°ã¯ãè¨å®ãã¿ã³ãã¯ãªãã¯ããã¨ãæåã«è¡¨ç¤ºãããç»é¢ã§ãã YubiKey 5 NFC ã®ãããªã»ãã¥ãªãã£ãã¼ã®å ´åã¯ããWindows Hello ã¾ãã¯å¤é¨ã»ãã¥ãªãã£ãã¼ããã¯ãªãã¯ãã¾ãã
YubiKey5 NFC ã§ã¯ãæ¬äººèªè¨¼ã¯ãPIN ã³ã¼ãã®å ¥å㨠YubiKey ã®ä¸å¤®ã®éå±é¨å(y ã®åã®é¨å)ã¸ã¿ãããããã¨ã§è¡ããã¾ãã ãã®ã¨ãå ¥åãã PIN ã³ã¼ãã¯èªè¨¼å¨å é¨ã®ç §åã§ä½¿ç¨ããããããã¯ã¼ã¯ä¸ã¯æµãã¾ããã ã¾ããPIN ã³ã¼ãã®å ¥åã«å ãã¦ã¿ãããè¦æ±ãããã®ã¯ã人ãèªè¨¼å¨ã®ããè¿ãã«ãã¦æä½ãã¦ãã(ï¼ãªã¢ã¼ãã§ä¸æ£ãªæä½ãè¡ããã¦ããããã§ã¯ãªã)ãã¨ã確èªããããã«è¡ããã¾ãã*1
ããã§ AMC ã«ãã¹ãã¼ãç»é²ã§ãã¾ããã æ¬¡ã«èªè¨¼å¦çã®å®è£ ãã¿ã¦ããã¾ãã
èªè¨¼ãã©ã¡ã¼ã¿ã¼åå¾ API ã®ä½æ
ãã® API 㯠navigator.credentials.get() ã®å¼ã³åºããã©ã¡ã¼ã¿ã¼ã«ãªãæ å ±ãåå¾ããããã«ã¯ã©ã¤ã¢ã³ãããå¼ã³åºããã¾ãã æ¬¡ã®ãã㪠JSON ãã¬ã¹ãã³ã¹ã¨ãã¦è¿ãã¾ãã
{ "challenge": "T26O5DpSozRzxLqQ0Zrp387Ij3H6jxNYZxUf9vTwITk" }
| åå | æ¦è¦ |
|---|---|
| challenge | ãµã¼ãã¼ãçæãããã£ã¬ã³ã¸ |
èªè¨¼å¦çã§ã® challenge(ãã£ã¬ã³ã¸) ã®ç¨éã¯ä»¥ä¸ã®éãã§ãã
å䏿§ã®æ¤è¨¼
- ããã¯ãç»é²å¦çã¨åæ§ã§ãã
æ¬äººèªè¨¼ã§ä½¿ç¨ãããç½²åã®ä¸é¨
- ç»é²å¦çã§ã¯ãèªè¨¼å¨ã®çæ£æ§ã®ç¢ºèªã«ä½¿ç¨ããã¦ãã¾ããããèªè¨¼å¦çã§ã¯ãã®ä»ã®æ å ±ã¨ã¨ãã«ç½²åããããµã¼ãã¼ã§ã®æ¬äººèªè¨¼ã«ä½¿ç¨ããã¾ãã
èªè¨¼å¦ç API ã®ä½æ
ç½²åãªã©ãæ¤è¨¼ããæ£å½æ§ã確èªã§ããã°ã¦ã¼ã¶ã¼ã«ãã°ã¤ã³ã許å¯ãã¾ãã ãªã¯ã¨ã¹ããã©ã¡ã¼ã¿ã¼ã¨ãã¦ã次ã®ãã㪠JSON ãéä¿¡ãã¾ãã
{ "id": "JkxADqBLdF1M5Rt3y0EGfMXGXx0", "type": "public-key", "rawId": "JkxADqBLdF1M5Rt3y0EGfMXGXx0", "response": { "clientDataJSON": "d2Vi44OW44Op44Km4 ..çç¥.. 4K244O855Sf5oiQ44", "authenticatorData": "0ungbt45g67h6c ..çç¥.. dgeDsdrg3d44amjye", "signature": "MEUCIQCI7bi_NqqVS0CdLg ..çç¥.. sadkwxciGv1HRIQbxAeY", "userHandle": "NDg1ZGVmMzQtYjZkMC00ZDQ3LWJlNzQtOGY1NTQ1ZjI5YmQ2" } }
| åå | æ¦è¦ |
|---|---|
| id | ç»é²å¦çã§çæãããå ¬é鵿 å ±ã®èå¥å |
| type | public-key åºå® |
| rawId | idã¨åã |
| clientDataJSON | web ãã©ã¦ã¶ã¼ãçæããæ å ±ã§ããã®ä¸ã«ãµã¼ãã¼ãçæãããã£ã¬ã³ã¸ããªãªã¸ã³(ãã¡ã¤ã³)ãå«ã¾ãã |
| authenticatorData | èªè¨¼å¨ã«é¢ããæ å ± |
| signature | clientDataJSON 㨠authenticatorData ããã¨ã«èªè¨¼å¨ãçæããç½²å ããã AMC å´ã§æ¤è¨¼ãããã°ã¤ã³å¯å¦ãå¤å®ãã |
| userHandle | ãã°ã¤ã³ããã¦ã¼ã¶ã¼ãèå¥ããããã®æ å ± |
èªè¨¼å¦çã® WebUI ã®å®è£
次ã«ãWebUI å´ã®å®è£ ã§ãã
ç¾å¨ã® AMC ã®ãã°ã¤ã³ç»é¢ã¯ãä¸è¬ã«ããããã¦ã¼ã¶ã¼ID(ã¡ã¼ã«ã¢ãã¬ã¹)ã¨ãã¹ã¯ã¼ãã® 2 é ç®ã¨ãã°ã¤ã³ãã¿ã³ãç¨æãããç»é¢ã§ãã ç°¡æçãªå®è£ ãªã®ã§ãã¡ã¼ã«ã¢ãã¬ã¹ã®å ¥åã¨ãã¹ã¯ã¼ãã®å ¥åãåé¢ãããã¹ã¯ã¼ãå ¥åã®ç»é¢ã§ãã¹ã¯ã¼ãããã¹ãã¼ã®ããããã鏿ã§ããç¨åº¦ã®å¤æ´ã«çãã¦ãã¾ãã ãã®ç»é¢ã§ãããã¹ãã¼ã使ç¨ãã¦ãã°ã¤ã³ããããã¯ãªãã¯ããã¨ä»¥ä¸ã®ã¹ã¯ãªãããå®è¡ãããæ¬äººèªè¨¼ãå§ã¾ãã¾ãã
authenticate_by_passkey : async () => { // 1. èªè¨¼ãã©ã¡ã¼ã¿ã¼åå¾ API ã®å¼ã³åºã let request_param = { 'ticket': $( 'input[name="ticket"]' ).val(), 'email': $( 'input[name="e_mail_address"]' ).val() }; response = await $.ajax ({ type:'post', url:'/func/initial/api/request/', dataType: 'json', cache: false, data: JSON.stringify(request_param) }); // 2. èªè¨¼ãã©ã¡ã¼ã¿ã¼åå¾ API ã®ã¬ã¹ãã³ã¹ãç·¨é(Base64url â ãã¤ããª) response.challenge = base64url2ab(response.challenge); let options = { publicKey: response } // 3. get() ã®å¼ã³åºã assertion = await navigator.credentials.get(options); console.log(assertion); // 4. get() ã®æ»ãå¤ã®ç·¨é(ãã¤ã㪠â Base64url) let credentials = { id : assertion.id, type : assertion.type, rawId : ab2base64url(assertion.rawId), response : { clientDataJSON : ab2base64url(assertion.response.clientDataJSON), authenticatorData : ab2base64url(assertion.response.authenticatorData), signature : ab2base64url(assertion.response.signature), userHandle : ab2base64url(assertion.response.userHandle) } }; // 5. èªè¨¼å¦ç API ã®å¼ã³åºã let credential_param = { 'email': $( 'input[name="e_mail_address"]' ).val(), 'credentials' : JSON.stringify(credentials) }; await $.ajax ({ type:'post', url:'/func/initial/api/verify/', dataType: 'json', cache: false, data: JSON.stringify(credential_param) }); // 6. ãããç»é¢ã¸ã¢ã¯ã»ã¹ $('#form_passkey').trigger('submit'); }
å¦çå 容ã¯ãå¼ã³åºãã¦ãã API ãç°ãªãã ãã§ç»é²å¦çã¨æ¦ãåããªã®ã§ã説æã¯å²æãã¾ãã
ä¸è¨ã¹ã¯ãªããã®å®è¡çµæ
ç»é²å¦çã¨åããããªç»é¢ã§ããã YubiKey ã«ã¿ãããã¦èªè¨¼å¨ã§ã®æ¬äººèªè¨¼ãå®äºããã¨ããã£ã¬ã³ã¸ãç½²åãªã©ã AMC ã«éä¿¡ãããããããæ¤è¨¼ãæ£å½æ§ã確èªã§ããã°ãã°ã¤ã³ãå¯è½ã¨ãªãã¾ãã
ãããã«
ãµã¼ãã¼å´ã®å¦çã¯æ²è¼ãã¾ããã§ãããããã¾ãã¾ãª OSS ãæä¾ããã¦ããã®ã§ããããããã¾ãå©ç¨ããã°å®è£ ã®é£æåº¦ãä½ãã§ããã¨æãã¾ãã å®éã« AMC ã¸å®è£ ããã¨ãã¯ãèªè¨¼å¨ãæ éãç´å¤±ããã¨ãã®ææ¸çãªã©ãã¾ãã¾ãªã±ã¼ã¹ãæ³å®ãã¦éç¨ã«èããããä»çµã¿ãæ§ç¯ããå¿ è¦ãããã¨èãã¦ãã¾ãã ããæ¬¡ã«ããã°ãæ¸ãæ©ä¼ãããã°ãAMC ã«å®éã«å®è£ ããå 容ã¨ãã®éã«å·¥å¤«ãããã¨ãè¦å´ãããã¨ãªã©äº¤ããªãããç´¹ä»ã§ããã°ã¨æãã¾ãã
*1:ããã¯æç´èªè¨¼ã§ã¯ãªãã人éã®ç®èã®å¾®å¼±é»æµãæç¥ãããã¨ã§äººéã®åå¨ã確èªãããã¨ãç®çã§ãã










